blob: 09344d5579503ad59cd077894c75df89c159e5a1 [file] [edit]
# REQUIRES: aarch64
# RUN: rm -rf %t; split-file %s %t
# RUN: llvm-mc -filetype=obj -triple=arm64-apple-darwin %t/test.s -o %t.o
# RUN: %lld -arch arm64 -lSystem %t.o -o %t.noorder.exe
# RUN: llvm-objdump -d %t.noorder.exe | FileCheck %s --check-prefix=NOORDER
# RUN: %lld -arch arm64 -lSystem %t.o -o %t.order-hot.exe -order_file %t/ord-hot
# RUN: llvm-objdump -d %t.order-hot.exe | FileCheck %s --check-prefix=ORDER-HOT
# RUN: %lld -arch arm64 -lSystem %t.o -o %t.order-cold.exe -order_file %t/ord-cold
# RUN: llvm-objdump -d %t.order-cold.exe | FileCheck %s --check-prefix=ORDER-COLD
# RUN: %lld -arch arm64 -lSystem %t.o -o %t.exe
# RUN: llvm-nm -m %t.exe | FileCheck %s --check-prefix=EXE
# RUN: %lld -arch arm64 -lSystem --icf=all %t.o -o %t.icf.exe -map %t/icf.map
# RUN: FileCheck %s --input-file %t/icf.map --check-prefix=ICF
# RUN: %lld -arch arm64 -lSystem --icf=safe_thunks %t.o -o %t.safe.exe -map %t/safe.map
# RUN: FileCheck %s --input-file %t/safe.map --check-prefix=SAFE-THUNKS
#--- test.s
.subsections_via_symbols
.addrsig
.addrsig_sym _cold
.addrsig_sym _cold_addrsig
.addrsig_sym _normal
.text
.globl _cold
.p2align 2
.desc _cold, 0x400
_cold:
add x0, x1, x2
add x3, x4, x5
ret
.globl _normal
.p2align 2
_normal:
add x0, x1, x2
add x3, x4, x5
ret
.globl _ordered
.p2align 2
_ordered:
add x0, x1, x2
add x3, x4, x5
ret
.globl _cold_addrsig
.p2align 2
.desc _cold_addrsig, 0x400
_cold_addrsig:
add x0, x1, x2
add x3, x4, x5
ret
.globl _cold_unordered
.p2align 2
.desc _cold_unordered, 0x400
_cold_unordered:
add x0, x1, x3
ret
.globl _main
.p2align 2
_main:
bl _normal
bl _cold
bl _cold_addrsig
bl _ordered
bl _cold_unordered
ret
## Basic N_COLD_FUNC support.
# NOORDER: <_normal>:
# NOORDER: <_ordered>:
# NOORDER: <_main>:
# NOORDER: <_cold>:
# NOORDER: <_cold_unordered>:
## Ordered symbols should come before unordered cold symbols.
# ORDER-HOT: <_ordered>:
# ORDER-HOT: <_normal>:
# ORDER-HOT: <_main>:
# ORDER-HOT: <_cold>:
# ORDER-HOT: <_cold_unordered>:
## Cold attribute should not change the ordering of order-file symbols.
# ORDER-COLD: <_cold>:
# ORDER-COLD: <_ordered>:
# ORDER-COLD: <_normal>:
# ORDER-COLD: <_main>:
# ORDER-COLD: <_cold_unordered>:
## Check that N_COLD_FUNC is NOT preserved in the output executable.
# EXE: (__TEXT,__text) external _cold
## ICF + N_COLD_FUNC: _cold, _normal, and _ordered have identical bodies.
## _cold is the master; since _normal (non-cold) is folded into _cold,
## _cold's isCold is unset and it stays in the hot region.
## _cold_unordered has a different body and stays cold.
# ICF-LABEL: # Symbols:
# ICF: _cold
# ICF: _normal
# ICF: _ordered
# ICF: _main
# ICF: _cold_unordered
## With safe_thunks, _cold, _cold_addrsig, and _normal are keepUnique. _cold
## appears first in input order so it becomes the master. Since _normal
## (non-cold) is folded into _cold, _cold's isCold is unset. _normal gets a
## non-cold thunk. _cold_addrsig gets a cold thunk. _cold_unordered stays cold
## and anchors the cold region.
# SAFE-THUNKS-LABEL: # Symbols:
# SAFE-THUNKS: 0x0000000C {{.*}} _cold
# SAFE-THUNKS: 0x00000000 {{.*}} _ordered
# SAFE-THUNKS: {{.*}} _main
# SAFE-THUNKS: 0x00000004 {{.*}} _normal
# SAFE-THUNKS: {{.*}} _cold_unordered
# SAFE-THUNKS: 0x00000004 {{.*}} _cold_addrsig
#--- ord-hot
_ordered
#--- ord-cold
_cold
_ordered