[llvm] r313888 - llvm-dwarfdump: Add support for the --arch command line option.

Adrian Prantl via llvm-commits llvm-commits at lists.llvm.org
Thu Sep 21 09:26:18 PDT 2017


Author: adrian
Date: Thu Sep 21 09:26:18 2017
New Revision: 313888

URL: http://llvm.org/viewvc/llvm-project?rev=313888&view=rev
Log:
llvm-dwarfdump: Add support for the --arch command line option.

Modified:
    llvm/trunk/test/tools/llvm-dwarfdump/X86/archive.test
    llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp

Modified: llvm/trunk/test/tools/llvm-dwarfdump/X86/archive.test
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/llvm-dwarfdump/X86/archive.test?rev=313888&r1=313887&r2=313888&view=diff
==============================================================================
--- llvm/trunk/test/tools/llvm-dwarfdump/X86/archive.test (original)
+++ llvm/trunk/test/tools/llvm-dwarfdump/X86/archive.test Thu Sep 21 09:26:18 2017
@@ -1,5 +1,18 @@
-RUN: llvm-dwarfdump --debug-info %S/../../dsymutil/Inputs/libfat-test.a | FileCheck %s
+RUN: llvm-dwarfdump --debug-info %S/../../dsymutil/Inputs/libfat-test.a \
+RUN:   | FileCheck %s
 CHECK: libfat-test.a(x86_64)(fat-test.o):        file format Mach-O 64-bit x86-64
 CHECK: .debug_info contents:
 CHECK: libfat-test.a(i386)(fat-test.o):  file format Mach-O 32-bit i386
 CHECK: .debug_info contents:
+
+RUN: llvm-dwarfdump --debug-info %S/../../dsymutil/Inputs/libfat-test.a \
+RUN:   --arch=i386 | FileCheck %s --check-prefix=I386
+I386-NOT: 64-bit
+I386: file format Mach-O 32-bit i386
+I386-NOT: 64-bit
+
+RUN: llvm-dwarfdump --debug-info %S/../../dsymutil/Inputs/libfat-test.a \
+RUN:   --arch=i386 --arch=x86_64 | FileCheck %s
+
+RUN: llvm-dwarfdump --debug-info %S/../../dsymutil/Inputs/libfat-test.a \
+RUN:   --arch=7 | FileCheck %s --check-prefix=I386

Modified: llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp?rev=313888&r1=313887&r2=313888&view=diff
==============================================================================
--- llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp (original)
+++ llvm/trunk/tools/llvm-dwarfdump/llvm-dwarfdump.cpp Thu Sep 21 09:26:18 2017
@@ -126,6 +126,13 @@ static std::array<llvm::Optional<uint64_
 static alias DumpDebugFrameAlias("eh-frame", desc("Alias for -debug-frame"),
                                  NotHidden, cat(SectionCategory),
                                  aliasopt(DumpDebugFrame));
+static list<std::string>
+    ArchFilters("arch",
+                desc("Dump debug information for the specified CPU "
+                     "architecture only. Architectures may be specified by "
+                     "name or by number. This option can be specified "
+                     "multiple times, once for each desired architecture."),
+                cat(DwarfDumpCategory));
 static opt<bool> DumpUUID("uuid", desc("Show the UUID for each architecture"),
                           cat(DwarfDumpCategory));
 static alias DumpUUIDAlias("u", desc("Alias for -uuid"), aliasopt(DumpUUID));
@@ -190,28 +197,55 @@ static DIDumpOptions getDumpOpts() {
   return DumpOpts;
 }
 
