summaryrefslogtreecommitdiffstats
path: root/llvm
diff options
context:
space:
mode:
Diffstat (limited to 'llvm')
-rw-r--r--llvm/test/tools/llvm-objdump/Inputs/malformed-machos/mem-crup-0010.machobin0 -> 9248 bytes
-rw-r--r--llvm/test/tools/llvm-objdump/malformed-machos.test6
-rw-r--r--llvm/tools/llvm-objdump/MachODump.cpp12
3 files changed, 15 insertions, 3 deletions
diff --git a/llvm/test/tools/llvm-objdump/Inputs/malformed-machos/mem-crup-0010.macho b/llvm/test/tools/llvm-objdump/Inputs/malformed-machos/mem-crup-0010.macho
new file mode 100644
index 00000000000..4c7e78d93b6
--- /dev/null
+++ b/llvm/test/tools/llvm-objdump/Inputs/malformed-machos/mem-crup-0010.macho
Binary files differ
diff --git a/llvm/test/tools/llvm-objdump/malformed-machos.test b/llvm/test/tools/llvm-objdump/malformed-machos.test
index 4e1765f7f42..e836239a250 100644
--- a/llvm/test/tools/llvm-objdump/malformed-machos.test
+++ b/llvm/test/tools/llvm-objdump/malformed-machos.test
@@ -12,3 +12,9 @@
# RUN: | FileCheck -check-prefix=m0006 %s
# m0006: ivarLayout 0x8
+
+# RUN: llvm-objdump -macho -objc-meta-data \
+# RUN: %p/Inputs/malformed-machos/mem-crup-0006.macho \
+# RUN: | FileCheck -check-prefix=m0010 %s
+
+# m0010: 00000000000010e0 0x10e8 _OBJC_CLASS_
diff --git a/llvm/tools/llvm-objdump/MachODump.cpp b/llvm/tools/llvm-objdump/MachODump.cpp
index 0e9bf3695d8..b6b910f55dc 100644
--- a/llvm/tools/llvm-objdump/MachODump.cpp
+++ b/llvm/tools/llvm-objdump/MachODump.cpp
@@ -1667,6 +1667,7 @@ struct DisassembleInfo {
uint64_t adrp_addr;
uint32_t adrp_inst;
BindTable *bindtable;
+ uint32_t depth;
};
// SymbolizerGetOpInfo() is the operand information call back function.
@@ -4463,9 +4464,13 @@ static void print_class64_t(uint64_t p, struct DisassembleInfo *info) {
bool is_meta_class;
print_class_ro64_t((c.data + n_value) & ~0x7, info, is_meta_class);
- if (!is_meta_class) {
- outs() << "Meta Class\n";
- print_class64_t(c.isa + isa_n_value, info);
+ if (!is_meta_class &&
+ c.isa + isa_n_value != p &&
+ c.isa + isa_n_value != 0 &&
+ info->depth < 100) {
+ info->depth++;
+ outs() << "Meta Class\n";
+ print_class64_t(c.isa + isa_n_value, info);
}
}
@@ -5113,6 +5118,7 @@ static void printObjc2_64bit_MetaData(MachOObjectFile *O, bool verbose) {
info.adrp_addr = 0;
info.adrp_inst = 0;
+ info.depth = 0;
const SectionRef CL = get_section(O, "__OBJC2", "__class_list");
if (CL != SectionRef()) {
info.S = CL;
OpenPOWER on IntegriCloud