diff --git a/lld/lib/ReaderWriter/ELF/DefaultLayout.h b/lld/lib/ReaderWriter/ELF/DefaultLayout.h index 041a0d7cc488..608f5ec281ac 100644 --- a/lld/lib/ReaderWriter/ELF/DefaultLayout.h +++ b/lld/lib/ReaderWriter/ELF/DefaultLayout.h @@ -91,24 +91,26 @@ public: // The sections are created using // SectionName, contentPermissions struct SectionKey { - SectionKey(StringRef name, DefinedAtom::ContentPermissions perm) - : _name(name), _perm(perm) { - } + SectionKey(StringRef name, DefinedAtom::ContentPermissions perm, + StringRef path) + : _name(name), _perm(perm), _path(path) {} // Data members StringRef _name; DefinedAtom::ContentPermissions _perm; + StringRef _path; }; struct SectionKeyHash { int64_t operator()(const SectionKey &k) const { - return llvm::hash_combine(k._name, k._perm); + return llvm::hash_combine(k._name, k._perm, k._path); } }; struct SectionKeyEq { bool operator()(const SectionKey &lhs, const SectionKey &rhs) const { - return ((lhs._name == rhs._name) && (lhs._perm == rhs._perm)); + return ((lhs._name == rhs._name) && (lhs._perm == rhs._perm) && + (lhs._path == rhs._path)); } }; @@ -178,9 +180,10 @@ public: virtual StringRef getSectionName(const DefinedAtom *da) const; /// \brief Gets or creates a section. - AtomSection *getSection( - StringRef name, int32_t contentType, - DefinedAtom::ContentPermissions contentPermissions); + AtomSection * + getSection(StringRef name, int32_t contentType, + DefinedAtom::ContentPermissions contentPermissions, + StringRef path); /// \brief Gets the segment for a output section virtual Layout::SegmentType getSegmentType(Section *section) const; @@ -533,10 +536,11 @@ AtomSection *DefaultLayout::createSection( } template -AtomSection *DefaultLayout::getSection( - StringRef sectionName, int32_t contentType, - DefinedAtom::ContentPermissions permissions) { - const SectionKey sectionKey(sectionName, permissions); +AtomSection * +DefaultLayout::getSection(StringRef sectionName, int32_t contentType, + DefinedAtom::ContentPermissions permissions, + StringRef path) { + const SectionKey sectionKey(sectionName, permissions, path); auto sec = _sectionMap.find(sectionKey); if (sec != _sectionMap.end()) return sec->second; @@ -563,8 +567,8 @@ ErrorOr DefaultLayout::addAtom(const Atom *atom) const DefinedAtom::ContentType contentType = definedAtom->contentType(); StringRef sectionName = getSectionName(definedAtom); - AtomSection *section = - getSection(sectionName, contentType, permissions); + AtomSection *section = getSection( + sectionName, contentType, permissions, definedAtom->file().path()); // Add runtime relocations to the .rela section. for (const auto &reloc : *definedAtom) {