[lld] r230614 - [Core] Do not reclaim absolute atoms in resolver.

Davide Italiano davide at freebsd.org
Wed Feb 25 21:39:57 PST 2015


Author: davide
Date: Wed Feb 25 23:39:57 2015
New Revision: 230614

URL: http://llvm.org/viewvc/llvm-project?rev=230614&view=rev
Log:
[Core] Do not reclaim absolute atoms in resolver.

This fixes a linker crash (found out while testing --gc-sections,
testcase provided by Rafael Avila de Espindola).
While this behaviour was found while testing ELF, it' not necessarily
ELF specific and this change is (apparently) harmless on all the
other drivers.

Differential Revision:  D7823
Reviewed by:    ruiu

Modified:
    lld/trunk/lib/Core/Resolver.cpp
    lld/trunk/test/core/absolute-basic.objtxt

Modified: lld/trunk/lib/Core/Resolver.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/Core/Resolver.cpp?rev=230614&r1=230613&r2=230614&view=diff
==============================================================================
--- lld/trunk/lib/Core/Resolver.cpp (original)
+++ lld/trunk/lib/Core/Resolver.cpp Wed Feb 25 23:39:57 2015
@@ -383,11 +383,16 @@ void Resolver::deadStripOptimize() {
 
   // Some type of references prevent referring atoms to be dead-striped.
   // Make a reverse map of such references before traversing the graph.
-  for (const Atom *atom : _atoms)
+  // While traversing the list of atoms, mark AbsoluteAtoms as live
+  // in order to avoid reclaim.
+  for (const Atom *atom : _atoms) {
     if (const DefinedAtom *defAtom = dyn_cast<DefinedAtom>(atom))
       for (const Reference *ref : *defAtom)
         if (isBackref(ref))
           _reverseRef[ref->target()].insert(atom);
+    if (const AbsoluteAtom *absAtom = dyn_cast<AbsoluteAtom>(atom))
+      markLive(absAtom);
+  }
 
   // By default, shared libraries are built with all globals as dead strip roots
   if (_context.globalsAreDeadStripRoots())

Modified: lld/trunk/test/core/absolute-basic.objtxt
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/test/core/absolute-basic.objtxt?rev=230614&r1=230613&r2=230614&view=diff
==============================================================================
--- lld/trunk/test/core/absolute-basic.objtxt (original)
+++ lld/trunk/test/core/absolute-basic.objtxt Wed Feb 25 23:39:57 2015
@@ -1,4 +1,4 @@
-# RUN: lld -core %s | FileCheck %s
+# RUN: lld -core --dead-strip %s | FileCheck %s
 
 #
 # Test that absolute symbols are parsed and preserved





More information about the llvm-commits mailing list