[lld] r178269 - [ELF] Cache contentType and permissions.

Michael J. Spencer bigcheesegs at gmail.com
Thu Mar 28 11:58:50 PDT 2013


Author: mspencer
Date: Thu Mar 28 13:58:50 2013
New Revision: 178269

URL: http://llvm.org/viewvc/llvm-project?rev=178269&view=rev
Log:
[ELF] Cache contentType and permissions.

Modified:
    lld/trunk/lib/ReaderWriter/ELF/Atoms.h
    lld/trunk/lib/ReaderWriter/ELF/File.h

Modified: lld/trunk/lib/ReaderWriter/ELF/Atoms.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Atoms.h?rev=178269&r1=178268&r2=178269&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Atoms.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Atoms.h Thu Mar 28 13:58:50 2013
@@ -179,7 +179,9 @@ public:
     , _referenceStartIndex(referenceStart)
     , _referenceEndIndex(referenceEnd)
     , _referenceList(referenceList)
-    , _targetAtomHandler(nullptr) {}
+    , _targetAtomHandler(nullptr)
+    , _contentType(typeUnknown)
+    , _permissions(permUnknown) {}
 
   virtual const ELFFile<ELFT> &file() const {
     return _owningFile;
@@ -260,6 +262,9 @@ public:
   }
 
   virtual ContentType contentType() const {
+    if (_contentType != typeUnknown)
+      return _contentType;
+
     ContentType ret = typeUnknown;
     uint64_t flags = _section->sh_flags;
 
@@ -272,20 +277,20 @@ public:
         TargetHandler<ELFT> &TargetHandler = eti.getTargetHandler<ELFT>();
         _targetAtomHandler = &TargetHandler.targetAtomHandler();
       }
-      return _targetAtomHandler->contentType(this);
+      return _contentType = _targetAtomHandler->contentType(this);
     }
 
     if (_section->sh_flags ==
         (llvm::ELF::SHF_ALLOC | llvm::ELF::SHF_WRITE | llvm::ELF::SHF_TLS)) {
-      return _section->sh_type == llvm::ELF::SHT_NOBITS ? typeTLVInitialZeroFill
+      return _contentType = _section->sh_type == llvm::ELF::SHT_NOBITS ? typeTLVInitialZeroFill
                                                         : typeTLVInitialData;
     }
 
     if (_symbol->getType() == llvm::ELF::STT_GNU_IFUNC)
-      return typeResolver;
+      return _contentType = typeResolver;
 
     if (_symbol->st_shndx == llvm::ELF::SHN_COMMON)
-      return typeZeroFill;
+      return _contentType = typeZeroFill;
 
     switch (_section->sh_type) {
     case llvm::ELF::SHT_PROGBITS:
@@ -321,7 +326,7 @@ public:
       break;
     }
 
-    return ret;
+    return _contentType = ret;
   }
 
   virtual Alignment alignment() const {
@@ -374,6 +379,9 @@ public:
   }
 
   virtual ContentPermissions permissions() const {
+    if (_permissions != permUnknown)
+      return _permissions;
+
     uint64_t flags = _section->sh_flags;
     // Treat target defined symbols
     if ((_symbol->st_shndx > llvm::ELF::SHN_LOPROC &&
@@ -383,14 +391,14 @@ public:
         TargetHandler<ELFT> &TargetHandler = eti.getTargetHandler<ELFT>();
         _targetAtomHandler = &TargetHandler.targetAtomHandler();
       }
-      return (_targetAtomHandler->contentPermissions(this));
+      return _permissions = _targetAtomHandler->contentPermissions(this);
     }
     switch (_section->sh_type) {
     // permRW_L is for sections modified by the runtime
     // loader.
     case llvm::ELF::SHT_REL:
     case llvm::ELF::SHT_RELA:
-      return permRW_L;
+      return _permissions = permRW_L;
 
     case llvm::ELF::SHT_DYNAMIC:
     case llvm::ELF::SHT_PROGBITS:
@@ -399,31 +407,31 @@ public:
       switch (flags) {
       // Code
       case llvm::ELF::SHF_EXECINSTR:
-        return permR_X;
+        return _permissions = permR_X;
       case (llvm::ELF::SHF_WRITE|llvm::ELF::SHF_EXECINSTR):
-        return permRWX;
+        return _permissions = permRWX;
       // Data
       case llvm::ELF::SHF_WRITE:
-        return permRW_;
+        return _permissions = permRW_;
       // Strings
       case llvm::ELF::SHF_MERGE:
       case llvm::ELF::SHF_STRINGS:
-        return permR__;
+        return _permissions = permR__;
 
       default:
         if (flags & llvm::ELF::SHF_WRITE)
-          return permRW_;
-        return permR__;
+          return _permissions = permRW_;
+        return _permissions = permR__;
       }
 
     case llvm::ELF::SHT_NOBITS:
-      return permRW_;
+      return _permissions = permRW_;
 
     case llvm::ELF::SHT_INIT_ARRAY:
-      return permRW_;
+      return _permissions = permRW_;
 
     default:
-      return perm___;
+      return _permissions = perm___;
     }
   }
 
@@ -489,6 +497,8 @@ private:
   std::vector<ELFReference<ELFT> *> &_referenceList;
   // Cached size of the TLS segment.
   mutable TargetAtomHandler<ELFT> *_targetAtomHandler;
+  mutable ContentType _contentType;
+  mutable ContentPermissions _permissions;
 };
 
 /// \brief This atom stores mergeable Strings

Modified: lld/trunk/lib/ReaderWriter/ELF/File.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/File.h?rev=178269&r1=178268&r2=178269&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/File.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/File.h Thu Mar 28 13:58:50 2013
@@ -598,9 +598,12 @@ private:
       }
 
     // Create the DefinedAtom and add it to the list of DefinedAtoms.
-    return new (_readerStorage) ELFDefinedAtom<
+    auto ret = new (_readerStorage) ELFDefinedAtom<
         ELFT>(*this, symbolName, sectionName, symbol, section, content,
               referenceStart, _references.size(), _references);
+    ret->permissions();
+    ret->contentType();
+    return ret;
   }
 
   llvm::BumpPtrAllocator _readerStorage;





More information about the llvm-commits mailing list