summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRui Ueyama <ruiu@google.com>2015-03-09 00:06:07 +0000
committerRui Ueyama <ruiu@google.com>2015-03-09 00:06:07 +0000
commitd18a97cb7a0fe8cac4fc33020e3033cc23d45da8 (patch)
tree91dfe33cc1ccd699c76035ef030db20aa1f98eee
parentf46b190465c9e5472eef1ce924330ae73a707ef9 (diff)
downloadbcm5719-llvm-d18a97cb7a0fe8cac4fc33020e3033cc23d45da8.tar.gz
bcm5719-llvm-d18a97cb7a0fe8cac4fc33020e3033cc23d45da8.zip
PECOFF: Create layout-afters instead of layout-befores.
All readers except PE/COFF reader create layout-after edges to preserve the original symbol order. PE/COFF uses layout-before edges as primary edges for no reason. This patch makes PE/COFF reader to create layout-after edges. Resolver is updated to recognize reverse edges of layout-after edges in the garbage collection pass. Now we can retire layout-before edges. I don't do that in this patch because if I do, I would have updated many tests to replace all occurrrences of "layout-before" with "layout-after". So that's a TODO. llvm-svn: 231615
-rw-r--r--lld/lib/Core/Resolver.cpp2
-rw-r--r--lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp6
-rw-r--r--lld/test/core/sectiongroup-deadstrip.objtxt14
3 files changed, 11 insertions, 11 deletions
diff --git a/lld/lib/Core/Resolver.cpp b/lld/lib/Core/Resolver.cpp
index ef29481998a..393a7ef2bfc 100644
--- a/lld/lib/Core/Resolver.cpp
+++ b/lld/lib/Core/Resolver.cpp
@@ -382,7 +382,7 @@ void Resolver::markLive(const Atom *atom) {
static bool isBackref(const Reference *ref) {
if (ref->kindNamespace() != lld::Reference::KindNamespace::all)
return false;
- return (ref->kindValue() == lld::Reference::kindLayoutBefore ||
+ return (ref->kindValue() == lld::Reference::kindLayoutAfter ||
ref->kindValue() == lld::Reference::kindGroupChild);
}
diff --git a/lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp b/lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
index 6abd68966e3..b044b4590e2 100644
--- a/lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
+++ b/lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp
@@ -747,14 +747,14 @@ std::error_code FileCOFF::AtomizeDefinedSymbols(
if (atoms.size() > 0)
atoms[0]->setAlignment(getAlignment(section));
- // Connect atoms with layout-before edges. It prevents atoms
+ // Connect atoms with layout-after edges. It prevents atoms
// from being GC'ed if there is a reference to one of the atoms
- // in the same layout-before chain. In such case we want to emit
+ // in the same layout-after chain. In such case we want to emit
// all the atoms appeared in the same chain, because the "live"
// atom may reference other atoms in the same chain.
if (atoms.size() >= 2)
for (auto it = atoms.begin(), e = atoms.end(); it + 1 != e; ++it)
- addLayoutEdge(*(it + 1), *it, lld::Reference::kindLayoutBefore);
+ addLayoutEdge(*it, *(it + 1), lld::Reference::kindLayoutAfter);
for (COFFDefinedFileAtom *atom : atoms) {
_sectionAtoms[section].push_back(atom);
diff --git a/lld/test/core/sectiongroup-deadstrip.objtxt b/lld/test/core/sectiongroup-deadstrip.objtxt
index 4965bf84e26..8606c52d62e 100644
--- a/lld/test/core/sectiongroup-deadstrip.objtxt
+++ b/lld/test/core/sectiongroup-deadstrip.objtxt
@@ -18,6 +18,9 @@ defined-atoms:
- name: f1
scope: global
type: code
+ references:
+ - kind: layout-after
+ target: anotherfunction
- name: f2
scope: global
type: code
@@ -42,9 +45,6 @@ defined-atoms:
- name: anotherfunction
scope: global
type: data
- references:
- - kind: layout-before
- target: f1
---
undefined-atoms:
- name: f1
@@ -71,6 +71,10 @@ undefined-atoms:
#CHECK: target: [[GCHILD:[a-zA-Z\.0-9_]+]]
#CHECK: - name: f1
#CHECK: scope: global
+#CHECK: references:
+#CHECK: - kind: layout-after
+#CHECK: offset: 0
+#CHECK: target: anotherfunction
#CHECK: - name: f2
#CHECK: scope: global
#CHECK: - name: d1
@@ -82,7 +86,3 @@ undefined-atoms:
#CHECK: - name: anotherfunction
#CHECK: scope: global
#CHECK: type: data
-#CHECK: references:
-#CHECK: - kind: layout-before
-#CHECK: offset: 0
-#CHECK: target: f1
OpenPOWER on IntegriCloud