[ELF] Update for LLVM Object/ELF changes.

llvm-svn: 172516
diff --git a/lld/lib/ReaderWriter/ELF/ReaderELF.cpp b/lld/lib/ReaderWriter/ELF/ReaderELF.cpp
index f40dacc..53871a9 100644
--- a/lld/lib/ReaderWriter/ELF/ReaderELF.cpp
+++ b/lld/lib/ReaderWriter/ELF/ReaderELF.cpp
@@ -47,12 +47,12 @@
 namespace {
 // \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<endianness target_endianness, std::size_t max_align, bool is64Bits>
+template<class ELFT>
 class FileELF: public File {
-  typedef Elf_Sym_Impl<target_endianness, max_align, is64Bits> Elf_Sym;
-  typedef Elf_Shdr_Impl<target_endianness, max_align, is64Bits> Elf_Shdr;
-  typedef Elf_Rel_Impl<target_endianness, max_align, is64Bits, false> Elf_Rel;
-  typedef Elf_Rel_Impl<target_endianness, max_align, is64Bits, true> Elf_Rela;
+  typedef Elf_Sym_Impl<ELFT> Elf_Sym;
+  typedef Elf_Shdr_Impl<ELFT> Elf_Shdr;
+  typedef Elf_Rel_Impl<ELFT, false> Elf_Rel;
+  typedef Elf_Rel_Impl<ELFT, true> Elf_Rela;
 
 public:
   FileELF(std::unique_ptr<llvm::MemoryBuffer> MB, llvm::error_code &EC)
@@ -63,8 +63,7 @@
       return;
 
     // Point Obj to correct class and bitwidth ELF object
-    _objFile.reset(llvm::dyn_cast<ELFObjectFile<target_endianness, max_align,
-        is64Bits> >(binaryFile.get()));
+    _objFile.reset(llvm::dyn_cast<ELFObjectFile<ELFT>>(binaryFile.get()));
 
     if (!_objFile) {
       EC = make_error_code(object_error::invalid_file_type);
@@ -143,8 +142,8 @@
       if (symbol->st_shndx == llvm::ELF::SHN_ABS) {
         // Create an absolute atom.
         auto *newAtom = new (_readerStorage.Allocate<
-          ELFAbsoluteAtom<target_endianness, max_align, is64Bits> > ())
-          ELFAbsoluteAtom<target_endianness, max_align, is64Bits>(
+          ELFAbsoluteAtom<ELFT> > ())
+          ELFAbsoluteAtom<ELFT>(
             *this, symbolName, symbol, symbol->st_value);
 
         _absoluteAtoms._atoms.push_back(newAtom);
@@ -152,8 +151,8 @@
       } else if (symbol->st_shndx == llvm::ELF::SHN_UNDEF) {
         // Create an undefined atom.
         auto *newAtom = new (_readerStorage.Allocate<
-          ELFUndefinedAtom<target_endianness, max_align, is64Bits> > ())
-          ELFUndefinedAtom<target_endianness, max_align, is64Bits>(
+          ELFUndefinedAtom<ELFT> > ())
+          ELFUndefinedAtom<ELFT>(
             *this, symbolName, symbol);
 
         _undefinedAtoms._atoms.push_back(newAtom);
@@ -234,8 +233,8 @@
           if ((rai->r_offset >= (*si)->st_value) &&
               (rai->r_offset < (*si)->st_value+contentSize)) {
             auto *ERef = new (_readerStorage.Allocate<
-              ELFReference<target_endianness, max_align, is64Bits> > ())
-              ELFReference<target_endianness, max_align, is64Bits> (
+              ELFReference<ELFT> > ())
+              ELFReference<ELFT> (
                 rai, rai->r_offset-(*si)->st_value, nullptr);
 
             _references.push_back(ERef);
@@ -247,8 +246,8 @@
           if (((ri)->r_offset >= (*si)->st_value) &&
               ((ri)->r_offset < (*si)->st_value+contentSize)) {
             auto *ERef = new (_readerStorage.Allocate<
-              ELFReference<target_endianness, max_align, is64Bits> > ())
-              ELFReference<target_endianness, max_align, is64Bits> (
+              ELFReference<ELFT> > ())
+              ELFReference<ELFT> (
                 (ri), (ri)->r_offset-(*si)->st_value, nullptr);
 
             _references.push_back(ERef);
@@ -257,8 +256,8 @@
 
         // Create the DefinedAtom and add it to the list of DefinedAtoms.
         auto *newAtom = new (_readerStorage.Allocate<
-          ELFDefinedAtom<target_endianness, max_align, is64Bits> > ())
-          ELFDefinedAtom<target_endianness, max_align, is64Bits>(
+          ELFDefinedAtom<ELFT> > ())
+          ELFDefinedAtom<ELFT>(
             *this, symbolName, sectionName, *si, i.first, symbolData,
             referenceStart, _references.size(), _references);
 
@@ -296,7 +295,7 @@
   }
 
 private:
-  std::unique_ptr<ELFObjectFile<target_endianness, max_align, is64Bits> >
+  std::unique_ptr<ELFObjectFile<ELFT> >
       _objFile;
   atom_collection_vector<DefinedAtom>       _definedAtoms;
   atom_collection_vector<UndefinedAtom>     _undefinedAtoms;
@@ -313,7 +312,7 @@
   std::map<llvm::StringRef, std::vector<const Elf_Rel *> >
            _relocationReferences;
 
-  std::vector<ELFReference<target_endianness, max_align, is64Bits> *>
+  std::vector<ELFReference<ELFT> *>
     _references;
   llvm::DenseMap<const Elf_Sym *, Atom *> _symbolToAtomMapping;
 
@@ -333,6 +332,7 @@
 
   error_code parseFile(std::unique_ptr<MemoryBuffer> mb, std::vector<
                        std::unique_ptr<File> > &result) {
+    using llvm::object::ELFType;
     llvm::error_code ec;
     std::unique_ptr<File> f;
     std::pair<unsigned char, unsigned char> Ident;
@@ -353,41 +353,41 @@
       if (Ident.first == llvm::ELF::ELFCLASS32 && Ident.second
           == llvm::ELF::ELFDATA2LSB) {
         if (MaxAlignment >= 4)
-          f.reset(
-            new FileELF<llvm::support::little, 4, false>(std::move(mb), ec));
+          f.reset(new FileELF<ELFType<llvm::support::little, 4, false>>(
+                    std::move(mb), ec));
         else if (MaxAlignment >= 2)
-          f.reset(
-            new FileELF<llvm::support::little, 2, false>(std::move(mb), ec));
+          f.reset(new FileELF<ELFType<llvm::support::little, 2, false>>(
+                    std::move(mb), ec));
         else
           llvm_unreachable("Invalid alignment for ELF file!");
       } else if (Ident.first == llvm::ELF::ELFCLASS32 && Ident.second
           == llvm::ELF::ELFDATA2MSB) {
         if (MaxAlignment >= 4)
-          f.reset(
-            new FileELF<llvm::support::big, 4, false>(std::move(mb), ec));
+          f.reset(new FileELF<ELFType<llvm::support::big, 4, false>>(
+                    std::move(mb), ec));
         else if (MaxAlignment >= 2)
-          f.reset(
-            new FileELF<llvm::support::big, 2, false>(std::move(mb), ec));
+          f.reset(new FileELF<ELFType<llvm::support::big, 2, false>>(
+                    std::move(mb), ec));
         else
           llvm_unreachable("Invalid alignment for ELF file!");
       } else if (Ident.first == llvm::ELF::ELFCLASS64 && Ident.second
           == llvm::ELF::ELFDATA2MSB) {
         if (MaxAlignment >= 8)
-          f.reset(
-            new FileELF<llvm::support::big, 8, true>(std::move(mb), ec));
+          f.reset(new FileELF<ELFType<llvm::support::big, 8, true>>(
+                    std::move(mb), ec));
         else if (MaxAlignment >= 2)
-          f.reset(
-            new FileELF<llvm::support::big, 2, true>(std::move(mb), ec));
+          f.reset(new FileELF<ELFType<llvm::support::big, 2, true>>(
+                    std::move(mb), ec));
         else
           llvm_unreachable("Invalid alignment for ELF file!");
       } else if (Ident.first == llvm::ELF::ELFCLASS64 && Ident.second
           == llvm::ELF::ELFDATA2LSB) {
         if (MaxAlignment >= 8)
-          f.reset(
-            new FileELF<llvm::support::little, 8, true>(std::move(mb), ec));
+          f.reset(new FileELF<ELFType<llvm::support::little, 8, true>>(
+                    std::move(mb), ec));
         else if (MaxAlignment >= 2)
-          f.reset(
-            new FileELF<llvm::support::little, 2, true>(std::move(mb), ec));
+          f.reset(new FileELF<ELFType<llvm::support::little, 2, true>>(
+                    std::move(mb), ec));
         else
           llvm_unreachable("Invalid alignment for ELF file!");
       }