[lld] r234047 - ELF: Pass file types instead of type traits to ELFObjectReader.

Rui Ueyama ruiu at google.com
Fri Apr 3 13:29:37 PDT 2015


Author: ruiu
Date: Fri Apr  3 15:29:37 2015
New Revision: 234047

URL: http://llvm.org/viewvc/llvm-project?rev=234047&view=rev
Log:
ELF: Pass file types instead of type traits to ELFObjectReader.

All <Arch>ELFFileCreateFileTraits structs are the same except its file type.
That means that we don't need to pass the type traits. Instead, we can only
pass file types. By doing this, we can remove copy-pasted boilerplates.

Modified:
    lld/trunk/lib/ReaderWriter/ELF/AArch64/AArch64ELFReader.h
    lld/trunk/lib/ReaderWriter/ELF/ARM/ARMELFReader.h
    lld/trunk/lib/ReaderWriter/ELF/CreateELF.h
    lld/trunk/lib/ReaderWriter/ELF/DynamicFile.h
    lld/trunk/lib/ReaderWriter/ELF/ELFReader.h
    lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonELFReader.h
    lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFReader.h
    lld/trunk/lib/ReaderWriter/ELF/X86/X86ELFReader.h
    lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64ELFReader.h

Modified: lld/trunk/lib/ReaderWriter/ELF/AArch64/AArch64ELFReader.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/AArch64/AArch64ELFReader.h?rev=234047&r1=234046&r2=234047&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/AArch64/AArch64ELFReader.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/AArch64/AArch64ELFReader.h Fri Apr  3 15:29:37 2015
@@ -19,16 +19,8 @@ class AArch64LinkingContext;
 
 typedef llvm::object::ELFType<llvm::support::little, 2, true> AArch64ELFType;
 
-struct AArch64ELFFileCreateELFTraits {
-  template <class ELFT>
-  static llvm::ErrorOr<std::unique_ptr<lld::File>>
-  create(std::unique_ptr<llvm::MemoryBuffer> mb, AArch64LinkingContext &ctx) {
-    return lld::elf::ELFFile<ELFT>::create(std::move(mb), ctx);
-  }
-};
-
-typedef ELFObjectReader<AArch64ELFType, AArch64ELFFileCreateELFTraits,
-                        AArch64LinkingContext> AArch64ELFObjectReader;
+typedef ELFObjectReader<AArch64ELFType, AArch64LinkingContext,
+                        lld::elf::ELFFile> AArch64ELFObjectReader;
 
 typedef ELFDSOReader<AArch64ELFType, AArch64LinkingContext> AArch64ELFDSOReader;
 

Modified: lld/trunk/lib/ReaderWriter/ELF/ARM/ARMELFReader.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ARM/ARMELFReader.h?rev=234047&r1=234046&r2=234047&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/ARM/ARMELFReader.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/ARM/ARMELFReader.h Fri Apr  3 15:29:37 2015
@@ -18,16 +18,8 @@ namespace elf {
 
 typedef llvm::object::ELFType<llvm::support::little, 2, false> ARMELFType;
 
-struct ARMELFFileCreateELFTraits {
-  template <class ELFT>
-  static llvm::ErrorOr<std::unique_ptr<lld::File>>
-  create(std::unique_ptr<llvm::MemoryBuffer> mb, ARMLinkingContext &ctx) {
-    return lld::elf::ARMELFFile<ELFT>::create(std::move(mb), ctx);
-  }
-};
-
-typedef ELFObjectReader<ARMELFType, ARMELFFileCreateELFTraits,
-                        ARMLinkingContext> ARMELFObjectReader;
+typedef ELFObjectReader<ARMELFType, ARMLinkingContext, lld::elf::ARMELFFile>
+    ARMELFObjectReader;
 typedef ELFDSOReader<ARMELFType, ARMLinkingContext> ARMELFDSOReader;
 
 } // namespace elf

