[PATCH] [lld][ELF] Initialize readers and writers on creation.

Michael Spencer bigcheesegs at gmail.com
Fri Apr 19 17:32:20 PDT 2013


Hi shankarke, kledzik,

This makes the target handler a constructor argument because the constructor of
OutputELFWriter relies on it being initialized.


http://llvm-reviews.chandlerc.com/D697

Files:
  include/lld/ReaderWriter/ELFTargetInfo.h
  lib/ReaderWriter/ELF/ELFTargetInfo.cpp
  lib/ReaderWriter/ELF/Hexagon/HexagonTargetInfo.h
  lib/ReaderWriter/ELF/PPC/PPCTargetInfo.h
  lib/ReaderWriter/ELF/X86/X86TargetInfo.h
  lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.h

Index: include/lld/ReaderWriter/ELFTargetInfo.h
===================================================================
--- include/lld/ReaderWriter/ELFTargetInfo.h
+++ include/lld/ReaderWriter/ELFTargetInfo.h
@@ -112,7 +112,7 @@
 private:
   ELFTargetInfo() LLVM_DELETED_FUNCTION;
 protected:
-  ELFTargetInfo(llvm::Triple);
+  ELFTargetInfo(llvm::Triple, std::unique_ptr<TargetHandlerBase>);
 
   virtual Writer &writer() const;
 
@@ -128,10 +128,10 @@
   bool                               _useShlibUndefines;
   std::vector<StringRef>             _inputSearchPaths;
   llvm::BumpPtrAllocator             _extraStrings;
-  mutable std::unique_ptr<Reader>    _elfReader;
-  mutable std::unique_ptr<Reader>    _yamlReader;
-  mutable std::unique_ptr<Writer>    _writer;
-  mutable std::unique_ptr<Reader>    _linkerScriptReader;
+  std::unique_ptr<Reader>            _elfReader;
+  std::unique_ptr<Reader>            _yamlReader;
+  std::unique_ptr<Writer>            _writer;
+  std::unique_ptr<Reader>            _linkerScriptReader;
 };
 } // end namespace lld
 
Index: lib/ReaderWriter/ELF/ELFTargetInfo.cpp
===================================================================
--- lib/ReaderWriter/ELF/ELFTargetInfo.cpp
+++ lib/ReaderWriter/ELF/ELFTargetInfo.cpp
@@ -12,6 +12,7 @@
 #include "TargetHandler.h"
 #include "Targets.h"
 
+#include "lld/Core/Instrumentation.h"
 #include "lld/Passes/LayoutPass.h"
 #include "lld/ReaderWriter/ReaderLinkerScript.h"
 
@@ -21,17 +22,17 @@
 #include "llvm/Support/Path.h"
 
 namespace lld {
-ELFTargetInfo::ELFTargetInfo(llvm::Triple triple)
- : _outputFileType(elf::ET_EXEC)
- , _triple(triple)
- , _baseAddress(0)
- , _isStaticExecutable(false)
- , _outputYAML(false)
- , _noInhibitExec(false)
- , _mergeCommonStrings(false)
- , _runLayoutPass(true)
- , _useShlibUndefines(false) {
-}
+ELFTargetInfo::ELFTargetInfo(llvm::Triple triple, std::unique_ptr<TargetHandlerBase> targetHandler)
+    : _outputFileType(elf::ET_EXEC),
+      _triple(triple),
+      _targetHandler(std::move(targetHandler))
+    , _baseAddress(0)
+    , _isStaticExecutable(false)
+    , _outputYAML(false)
+    , _noInhibitExec(false)
+    , _mergeCommonStrings(false)
+    , _runLayoutPass(true)
+    , _useShlibUndefines(false) {}
 
 bool ELFTargetInfo::is64Bits() const {
   return getTriple().isArch64Bit();
@@ -74,11 +75,14 @@
     return true;
   }
 
+  _elfReader = createReaderELF(*this);
+  _yamlReader = createReaderYAML(*this);
+  _linkerScriptReader.reset(new ReaderLinkerScript(*this));
+  _writer = _outputYAML ? createWriterYAML(*this) : createWriterELF(*this);
 
   return false;
 }
 
