From d18a97cb7a0fe8cac4fc33020e3033cc23d45da8 Mon Sep 17 00:00:00 2001 From: Rui Ueyama Date: Mon, 9 Mar 2015 00:06:07 +0000 Subject: [PATCH] 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 --- lld/lib/Core/Resolver.cpp | 2 +- lld/lib/ReaderWriter/PECOFF/ReaderCOFF.cpp | 6 +++--- lld/test/core/sectiongroup-deadstrip.objtxt | 14 +++++++------- 3 files changed, 11 insertions(+), 11 deletions(-) diff --git a/lld/lib/Core/Resolver.cpp b/lld/lib/Core/Resolver.cpp index ef29481..393a7ef 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 6abd689..b044b45 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 4965bf8..8606c52 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 -- 2.7.4