-static bool dumpObjectFile(ObjectFile &Obj, Twine Filename) {
-  std::unique_ptr<DWARFContext> DICtx = DWARFContext::create(Obj);
-  logAllUnhandledErrors(DICtx->loadRegisterInfo(Obj), errs(),
+static uint32_t getCPUType(MachOObjectFile &MachO) {
+  if (MachO.is64Bit())
+    return MachO.getHeader64().cputype;
+  else
+    return MachO.getHeader().cputype;
+}
+
+/// Return true if the object file has not been filtered by an --arch option.
+static bool filterArch(ObjectFile &Obj) {
+  if (ArchFilters.empty())
+    return true;
+  if (auto *MachO = dyn_cast<MachOObjectFile>(&Obj)) {
+    std::string ObjArch =
+        Triple::getArchTypeName(MachO->getArchTriple().getArch());
+    for (auto Arch : ArchFilters) {
+      if (Arch == ObjArch)
+        return true;
+      unsigned Value;
+      if (!StringRef(Arch).getAsInteger(0, Value))
+        if (Value == getCPUType(*MachO))
+          return true;
+    }
+  }
+  return false;
+}
+
+using HandlerFn = std::function<bool(ObjectFile &, DWARFContext &DICtx, Twine)>;
+
+static bool dumpObjectFile(ObjectFile &Obj, DWARFContext &DICtx,
+                           Twine Filename) {
+  logAllUnhandledErrors(DICtx.loadRegisterInfo(Obj), errs(),
                         Filename.str() + ": ");
   // The UUID dump already contains all the same information.
   if (!(DumpType & DIDT_UUID) || DumpType == DIDT_All)
     outs() << Filename << ":\tfile format " << Obj.getFileFormatName() << '\n';
 
   // Dump the complete DWARF structure.
-  DICtx->dump(outs(), getDumpOpts(), DumpOffsets);
+  DICtx.dump(outs(), getDumpOpts(), DumpOffsets);
   return true;
 }
 
-static bool verifyObjectFile(ObjectFile &Obj, Twine Filename) {
-  std::unique_ptr<DIContext> DICtx = DWARFContext::create(Obj);
-
+static bool verifyObjectFile(ObjectFile &Obj, DWARFContext &DICtx,
+                             Twine Filename) {
   // Verify the DWARF and exit with non-zero exit status if verification
   // fails.
   raw_ostream &stream = Quiet ? nulls() : outs();
   stream << "Verifying " << Filename.str() << ":\tfile format "
   << Obj.getFileFormatName() << "\n";
-  bool Result = DICtx->verify(stream, getDumpOpts());
+  bool Result = DICtx.verify(stream, getDumpOpts());
   if (Result)
     stream << "No errors.\n";
   else
@@ -220,10 +254,10 @@ static bool verifyObjectFile(ObjectFile
 }
 
 static bool handleBuffer(StringRef Filename, MemoryBufferRef Buffer,
-                         std::function<bool(ObjectFile &, Twine)> HandleObj);
+                         HandlerFn HandleObj);
 
 static bool handleArchive(StringRef Filename, Archive &Arch,
-                          std::function<bool(ObjectFile &, Twine)> HandleObj) {
+                          HandlerFn HandleObj) {
   bool Result = true;
   Error Err = Error::success();
   for (auto Child : Arch.children(Err)) {
@@ -240,19 +274,27 @@ static bool handleArchive(StringRef File
 }
 
 static bool handleBuffer(StringRef Filename, MemoryBufferRef Buffer,
-                         std::function<bool(ObjectFile &, Twine)> HandleObj) {
+                         HandlerFn HandleObj) {
   Expected<std::unique_ptr<Binary>> BinOrErr = object::createBinary(Buffer);
   error(Filename, errorToErrorCode(BinOrErr.takeError()));
 
   bool Result = true;
-  if (auto *Obj = dyn_cast<ObjectFile>(BinOrErr->get()))
-    Result = HandleObj(*Obj, Filename);
+  if (auto *Obj = dyn_cast<ObjectFile>(BinOrErr->get())) {
+    if (filterArch(*Obj)) {
+      std::unique_ptr<DWARFContext> DICtx = DWARFContext::create(*Obj);
+      Result = HandleObj(*Obj, *DICtx, Filename);
+    }
+  }
   else if (auto *Fat = dyn_cast<MachOUniversalBinary>(BinOrErr->get()))
     for (auto &ObjForArch : Fat->objects()) {
       std::string ObjName =
           (Filename + "(" + ObjForArch.getArchFlagName() + ")").str();
       if (auto MachOOrErr = ObjForArch.getAsObjectFile()) {
-        Result &= HandleObj(**MachOOrErr, ObjName);
+        auto &Obj = **MachOOrErr;
+        if (filterArch(Obj)) {
+          std::unique_ptr<DWARFContext> DICtx = DWARFContext::create(Obj);
+          Result &= HandleObj(Obj, *DICtx, ObjName);
+        }
         continue;
       } else
         consumeError(MachOOrErr.takeError());
@@ -268,8 +310,7 @@ static bool handleBuffer(StringRef Filen
   return Result;
 }
 
-static bool handleFile(StringRef Filename,
-                       std::function<bool(ObjectFile &, Twine)> HandleObj) {
+static bool handleFile(StringRef Filename, HandlerFn HandleObj) {
   ErrorOr<std::unique_ptr<MemoryBuffer>> BuffOrErr =
   MemoryBuffer::getFileOrSTDIN(Filename);
   error(Filename, BuffOrErr.getError());




More information about the llvm-commits mailing list