-
 bool ELFTargetInfo::isDynamic() const {
   switch (_outputFileType) {
   case llvm::ELF::ET_EXEC:
@@ -94,34 +98,20 @@
 
 error_code ELFTargetInfo::parseFile(std::unique_ptr<MemoryBuffer> &mb,
                           std::vector<std::unique_ptr<File>> &result) const {
-  if (!_elfReader)
-    _elfReader = createReaderELF(*this);
   error_code ec = _elfReader->parseFile(mb, result);
   if (ec) {
     // Not an ELF file, check file extension to see if it might be yaml
     StringRef path = mb->getBufferIdentifier();
-    if ( path.endswith(".objtxt") ) {
-      if (!_yamlReader)
-          _yamlReader = createReaderYAML(*this);
+    if (path.endswith(".objtxt"))
       ec = _yamlReader->parseFile(mb, result);
-    }
-    if (ec) {
+    if (ec)
       // Not a yaml file, assume it is a linkerscript
-      if (!_linkerScriptReader)
-        _linkerScriptReader.reset(new ReaderLinkerScript(*this));
       ec = _linkerScriptReader->parseFile(mb, result);
-    }
   }
   return ec;
 }
 
 Writer &ELFTargetInfo::writer() const {
-  if (!_writer) {
-    if (_outputYAML)
-      _writer = createWriterYAML(*this);
-    else
-      _writer = createWriterELF(*this);
-  }
   return *_writer;
 }
 
Index: lib/ReaderWriter/ELF/Hexagon/HexagonTargetInfo.h
===================================================================
--- lib/ReaderWriter/ELF/Hexagon/HexagonTargetInfo.h
+++ lib/ReaderWriter/ELF/Hexagon/HexagonTargetInfo.h
@@ -23,10 +23,7 @@
 class HexagonTargetInfo LLVM_FINAL : public ELFTargetInfo {
 public:
   HexagonTargetInfo(llvm::Triple triple) 
-    : ELFTargetInfo(triple) {
-    _targetHandler = std::unique_ptr<TargetHandlerBase>(
-        new HexagonTargetHandler(*this));
-  }
+      : ELFTargetInfo(triple, std::unique_ptr<TargetHandlerBase>(new HexagonTargetHandler(*this))) {}
 
   virtual ErrorOr<Reference::Kind> relocKindFromString(StringRef str) const;
   virtual ErrorOr<std::string> stringFromRelocKind(Reference::Kind kind) const;
Index: lib/ReaderWriter/ELF/PPC/PPCTargetInfo.h
===================================================================
--- lib/ReaderWriter/ELF/PPC/PPCTargetInfo.h
+++ lib/ReaderWriter/ELF/PPC/PPCTargetInfo.h
@@ -22,10 +22,7 @@
 class PPCTargetInfo LLVM_FINAL : public ELFTargetInfo {
 public:
   PPCTargetInfo(llvm::Triple triple)
-    : ELFTargetInfo(triple) {
-    _targetHandler = std::unique_ptr<TargetHandlerBase>(
-        new PPCTargetHandler(*this));
-  }
+    : ELFTargetInfo(triple, std::unique_ptr<TargetHandlerBase>(new PPCTargetHandler(*this))) {}
 
   virtual bool isLittleEndian() const { return false; }
   virtual ErrorOr<Reference::Kind> relocKindFromString(StringRef str) const;
Index: lib/ReaderWriter/ELF/X86/X86TargetInfo.h
===================================================================
--- lib/ReaderWriter/ELF/X86/X86TargetInfo.h
+++ lib/ReaderWriter/ELF/X86/X86TargetInfo.h
@@ -22,10 +22,7 @@
 class X86TargetInfo LLVM_FINAL : public ELFTargetInfo {
 public:
   X86TargetInfo(llvm::Triple triple) 
-    : ELFTargetInfo(triple) {
-    _targetHandler = std::unique_ptr<TargetHandlerBase>(
-        new X86TargetHandler(*this));
-  }
+      : ELFTargetInfo(triple, std::unique_ptr<TargetHandlerBase>(new X86TargetHandler(*this))) {}
 
   virtual ErrorOr<Reference::Kind> relocKindFromString(StringRef str) const;
   virtual ErrorOr<std::string> stringFromRelocKind(Reference::Kind kind) const;
Index: lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.h
===================================================================
--- lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.h
+++ lib/ReaderWriter/ELF/X86_64/X86_64TargetInfo.h
@@ -29,10 +29,7 @@
 class X86_64TargetInfo LLVM_FINAL : public ELFTargetInfo {
 public:
   X86_64TargetInfo(llvm::Triple triple) 
-    : ELFTargetInfo(triple) {
-    _targetHandler =
-        std::unique_ptr<TargetHandlerBase>(new X86_64TargetHandler(*this));
-  }
+    : ELFTargetInfo(triple, std::unique_ptr<TargetHandlerBase>(new X86_64TargetHandler(*this))) {}
 
   virtual void addPasses(PassManager &) const;
-------------- next part --------------
A non-text attachment was scrubbed...
Name: D697.1.patch
Type: text/x-patch
Size: 6643 bytes
Desc: not available
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20130419/0b877939/attachment.bin>


More information about the llvm-commits mailing list