diff options
| -rw-r--r-- | lld/include/lld/Core/Reference.h | 9 | ||||
| -rw-r--r-- | lld/include/lld/Passes/LayoutPass.h | 4 | ||||
| -rw-r--r-- | lld/lib/Core/Reader.cpp | 1 | ||||
| -rw-r--r-- | lld/lib/Passes/LayoutPass.cpp | 71 | ||||
| -rw-r--r-- | lld/lib/ReaderWriter/ELF/ELFFile.h | 9 | ||||
| -rw-r--r-- | lld/test/core/ingroup-test-big.objtxt | 57 | ||||
| -rw-r--r-- | lld/test/core/ingroup-test-loop.objtxt | 20 | ||||
| -rw-r--r-- | lld/test/core/ingroup-test-with-layout-after.objtxt | 50 | ||||
| -rw-r--r-- | lld/test/core/ingroup-test.objtxt | 38 | ||||
| -rw-r--r-- | lld/test/elf/Mips/ctors-order.test | 9 | ||||
| -rw-r--r-- | lld/test/elf/Mips/dynlib-dynsym-micro.test | 2 | ||||
| -rw-r--r-- | lld/test/elf/Mips/dynlib-dynsym.test | 2 | ||||
| -rw-r--r-- | lld/test/elf/Mips/got16-micro.test | 20 |
13 files changed, 18 insertions, 274 deletions
diff --git a/lld/include/lld/Core/Reference.h b/lld/include/lld/Core/Reference.h index cbe574445e1..181d4583cb3 100644 --- a/lld/include/lld/Core/Reference.h +++ b/lld/include/lld/Core/Reference.h @@ -82,16 +82,15 @@ public: /// KindValues used with KindNamespace::all and KindArch::all. enum { - kindInGroup = 1, // kindLayoutAfter is treated as a bidirected edge by the dead-stripping // pass. - kindLayoutAfter = 2, + kindLayoutAfter = 1, // kindLayoutBefore is currently used only by PECOFF port, and will // be removed soon. To enforce layout, use kindLayoutAfter instead. - kindLayoutBefore = 3, + kindLayoutBefore, // kindGroupChild is treated as a bidirected edge too. - kindGroupChild = 4, - kindAssociate = 5, + kindGroupChild, + kindAssociate, }; // A value to be added to the value of a target diff --git a/lld/include/lld/Passes/LayoutPass.h b/lld/include/lld/Passes/LayoutPass.h index 9d28c062d51..9275d6f517d 100644 --- a/lld/include/lld/Passes/LayoutPass.h +++ b/lld/include/lld/Passes/LayoutPass.h @@ -52,10 +52,6 @@ private: // reference type void buildFollowOnTable(MutableFile::DefinedAtomRange &range); - // Build the followOn atoms chain as specified by the kindInGroup - // reference type - void buildInGroupTable(MutableFile::DefinedAtomRange &range); - // Build a map of Atoms to ordinals for sorting the atoms void buildOrdinalOverrideMap(MutableFile::DefinedAtomRange &range); diff --git a/lld/lib/Core/Reader.cpp b/lld/lib/Core/Reader.cpp index 6027c14ebfe..96a0c450391 100644 --- a/lld/lib/Core/Reader.cpp +++ b/lld/lib/Core/Reader.cpp @@ -52,7 +52,6 @@ Registry::loadFile(std::unique_ptr<MemoryBuffer> mb, } static const Registry::KindStrings kindStrings[] = { - {Reference::kindInGroup, "in-group"}, {Reference::kindLayoutAfter, "layout-after"}, {Reference::kindLayoutBefore, "layout-before"}, {Reference::kindGroupChild, "group-child"}, diff --git a/lld/lib/Passes/LayoutPass.cpp b/lld/lib/Passes/LayoutPass.cpp index 1ac4ee0b5dd..89fd1350af1 100644 --- a/lld/lib/Passes/LayoutPass.cpp +++ b/lld/lib/Passes/LayoutPass.cpp @@ -400,74 +400,6 @@ void LayoutPass::buildFollowOnTable(MutableFile::DefinedAtomRange &range) { } } -/// This pass builds the followon tables using InGroup relationships -/// The algorithm follows a very simple approach -/// a) If the rootAtom is not part of any root, create a new root with the -/// as the head -/// b) If the current Atom root is not found, then make the current atoms root -/// point to the rootAtom -/// c) If the root of the current Atom is itself a root of some other tree -/// make all the atoms in the chain point to the ingroup reference -/// d) Check to see if the current atom is part of the chain from the rootAtom -/// if not add the atom to the chain, so that the current atom is part of the -/// the chain where the rootAtom is in -void LayoutPass::buildInGroupTable(MutableFile::DefinedAtomRange &range) { - ScopedTask task(getDefaultDomain(), "LayoutPass::buildInGroupTable"); - // This table would convert precededby references to follow on - // references so that we have only one table - for (const DefinedAtom *ai : range) { - for (const Reference *r : *ai) { - if (r->kindNamespace() != lld::Reference::KindNamespace::all || - r->kindValue() != lld::Reference::kindInGroup) - continue; - const DefinedAtom *rootAtom = dyn_cast<DefinedAtom>(r->target()); - // If the root atom is not part of any root - // create a new root - if (_followOnRoots.count(rootAtom) == 0) { - _followOnRoots[rootAtom] = rootAtom; - } - // If the current Atom has not been seen yet and there is no root - // that has been set, set the root of the atom to the targetAtom - // as the targetAtom points to the ingroup root - auto iter = _followOnRoots.find(ai); - if (iter == _followOnRoots.end()) { - _followOnRoots[ai] = rootAtom; - } else if (iter->second == ai) { - if (iter->second != rootAtom) - setChainRoot(iter->second, rootAtom); - } else { - // TODO : Flag an error that the root of the tree - // is different, Here is an example - // Say there are atoms - // chain 1 : a->b->c - // chain 2 : d->e->f - // and e,f have their ingroup reference as a - // this could happen only if the root of e,f that is d - // has root as 'a' - continue; - } - - // Check if the current atom is part of the chain - bool isAtomInChain = false; - const DefinedAtom *lastAtom = rootAtom; - for (;;) { - AtomToAtomT::iterator followOnAtomsIter = - _followOnNexts.find(lastAtom); - if (followOnAtomsIter != _followOnNexts.end()) { - lastAtom = followOnAtomsIter->second; - if (lastAtom != ai) - continue; - isAtomInChain = true; - } - break; - } - - if (!isAtomInChain) - _followOnNexts[lastAtom] = ai; - } - } -} - /// Build an ordinal override map by traversing the followon chain, and /// assigning ordinals to each atom, if the atoms have their ordinals /// already assigned skip the atom and move to the next. This is the @@ -520,9 +452,6 @@ void LayoutPass::perform(std::unique_ptr<MutableFile> &mergedFile) { // Build follow on tables buildFollowOnTable(atomRange); - // Build Ingroup reference table - buildInGroupTable(atomRange); - // Check the structure of followon graph if running in debug mode. DEBUG(checkFollowonChain(atomRange)); diff --git a/lld/lib/ReaderWriter/ELF/ELFFile.h b/lld/lib/ReaderWriter/ELF/ELFFile.h index 6be5fca9514..bddb56fb25f 100644 --- a/lld/lib/ReaderWriter/ELF/ELFFile.h +++ b/lld/lib/ReaderWriter/ELF/ELFFile.h @@ -632,7 +632,6 @@ template <class ELFT> std::error_code ELFFile<ELFT>::createAtoms() { } ELFDefinedAtom<ELFT> *previousAtom = nullptr; - ELFDefinedAtom<ELFT> *inGroupAtom = nullptr; ELFReference<ELFT> *anonFollowedBy = nullptr; for (auto si = symbols.begin(), se = symbols.end(); si != se; ++si) { @@ -717,20 +716,12 @@ template <class ELFT> std::error_code ELFFile<ELFT>::createAtoms() { // Set the followon atom to the weak atom that we have created, so // that they would alias when the file gets written. followOn->setTarget(anonAtom ? anonAtom : newAtom); - - // Add a preceded-by reference only if the current atom is not a weak - // atom. - if (symbol->getBinding() != llvm::ELF::STB_WEAK) - createEdge(newAtom, inGroupAtom, lld::Reference::kindInGroup); } // The previous atom is always the atom created before unless the atom // is a weak atom. previousAtom = anonAtom ? anonAtom : newAtom; - if (!inGroupAtom) - inGroupAtom = previousAtom; - _definedAtoms._atoms.push_back(newAtom); _symbolToAtomMapping.insert(std::make_pair(&*symbol, newAtom)); if (anonAtom) { diff --git a/lld/test/core/ingroup-test-big.objtxt b/lld/test/core/ingroup-test-big.objtxt deleted file mode 100644 index f666328bb4c..00000000000 --- a/lld/test/core/ingroup-test-big.objtxt +++ /dev/null @@ -1,57 +0,0 @@ -# RUN: lld -core --add-pass layout %s | FileCheck %s -check-prefix=CHKORDER - ---- -defined-atoms: - - name: A - scope: global - references: - - kind: layout-after - offset: 0 - target: B - - name: B - scope: global - references: - - kind: in-group - offset: 0 - target: A - - kind: layout-after - offset: 0 - target: C - - name: C - scope: global - references: - - kind: in-group - offset: 0 - target: A - - name: E - scope: global - references: - - kind: in-group - offset: 0 - target: E - - kind: layout-after - offset: 0 - target: F - - name: F - scope: global - references: - - kind: in-group - offset: 0 - target: E - - name: D - scope: global - references: - - kind: in-group - offset: 0 - target: A - - kind: layout-after - offset: 0 - target: E -... - -# CHKORDER: - name: A -# CHKORDER: - name: B -# CHKORDER: - name: C -# CHKORDER: - name: D -# CHKORDER: - name: E -# CHKORDER: - name: F diff --git a/lld/test/core/ingroup-test-loop.objtxt b/lld/test/core/ingroup-test-loop.objtxt deleted file mode 100644 index b22dcb8b589..00000000000 --- a/lld/test/core/ingroup-test-loop.objtxt +++ /dev/null @@ -1,20 +0,0 @@ -# RUN: lld -core --add-pass layout %s | FileCheck %s -check-prefix=CHKORDER - ---- -defined-atoms: - - name: A - scope: global - references: - - kind: layout-after - offset: 0 - target: E - - name: E - scope: global - references: - - kind: in-group - offset: 0 - target: A -... - -# CHKORDER: - name: A -# CHKORDER: - name: E diff --git a/lld/test/core/ingroup-test-with-layout-after.objtxt b/lld/test/core/ingroup-test-with-layout-after.objtxt deleted file mode 100644 index d93e194446d..00000000000 --- a/lld/test/core/ingroup-test-with-layout-after.objtxt +++ /dev/null @@ -1,50 +0,0 @@ -# RUN: lld -core --add-pass layout %s | FileCheck %s -check-prefix=CHKORDER - ---- -defined-atoms: - - name: A - scope: global - references: - - kind: layout-after - offset: 0 - target: B - - name: B - scope: global - references: - - kind: in-group - offset: 0 - target: A - - kind: layout-after - offset: 0 - target: E - - name: F - scope: global - references: - - kind: in-group - offset: 0 - target: E - - kind: layout-after - offset: 0 - target: G - - name: G - scope: global - references: - - kind: in-group - offset: 0 - target: E - - name: E - scope: global - references: - - kind: in-group - offset: 0 - target: A - - kind: layout-after - offset: 0 - target: F -... - -# CHKORDER: - name: A -# CHKORDER: - name: B -# CHKORDER: - name: E -# CHKORDER: - name: F -# CHKORDER: - name: G diff --git a/lld/test/core/ingroup-test.objtxt b/lld/test/core/ingroup-test.objtxt deleted file mode 100644 index b5eeebe73c7..00000000000 --- a/lld/test/core/ingroup-test.objtxt +++ /dev/null @@ -1,38 +0,0 @@ -# RUN: lld -core --add-pass layout %s | FileCheck %s -check-prefix=CHKORDER - ---- -defined-atoms: - - name: A - scope: global - - - name: B - scope: global - references: - - kind: in-group - offset: 0 - target: A - - name: F - scope: global - references: - - kind: in-group - offset: 0 - target: E - - name: G - scope: global - references: - - kind: in-group - offset: 0 - target: E - - name: E - scope: global - references: - - kind: in-group - offset: 0 - target: A -... - -# CHKORDER: - name: A -# CHKORDER: - name: B -# CHKORDER: - name: E -# CHKORDER: - name: F -# CHKORDER: - name: G diff --git a/lld/test/elf/Mips/ctors-order.test b/lld/test/elf/Mips/ctors-order.test index b8bf0126f69..9c2d0d12d1e 100644 --- a/lld/test/elf/Mips/ctors-order.test +++ b/lld/test/elf/Mips/ctors-order.test @@ -10,8 +10,7 @@ # RUN: llvm-objdump -s %t.so | FileCheck -check-prefix=RAW %s # CHECK: defined-atoms: -# CHECK-NEXT: - ref-name: L000 -# CHECK-NEXT: type: data +# CHECK-NEXT: - type: data # CHECK-NEXT: alignment: 2^2 # CHECK-NEXT: section-choice: custom-required # CHECK-NEXT: section-name: .ctors @@ -25,10 +24,6 @@ # CHECK-NEXT: alignment: 2^2 # CHECK-NEXT: section-choice: custom-required # CHECK-NEXT: section-name: .ctors -# CHECK-NEXT: references: -# CHECK-NEXT: - kind: in-group -# CHECK-NEXT: offset: 0 -# CHECK-NEXT: target: L000 # CHECK-NEXT: - type: data # CHECK-NEXT: content: [ 11, 11, 11, 11 ] # CHECK-NEXT: alignment: 2^2 @@ -39,7 +34,7 @@ # CHECK-NEXT: alignment: 2^2 # CHECK-NEXT: section-choice: custom-required # CHECK-NEXT: section-name: .ctors.2 -# CHECK-NEXT: - ref-name: L005 +# CHECK-NEXT: - ref-name: L003 # CHECK-NEXT: type: data # CHECK-NEXT: alignment: 2^2 # CHECK-NEXT: section-choice: custom-required diff --git a/lld/test/elf/Mips/dynlib-dynsym-micro.test b/lld/test/elf/Mips/dynlib-dynsym-micro.test index bcd4bcf340b..25b54b0bcab 100644 --- a/lld/test/elf/Mips/dynlib-dynsym-micro.test +++ b/lld/test/elf/Mips/dynlib-dynsym-micro.test @@ -122,7 +122,7 @@ # CHECK-GOT: - kind: LLD_R_MIPS_GLOBAL_GOT # CHECK-GOT: offset: 0 # CHECK-GOT: target: ext1 -# CHECK-GOT: - ref-name: L009 +# CHECK-GOT: - ref-name: L008 # CHECK-GOT: type: got # CHECK-GOT: content: [ 00, 00, 00, 00 ] # CHECK-GOT: alignment: 2^2 diff --git a/lld/test/elf/Mips/dynlib-dynsym.test b/lld/test/elf/Mips/dynlib-dynsym.test index c29caa42950..8bef139ba34 100644 --- a/lld/test/elf/Mips/dynlib-dynsym.test +++ b/lld/test/elf/Mips/dynlib-dynsym.test @@ -118,7 +118,7 @@ # CHECK-GOT: - kind: LLD_R_MIPS_GLOBAL_GOT # CHECK-GOT: offset: 0 # CHECK-GOT: target: ext1 -# CHECK-GOT: - ref-name: L009 +# CHECK-GOT: - ref-name: L008 # CHECK-GOT: type: got # CHECK-GOT: content: [ 00, 00, 00, 00 ] # CHECK-GOT: alignment: 2^2 diff --git a/lld/test/elf/Mips/got16-micro.test b/lld/test/elf/Mips/got16-micro.test index c2c48ab1efa..eb642ad05ef 100644 --- a/lld/test/elf/Mips/got16-micro.test +++ b/lld/test/elf/Mips/got16-micro.test @@ -11,7 +11,7 @@ # RUN: | FileCheck -check-prefix RAW %s # Local GOT entries: -# YAML: - ref-name: L002 +# YAML: - ref-name: L001 # YAML-NEXT: type: got # YAML-NEXT: content: [ 00, 00, 00, 00 ] # YAML-NEXT: alignment: 2^2 @@ -22,7 +22,7 @@ # YAML-NEXT: - kind: LLD_R_MIPS_32_HI16 # YAML-NEXT: offset: 0 # YAML-NEXT: target: data_1 -# YAML-NEXT: - ref-name: L003 +# YAML-NEXT: - ref-name: L002 # YAML-NEXT: type: got # YAML-NEXT: content: [ 00, 00, 00, 00 ] # YAML-NEXT: alignment: 2^2 @@ -33,7 +33,7 @@ # YAML-NEXT: - kind: LLD_R_MIPS_32_HI16 # YAML-NEXT: offset: 0 # YAML-NEXT: target: data_2 -# YAML-NEXT: - ref-name: L004 +# YAML-NEXT: - ref-name: L003 # YAML-NEXT: type: got # YAML-NEXT: content: [ 00, 00, 00, 00 ] # YAML-NEXT: alignment: 2^2 @@ -46,7 +46,7 @@ # YAML-NEXT: target: data_h # Global GOT entries: -# YAML-NEXT: - ref-name: L005 +# YAML-NEXT: - ref-name: L004 # YAML-NEXT: type: got # YAML-NEXT: content: [ 00, 00, 00, 00 ] # YAML-NEXT: alignment: 2^2 @@ -60,7 +60,7 @@ # YAML-NEXT: - kind: R_MIPS_32 # YAML-NEXT: offset: 0 # YAML-NEXT: target: bar -# YAML-NEXT: - ref-name: L006 +# YAML-NEXT: - ref-name: L005 # YAML-NEXT: type: got # YAML-NEXT: content: [ 00, 00, 00, 00 ] # YAML-NEXT: alignment: 2^2 @@ -83,25 +83,25 @@ # YAML: references: # YAML-NEXT: - kind: R_MICROMIPS_GOT16 # YAML-NEXT: offset: 0 -# YAML-NEXT: target: L002 +# YAML-NEXT: target: L001 # YAML-NEXT: - kind: R_MICROMIPS_LO16 # YAML-NEXT: offset: 4 # YAML-NEXT: target: data_1 # YAML-NEXT: - kind: R_MICROMIPS_GOT16 # YAML-NEXT: offset: 8 -# YAML-NEXT: target: L003 +# YAML-NEXT: target: L002 # YAML-NEXT: - kind: R_MICROMIPS_LO16 # YAML-NEXT: offset: 12 # YAML-NEXT: target: data_2 # YAML-NEXT: - kind: R_MICROMIPS_GOT16 # YAML-NEXT: offset: 16 -# YAML-NEXT: target: L004 +# YAML-NEXT: target: L003 # YAML-NEXT: - kind: R_MICROMIPS_CALL16 # YAML-NEXT: offset: 20 -# YAML-NEXT: target: L005 +# YAML-NEXT: target: L004 # YAML-NEXT: - kind: R_MICROMIPS_CALL16 # YAML-NEXT: offset: 24 -# YAML-NEXT: target: L006 +# YAML-NEXT: target: L005 # RAW: Disassembly of section .text: # RAW: main: |

