[PATCH] D31932: [LLD][ELF] Mark ARM Exceptions that refer to folded code as not live

Peter Smith via Phabricator via llvm-commits llvm-commits at lists.llvm.org
Tue Apr 11 05:51:58 PDT 2017


peter.smith created this revision.
Herald added subscribers: rengolin, aemerson.

ARM Exception Index Table sections .ARM.exidx have an implicit dependency on code sections via SHF_LINK_ORDER. When code sections are folded by ICF we must mark the unique .ARM.exidx table that describes it as not live to prevent an illegal entry in the exception table.

      

Note that we do not try and follow the relocations from the .ARM.exidx section to the .ARM.extab sections to mark these as not live. Leaving these sections is not a correctness problem. In theory these could be removed via an application of garbage collection.

      

Fixes https://bugs.llvm.org/show_bug.cgi?id=32614


https://reviews.llvm.org/D31932

Files:
  ELF/ICF.cpp
  test/ELF/arm-icf-exidx.s


Index: test/ELF/arm-icf-exidx.s
===================================================================
--- /dev/null
+++ test/ELF/arm-icf-exidx.s
@@ -0,0 +1,31 @@
+// REQUIRES: arm
+// RUN: llvm-mc -filetype=obj -triple=armv7a-none-linux-gnueabi %s -o %t
+// RUN: ld.lld %t -o %t2 --icf=all
+// RUN: llvm-objdump -s -d -triple=armv7a-none-linux-gnueabi %t2 | FileCheck %s
+
+ .syntax unified
+ .section        .text.f,"axG",%progbits,f,comdat
+f:
+ .fnstart
+ bx      lr
+ .fnend
+
+ .section        .text.g,"axG",%progbits,g,comdat
+g:
+ .fnstart
+ bx      lr
+ .fnend
+
+ .section .text.h
+ .global __aeabi_unwind_cpp_pr0
+__aeabi_unwind_cpp_pr0:
+ bx lr
+
+// CHECK: Disassembly of section .text:
+// CHECK-NEXT: f:
+// CHECK-NEXT:    11000:        1e ff 2f e1     bx      lr
+// CHECK: __aeabi_unwind_cpp_pr0:
+// CHECK-NEXT:    11004:        1e ff 2f e1     bx      lr
+
+// CHECK: Contents of section .ARM.exidx:
+// CHECK-NEXT:  100d4 2c0f0000 b0b0b080 280f0000 01000000
Index: ELF/ICF.cpp
===================================================================
--- ELF/ICF.cpp
+++ ELF/ICF.cpp
@@ -375,6 +375,19 @@
       Sections[Begin]->replace(Sections[I]);
     }
   });
+
+  // Mark ARM Exception Index table sections that refer to folded code
+  // sections as not live. These sections have an implict dependency
+  // via the link order dependency.
+  if (Config->EMachine == EM_ARM)
+    for (InputSectionBase *Sec : InputSections) {
+      auto *S = dyn_cast<InputSection>(Sec);
+      if (!S || !(S->Flags & SHF_LINK_ORDER))
+        continue;
+      InputSectionBase *CodeSec = S->getLinkOrderDep();
+      if (CodeSec->Live == false)
+        S->Live = false;
+    }
 }
 
 // ICF entry point function.


-------------- next part --------------
A non-text attachment was scrubbed...
Name: D31932.94806.patch
Type: text/x-patch
Size: 1714 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20170411/90018ac1/attachment.bin>


More information about the llvm-commits mailing list