At Jim Grosbach's request detemplate Object/MachO.h.

We are still able to handle mixed endian objects by swapping one struct at a
time.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@179778 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/llvm-objdump/MachODump.cpp b/tools/llvm-objdump/MachODump.cpp
index 4b6cb5f..e4d9ce2 100644
--- a/tools/llvm-objdump/MachODump.cpp
+++ b/tools/llvm-objdump/MachODump.cpp
@@ -53,7 +53,7 @@
 static cl::opt<std::string>
   DSYMFile("dsym", cl::desc("Use .dSYM file for debug info"));
 
-static const Target *GetTarget(const MachOObjectFileBase *MachOObj) {
+static const Target *GetTarget(const MachOObjectFile *MachOObj) {
   // Figure out the target triple.
   if (TripleName.empty()) {
     llvm::Triple TT("unknown-unknown-unknown");
@@ -93,7 +93,7 @@
 
 // Print additional information about an address, if available.
 static void DumpAddress(uint64_t Address, ArrayRef<SectionRef> Sections,
-                        const MachOObjectFileBase *MachOObj, raw_ostream &OS) {
+                        const MachOObjectFile *MachOObj, raw_ostream &OS) {
   for (unsigned i = 0; i != Sections.size(); ++i) {
     uint64_t SectAddr = 0, SectSize = 0;
     Sections[i].getAddress(SectAddr);
@@ -184,14 +184,12 @@
   Out << "}\n";
 }
 
-template<endianness E>
 static void
-getSectionsAndSymbols(const typename MachOObjectFileMiddle<E>::Header *Header,
-                      const MachOObjectFileMiddle<E> *MachOObj,
+getSectionsAndSymbols(const macho::Header Header,
+                      MachOObjectFile *MachOObj,
                       std::vector<SectionRef> &Sections,
                       std::vector<SymbolRef> &Symbols,
                       SmallVectorImpl<uint64_t> &FoundFns) {
-  typedef MachOObjectFileMiddle<E> ObjType;
   error_code ec;
   for (symbol_iterator SI = MachOObj->begin_symbols(),
        SE = MachOObj->end_symbols(); SI != SE; SI.increment(ec))
@@ -205,23 +203,23 @@
     Sections.push_back(*SI);
   }
 
-  for (unsigned i = 0; i != Header->NumLoadCommands; ++i) {
-    const typename ObjType::LoadCommand *Command =
-      MachOObj->getLoadCommandInfo(i);
-    if (Command->Type == macho::LCT_FunctionStarts) {
+  MachOObjectFile::LoadCommandInfo Command =
+    MachOObj->getFirstLoadCommandInfo();
+  for (unsigned i = 0; i != Header.NumLoadCommands; ++i) {
+    if (Command.C.Type == macho::LCT_FunctionStarts) {
       // We found a function starts segment, parse the addresses for later
       // consumption.
-      const typename ObjType::LinkeditDataLoadCommand *LLC =
-    reinterpret_cast<const typename ObjType::LinkeditDataLoadCommand*>(Command);
+      macho::LinkeditDataLoadCommand LLC =
+        MachOObj->getLinkeditDataLoadCommand(Command);
 
-      MachOObj->ReadULEB128s(LLC->DataOffset, FoundFns);
+      MachOObj->ReadULEB128s(LLC.DataOffset, FoundFns);
     }
+    Command = MachOObj->getNextLoadCommandInfo(Command);
   }
 }
 
-template<endianness E>
 static void DisassembleInputMachO2(StringRef Filename,
-                                   MachOObjectFileMiddle<E> *MachOOF);
+                                   MachOObjectFile *MachOOF);
 
 void llvm::DisassembleInputMachO(StringRef Filename) {
   OwningPtr<MemoryBuffer> Buff;
@@ -231,20 +229,14 @@
     return;
   }
 
-  OwningPtr<MachOObjectFileBase> MachOOF(static_cast<MachOObjectFileBase*>(
+  OwningPtr<MachOObjectFile> MachOOF(static_cast<MachOObjectFile*>(
         ObjectFile::createMachOObjectFile(Buff.take())));
 
-  if (MachOObjectFileLE *O = dyn_cast<MachOObjectFileLE>(MachOOF.get())) {
-    DisassembleInputMachO2(Filename, O);
-    return;
-  }
-  MachOObjectFileBE *O = cast<MachOObjectFileBE>(MachOOF.get());
-  DisassembleInputMachO2(Filename, O);
+  DisassembleInputMachO2(Filename, MachOOF.get());
 }
 
-template<endianness E>
 static void DisassembleInputMachO2(StringRef Filename,
-                                   MachOObjectFileMiddle<E> *MachOOF) {
+                                   MachOObjectFile *MachOOF) {
   const Target *TheTarget = GetTarget(MachOOF);
   if (!TheTarget) {
     // GetTarget prints out stuff.
@@ -273,8 +265,7 @@
 
   outs() << '\n' << Filename << ":\n\n";
 
-  const typename MachOObjectFileMiddle<E>::Header *Header =
-    MachOOF->getHeader();
+  macho::Header Header = MachOOF->getHeader();
 
   std::vector<SectionRef> Sections;
   std::vector<SymbolRef> Symbols;
diff --git a/tools/llvm-objdump/llvm-objdump.cpp b/tools/llvm-objdump/llvm-objdump.cpp
index 6f4b101..9985599 100644
--- a/tools/llvm-objdump/llvm-objdump.cpp
+++ b/tools/llvm-objdump/llvm-objdump.cpp
@@ -191,14 +191,6 @@
   return a_addr < b_addr;
 }
 
-StringRef
-getSectionFinalSegmentName(const MachOObjectFileBase *MachO, DataRefImpl DR) {
-  if (const MachOObjectFileLE *O = dyn_cast<MachOObjectFileLE>(MachO))
-    return O->getSectionFinalSegmentName(DR);
-  const MachOObjectFileBE *O = dyn_cast<MachOObjectFileBE>(MachO);
-  return O->getSectionFinalSegmentName(DR);
-}
-
 static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) {
   const Target *TheTarget = getTarget(Obj);
   // getTarget() will have already issued a diagnostic if necessary, so
@@ -263,10 +255,10 @@
     std::sort(Rels.begin(), Rels.end(), RelocAddressLess);
 
     StringRef SegmentName = "";
-    if (const MachOObjectFileBase *MachO =
-        dyn_cast<const MachOObjectFileBase>(Obj)) {
+    if (const MachOObjectFile *MachO =
+        dyn_cast<const MachOObjectFile>(Obj)) {
       DataRefImpl DR = i->getRawDataRefImpl();
-      SegmentName = getSectionFinalSegmentName(MachO, DR);
+      SegmentName = MachO->getSectionFinalSegmentName(DR);
     }
     StringRef name;
     if (error(i->getName(name))) break;
@@ -608,10 +600,10 @@
       else if (Section == o->end_sections())
         outs() << "*UND*";
       else {
-        if (const MachOObjectFileBase *MachO =
-            dyn_cast<const MachOObjectFileBase>(o)) {
+        if (const MachOObjectFile *MachO =
+            dyn_cast<const MachOObjectFile>(o)) {
           DataRefImpl DR = Section->getRawDataRefImpl();
-          StringRef SegmentName = getSectionFinalSegmentName(MachO, DR);
+          StringRef SegmentName = MachO->getSectionFinalSegmentName(DR);
           outs() << SegmentName << ",";
         }
         StringRef SectionName;