[ELF] Sectionkey should also contain path.
authorShankar Easwaran <shankare@codeaurora.org>
Wed, 19 Nov 2014 03:51:41 +0000 (03:51 +0000)
committerShankar Easwaran <shankare@codeaurora.org>
Wed, 19 Nov 2014 03:51:41 +0000 (03:51 +0000)
No change in functionality.

llvm-svn: 222309

lld/lib/ReaderWriter/ELF/DefaultLayout.h

index 041a0d7..608f5ec 100644 (file)
@@ -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<ELFT> *getSection(
-      StringRef name, int32_t contentType,
-      DefinedAtom::ContentPermissions contentPermissions);
+  AtomSection<ELFT> *
+  getSection(StringRef name, int32_t contentType,
+             DefinedAtom::ContentPermissions contentPermissions,
+             StringRef path);
 
   /// \brief Gets the segment for a output section
   virtual Layout::SegmentType getSegmentType(Section<ELFT> *section) const;
@@ -533,10 +536,11 @@ AtomSection<ELFT> *DefaultLayout<ELFT>::createSection(
 }
 
 template <class ELFT>
-AtomSection<ELFT> *DefaultLayout<ELFT>::getSection(
-    StringRef sectionName, int32_t contentType,
-    DefinedAtom::ContentPermissions permissions) {
-  const SectionKey sectionKey(sectionName, permissions);
+AtomSection<ELFT> *
+DefaultLayout<ELFT>::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<const lld::AtomLayout &> DefaultLayout<ELFT>::addAtom(const Atom *atom)
     const DefinedAtom::ContentType contentType = definedAtom->contentType();
 
     StringRef sectionName = getSectionName(definedAtom);
-    AtomSection<ELFT> *section =
-        getSection(sectionName, contentType, permissions);
+    AtomSection<ELFT> *section = getSection(
+        sectionName, contentType, permissions, definedAtom->file().path());
 
     // Add runtime relocations to the .rela section.
     for (const auto &reloc : *definedAtom) {