From: Rui Ueyama Date: Tue, 3 Jun 2014 03:07:49 +0000 (+0000) Subject: Remove group-parent references. X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=9aee050a0cdcae535c8fd43b172df05f607948cd;p=platform%2Fupstream%2Fllvm.git Remove group-parent references. Previously section groups are doubly linked to their children. That is, an atom representing a group has group-child references to its group contents, and content atoms also have group-parent references to the group atom. That relationship was invariant; if X has a group-child edge to Y, Y must have a group-parent edge to X. However we were not using group-parent references at all. The resolver only needs group-child edges. This patch simplifies the section group by removing the unused reverse edge. No functionality change intended. Differential Revision: http://reviews.llvm.org/D3945 llvm-svn: 210066 --- diff --git a/lld/docs/design.rst b/lld/docs/design.rst index 1e640a9..06d3565 100644 --- a/lld/docs/design.rst +++ b/lld/docs/design.rst @@ -170,8 +170,7 @@ outside the '.group'. In lld the the '.group' sections with COMDAT are identified by contentType( typeGroupComdat). The '.group' members are identified by using -**kindGroupChild** references. The group child members have a reference to the -group section by using **kindGroupParent** references. +**kindGroupChild** references. The point to be noted here is the 'group child' members would need to be emitted in the output file **iff** the group was selected by the resolver. diff --git a/lld/include/lld/Core/Reference.h b/lld/include/lld/Core/Reference.h index 5283197..70aba25 100644 --- a/lld/include/lld/Core/Reference.h +++ b/lld/include/lld/Core/Reference.h @@ -89,8 +89,8 @@ public: // kindLayoutBefore is currently used only by PECOFF port, and will // be removed soon. To enforce layout, use kindLayoutAfter instead. kindLayoutBefore = 3, + // kindGroupChild is treated as a bidirected edge too. kindGroupChild = 4, - kindGroupParent = 5 }; // A value to be added to the value of a target diff --git a/lld/lib/Core/Resolver.cpp b/lld/lib/Core/Resolver.cpp index b73d80a..ba4b61b 100644 --- a/lld/lib/Core/Resolver.cpp +++ b/lld/lib/Core/Resolver.cpp @@ -321,8 +321,10 @@ void Resolver::markLive(const Atom *atom) { } static bool isBackref(const Reference *ref) { - return ref->kindNamespace() == lld::Reference::KindNamespace::all && - ref->kindValue() == lld::Reference::kindLayoutBefore; + if (ref->kindNamespace() != lld::Reference::KindNamespace::all) + return false; + return (ref->kindValue() == lld::Reference::kindLayoutBefore || + ref->kindValue() == lld::Reference::kindGroupChild); } // remove all atoms not actually used diff --git a/lld/lib/ReaderWriter/Reader.cpp b/lld/lib/ReaderWriter/Reader.cpp index 34887c2..18fe9c9 100644 --- a/lld/lib/ReaderWriter/Reader.cpp +++ b/lld/lib/ReaderWriter/Reader.cpp @@ -58,7 +58,6 @@ static const Registry::KindStrings kindStrings[] = { {Reference::kindLayoutAfter, "layout-after"}, {Reference::kindLayoutBefore, "layout-before"}, {Reference::kindGroupChild, "group-child"}, - {Reference::kindGroupParent, "group-parent"}, LLD_KIND_STRING_END}; Registry::Registry() { diff --git a/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp b/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp index 90ec430..208a092 100644 --- a/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp +++ b/lld/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp @@ -183,18 +183,14 @@ public: const lld::Atom *lookup(StringRef name) const { NameToAtom::const_iterator pos = _nameMap.find(name); - if (pos != _nameMap.end()) { - return pos->second; - } else if ((pos = _groupChild.find(name)) != _groupChild.end()) { + if (pos != _nameMap.end()) return pos->second; - } else { - _io.setError(Twine("no such atom name: ") + name); - return nullptr; - } + _io.setError(Twine("no such atom name: ") + name); + return nullptr; } /// \brief Lookup a group parent when there is a reference of type - /// kindGroupParent. If there was no group-parent produce an appropriate + /// kindGroupChild. If there was no group-parent produce an appropriate /// error. const lld::Atom *lookupGroupParent(StringRef name) const { NameToAtom::const_iterator pos = _groupMap.find(name); @@ -204,30 +200,10 @@ public: return nullptr; } - /// \brief Lookup a group child when there is a reference of type - /// kindGroupChild. If there was no group-child produce an appropriate - /// error. - const lld::Atom *lookupGroupChild(StringRef name) const { - NameToAtom::const_iterator pos = _groupChild.find(name); - if (pos != _groupChild.end()) - return pos->second; - _io.setError(Twine("no such group child: ") + name); - return nullptr; - } - private: typedef llvm::StringMap NameToAtom; void add(StringRef name, const lld::Atom *atom, bool isGroupChild = false) { - if (isGroupChild) { - if (_groupChild.count(name)) { - _io.setError(Twine("duplicate group child: ") + name); - } else { - _groupChild[name] = atom; - } - return; - } - if (const lld::DefinedAtom *da = dyn_cast(atom)) { if (da->isGroupParent()) { if (_groupMap.count(name)) { @@ -248,7 +224,6 @@ private: IO &_io; NameToAtom _nameMap; NameToAtom _groupMap; - NameToAtom _groupChild; }; // Used in NormalizedFile to hold the atoms lists. @@ -836,15 +811,8 @@ template <> struct MappingTraits { _deadStrip(atom->deadStrip()), _dynamicExport(atom->dynamicExport()), _permissions(atom->permissions()), _size(atom->size()), _sectionName(atom->customSectionName()) { - for (const lld::Reference *r : *atom) { - // If this is not a group child as yet, lets keep looking - // at all the references. - if (!_isGroupChild && - r->kindNamespace() == lld::Reference::KindNamespace::all && - r->kindValue() == lld::Reference::kindGroupParent) - _isGroupChild = true; + for (const lld::Reference *r : *atom) _references.push_back(r); - } if (!atom->occupiesDiskSpace()) return; ArrayRef cont = atom->rawContent(); @@ -892,6 +860,7 @@ template <> struct MappingTraits { DeadStripKind deadStrip() const override { return _deadStrip; } DynamicExport dynamicExport() const override { return _dynamicExport; } ContentPermissions permissions() const override { return _permissions; } + void setGroupChild(bool val) { _isGroupChild = val; } bool isGroupChild() const { return _isGroupChild; } ArrayRef rawContent() const override { if (!occupiesDiskSpace()) @@ -987,16 +956,6 @@ template <> struct MappingTraits { DefinedAtom::permissions( keys->_contentType)); io.mapOptional("references", keys->_references); - for (const lld::Reference *r : keys->_references) { - // If this is not a group child as yet, lets keep looking - // at all the references. - if (!keys->_isGroupChild && - r->kindNamespace() == lld::Reference::KindNamespace::all && - r->kindValue() == lld::Reference::kindGroupParent) { - keys->_isGroupChild = true; - break; - } - } } }; @@ -1256,17 +1215,14 @@ inline void MappingTraits::NormalizedAtom::bind( inline void MappingTraits::NormalizedReference::bind( const RefNameResolver &resolver) { - if (_mappedKind.ns == lld::Reference::KindNamespace::all) { - if (_mappedKind.value == lld::Reference::kindGroupParent) { - _target = resolver.lookupGroupParent(_targetName); - return; - } - if (_mappedKind.value == lld::Reference::kindGroupChild) { - _target = resolver.lookupGroupChild(_targetName); - return; - } - } + typedef MappingTraits::NormalizedAtom NormalizedAtom; + _target = resolver.lookup(_targetName); + + if (_mappedKind.ns == lld::Reference::KindNamespace::all && + _mappedKind.value == lld::Reference::kindGroupChild) { + ((NormalizedAtom *)_target)->setGroupChild(true); + } } inline StringRef diff --git a/lld/test/core/gnulinkonce-rearrange-resolve.objtxt b/lld/test/core/gnulinkonce-rearrange-resolve.objtxt index dbcc955..2a6386a 100644 --- a/lld/test/core/gnulinkonce-rearrange-resolve.objtxt +++ b/lld/test/core/gnulinkonce-rearrange-resolve.objtxt @@ -22,27 +22,15 @@ defined-atoms: - name: f1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: f2 scope: global type: code - references: - - kind: group-parent - target: g1 - name: g1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: d1 scope: global type: data - references: - - kind: group-parent - target: g1 --- defined-atoms: - name: g1 @@ -60,27 +48,15 @@ defined-atoms: - name: f1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: f2 scope: global type: code - references: - - kind: group-parent - target: g1 - name: g1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: d1 scope: global type: data - references: - - kind: group-parent - target: g1 ... # CHECK: defined-atoms: @@ -97,19 +73,7 @@ defined-atoms: # CHECK: - kind: group-child # CHECK: target: d1 # CHECK: - name: f1 -# CHECK: references: -# CHECK: - kind: group-parent -# CHECK: target: [[PARENT]] # CHECK: - name: f2 -# CHECK: references: -# CHECK: - kind: group-parent -# CHECK: target: [[PARENT]] # CHECK: - name: g1 # CHECK: ref-name: [[CHILD]] -# CHECK: references: -# CHECK: - kind: group-parent -# CHECK: target: [[PARENT]] # CHECK: - name: d1 -# CHECK: references: -# CHECK: - kind: group-parent -# CHECK: target: [[PARENT]] diff --git a/lld/test/core/gnulinkonce-remaining-undef.objtxt b/lld/test/core/gnulinkonce-remaining-undef.objtxt index ee5f681..fcd28d2 100644 --- a/lld/test/core/gnulinkonce-remaining-undef.objtxt +++ b/lld/test/core/gnulinkonce-remaining-undef.objtxt @@ -12,27 +12,15 @@ defined-atoms: - name: f1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: f2 scope: global type: code - references: - - kind: group-parent - target: g1 - name: g1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: d1 scope: global type: data - references: - - kind: group-parent - target: g1 - name: g1 scope: global type: gnu-linkonce @@ -56,33 +44,18 @@ defined-atoms: - name: f1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: f2 scope: global type: code - references: - - kind: group-parent - target: g1 - name: f3 scope: global type: code - references: - - kind: group-parent - target: g1 - name: g1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: d1 scope: global type: data - references: - - kind: group-parent - target: g1 - name: g1 scope: global type: gnu-linkonce @@ -97,6 +70,7 @@ defined-atoms: target: g1 - kind: group-child target: d1 +--- undefined-atoms: - name: f3 can-be-null: never diff --git a/lld/test/core/gnulinkonce-resolve.objtxt b/lld/test/core/gnulinkonce-resolve.objtxt index ff099a5..f648bce 100644 --- a/lld/test/core/gnulinkonce-resolve.objtxt +++ b/lld/test/core/gnulinkonce-resolve.objtxt @@ -10,27 +10,15 @@ defined-atoms: - name: f1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: f2 scope: global type: code - references: - - kind: group-parent - target: g1 - name: g1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: d1 scope: global type: data - references: - - kind: group-parent - target: g1 - name: g1 scope: global type: gnu-linkonce @@ -48,27 +36,15 @@ defined-atoms: - name: f1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: f2 scope: global type: code - references: - - kind: group-parent - target: g1 - name: g1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: d1 scope: global type: data - references: - - kind: group-parent - target: g1 - name: g1 scope: global type: gnu-linkonce @@ -104,30 +80,14 @@ defined-atoms: #CHECK: - name: f1 #CHECK: ref-name: [[GCHILDONE]] #CHECK: scope: global -#CHECK: references: -#CHECK: - kind: group-parent -#CHECK: offset: 0 -#CHECK: target: [[PARENT]] #CHECK: - name: f2 #CHECK: ref-name: [[GCHILDTWO]] #CHECK: scope: global -#CHECK: references: -#CHECK: - kind: group-parent -#CHECK: offset: 0 -#CHECK: target: [[PARENT]] #CHECK: - name: g1 #CHECK: ref-name: [[GCHILDTHREE]] #CHECK: scope: global -#CHECK: references: -#CHECK: - kind: group-parent -#CHECK: offset: 0 -#CHECK: target: [[PARENT]] #CHECK: - name: d1 #CHECK: ref-name: [[GCHILDFOUR]] #CHECK: scope: global #CHECK: type: data -#CHECK: references: -#CHECK: - kind: group-parent -#CHECK: offset: 0 -#CHECK: target: [[PARENT]] #CHECK: ... diff --git a/lld/test/core/gnulinkonce-simple.objtxt b/lld/test/core/gnulinkonce-simple.objtxt index 1a96b62..0f07645 100644 --- a/lld/test/core/gnulinkonce-simple.objtxt +++ b/lld/test/core/gnulinkonce-simple.objtxt @@ -10,27 +10,15 @@ defined-atoms: - name: f1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: f2 scope: global type: code - references: - - kind: group-parent - target: g1 - name: g1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: d1 scope: global type: data - references: - - kind: group-parent - target: g1 - name: g1 scope: global type: gnu-linkonce @@ -49,7 +37,7 @@ defined-atoms: references: - kind: layout-before target: f1 - +--- undefined-atoms: - name: f1 can-be-null: never @@ -76,32 +64,16 @@ undefined-atoms: #CHECK: - name: f1 #CHECK: ref-name: [[GCHILDONE]] #CHECK: scope: global -#CHECK: references: -#CHECK: - kind: group-parent -#CHECK: offset: 0 -#CHECK: target: [[PARENT]] #CHECK: - name: f2 #CHECK: ref-name: [[GCHILDTWO]] #CHECK: scope: global -#CHECK: references: -#CHECK: - kind: group-parent -#CHECK: offset: 0 -#CHECK: target: [[PARENT]] #CHECK: - name: d1 #CHECK: ref-name: [[GCHILDTHREE]] #CHECK: scope: global #CHECK: type: data -#CHECK: references: -#CHECK: - kind: group-parent -#CHECK: offset: 0 -#CHECK: target: [[PARENT]] #CHECK: - name: g1 #CHECK: ref-name: [[GCHILDFOUR]] #CHECK: scope: global -#CHECK: references: -#CHECK: - kind: group-parent -#CHECK: offset: 0 -#CHECK: target: [[PARENT]] #CHECK: - name: anotherfunction #CHECK: scope: global #CHECK: type: data diff --git a/lld/test/core/sectiongroup-gnulinkonce-error.objtxt b/lld/test/core/sectiongroup-gnulinkonce-error.objtxt index 7043d3f..4759895 100644 --- a/lld/test/core/sectiongroup-gnulinkonce-error.objtxt +++ b/lld/test/core/sectiongroup-gnulinkonce-error.objtxt @@ -10,27 +10,15 @@ defined-atoms: - name: f1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: f2 scope: global type: code - references: - - kind: group-parent - target: g1 - name: g1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: d1 scope: global type: data - references: - - kind: group-parent - target: g1 - name: g1 scope: global type: group-comdat @@ -48,27 +36,15 @@ defined-atoms: - name: f1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: f2 scope: global type: code - references: - - kind: group-parent - target: g1 - name: g1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: d1 scope: global type: data - references: - - kind: group-parent - target: g1 - name: g1 scope: global type: gnu-linkonce diff --git a/lld/test/core/sectiongroup-rearrange-resolve.objtxt b/lld/test/core/sectiongroup-rearrange-resolve.objtxt index 01d305c..7f5d260 100644 --- a/lld/test/core/sectiongroup-rearrange-resolve.objtxt +++ b/lld/test/core/sectiongroup-rearrange-resolve.objtxt @@ -22,27 +22,15 @@ defined-atoms: - name: f1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: f2 scope: global type: code - references: - - kind: group-parent - target: g1 - name: g1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: d1 scope: global type: data - references: - - kind: group-parent - target: g1 --- defined-atoms: - name: g1 @@ -60,27 +48,15 @@ defined-atoms: - name: f1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: f2 scope: global type: code - references: - - kind: group-parent - target: g1 - name: g1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: d1 scope: global type: data - references: - - kind: group-parent - target: g1 ... # CHECK: defined-atoms: @@ -97,19 +73,7 @@ defined-atoms: # CHECK: - kind: group-child # CHECK: target: d1 # CHECK: - name: f1 -# CHECK: references: -# CHECK: - kind: group-parent -# CHECK: target: [[PARENT]] # CHECK: - name: f2 -# CHECK: references: -# CHECK: - kind: group-parent -# CHECK: target: [[PARENT]] # CHECK: - name: g1 # CHECK: ref-name: [[CHILD]] -# CHECK: references: -# CHECK: - kind: group-parent -# CHECK: target: [[PARENT]] # CHECK: - name: d1 -# CHECK: references: -# CHECK: - kind: group-parent -# CHECK: target: [[PARENT]] diff --git a/lld/test/core/sectiongroup-remaining-undef.objtxt b/lld/test/core/sectiongroup-remaining-undef.objtxt index faa9b6a..f1323d0 100644 --- a/lld/test/core/sectiongroup-remaining-undef.objtxt +++ b/lld/test/core/sectiongroup-remaining-undef.objtxt @@ -12,27 +12,15 @@ defined-atoms: - name: f1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: f2 scope: global type: code - references: - - kind: group-parent - target: g1 - name: g1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: d1 scope: global type: data - references: - - kind: group-parent - target: g1 - name: g1 scope: global type: group-comdat @@ -56,33 +44,18 @@ defined-atoms: - name: f1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: f2 scope: global type: code - references: - - kind: group-parent - target: g1 - name: f3 scope: global type: code - references: - - kind: group-parent - target: g1 - name: g1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: d1 scope: global type: data - references: - - kind: group-parent - target: g1 - name: g1 scope: global type: group-comdat @@ -97,6 +70,7 @@ defined-atoms: target: g1 - kind: group-child target: d1 +--- undefined-atoms: - name: f3 can-be-null: never diff --git a/lld/test/core/sectiongroup-resolve.objtxt b/lld/test/core/sectiongroup-resolve.objtxt index ab03f64..7e75e7c 100644 --- a/lld/test/core/sectiongroup-resolve.objtxt +++ b/lld/test/core/sectiongroup-resolve.objtxt @@ -10,27 +10,15 @@ defined-atoms: - name: f1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: f2 scope: global type: code - references: - - kind: group-parent - target: g1 - name: g1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: d1 scope: global type: data - references: - - kind: group-parent - target: g1 - name: g1 scope: global type: group-comdat @@ -48,27 +36,15 @@ defined-atoms: - name: f1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: f2 scope: global type: code - references: - - kind: group-parent - target: g1 - name: g1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: d1 scope: global type: data - references: - - kind: group-parent - target: g1 - name: g1 scope: global type: group-comdat @@ -104,30 +80,14 @@ defined-atoms: #CHECK: - name: f1 #CHECK: ref-name: [[GCHILDONE]] #CHECK: scope: global -#CHECK: references: -#CHECK: - kind: group-parent -#CHECK: offset: 0 -#CHECK: target: [[PARENT]] #CHECK: - name: f2 #CHECK: ref-name: [[GCHILDTWO]] #CHECK: scope: global -#CHECK: references: -#CHECK: - kind: group-parent -#CHECK: offset: 0 -#CHECK: target: [[PARENT]] #CHECK: - name: g1 #CHECK: ref-name: [[GCHILDTHREE]] #CHECK: scope: global -#CHECK: references: -#CHECK: - kind: group-parent -#CHECK: offset: 0 -#CHECK: target: [[PARENT]] #CHECK: - name: d1 #CHECK: ref-name: [[GCHILDFOUR]] #CHECK: scope: global #CHECK: type: data -#CHECK: references: -#CHECK: - kind: group-parent -#CHECK: offset: 0 -#CHECK: target: [[PARENT]] #CHECK: ... diff --git a/lld/test/core/sectiongroup-simple.objtxt b/lld/test/core/sectiongroup-simple.objtxt index d754509..f6258e1 100644 --- a/lld/test/core/sectiongroup-simple.objtxt +++ b/lld/test/core/sectiongroup-simple.objtxt @@ -10,27 +10,15 @@ defined-atoms: - name: f1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: f2 scope: global type: code - references: - - kind: group-parent - target: g1 - name: g1 scope: global type: code - references: - - kind: group-parent - target: g1 - name: d1 scope: global type: data - references: - - kind: group-parent - target: g1 - name: g1 scope: global type: group-comdat @@ -49,7 +37,7 @@ defined-atoms: references: - kind: layout-before target: f1 - +--- undefined-atoms: - name: f1 can-be-null: never @@ -76,32 +64,16 @@ undefined-atoms: #CHECK: - name: f1 #CHECK: ref-name: [[GCHILDONE]] #CHECK: scope: global -#CHECK: references: -#CHECK: - kind: group-parent -#CHECK: offset: 0 -#CHECK: target: [[PARENT]] #CHECK: - name: f2 #CHECK: ref-name: [[GCHILDTWO]] #CHECK: scope: global -#CHECK: references: -#CHECK: - kind: group-parent -#CHECK: offset: 0 -#CHECK: target: [[PARENT]] #CHECK: - name: d1 #CHECK: ref-name: [[GCHILDTHREE]] #CHECK: scope: global #CHECK: type: data -#CHECK: references: -#CHECK: - kind: group-parent -#CHECK: offset: 0 -#CHECK: target: [[PARENT]] #CHECK: - name: g1 #CHECK: ref-name: [[GCHILDFOUR]] #CHECK: scope: global -#CHECK: references: -#CHECK: - kind: group-parent -#CHECK: offset: 0 -#CHECK: target: [[PARENT]] #CHECK: - name: anotherfunction #CHECK: scope: global #CHECK: type: data