Modified: lld/trunk/lib/ReaderWriter/ELF/CreateELF.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/CreateELF.h?rev=234047&r1=234046&r2=234047&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/CreateELF.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/CreateELF.h Fri Apr  3 15:29:37 2015
@@ -36,8 +36,7 @@ using llvm::object::ELFType;
 /// \param args arguments forwarded to CreateELFTraits<T>::create.
 
 #define LLVM_CREATE_ELF_CreateELFTraits(endian, align, is64, ...) \
-  Traits::template create<ELFType<llvm::support::endian, align, is64>>( \
-      __VA_ARGS__);
+  new FileT<ELFType<llvm::support::endian, align, is64>>(__VA_ARGS__);
 
 #if !LLVM_IS_UNALIGNED_ACCESS_FAST
 # define LLVM_CREATE_ELF_Create(normal, low, endian, is64, ...) \
@@ -50,15 +49,16 @@ using llvm::object::ELFType;
 #else
 # define LLVM_CREATE_ELF_Create(normal, low, endian, is64, ...) \
   if (maxAlignment >= low) \
-    return LLVM_CREATE_ELF_CreateELFTraits(endian, low, is64, __VA_ARGS__) \
+    file = LLVM_CREATE_ELF_CreateELFTraits(endian, low, is64, __VA_ARGS__) \
   else \
     llvm_unreachable("Invalid alignment for ELF file!");
 #endif
 
-template <class Traits, class... Args>
+template <template <typename ELFT> class FileT, class... Args>
 llvm::ErrorOr<std::unique_ptr<lld::File>>
 createELF(std::pair<unsigned char, unsigned char> ident,
           std::size_t maxAlignment, Args &&... args) {
+  lld::File *file = nullptr;
   if (ident.first == llvm::ELF::ELFCLASS32 &&
       ident.second == llvm::ELF::ELFDATA2LSB) {
     LLVM_CREATE_ELF_Create(4, 2, little, false, std::forward<Args>(args)...)
@@ -72,8 +72,11 @@ createELF(std::pair<unsigned char, unsig
              ident.second == llvm::ELF::ELFDATA2LSB) {
     LLVM_CREATE_ELF_Create(8, 2, little, true, std::forward<Args>(args)...)
   }
-  llvm_unreachable("Invalid ELF type!");
+  if (!file)
+    llvm_unreachable("Invalid ELF type!");
+  return std::unique_ptr<lld::File>(file);
 }
+
 } // end anon namespace
 
 #undef LLVM_CREATE_ELF_CreateELFTraits

Modified: lld/trunk/lib/ReaderWriter/ELF/DynamicFile.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/DynamicFile.h?rev=234047&r1=234046&r2=234047&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/DynamicFile.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/DynamicFile.h Fri Apr  3 15:29:37 2015
@@ -24,6 +24,10 @@ public:
   static ErrorOr<std::unique_ptr<DynamicFile>>
   create(std::unique_ptr<llvm::MemoryBuffer> mb, ELFLinkingContext &ctx);
 
+  DynamicFile(std::unique_ptr<MemoryBuffer> mb, ELFLinkingContext &ctx)
+      : SharedLibraryFile(mb->getBufferIdentifier()), _mb(std::move(mb)),
+        _ctx(ctx), _useShlibUndefines(ctx.useShlibUndefines()) {}
+
   const SharedLibraryAtom *exports(StringRef name,
                                    bool dataSymbolOnly) const override {
     assert(!dataSymbolOnly && "Invalid option for ELF exports!");
@@ -89,10 +93,6 @@ protected:
   }
 
 private:
-  DynamicFile(std::unique_ptr<MemoryBuffer> mb, ELFLinkingContext &ctx)
-      : SharedLibraryFile(mb->getBufferIdentifier()), _mb(std::move(mb)),
-        _ctx(ctx), _useShlibUndefines(ctx.useShlibUndefines()) {}
-
   mutable llvm::BumpPtrAllocator _alloc;
   std::unique_ptr<llvm::object::ELFFile<ELFT>> _objFile;
   /// \brief DT_SONAME

