| // REQUIRES: arm |
| // RUN: llvm-mc %s -triple=armv7-unknown-linux-gnueabi -filetype=obj -o %t.o |
| // RUN: echo "SECTIONS { \ |
| // RUN: .text : { *(.text) } \ |
| // RUN: .prel.test : { *(.ARM.exidx) } \ |
| // RUN: .prel.test.TEST1 : { *(.ARM.exidx.TEST1) } \ |
| // RUN: .TEST1 : { *(.TEST1) } } " > %t.script |
| // RUN: ld.lld --script %t.script %t.o -o %t |
| // RUN: llvm-readobj -s -sd %t | FileCheck --check-prefix=CHECK %s |
| |
| // The R_ARM_PREL31 relocation is used in by the .ARM.exidx exception tables |
| // bit31 of the place denotes whether the field is an inline table entry |
| // (bit31=1) or relocation (bit31=0) |
| // The linker must preserve the value of bit31 |
| |
| // This test case is adapted from llvm/test/MC/ARM/eh-compact-pr0.s |
| // We use a linker script to place the .ARM.exidx sections in between |
| // the code sections so that we can test positive and negative offsets |
| .syntax unified |
| |
| .section .TEST1, "ax",%progbits |
| .globl _start |
| .align 2 |
| .type _start,%function |
| _start: |
| .fnstart |
| .save {r11, lr} |
| push {r11, lr} |
| .setfp r11, sp |
| mov r11, sp |
| pop {r11, lr} |
| mov pc, lr |
| .fnend |
| |
| .section .text, "ax",%progbits |
| // The generated .ARM.exidx section will refer to the personality |
| // routine __aeabi_unwind_cpp_pr0. Provide a dummy implementation |
| // to stop an undefined symbol error |
| .globl __aeabi_unwind_cpp_pr0 |
| .align 2 |
| .type __aeabi_unwind_cpp_pr0,%function |
| __aeabi_unwind_cpp_pr0: |
| .fnstart |
| bx lr |
| .fnend |
| |
| // The expected value of the exception table is |
| // Word0 0 in bit 31, -4 encoded in 31-bit signed offset |
| // Word1 Inline table entry EHT Inline Personality Routine #0 |
| // CHECK: Name: .prel.test |
| // CHECK: SectionData ( |
| // CHECK: 0000: FCFFFF7F B0B0B080 |
| // CHECK: ) |
| |
| // The expected value of the exception table is |
| // Word0 0 in bit 31, +8 encoded in 31-bit signed offset |
| // Word1 Inline table entry EHT Inline Personality Routine #0 |
| // set vsp = r11 |
| // pop r11, r14 |
| // CHECK: Name: .prel.test.TEST1 |
| // CHECK: SectionData ( |
| // CHECK: 0000: 08000000 80849B80 |
| // CHECK: ) |