diff options
| author | Peter Smith <peter.smith@linaro.org> | 2016-08-24 09:08:54 +0000 |
|---|---|---|
| committer | Peter Smith <peter.smith@linaro.org> | 2016-08-24 09:08:54 +0000 |
| commit | a52864a78c790bcd1d217143a817973d6becb400 (patch) | |
| tree | a83418027c6d3bfea0e15cbd095b8fcf9a5ff659 | |
| parent | 1164cae527ace6b4f4eba2121f161dea7fb005ae (diff) | |
| download | bcm5719-llvm-a52864a78c790bcd1d217143a817973d6becb400.tar.gz bcm5719-llvm-a52864a78c790bcd1d217143a817973d6becb400.zip | |
Canonicalize output section name for .ARM.exidx sections
The ARM Exception handling ABI requires that all ARM exception index
table sections have a prefix of .ARM.exidx and are combined into a
single contiguous block either in their own output section or as part
of another output section.
In general clang will output a single .ARM.exidx section per object,
but will use .ARM.exidx.<section name> when -ffunction-sections is used.
This change canonicalizes the names of sections with the .ARM.exidx
prefix to just .ARM.exidx, which ensures that there is only a single
output section.
Differential Revision: https://reviews.llvm.org/D23775
llvm-svn: 279617
| -rw-r--r-- | lld/ELF/Writer.cpp | 2 | ||||
| -rw-r--r-- | lld/test/ELF/arm-exidx-output.s | 50 |
2 files changed, 51 insertions, 1 deletions
diff --git a/lld/ELF/Writer.cpp b/lld/ELF/Writer.cpp index a8c6f824198..d927ee3a376 100644 --- a/lld/ELF/Writer.cpp +++ b/lld/ELF/Writer.cpp @@ -90,7 +90,7 @@ StringRef elf::getOutputSectionName(InputSectionBase<ELFT> *S) { StringRef Name = S->getSectionName(); for (StringRef V : {".text.", ".rodata.", ".data.rel.ro.", ".data.", ".bss.", ".init_array.", ".fini_array.", ".ctors.", ".dtors.", - ".tbss.", ".gcc_except_table.", ".tdata."}) + ".tbss.", ".gcc_except_table.", ".tdata.", ".ARM.exidx."}) if (Name.startswith(V)) return V.drop_back(); return Name; diff --git a/lld/test/ELF/arm-exidx-output.s b/lld/test/ELF/arm-exidx-output.s new file mode 100644 index 00000000000..c91be828554 --- /dev/null +++ b/lld/test/ELF/arm-exidx-output.s @@ -0,0 +1,50 @@ +// RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %s -o %t +// RUN: ld.lld %t -o %t2 2>&1 +// RUN: llvm-readobj -sections %t2 | FileCheck %s +// REQUIRES: arm + +// Check that only a single .ARM.exidx output section is created when +// there are input sections of the form .ARM.exidx.<section-name>. The +// assembler creates the .ARM.exidx input sections with the .cantunwind +// directive + .syntax unified + .section .text, "ax",%progbits + .globl _start + .align 2 + .type _start,%function +_start: + .fnstart + bx lr + .cantunwind + .fnend + + .section .text.f1, "ax", %progbits + .globl f1 + .align 2 + .type f1,%function +f1: + .fnstart + bx lr + .cantunwind + .fnend + + .section .text.f2, "ax", %progbits + .globl f2 + .align 2 + .type f2,%function +f2: + .fnstart + bx lr + .cantunwind + .fnend + +// CHECK: Section { +// CHECK: Name: .ARM.exidx +// CHECK-NEXT: Type: SHT_ARM_EXIDX (0x70000001) +// CHECK-NEXT: Flags [ (0x82) +// CHECK-NEXT: SHF_ALLOC (0x2) +// CHECK-NEXT: SHF_LINK_ORDER (0x80) +// CHECK-NEXT: ] + +// CHECK-NOT: Name: .ARM.exidx.text.f1 +// CHECK-NOT: Name: .ARM.exidx.text.f2 |

