diff --git a/llvm/test/tools/llvm-objdump/ELF/PowerPC/disassemble-symbolize-operands.ll b/llvm/test/tools/llvm-objdump/ELF/PowerPC/disassemble-symbolize-operands.ll --- a/llvm/test/tools/llvm-objdump/ELF/PowerPC/disassemble-symbolize-operands.ll +++ b/llvm/test/tools/llvm-objdump/ELF/PowerPC/disassemble-symbolize-operands.ll @@ -57,3 +57,23 @@ loopexit: ret void } + +;; Expect to annotate the symbol names. +; CHECK-LABEL: : +; CHECK-NEXT: c0: addis 2, 12, 0 # <.TOC.> +; CHECK-NEXT: c4: addi 2, 2, 0 # <.TOC.+0x4> +; CHECK-NEXT: c8: addis 3, 2, 0 # <.toc> +; CHECK-NEXT: cc: addis 4, 2, 0 # +; CHECK-NEXT: d0: ld 3, 0(3) # <.toc> +; CHECK-NEXT: d4: lwz 4, 0(4) # + +@val1 = dso_local global i32 10, align 4 +@val2 = external global i32, align 4 + +define dso_local signext i32 @fun() #0 { +entry: + %0 = load i32, i32* @val1, align 4 + %1 = load i32, i32* @val2, align 4 + %add = add nsw i32 %0, %1 + ret i32 %add +} diff --git a/llvm/test/tools/llvm-objdump/X86/disassemble-symbolize-operands.ll b/llvm/test/tools/llvm-objdump/X86/disassemble-symbolize-operands.ll --- a/llvm/test/tools/llvm-objdump/X86/disassemble-symbolize-operands.ll +++ b/llvm/test/tools/llvm-objdump/X86/disassemble-symbolize-operands.ll @@ -0,0 +1,20 @@ +; RUN: llc -mtriple=x86_64-pc-linux %s -filetype=obj -o %t +; RUN: llvm-objdump %t -d --symbolize-operands --no-show-raw-insn \ +; RUN: | FileCheck %s + +; CHECK-LABEL: : +; CHECK-NEXT: 0: movl , %eax # +; CHECK-NEXT: 6: movq , %rcx # +; CHECK-NEXT: d: addl (%rcx), %eax +; CHECK-NEXT: f: retq + +@val1 = dso_local global i32 10, align 4 +@val2 = external global i32, align 4 + +define dso_local signext i32 @fun() #0 { +entry: + %0 = load i32, i32* @val1, align 4 + %1 = load i32, i32* @val2, align 4 + %add = add nsw i32 %0, %1 + ret i32 %add +} diff --git a/llvm/test/tools/llvm-objdump/XCOFF/disassemble-symbolize-operands.ll b/llvm/test/tools/llvm-objdump/XCOFF/disassemble-symbolize-operands.ll --- a/llvm/test/tools/llvm-objdump/XCOFF/disassemble-symbolize-operands.ll +++ b/llvm/test/tools/llvm-objdump/XCOFF/disassemble-symbolize-operands.ll @@ -61,3 +61,19 @@ loopexit: ret void } + +;; Expect to annotate the symbol names. +; CHECK-LABEL: <.fun>: +; CHECK-NEXT: bc: lwz 3, 0(2) # +; CHECK-NEXT: c0: lwz 4, 4(2) # + +@val1 = dso_local global i32 10, align 4 +@val2 = external global i32, align 4 + +define dso_local signext i32 @fun() #0 { +entry: + %0 = load i32, i32* @val1, align 4 + %1 = load i32, i32* @val2, align 4 + %add = add nsw i32 %0, %1 + ret i32 %add +} diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp --- a/llvm/tools/llvm-objdump/llvm-objdump.cpp +++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp @@ -1116,7 +1116,7 @@ PrimaryIsThumb = STI->checkFeatures("+thumb-mode"); std::map> RelocMap; - if (InlineRelocs) + if (InlineRelocs || SymbolizeOperands) RelocMap = getRelocsMap(*Obj); bool Is64Bits = Obj->getBytesInAddress() > 4; @@ -1576,6 +1576,24 @@ if (TargetOS == &CommentStream) *TargetOS << "\n"; } + + // Walk the relocations and annotate the target symbol name on the + // right of the instruction. + if (SymbolizeOperands && !InlineRelocs) { + TargetOS = &CommentStream; + while (RelCur != RelEnd) { + uint64_t Offset = RelCur->getOffset() - RelAdjustment; + if (Offset >= Index + Size) + break; + + SmallString<32> Val; + if (Error E = getRelocationValueString(*RelCur, Val)) + reportError(std::move(E), Obj->getFileName()); + *TargetOS << " <" << Val << ">"; + + ++RelCur; + } + } } }