forked from OSchip/llvm-project
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
This commit is contained in:
parent
f46b190465
commit
d18a97cb7a
|
|
@ -382,7 +382,7 @@ void Resolver::markLive(const Atom *atom) {
|
||||||
static bool isBackref(const Reference *ref) {
|
static bool isBackref(const Reference *ref) {
|
||||||
if (ref->kindNamespace() != lld::Reference::KindNamespace::all)
|
if (ref->kindNamespace() != lld::Reference::KindNamespace::all)
|
||||||
return false;
|
return false;
|
||||||
return (ref->kindValue() == lld::Reference::kindLayoutBefore ||
|
return (ref->kindValue() == lld::Reference::kindLayoutAfter ||
|
||||||
ref->kindValue() == lld::Reference::kindGroupChild);
|
ref->kindValue() == lld::Reference::kindGroupChild);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -747,14 +747,14 @@ std::error_code FileCOFF::AtomizeDefinedSymbols(
|
||||||
if (atoms.size() > 0)
|
if (atoms.size() > 0)
|
||||||
atoms[0]->setAlignment(getAlignment(section));
|
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
|
// 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"
|
// all the atoms appeared in the same chain, because the "live"
|
||||||
// atom may reference other atoms in the same chain.
|
// atom may reference other atoms in the same chain.
|
||||||
if (atoms.size() >= 2)
|
if (atoms.size() >= 2)
|
||||||
for (auto it = atoms.begin(), e = atoms.end(); it + 1 != e; ++it)
|
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) {
|
for (COFFDefinedFileAtom *atom : atoms) {
|
||||||
_sectionAtoms[section].push_back(atom);
|
_sectionAtoms[section].push_back(atom);
|
||||||
|
|
|
||||||
|
|
@ -18,6 +18,9 @@ defined-atoms:
|
||||||
- name: f1
|
- name: f1
|
||||||
scope: global
|
scope: global
|
||||||
type: code
|
type: code
|
||||||
|
references:
|
||||||
|
- kind: layout-after
|
||||||
|
target: anotherfunction
|
||||||
- name: f2
|
- name: f2
|
||||||
scope: global
|
scope: global
|
||||||
type: code
|
type: code
|
||||||
|
|
@ -42,9 +45,6 @@ defined-atoms:
|
||||||
- name: anotherfunction
|
- name: anotherfunction
|
||||||
scope: global
|
scope: global
|
||||||
type: data
|
type: data
|
||||||
references:
|
|
||||||
- kind: layout-before
|
|
||||||
target: f1
|
|
||||||
---
|
---
|
||||||
undefined-atoms:
|
undefined-atoms:
|
||||||
- name: f1
|
- name: f1
|
||||||
|
|
@ -71,6 +71,10 @@ undefined-atoms:
|
||||||
#CHECK: target: [[GCHILD:[a-zA-Z\.0-9_]+]]
|
#CHECK: target: [[GCHILD:[a-zA-Z\.0-9_]+]]
|
||||||
#CHECK: - name: f1
|
#CHECK: - name: f1
|
||||||
#CHECK: scope: global
|
#CHECK: scope: global
|
||||||
|
#CHECK: references:
|
||||||
|
#CHECK: - kind: layout-after
|
||||||
|
#CHECK: offset: 0
|
||||||
|
#CHECK: target: anotherfunction
|
||||||
#CHECK: - name: f2
|
#CHECK: - name: f2
|
||||||
#CHECK: scope: global
|
#CHECK: scope: global
|
||||||
#CHECK: - name: d1
|
#CHECK: - name: d1
|
||||||
|
|
@ -82,7 +86,3 @@ undefined-atoms:
|
||||||
#CHECK: - name: anotherfunction
|
#CHECK: - name: anotherfunction
|
||||||
#CHECK: scope: global
|
#CHECK: scope: global
|
||||||
#CHECK: type: data
|
#CHECK: type: data
|
||||||
#CHECK: references:
|
|
||||||
#CHECK: - kind: layout-before
|
|
||||||
#CHECK: offset: 0
|
|
||||||
#CHECK: target: f1
|
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue