[lld] r200172 - [ELF] Unify interfaces between DynamicFile/ELFFile.

Shankar Easwaran shankare at codeaurora.org
Sun Jan 26 16:40:49 PST 2014


Author: shankare
Date: Sun Jan 26 18:40:49 2014
New Revision: 200172

URL: http://llvm.org/viewvc/llvm-project?rev=200172&view=rev
Log:
[ELF] Unify interfaces between DynamicFile/ELFFile.

Modified:
    lld/trunk/lib/ReaderWriter/ELF/ELFFile.h
    lld/trunk/lib/ReaderWriter/ELF/Reader.cpp

Modified: lld/trunk/lib/ReaderWriter/ELF/ELFFile.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ELFFile.h?rev=200172&r1=200171&r2=200172&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/ELFFile.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/ELFFile.h Sun Jan 26 18:40:49 2014
@@ -43,6 +43,7 @@ namespace elf {
 /// \brief Read a binary, find out based on the symbol table contents what kind
 /// of symbol it is and create corresponding atoms for it
 template <class ELFT> class ELFFile : public File {
+
   typedef llvm::object::Elf_Sym_Impl<ELFT> Elf_Sym;
   typedef llvm::object::Elf_Shdr_Impl<ELFT> Elf_Shdr;
   typedef llvm::object::Elf_Rel_Impl<ELFT, false> Elf_Rel;
@@ -53,8 +54,7 @@ template <class ELFT> class ELFFile : pu
   // after reading the section that contains Merge String attributes
   struct MergeSectionKey {
     MergeSectionKey(const Elf_Shdr *shdr, int32_t offset)
-        : _shdr(shdr), _offset(offset) {
-    }
+        : _shdr(shdr), _offset(offset) {}
     // Data members
     const Elf_Shdr *_shdr;
     int32_t _offset;
@@ -62,7 +62,7 @@ template <class ELFT> class ELFFile : pu
   struct MergeSectionEq {
     int64_t operator()(const MergeSectionKey &k) const {
       return llvm::hash_combine((int64_t)(k._shdr->sh_name),
-                                (int64_t) k._offset);
+                                (int64_t)k._offset);
     }
     bool operator()(const MergeSectionKey &lhs,
                     const MergeSectionKey &rhs) const {
@@ -75,8 +75,7 @@ template <class ELFT> class ELFFile : pu
     MergeString(int32_t offset, StringRef str, const Elf_Shdr *shdr,
                 StringRef sectionName)
         : _offset(offset), _string(str), _shdr(shdr),
-          _sectionName(sectionName) {
-    }
+          _sectionName(sectionName) {}
     // the offset of this atom
     int32_t _offset;
     // The content
@@ -96,8 +95,7 @@ template <class ELFT> class ELFFile : pu
     const Elf_Shdr *_shdr;
     uint64_t _offset;
     FindByOffset(const Elf_Shdr *shdr, uint64_t offset)
-        : _shdr(shdr), _offset(offset) {
-    }
+        : _shdr(shdr), _offset(offset) {}
     bool operator()(const ELFMergeAtom<ELFT> *a) {
       uint64_t off = a->offset();
       return (_shdr->sh_name == a->section()) &&
@@ -118,12 +116,13 @@ template <class ELFT> class ELFFile : pu
   typedef typename MergedSectionMapT::iterator MergedSectionMapIterT;
 
 public:
-  ELFFile(StringRef name)
-      : File(name, kindObject), _ordinal(0), _doStringsMerge(false),
+  ELFFile(StringRef name, bool atomizeStrings = false)
+      : File(name, kindObject), _ordinal(0), _doStringsMerge(atomizeStrings),
         _targetHandler(nullptr) {}
 
-  ELFFile(std::unique_ptr<MemoryBuffer> mb, bool atomizeStrings,
-          TargetHandlerBase *handler, error_code &ec);
+  static ErrorOr<std::unique_ptr<ELFFile>>
+  create(std::unique_ptr<MemoryBuffer> mb, bool atomizeStrings,
+         TargetHandlerBase *handler);
 
   virtual Reference::KindArch kindArch();
 
@@ -211,6 +210,10 @@ protected:
   virtual void createEdge(ELFDefinedAtom<ELFT> *from, ELFDefinedAtom<ELFT> *to,
                           uint32_t edgeKind);
 
+  virtual void setTargetHandler(TargetHandlerBase *handler) {
+    _targetHandler = reinterpret_cast<TargetHandler<ELFT> *>(handler);
+  }
+
   llvm::BumpPtrAllocator _readerStorage;
   std::unique_ptr<llvm::object::ELFFile<ELFT> > _objFile;
   atom_collection_vector<DefinedAtom> _definedAtoms;
@@ -305,42 +308,40 @@ protected:
 };
 
 template <class ELFT>
-ELFFile<ELFT>::ELFFile(std::unique_ptr<MemoryBuffer> mb, bool atomizeStrings,
-                       TargetHandlerBase *handler, error_code &ec)
-    : File(mb->getBufferIdentifier(), kindObject), _ordinal(0),
-      _doStringsMerge(atomizeStrings),
-      _targetHandler(reinterpret_cast<TargetHandler<ELFT> *>(handler)) {
-  _objFile.reset(new llvm::object::ELFFile<ELFT>(mb.release(), ec));
+ErrorOr<std::unique_ptr<ELFFile<ELFT>>>
+ELFFile<ELFT>::create(std::unique_ptr<MemoryBuffer> mb, bool atomizeStrings,
+                      TargetHandlerBase *handler) {
+  error_code ec;
+  std::unique_ptr<ELFFile<ELFT>> file(
+      new ELFFile<ELFT>(mb->getBufferIdentifier(), atomizeStrings));
+
+  file->setTargetHandler(handler);
+
+  file->_objFile.reset(new llvm::object::ELFFile<ELFT>(mb.release(), ec));
 
   if (ec)
-    return;
+    return ec;
 
   // Read input sections from the input file that need to be converted to
   // atoms
-  if (auto err = createAtomizableSections()) {
-    ec = err;
-    return;
-  }
+  if ((ec = file->createAtomizableSections()))
+    return ec;
 
   // For mergeable strings, we would need to split the section into various
   // atoms
-  if (auto err = createMergeableAtoms()) {
-    ec = err;
-    return;
-  }
+  if ((ec = file->createMergeableAtoms()))
+    return ec;
 
   // Create the necessary symbols that are part of the section that we
   // created in createAtomizableSections function
-  if (auto err = createSymbolsFromAtomizableSections()) {
-    ec = err;
-    return;
-  }
+  if ((ec = file->createSymbolsFromAtomizableSections()))
+    return ec;
 
   // Create the appropriate atoms from the file
-  if (auto err = createAtoms()) {
-    ec = err;
-    return;
-  }
+  if ((ec = file->createAtoms()))
+    return ec;
+
+  return std::move(file);
 }
 
 template <class ELFT> Reference::KindArch ELFFile<ELFT>::kindArch() {

Modified: lld/trunk/lib/ReaderWriter/ELF/Reader.cpp
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Reader.cpp?rev=200172&r1=200171&r2=200172&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Reader.cpp (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Reader.cpp Sun Jan 26 18:40:49 2014
@@ -60,14 +60,13 @@ struct DynamicFileCreateELFTraits {
 };
 
 struct ELFFileCreateELFTraits {
-  typedef std::unique_ptr<lld::File> result_type;
+  typedef llvm::ErrorOr<std::unique_ptr<lld::File>> result_type;
 
   template <class ELFT>
   static result_type create(std::unique_ptr<llvm::MemoryBuffer> mb,
-                            bool atomizeStrings, TargetHandlerBase *handler,
-                            lld::error_code &ec) {
-    return std::unique_ptr<lld::File>(new lld::elf::ELFFile<ELFT>(
-        std::move(mb), atomizeStrings, handler, ec));
+                            bool atomizeStrings, TargetHandlerBase *handler) {
+    return lld::elf::ELFFile<ELFT>::create(std::move(mb), atomizeStrings,
+                                           handler);
   }
 };
 
@@ -87,12 +86,12 @@ public:
     error_code ec;
     std::size_t maxAlignment =
         1ULL << llvm::countTrailingZeros(uintptr_t(mb->getBufferStart()));
-    std::unique_ptr<File> f(createELF<ELFFileCreateELFTraits>(
-        getElfArchType(&*mb), maxAlignment, std::move(mb), _atomizeStrings,
-        _handler, ec));
-    if (ec)
+    auto f = createELF<ELFFileCreateELFTraits>(getElfArchType(&*mb),
+                                               maxAlignment, std::move(mb),
+                                               _atomizeStrings, _handler);
+    if (error_code ec = f.getError())
       return ec;
-    result.push_back(std::move(f));
+    result.push_back(std::move(*f));
     return error_code::success();
   }
 





More information about the llvm-commits mailing list