Index: lld/trunk/docs/design.rst =================================================================== --- lld/trunk/docs/design.rst +++ lld/trunk/docs/design.rst @@ -170,8 +170,7 @@ 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. Index: lld/trunk/include/lld/Core/Reference.h =================================================================== --- lld/trunk/include/lld/Core/Reference.h +++ lld/trunk/include/lld/Core/Reference.h @@ -89,8 +89,8 @@ // 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 Index: lld/trunk/lib/Core/Resolver.cpp =================================================================== --- lld/trunk/lib/Core/Resolver.cpp +++ lld/trunk/lib/Core/Resolver.cpp @@ -321,8 +321,10 @@ } 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 Index: lld/trunk/lib/ReaderWriter/Reader.cpp =================================================================== --- lld/trunk/lib/ReaderWriter/Reader.cpp +++ lld/trunk/lib/ReaderWriter/Reader.cpp @@ -58,7 +58,6 @@ {Reference::kindLayoutAfter, "layout-after"}, {Reference::kindLayoutBefore, "layout-before"}, {Reference::kindGroupChild, "group-child"}, - {Reference::kindGroupParent, "group-parent"}, LLD_KIND_STRING_END}; Registry::Registry() { Index: lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp =================================================================== --- lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp +++ lld/trunk/lib/ReaderWriter/YAML/ReaderWriterYAML.cpp @@ -183,18 +183,14 @@ 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 @@ 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 @@ IO &_io; NameToAtom _nameMap; NameToAtom _groupMap; - NameToAtom _groupChild; }; // Used in NormalizedFile to hold the atoms lists. @@ -836,15 +811,8 @@ _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 @@ 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 @@ 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::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 Index: lld/trunk/test/core/gnulinkonce-rearrange-resolve.objtxt =================================================================== --- lld/trunk/test/core/gnulinkonce-rearrange-resolve.objtxt +++ lld/trunk/test/core/gnulinkonce-rearrange-resolve.objtxt @@ -22,27 +22,15 @@ - 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 @@ - 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 @@ # 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]] Index: lld/trunk/test/core/gnulinkonce-remaining-undef.objtxt =================================================================== --- lld/trunk/test/core/gnulinkonce-remaining-undef.objtxt +++ lld/trunk/test/core/gnulinkonce-remaining-undef.objtxt @@ -12,27 +12,15 @@ - 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 @@ - 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 @@ target: g1 - kind: group-child target: d1 +--- undefined-atoms: - name: f3 can-be-null: never Index: lld/trunk/test/core/gnulinkonce-resolve.objtxt =================================================================== --- lld/trunk/test/core/gnulinkonce-resolve.objtxt +++ lld/trunk/test/core/gnulinkonce-resolve.objtxt @@ -10,27 +10,15 @@ - 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 @@ - 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 @@ #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: ... Index: lld/trunk/test/core/gnulinkonce-simple.objtxt =================================================================== --- lld/trunk/test/core/gnulinkonce-simple.objtxt +++ lld/trunk/test/core/gnulinkonce-simple.objtxt @@ -10,27 +10,15 @@ - 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 @@ references: - kind: layout-before target: f1 - +--- undefined-atoms: - name: f1 can-be-null: never @@ -76,32 +64,16 @@ #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 Index: lld/trunk/test/core/sectiongroup-gnulinkonce-error.objtxt =================================================================== --- lld/trunk/test/core/sectiongroup-gnulinkonce-error.objtxt +++ lld/trunk/test/core/sectiongroup-gnulinkonce-error.objtxt @@ -10,27 +10,15 @@ - 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 @@ - 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 Index: lld/trunk/test/core/sectiongroup-rearrange-resolve.objtxt =================================================================== --- lld/trunk/test/core/sectiongroup-rearrange-resolve.objtxt +++ lld/trunk/test/core/sectiongroup-rearrange-resolve.objtxt @@ -22,27 +22,15 @@ - 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 @@ - 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 @@ # 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]] Index: lld/trunk/test/core/sectiongroup-remaining-undef.objtxt =================================================================== --- lld/trunk/test/core/sectiongroup-remaining-undef.objtxt +++ lld/trunk/test/core/sectiongroup-remaining-undef.objtxt @@ -12,27 +12,15 @@ - 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 @@ - 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 @@ target: g1 - kind: group-child target: d1 +--- undefined-atoms: - name: f3 can-be-null: never Index: lld/trunk/test/core/sectiongroup-resolve.objtxt =================================================================== --- lld/trunk/test/core/sectiongroup-resolve.objtxt +++ lld/trunk/test/core/sectiongroup-resolve.objtxt @@ -10,27 +10,15 @@ - 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 @@ - 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 @@ #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: ... Index: lld/trunk/test/core/sectiongroup-simple.objtxt =================================================================== --- lld/trunk/test/core/sectiongroup-simple.objtxt +++ lld/trunk/test/core/sectiongroup-simple.objtxt @@ -10,27 +10,15 @@ - 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 @@ references: - kind: layout-before target: f1 - +--- undefined-atoms: - name: f1 can-be-null: never @@ -76,32 +64,16 @@ #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