[lld] r300182 - [ELF] Mark ARM Exceptions that refer to folded code as not live

Peter Smith via llvm-commits llvm-commits at lists.llvm.org
Thu Apr 13 01:52:59 PDT 2017


Author: psmith
Date: Thu Apr 13 03:52:58 2017
New Revision: 300182

URL: http://llvm.org/viewvc/llvm-project?rev=300182&view=rev
Log:
[ELF] Mark ARM Exceptions that refer to folded code as not live
    
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

Differential Revision: https://reviews.llvm.org/D31932


Added:
    lld/trunk/test/ELF/arm-icf-exidx.s
Modified:
    lld/trunk/ELF/ICF.cpp

Modified: lld/trunk/ELF/ICF.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/ELF/ICF.cpp?rev=300182&r1=300181&r2=300182&view=diff
==============================================================================
--- lld/trunk/ELF/ICF.cpp (original)
+++ lld/trunk/ELF/ICF.cpp Thu Apr 13 03:52:58 2017
@@ -375,6 +375,15 @@ template <class ELFT> void ICF<ELFT>::ru
       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)
+      if (auto *S = dyn_cast<InputSection>(Sec))
+        if (S->Flags & SHF_LINK_ORDER)
+          S->Live = S->getLinkOrderDep()->Live;
 }
 
 // ICF entry point function.

Added: lld/trunk/test/ELF/arm-icf-exidx.s
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/ELF/arm-icf-exidx.s?rev=300182&view=auto
==============================================================================
--- lld/trunk/test/ELF/arm-icf-exidx.s (added)
+++ lld/trunk/test/ELF/arm-icf-exidx.s Thu Apr 13 03:52:58 2017
@@ -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




More information about the llvm-commits mailing list