llvm-objdump: deal with unexpected object files more gracefully.
authorTim Northover <tnorthover@apple.com>
Tue, 15 Nov 2016 20:26:01 +0000 (20:26 +0000)
committerTim Northover <tnorthover@apple.com>
Tue, 15 Nov 2016 20:26:01 +0000 (20:26 +0000)
Specifically, we don't want to segfault on release builds, so print the problem
instead.

llvm-svn: 287022

llvm/test/tools/llvm-objdump/Inputs/malformed-unwind.macho-x86_64 [new file with mode: 0755]
llvm/test/tools/llvm-objdump/malformed-unwind-x86_64.test [new file with mode: 0644]
llvm/tools/llvm-objdump/MachODump.cpp

diff --git a/llvm/test/tools/llvm-objdump/Inputs/malformed-unwind.macho-x86_64 b/llvm/test/tools/llvm-objdump/Inputs/malformed-unwind.macho-x86_64
new file mode 100755 (executable)
index 0000000..c4cbe2a
Binary files /dev/null and b/llvm/test/tools/llvm-objdump/Inputs/malformed-unwind.macho-x86_64 differ
diff --git a/llvm/test/tools/llvm-objdump/malformed-unwind-x86_64.test b/llvm/test/tools/llvm-objdump/malformed-unwind-x86_64.test
new file mode 100644 (file)
index 0000000..26984a3
--- /dev/null
@@ -0,0 +1,5 @@
+# RUN: llvm-objdump -unwind-info %p/Inputs/malformed-unwind.macho-x86_64 | FileCheck %s
+
+# CHECK: Contents of __unwind_info section:
+# [...]
+# CHECK:     Skipping 2nd level page with unknown kind 4
index 249ab7e..7e61485 100644 (file)
@@ -7072,8 +7072,10 @@ printMachOCompactUnwindSection(const MachOObjectFile *Obj,
                                std::map<uint64_t, SymbolRef> &Symbols,
                                const SectionRef &CompactUnwind) {
 
-  assert(Obj->isLittleEndian() &&
-         "There should not be a big-endian .o with __compact_unwind");
+  if (!Obj->isLittleEndian()) {
+    outs() << "Skipping big-endian __compact_unwind section\n";
+    return;
+  }
 
   bool Is64 = Obj->is64Bit();
   uint32_t PointerSize = Is64 ? sizeof(uint64_t) : sizeof(uint32_t);
@@ -7105,8 +7107,10 @@ printMachOCompactUnwindSection(const MachOObjectFile *Obj,
       Entry.PersonalityReloc = Reloc;
     else if (OffsetInEntry == 2 * PointerSize + 2 * sizeof(uint32_t))
       Entry.LSDAReloc = Reloc;
-    else
-      llvm_unreachable("Unexpected relocation in __compact_unwind section");
+    else {
+      outs() << "Invalid relocation in __compact_unwind section\n";
+      return;
+    }
   }
 
   // Finally, we're ready to print the data we've gathered.
@@ -7212,8 +7216,10 @@ static void printMachOUnwindInfoSection(const MachOObjectFile *Obj,
                                         std::map<uint64_t, SymbolRef> &Symbols,
                                         const SectionRef &UnwindInfo) {
 
-  assert(Obj->isLittleEndian() &&
-         "There should not be a big-endian .o with __unwind_info");
+  if (!Obj->isLittleEndian()) {
+    outs() << "Skipping big-endian __unwind_info section\n";
+    return;
+  }
 
   outs() << "Contents of __unwind_info section:\n";
 
@@ -7228,7 +7234,10 @@ static void printMachOUnwindInfoSection(const MachOObjectFile *Obj,
   uint32_t Version = readNext<uint32_t>(Pos);
   outs() << "  Version:                                   "
          << format("0x%" PRIx32, Version) << '\n';
-  assert(Version == 1 && "only understand version 1");
+  if (Version != 1) {
+    outs() << "    Skipping section with unknown version\n";
+    return;
+  }
 
   uint32_t CommonEncodingsStart = readNext<uint32_t>(Pos);
   outs() << "  Common encodings array section offset:     "
@@ -7368,7 +7377,8 @@ static void printMachOUnwindInfoSection(const MachOObjectFile *Obj,
       printCompressedSecondLevelUnwindPage(Pos, IndexEntries[i].FunctionOffset,
                                            CommonEncodings);
     else
-      llvm_unreachable("Do not know how to print this kind of 2nd level page");
+      outs() << "    Skipping 2nd level page with unknown kind " << Kind
+             << '\n';
   }
 }