181 lines · plain
1// REQUIRES: arm2// RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %s -o %t3// RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %S/Inputs/arm-exidx-cantunwind.s -o %tcantunwind4// RUN: ld.lld --no-merge-exidx-entries %t %tcantunwind -o %t25// RUN: llvm-objdump -d --triple=armv7a-none-linux-gnueabi --no-show-raw-insn %t2 | FileCheck %s6// RUN: llvm-objdump -s --triple=armv7a-none-linux-gnueabi %t2 | FileCheck --check-prefix=CHECK-EXIDX %s7// RUN: llvm-readobj --program-headers --sections %t2 | FileCheck -check-prefix=CHECK-PT %s8// Use Linker script to place .ARM.exidx in between .text and orphan sections9// RUN: echo "SECTIONS { \10// RUN: .text 0x11000 : { *(.text*) } \11// RUN: .ARM.exidx : { *(.ARM.exidx) } } " > %t.script12// RUN: ld.lld --no-merge-exidx-entries --script %t.script %tcantunwind %t -o %t313// RUN: llvm-objdump -d --triple=armv7a-none-linux-gnueabi %t3 | FileCheck --check-prefix=CHECK-SCRIPT %s14// RUN: llvm-objdump -s --triple=armv7a-none-linux-gnueabi %t3 | FileCheck --check-prefix=CHECK-SCRIPT-EXIDX %s15 16/// Each assembler created .ARM.exidx section has the SHF_LINK_ORDER flag set17/// with the sh_link containing the section index of the executable section18/// containing the function it describes. The linker must combine the .ARM.exidx19/// InputSections in the same order that it has combined the executable section,20/// such that the combined .ARM.exidx OutputSection can be used as a binary21/// search table.22 23 .syntax unified24 .section .text, "ax",%progbits25 .globl _start26_start:27 .fnstart28 bx lr29 .cantunwind30 .fnend31 32 .section .text.f1, "ax", %progbits33 .globl f134f1:35 .fnstart36 bx lr37 .cantunwind38 .fnend39 40 .section .text.f2, "ax", %progbits41 .globl f242f2:43 .fnstart44 bx lr45 .cantunwind46 .fnend47 .globl f348f3:49 .fnstart50 bx lr51 .cantunwind52 .fnend53 54/// Check default no linker script order.55 56// CHECK: Disassembly of section .text:57// CHECK-EMPTY:58// CHECK: <_start>:59// CHECK-NEXT: 20124: bx lr60// CHECK: <f1>:61// CHECK-NEXT: 20128: bx lr62// CHECK: <f2>:63// CHECK-NEXT: 2012c: bx lr64// CHECK: <f3>:65// CHECK-NEXT: 20130: bx lr66// CHECK: <func4>:67// CHECK-NEXT: 20134: bx lr68// CHECK: <func5>:69// CHECK-NEXT: 20138: bx lr70// CHECK: Disassembly of section .func1:71// CHECK-EMPTY:72// CHECK-NEXT: <func1>:73// CHECK-NEXT: 2013c: bx lr74// CHECK: Disassembly of section .func2:75// CHECK-EMPTY:76// CHECK-NEXT: <func2>:77// CHECK-NEXT: 20140: bx lr78// CHECK: Disassembly of section .func3:79// CHECK-EMPTY:80// CHECK-NEXT: <func3>:81// CHECK-NEXT: 20144: bx lr82 83/// Each .ARM.exidx section has two 4 byte fields84/// Field 1 is the 31-bit offset to the function. The top bit is used to85/// indicate whether Field 2 is a pointer or an inline table entry.86/// Field 2 is either a pointer to a .ARM.extab section or an inline table87/// In this example all Field 2 entries are inline can't unwind (0x1)88/// We expect to see the entries in the same order as the functions89 90// CHECK-EXIDX: Contents of section .ARM.exidx:91/// 100d4 + 1050 = 11124 = _start92/// 100dc + 104c = 11128 = f193// CHECK-EXIDX-NEXT: 100d4 50000100 01000000 4c000100 0100000094/// 100e4 + 1048 = 1112c = f295/// 100ec + 1044 = 11130 = f396// CHECK-EXIDX-NEXT: 100e4 48000100 01000000 44000100 0100000097/// 100f4 + 1040 = 11134 = func498/// 100fc + 103c = 11138 = func599// CHECK-EXIDX-NEXT: 100f4 40000100 01000000 3c000100 01000000100/// 10104 + 1038 = 1113c = func1101/// 1010c + 1034 = 11140 = func2102// CHECK-EXIDX-NEXT: 10104 38000100 01000000 34000100 01000000103/// 10114 + 1030 = 11144 = func3104// CHECK-EXIDX-NEXT: 10114 30000100 01000000105 106/// Check that PT_ARM_EXIDX program header has been generated that describes107/// the .ARM.exidx output section108// CHECK-PT: Name: .ARM.exidx109// CHECK-PT-NEXT: Type: SHT_ARM_EXIDX (0x70000001)110// CHECK-PT-NEXT: Flags [111// CHECK-PT-NEXT: SHF_ALLOC112// CHECK-PT-NEXT: SHF_LINK_ORDER113// CHECK-PT-NEXT: ]114// CHECK-PT-NEXT: Address: 0x100D4115// CHECK-PT-NEXT: Offset: 0xD4116// CHECK-PT-NEXT: Size: 80117 118// CHECK-PT: Type: PT_ARM_EXIDX (0x70000001)119// CHECK-PT-NEXT: Offset: 0xD4120// CHECK-PT-NEXT: VirtualAddress: 0x100D4121// CHECK-PT-NEXT: PhysicalAddress: 0x100D4122// CHECK-PT-NEXT: FileSize: 80123// CHECK-PT-NEXT: MemSize: 80124// CHECK-PT-NEXT: Flags [ (0x4)125// CHECK-PT-NEXT: PF_R (0x4)126// CHECK-PT-NEXT: ]127// CHECK-PT-NEXT: Alignment: 4128// CHECK-PT-NEXT: }129 130 131/// Check linker script order. The .ARM.exidx section will be inserted after132/// the .text section but before the orphan sections133 134// CHECK-SCRIPT: Disassembly of section .text:135// CHECK-SCRIPT-EMPTY:136// CHECK-SCRIPT-NEXT: <func4>:137// CHECK-SCRIPT-NEXT: 11000: e12fff1e bx lr138// CHECK-SCRIPT: <func5>:139// CHECK-SCRIPT-NEXT: 11004: e12fff1e bx lr140// CHECK-SCRIPT: <_start>:141// CHECK-SCRIPT-NEXT: 11008: e12fff1e bx lr142// CHECK-SCRIPT: <f1>:143// CHECK-SCRIPT-NEXT: 1100c: e12fff1e bx lr144// CHECK-SCRIPT: <f2>:145// CHECK-SCRIPT-NEXT: 11010: e12fff1e bx lr146// CHECK-SCRIPT: <f3>:147// CHECK-SCRIPT-NEXT: 11014: e12fff1e bx lr148// CHECK-SCRIPT-EMPTY:149// CHECK-SCRIPT-NEXT: Disassembly of section .func1:150// CHECK-SCRIPT-EMPTY:151// CHECK-SCRIPT-NEXT: <func1>:152// CHECK-SCRIPT-NEXT: 11018: e12fff1e bx lr153// CHECK-SCRIPT-EMPTY:154// CHECK-SCRIPT-NEXT: Disassembly of section .func2:155// CHECK-SCRIPT-EMPTY:156// CHECK-SCRIPT-NEXT: <func2>:157// CHECK-SCRIPT-NEXT: 1101c: e12fff1e bx lr158// CHECK-SCRIPT-EMPTY:159// CHECK-SCRIPT-NEXT: Disassembly of section .func3:160// CHECK-SCRIPT-EMPTY:161// CHECK-SCRIPT-NEXT: <func3>:162// CHECK-SCRIPT-NEXT: 11020: e12fff1e bx lr163 164/// Check that the .ARM.exidx section is sorted in order as the functions165/// The offset in field 1, is 32-bit so in the binary the most significant bit166/// 11024 - 24 = 11000 func4167/// 1102c - 28 = 11004 func5168// CHECK-SCRIPT-EXIDX: 11024 dcffff7f 01000000 d8ffff7f 01000000169/// 11034 - 2c = 11008 _start170/// 1103c - 30 = 1100c f1171// CHECK-SCRIPT-EXIDX-NEXT: 11034 d4ffff7f 01000000 d0ffff7f 01000000172/// 11044 - 34 = 11010 f2173/// 1104c - 38 = 11014 f3174// CHECK-SCRIPT-EXIDX-NEXT: 11044 ccffff7f 01000000 c8ffff7f 01000000175/// 11054 - 3c = 11018 func1176/// 1105c - 40 = 1101c func2177// CHECK-SCRIPT-EXIDX-NEXT: 11054 c4ffff7f 01000000 c0ffff7f 01000000178/// 11064 - 44 = 11020 func3179/// 11068 - 48 = 11024 func3 + sizeof(func3)180// CHECK-SCRIPT-EXIDX-NEXT: 11064 bcffff7f 01000000 b8ffff7f 01000000181