diff --git a/llvm/test/MC/X86/AlignedBundling/nesting.s b/llvm/test/MC/X86/AlignedBundling/nesting.s index 74b8fe9ff49b..d83c423a56e4 100644 --- a/llvm/test/MC/X86/AlignedBundling/nesting.s +++ b/llvm/test/MC/X86/AlignedBundling/nesting.s @@ -6,7 +6,7 @@ # Will be bundle-aligning to 16 byte boundaries .bundle_align_mode 4 .text -# CHECK-LABEL: foo +# CHECK-LABEL: foo: foo: # Test that bundle alignment mode can be set more than once. .bundle_align_mode 4 @@ -19,11 +19,11 @@ foo: callq bar .bundle_unlock .bundle_unlock -# CHECK: 10: callq -# CHECK-NEXT: 15: callq +# CHECK: 10: callq {{.*}} +# CHECK-NEXT: 15: callq {{.*}} .p2align 4 -# CHECK-LABEL: bar +# CHECK-LABEL: bar: bar: callq foo callq foo @@ -35,10 +35,10 @@ bar: callq bar .bundle_unlock .bundle_unlock -# CHECK: 36: callq -# CHECK-NEXT: 3b: callq +# CHECK: 36: callq {{.*}} +# CHECK-NEXT: 3b: callq {{.*}} -# CHECK-LABEL: baz +# CHECK-LABEL: baz: baz: callq foo callq foo @@ -50,8 +50,8 @@ baz: callq bar .bundle_unlock .bundle_unlock -# CHECK: 56: callq -# CHECK-NEXT: 5b: callq +# CHECK: 56: callq {{.*}} +# CHECK-NEXT: 5b: callq {{.*}} # CHECK-LABEL: quux quux: @@ -65,5 +65,5 @@ quux: .bundle_unlock # Check that the calls are bundled together when the second one is after the # inner nest is closed. -# CHECK: 70: callq -# CHECK-NEXT: 75: callq +# CHECK: 70: callq {{.*}} +# CHECK-NEXT: 75: callq {{.*}} diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp index 0cb4fc24aa4a..c0965d8843dc 100644 --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -808,6 +808,27 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { SectionRelocMap[*Sec2].push_back(Section); } + // Create a mapping from virtual address to symbol name. This is used to + // pretty print the target of a call. + std::vector> AllSymbols; + if (MIA) { + for (const SymbolRef &Symbol : Obj->symbols()) { + ErrorOr AddressOrErr = Symbol.getAddress(); + if (error(AddressOrErr.getError())) + break; + uint64_t Address = *AddressOrErr; + + ErrorOr Name = Symbol.getName(); + if (error(Name.getError())) + break; + if (Name->empty()) + continue; + AllSymbols.push_back(std::make_pair(Address, *Name)); + } + + array_pod_sort(AllSymbols.begin(), AllSymbols.end()); + } + for (const SectionRef &Section : Obj->sections()) { if (!Section.isText() || Section.isVirtual()) continue; @@ -912,6 +933,21 @@ static void DisassembleObject(const ObjectFile *Obj, bool InlineRelocs) { SectionAddr + Index, outs(), "", *STI); outs() << CommentStream.str(); Comments.clear(); + if (MIA && (MIA->isCall(Inst) || MIA->isUnconditionalBranch(Inst))) { + uint64_t Target; + if (MIA->evaluateBranch(Inst, SectionAddr + Index, Size, Target)) { + const auto &TargetSym = + std::lower_bound(AllSymbols.begin(), AllSymbols.end(), + std::make_pair(Target, StringRef())); + if (TargetSym != AllSymbols.end()) { + outs() << " <" << TargetSym->second; + uint64_t Disp = TargetSym->first - Target; + if (Disp) + outs() << '-' << Disp; + outs() << '>'; + } + } + } outs() << "\n"; } else { errs() << ToolName << ": warning: invalid instruction encoding\n";