This reverts commit r223306 and r223277.
authorRafael Espindola <rafael.espindola@gmail.com>
Wed, 3 Dec 2014 23:29:34 +0000 (23:29 +0000)
committerRafael Espindola <rafael.espindola@gmail.com>
Wed, 3 Dec 2014 23:29:34 +0000 (23:29 +0000)
The code is using uninitialized memory and failing on linux.

llvm-svn: 223315

llvm/test/CodeGen/Thumb/iabs.ll
llvm/test/tools/llvm-objdump/X86/Inputs/macho-universal-archive.x86_64.i386 [deleted file]
llvm/test/tools/llvm-objdump/X86/Inputs/macho-universal.x86_64.i386 [deleted file]
llvm/test/tools/llvm-objdump/X86/macho-universal-x86_64.i386.test [deleted file]
llvm/tools/llvm-objdump/MachODump.cpp
llvm/tools/llvm-objdump/llvm-objdump.cpp

index ecd4a6b..76224bc 100644 (file)
@@ -1,5 +1,5 @@
 ; RUN: llc < %s -mtriple=thumb-unknown-unknown -filetype=obj -o %t.o
-; RUN: llvm-objdump -disassemble -arch-name=thumb %t.o | FileCheck %s
+; RUN: llvm-objdump -disassemble -arch=thumb %t.o | FileCheck %s
 
 define i32 @test(i32 %a) {
         %tmp1neg = sub i32 0, %a
diff --git a/llvm/test/tools/llvm-objdump/X86/Inputs/macho-universal-archive.x86_64.i386 b/llvm/test/tools/llvm-objdump/X86/Inputs/macho-universal-archive.x86_64.i386
deleted file mode 100644 (file)
index 1660714..0000000
Binary files a/llvm/test/tools/llvm-objdump/X86/Inputs/macho-universal-archive.x86_64.i386 and /dev/null differ
diff --git a/llvm/test/tools/llvm-objdump/X86/Inputs/macho-universal.x86_64.i386 b/llvm/test/tools/llvm-objdump/X86/Inputs/macho-universal.x86_64.i386
deleted file mode 100755 (executable)
index 36d5fc2..0000000
Binary files a/llvm/test/tools/llvm-objdump/X86/Inputs/macho-universal.x86_64.i386 and /dev/null differ
diff --git a/llvm/test/tools/llvm-objdump/X86/macho-universal-x86_64.i386.test b/llvm/test/tools/llvm-objdump/X86/macho-universal-x86_64.i386.test
deleted file mode 100644 (file)
index 9f1b513..0000000
+++ /dev/null
@@ -1,25 +0,0 @@
-RUN: llvm-objdump %p/Inputs/macho-universal.x86_64.i386 -d -m -no-show-raw-insn -full-leading-addr -print-imm-hex -arch all \
-RUN: | FileCheck %s -check-prefix UEXE-all
-RUN: llvm-objdump %p/Inputs/macho-universal-archive.x86_64.i386 -d -m -no-show-raw-insn -full-leading-addr -print-imm-hex -arch i386 \
-RUN: | FileCheck %s -check-prefix UArchive-i386
-
-UEXE-all: macho-universal.x86_64.i386 (architecture x86_64):
-UEXE-all: (__TEXT,__text) section
-UEXE-all: _main:
-UEXE-all: 0000000100000f60     pushq   %rbp
-UEXE-all: 0000000100000f61     movq    %rsp, %rbp
-UEXE-all: macho-universal.x86_64.i386 (architecture i386):
-UEXE-all: (__TEXT,__text) section
-UEXE-all: _main:
-UEXE-all: 00001fa0     pushl   %ebp
-UEXE-all: 00001fa1     movl    %esp, %ebp
-
-UArchive-i386: Archive : {{.*}}/macho-universal-archive.x86_64.i386
-UArchive-i386: macho-universal-archive.x86_64.i386(foo.o):
-UArchive-i386: (__TEXT,__text) section
-UArchive-i386: _foo:
-UArchive-i386: 00000000        pushl   %ebp
-UArchive-i386: 00000001        movl    %esp, %ebp
-UArchive-i386: 00000003        popl    %ebp
-UArchive-i386: 00000004        retl
-
index 417a8b8..3a28703 100644 (file)
@@ -28,7 +28,6 @@
 #include "llvm/MC/MCRegisterInfo.h"
 #include "llvm/MC/MCSubtargetInfo.h"
 #include "llvm/Object/MachO.h"
-#include "llvm/Object/MachOUniversal.h"
 #include "llvm/Support/Casting.h"
 #include "llvm/Support/CommandLine.h"
 #include "llvm/Support/Debug.h"
@@ -66,11 +65,6 @@ static cl::opt<bool>
     PrintImmHex("print-imm-hex",
                 cl::desc("Use hex format for immediate values"));
 
-static cl::list<std::string>
-    ArchFlags("arch", cl::desc("architecture(s) from a Mach-O file to dump"),
-              cl::ZeroOrMore);
-bool ArchAll = false;
-
 static std::string ThumbTripleName;
 
 static const Target *GetTarget(const MachOObjectFile *MachOObj,
@@ -211,12 +205,8 @@ static void getSectionsAndSymbols(const MachO::mach_header Header,
                                   std::vector<SymbolRef> &Symbols,
                                   SmallVectorImpl<uint64_t> &FoundFns,
                                   uint64_t &BaseSegmentAddress) {
-  for (const SymbolRef &Symbol : MachOObj->symbols()) {
-    StringRef SymName;
-    Symbol.getName(SymName);
-    if (!SymName.startswith("ltmp"))
-      Symbols.push_back(Symbol);
-  }
+  for (const SymbolRef &Symbol : MachOObj->symbols())
+    Symbols.push_back(Symbol);
 
   for (const SectionRef &Section : MachOObj->sections()) {
     StringRef SectName;
@@ -251,210 +241,22 @@ static void getSectionsAndSymbols(const MachO::mach_header Header,
   }
 }
 
-// checkMachOAndArchFlags() checks to see if the ObjectFile is a Mach-O file
-// and if it is and there is a list of architecture flags is specified then
-// check to make sure this Mach-O file is one of those architectures or all
-// architectures were specified.  If not then an error is generated and this
-// routine returns false.  Else it returns true.
-static bool checkMachOAndArchFlags(ObjectFile *O, StringRef Filename) {
-  if (isa<MachOObjectFile>(O) && !ArchAll && ArchFlags.size() != 0) {
-    MachOObjectFile *MachO = dyn_cast<MachOObjectFile>(O);
-    bool ArchFound = false;
-    MachO::mach_header H;
-    MachO::mach_header_64 H_64;
-    Triple T;
-    if (MachO->is64Bit()) {
-      H_64 = MachO->MachOObjectFile::getHeader64();
-      T = MachOObjectFile::getArch(H_64.cputype, H_64.cpusubtype);
-    } else {
-      H = MachO->MachOObjectFile::getHeader();
-      T = MachOObjectFile::getArch(H.cputype, H.cpusubtype);
-    }
-    unsigned i;
-    for (i = 0; i < ArchFlags.size(); ++i) {
-      if (ArchFlags[i] == T.getArchName())
-        ArchFound = true;
-      break;
-    }
-    if (!ArchFound) {
-      errs() << "llvm-objdump: file: " + Filename + " does not contain "
-             << "architecture: " + ArchFlags[i] + "\n";
-      return false;
-    }
-  }
-  return true;
-}
-
-static void DisassembleInputMachO2(StringRef Filename, MachOObjectFile *MachOOF,
-                                   StringRef ArchiveMemberName = StringRef(),
-                                   StringRef ArchitectureName = StringRef());
+static void DisassembleInputMachO2(StringRef Filename,
+                                   MachOObjectFile *MachOOF);
 
 void llvm::DisassembleInputMachO(StringRef Filename) {
-  // Check for -arch all and verifiy the -arch flags are valid.
-  for (unsigned i = 0; i < ArchFlags.size(); ++i) {
-    if (ArchFlags[i] == "all") {
-      ArchAll = true;
-    } else {
-      if (!MachOObjectFile::isValidArch(ArchFlags[i])) {
-        errs() << "llvm-objdump: Unknown architecture named '" + ArchFlags[i] +
-                      "'for the -arch option\n";
-        return;
-      }
-    }
-  }
-
-  // Attempt to open the binary.
-  ErrorOr<OwningBinary<Binary>> BinaryOrErr = createBinary(Filename);
-  if (std::error_code EC = BinaryOrErr.getError()) {
-    errs() << "llvm-objdump: '" << Filename << "': " << EC.message() << ".\n";
-    return;
-  }
-  Binary &Bin = *BinaryOrErr.get().getBinary();
-
-  if (Archive *A = dyn_cast<Archive>(&Bin)) {
-    outs() << "Archive : " << Filename << "\n";
-    for (Archive::child_iterator I = A->child_begin(), E = A->child_end();
-         I != E; ++I) {
-      ErrorOr<std::unique_ptr<Binary>> ChildOrErr = I->getAsBinary();
-      if (ChildOrErr.getError())
-        continue;
-      if (MachOObjectFile *O = dyn_cast<MachOObjectFile>(&*ChildOrErr.get())) {
-        if (!checkMachOAndArchFlags(O, Filename))
-          return;
-        DisassembleInputMachO2(Filename, O, O->getFileName());
-      }
-    }
+  ErrorOr<std::unique_ptr<MemoryBuffer>> BuffOrErr =
+      MemoryBuffer::getFileOrSTDIN(Filename);
+  if (std::error_code EC = BuffOrErr.getError()) {
+    errs() << "llvm-objdump: " << Filename << ": " << EC.message() << "\n";
     return;
   }
-  if (MachOUniversalBinary *UB = dyn_cast<MachOUniversalBinary>(&Bin)) {
-    // If we have a list of architecture flags specified dump only those.
-    if (!ArchAll && ArchFlags.size() != 0) {
-      // Look for a slice in the universal binary that matches each ArchFlag.
-      bool ArchFound;
-      for (unsigned i = 0; i < ArchFlags.size(); ++i) {
-        ArchFound = false;
-        for (MachOUniversalBinary::object_iterator I = UB->begin_objects(),
-                                                   E = UB->end_objects();
-             I != E; ++I) {
-          if (ArchFlags[i] == I->getArchTypeName()) {
-            ArchFound = true;
-            ErrorOr<std::unique_ptr<ObjectFile>> ObjOrErr =
-                I->getAsObjectFile();
-            std::unique_ptr<Archive> A;
-            StringRef ArchitectureName = StringRef();
-            if (ArchFlags.size() > 1)
-              ArchitectureName = I->getArchTypeName();
-            if (ObjOrErr) {
-              ObjectFile &O = *ObjOrErr.get();
-              if (MachOObjectFile *MachOOF = dyn_cast<MachOObjectFile>(&O))
-                DisassembleInputMachO2(Filename, MachOOF, "", ArchitectureName);
-            } else if (!I->getAsArchive(A)) {
-              outs() << "Archive : " << Filename;
-              if (!ArchitectureName.empty())
-                outs() << " (architecture " << ArchitectureName << ")";
-              outs() << "\n";
-              for (Archive::child_iterator AI = A->child_begin(),
-                                           AE = A->child_end();
-                   AI != AE; ++AI) {
-                ErrorOr<std::unique_ptr<Binary>> ChildOrErr = AI->getAsBinary();
-                if (ChildOrErr.getError())
-                  continue;
-                if (MachOObjectFile *O =
-                        dyn_cast<MachOObjectFile>(&*ChildOrErr.get()))
-                  DisassembleInputMachO2(Filename, O, O->getFileName(),
-                                         ArchitectureName);
-              }
-            }
-          }
-        }
-        if (!ArchFound) {
-          errs() << "llvm-objdump: file: " + Filename + " does not contain "
-                 << "architecture: " + ArchFlags[i] + "\n";
-          return;
-        }
-      }
-      return;
-    }
-    // No architecture flags were specified so if this contains a slice that
-    // matches the host architecture dump only that.
-    if (!ArchAll) {
-      StringRef HostArchName = MachOObjectFile::getHostArch().getArchName();
-      for (MachOUniversalBinary::object_iterator I = UB->begin_objects(),
-                                                 E = UB->end_objects();
-           I != E; ++I) {
-        if (HostArchName == I->getArchTypeName()) {
-          ErrorOr<std::unique_ptr<ObjectFile>> ObjOrErr = I->getAsObjectFile();
-          std::unique_ptr<Archive> A;
-          std::string ArchiveName;
-          ArchiveName.clear();
-          if (ObjOrErr) {
-            ObjectFile &O = *ObjOrErr.get();
-            if (MachOObjectFile *MachOOF = dyn_cast<MachOObjectFile>(&O))
-              DisassembleInputMachO2(Filename, MachOOF);
-          } else if (!I->getAsArchive(A)) {
-            outs() << "Archive : " << Filename << "\n";
-            for (Archive::child_iterator AI = A->child_begin(),
-                                         AE = A->child_end();
-                 AI != AE; ++AI) {
-              ErrorOr<std::unique_ptr<Binary>> ChildOrErr = AI->getAsBinary();
-              if (ChildOrErr.getError())
-                continue;
-              if (MachOObjectFile *O =
-                      dyn_cast<MachOObjectFile>(&*ChildOrErr.get()))
-                DisassembleInputMachO2(Filename, O, O->getFileName());
-            }
-          }
-          return;
-        }
-      }
-    }
-    // Either all architectures have been specified or none have been specified
-    // and this does not contain the host architecture so dump all the slices.
-    bool moreThanOneArch = UB->getNumberOfObjects() > 1;
-    for (MachOUniversalBinary::object_iterator I = UB->begin_objects(),
-                                               E = UB->end_objects();
-         I != E; ++I) {
-      ErrorOr<std::unique_ptr<ObjectFile>> ObjOrErr = I->getAsObjectFile();
-      std::unique_ptr<Archive> A;
-      StringRef ArchitectureName = StringRef();
-      if (moreThanOneArch)
-        ArchitectureName = I->getArchTypeName();
-      if (ObjOrErr) {
-        ObjectFile &Obj = *ObjOrErr.get();
-        if (MachOObjectFile *MachOOF = dyn_cast<MachOObjectFile>(&Obj))
-          DisassembleInputMachO2(Filename, MachOOF, "", ArchitectureName);
-      } else if (!I->getAsArchive(A)) {
-        outs() << "Archive : " << Filename;
-        if (!ArchitectureName.empty())
-          outs() << " (architecture " << ArchitectureName << ")";
-        outs() << "\n";
-        for (Archive::child_iterator AI = A->child_begin(), AE = A->child_end();
-             AI != AE; ++AI) {
-          ErrorOr<std::unique_ptr<Binary>> ChildOrErr = AI->getAsBinary();
-          if (ChildOrErr.getError())
-            continue;
-          if (MachOObjectFile *O =
-                  dyn_cast<MachOObjectFile>(&*ChildOrErr.get())) {
-            if (MachOObjectFile *MachOOF = dyn_cast<MachOObjectFile>(O))
-              DisassembleInputMachO2(Filename, MachOOF, MachOOF->getFileName(),
-                                     ArchitectureName);
-          }
-        }
-      }
-    }
-    return;
-  }
-  if (ObjectFile *O = dyn_cast<ObjectFile>(&Bin)) {
-    if (!checkMachOAndArchFlags(O, Filename))
-      return;
-    if (MachOObjectFile *MachOOF = dyn_cast<MachOObjectFile>(&*O)) {
-      DisassembleInputMachO2(Filename, MachOOF);
-    } else
-      errs() << "llvm-objdump: '" << Filename << "': "
-             << "Object is not a Mach-O file type.\n";
-  } else
-    errs() << "llvm-objdump: '" << Filename << "': "
-           << "Unrecognized file type.\n";
+  std::unique_ptr<MemoryBuffer> Buff = std::move(BuffOrErr.get());
+
+  std::unique_ptr<MachOObjectFile> MachOOF = std::move(
+      ObjectFile::createMachOObjectFile(Buff.get()->getMemBufferRef()).get());
+
+  DisassembleInputMachO2(Filename, MachOOF.get());
 }
 
 typedef DenseMap<uint64_t, StringRef> SymbolAddressMap;
@@ -1783,9 +1585,8 @@ static void emitComments(raw_svector_ostream &CommentStream,
   CommentStream.resync();
 }
 
-static void DisassembleInputMachO2(StringRef Filename, MachOObjectFile *MachOOF,
-                                   StringRef ArchiveMemberName,
-                                   StringRef ArchitectureName) {
+static void DisassembleInputMachO2(StringRef Filename,
+                                   MachOObjectFile *MachOOF) {
   const char *McpuDefault = nullptr;
   const Target *ThumbTarget = nullptr;
   const Target *TheTarget = GetTarget(MachOOF, &McpuDefault, &ThumbTarget);
@@ -1838,12 +1639,6 @@ static void DisassembleInputMachO2(StringRef Filename, MachOObjectFile *MachOOF,
   // Comment stream and backing vector.
   SmallString<128> CommentsToEmit;
   raw_svector_ostream CommentStream(CommentsToEmit);
-  // FIXME: Setting the CommentStream in the InstPrinter is problematic in that
-  // if it is done then arm64 comments for string literals don't get printed
-  // and some constant get printed instead and not setting it causes intel
-  // (32-bit and 64-bit) comments printed with different spacing before the
-  // comment causing different diffs with the 'C' disassembler library API.
-  // IP->setCommentStream(CommentStream);
 
   if (!AsmInfo || !STI || !DisAsm || !IP) {
     errs() << "error: couldn't initialize disassembler for target "
@@ -1892,12 +1687,7 @@ static void DisassembleInputMachO2(StringRef Filename, MachOObjectFile *MachOOF,
     return;
   }
 
-  outs() << Filename;
-  if (!ArchiveMemberName.empty())
-    outs() << '(' << ArchiveMemberName << ')';
-  if (!ArchitectureName.empty())
-    outs() << " (architecture " << ArchitectureName << ")";
-  outs() << ":\n";
+  outs() << '\n' << Filename << ":\n\n";
 
   MachO::mach_header Header = MachOOF->getHeader();
 
@@ -1960,14 +1750,6 @@ static void DisassembleInputMachO2(StringRef Filename, MachOObjectFile *MachOOF,
     diContext.reset(DIContext::getDWARFContext(*DbgObj));
   }
 
-  // TODO: For now this only disassembles the (__TEXT,__text) section (see the
-  // checks in the code below at the top of this loop).  It should allow a
-  // darwin otool(1) like -s option to disassemble any named segment & section
-  // that is marked as containing instructions with the attributes
-  // S_ATTR_PURE_INSTRUCTIONS or S_ATTR_SOME_INSTRUCTIONS in the flags field of
-  // the section structure.
-  outs() << "(__TEXT,__text) section\n";
-
   for (unsigned SectIdx = 0; SectIdx != Sections.size(); SectIdx++) {
 
     bool SectIsText = Sections[SectIdx].isText();
@@ -2231,11 +2013,6 @@ static void DisassembleInputMachO2(StringRef Filename, MachOObjectFile *MachOOF,
         }
       }
     }
-    // The TripleName's need to be reset if we are called again for a different
-    // archtecture.
-    TripleName = "";
-    ThumbTripleName = "";
-
     if (SymbolizerInfo.method != nullptr)
       free(SymbolizerInfo.method);
     if (SymbolizerInfo.demangled_name != nullptr)
index 7316a4f..c62922e 100644 (file)
@@ -109,7 +109,7 @@ llvm::MCPU("mcpu",
      cl::init(""));
 
 cl::opt<std::string>
-llvm::ArchName("arch-name", cl::desc("Target arch to disassemble for, "
+llvm::ArchName("arch", cl::desc("Target arch to disassemble for, "
                                 "see -version for available targets"));
 
 static cl::opt<bool>