Modified: lld/trunk/lib/ReaderWriter/ELF/ELFReader.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/ELFReader.h?rev=234047&r1=234046&r2=234047&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/ELFReader.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/ELFReader.h Fri Apr  3 15:29:37 2015
@@ -18,7 +18,7 @@
 namespace lld {
 namespace elf {
 
-template <typename ELFT, typename ELFTraitsT, typename ContextT>
+template <typename ELFT, typename ContextT, template <typename> class FileT>
 class ELFObjectReader : public Reader {
 public:
   typedef llvm::object::Elf_Ehdr_Impl<ELFT> Elf_Ehdr;
@@ -36,8 +36,7 @@ public:
            std::vector<std::unique_ptr<File>> &result) const override {
     std::size_t maxAlignment =
         1ULL << llvm::countTrailingZeros(uintptr_t(mb->getBufferStart()));
-    auto f =
-        createELF<ELFTraitsT>(llvm::object::getElfArchType(mb->getBuffer()),
+    auto f = createELF<FileT>(llvm::object::getElfArchType(mb->getBuffer()),
                               maxAlignment, std::move(mb), _ctx);
     if (std::error_code ec = f.getError())
       return ec;
@@ -55,14 +54,6 @@ protected:
   ContextT &_ctx;
 };
 
-struct DynamicFileCreateELFTraits {
-  template <typename ELFT, typename ContextT>
-  static llvm::ErrorOr<std::unique_ptr<lld::File>>
-  create(std::unique_ptr<llvm::MemoryBuffer> mb, ContextT &ctx) {
-    return DynamicFile<ELFT>::create(std::move(mb), ctx);
-  }
-};
-
 template <typename ELFT, typename ContextT>
 class ELFDSOReader : public Reader {
 public:
@@ -81,9 +72,9 @@ public:
            std::vector<std::unique_ptr<File>> &result) const override {
     std::size_t maxAlignment =
         1ULL << llvm::countTrailingZeros(uintptr_t(mb->getBufferStart()));
-    auto f = createELF<DynamicFileCreateELFTraits>(
-        llvm::object::getElfArchType(mb->getBuffer()),
-        maxAlignment, std::move(mb), _ctx);
+    auto f =
+        createELF<DynamicFile>(llvm::object::getElfArchType(mb->getBuffer()),
+                               maxAlignment, std::move(mb), _ctx);
     if (std::error_code ec = f.getError())
       return ec;
     result.push_back(std::move(*f));

Modified: lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonELFReader.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonELFReader.h?rev=234047&r1=234046&r2=234047&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonELFReader.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Hexagon/HexagonELFReader.h Fri Apr  3 15:29:37 2015
@@ -18,16 +18,8 @@ namespace elf {
 
 typedef llvm::object::ELFType<llvm::support::little, 2, false> HexagonELFType;
 
-struct HexagonELFFileCreateELFTraits {
-  template <class ELFT>
-  static llvm::ErrorOr<std::unique_ptr<lld::File>>
-  create(std::unique_ptr<llvm::MemoryBuffer> mb, HexagonLinkingContext &ctx) {
-    return lld::elf::HexagonELFFile<ELFT>::create(std::move(mb), ctx);
-  }
-};
-
-typedef ELFObjectReader<HexagonELFType, HexagonELFFileCreateELFTraits,
-                        HexagonLinkingContext> HexagonELFObjectReader;
+typedef ELFObjectReader<HexagonELFType, HexagonLinkingContext,
+                        lld::elf::HexagonELFFile> HexagonELFObjectReader;
 typedef ELFDSOReader<HexagonELFType, HexagonLinkingContext> HexagonELFDSOReader;
 
 } // namespace elf

Modified: lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFReader.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFReader.h?rev=234047&r1=234046&r2=234047&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFReader.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/Mips/MipsELFReader.h Fri Apr  3 15:29:37 2015
@@ -17,19 +17,10 @@
 namespace lld {
 namespace elf {
 
-struct MipsELFFileCreateTraits {
-  template <class ELFT>
-  static llvm::ErrorOr<std::unique_ptr<lld::File>>
-  create(std::unique_ptr<llvm::MemoryBuffer> mb, MipsLinkingContext &ctx) {
-    return lld::elf::MipsELFFile<ELFT>::create(std::move(mb), ctx);
-  }
-};
-
 template <class ELFT>
 class MipsELFObjectReader
-    : public ELFObjectReader<ELFT, MipsELFFileCreateTraits,
-                             MipsLinkingContext> {
-  typedef ELFObjectReader<ELFT, MipsELFFileCreateTraits, MipsLinkingContext>
+    : public ELFObjectReader<ELFT, MipsLinkingContext, lld::elf::MipsELFFile> {
+  typedef ELFObjectReader<ELFT, MipsLinkingContext, lld::elf::MipsELFFile>
       BaseReaderType;
 
 public:

Modified: lld/trunk/lib/ReaderWriter/ELF/X86/X86ELFReader.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86/X86ELFReader.h?rev=234047&r1=234046&r2=234047&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/X86/X86ELFReader.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/X86/X86ELFReader.h Fri Apr  3 15:29:37 2015
@@ -18,16 +18,8 @@ namespace elf {
 class X86LinkingContext;
 typedef llvm::object::ELFType<llvm::support::little, 2, false> X86ELFType;
 
-struct X86ELFFileCreateELFTraits {
-  template <class ELFT>
-  static llvm::ErrorOr<std::unique_ptr<lld::File>>
-  create(std::unique_ptr<llvm::MemoryBuffer> mb, X86LinkingContext &ctx) {
-    return lld::elf::ELFFile<ELFT>::create(std::move(mb), ctx);
-  }
-};
-
-typedef ELFObjectReader<X86ELFType, X86ELFFileCreateELFTraits,
-                        X86LinkingContext> X86ELFObjectReader;
+typedef ELFObjectReader<X86ELFType, X86LinkingContext, lld::elf::ELFFile>
+    X86ELFObjectReader;
 typedef ELFDSOReader<X86ELFType, X86LinkingContext> X86ELFDSOReader;
 
 } // namespace elf

Modified: lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64ELFReader.h
URL: http://llvm.org/viewvc/llvm-project/lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64ELFReader.h?rev=234047&r1=234046&r2=234047&view=diff
==============================================================================
--- lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64ELFReader.h (original)
+++ lld/trunk/lib/ReaderWriter/ELF/X86_64/X86_64ELFReader.h Fri Apr  3 15:29:37 2015
@@ -18,16 +18,8 @@ namespace elf {
 class X86_64LinkingContext;
 typedef llvm::object::ELFType<llvm::support::little, 2, true> X86_64ELFType;
 
-struct X86_64ELFFileCreateELFTraits {
-  template <class ELFT>
-  static llvm::ErrorOr<std::unique_ptr<lld::File>>
-  create(std::unique_ptr<llvm::MemoryBuffer> mb, X86_64LinkingContext &ctx) {
-    return lld::elf::ELFFile<ELFT>::create(std::move(mb), ctx);
-  }
-};
-
-typedef ELFObjectReader<X86_64ELFType, X86_64ELFFileCreateELFTraits,
-                        X86_64LinkingContext> X86_64ELFObjectReader;
+typedef ELFObjectReader<X86_64ELFType, X86_64LinkingContext, lld::elf::ELFFile>
+    X86_64ELFObjectReader;
 typedef ELFDSOReader<X86_64ELFType, X86_64LinkingContext> X86_64ELFDSOReader;
 
 } // namespace elf





More information about the llvm-commits mailing list