aboutsummaryrefslogtreecommitdiff
path: root/llvm/tools/llvm-objdump/llvm-objdump.cpp
diff options
context:
space:
mode:
authorIgor Kudrin <ikudrin@accesssoftek.com>2021-06-28 14:22:41 +0700
committerIgor Kudrin <ikudrin@accesssoftek.com>2021-06-28 14:25:20 +0700
commitabe0fa43523502c549ff9394d28f9f29f5be0a3d (patch)
tree8b3d8d1e76d998304b82b176452a5e63d4ad23f9 /llvm/tools/llvm-objdump/llvm-objdump.cpp
parent04242bdca991145548ab70be5e1c6c65390699dd (diff)
downloadllvm-abe0fa43523502c549ff9394d28f9f29f5be0a3d.zip
llvm-abe0fa43523502c549ff9394d28f9f29f5be0a3d.tar.gz
llvm-abe0fa43523502c549ff9394d28f9f29f5be0a3d.tar.bz2
[llvm-objdump] Print comments for the disassembled code
LLVM disassembler can generate comments for disassembled instructions. The patch enables printing these comments for 'llvm-objdump -d'. Differential Revision: https://reviews.llvm.org/D104699
Diffstat (limited to 'llvm/tools/llvm-objdump/llvm-objdump.cpp')
-rw-r--r--llvm/tools/llvm-objdump/llvm-objdump.cpp35
1 files changed, 31 insertions, 4 deletions
diff --git a/llvm/tools/llvm-objdump/llvm-objdump.cpp b/llvm/tools/llvm-objdump/llvm-objdump.cpp
index b0ca095..13e5f68 100644
--- a/llvm/tools/llvm-objdump/llvm-objdump.cpp
+++ b/llvm/tools/llvm-objdump/llvm-objdump.cpp
@@ -1039,6 +1039,29 @@ static StringRef getSegmentName(const MachOObjectFile *MachO,
return "";
}
+static void emitPostInstructionInfo(formatted_raw_ostream &FOS,
+ const MCAsmInfo &MAI,
+ const MCSubtargetInfo &STI,
+ StringRef Comments,
+ LiveVariablePrinter &LVP) {
+ do {
+ if (!Comments.empty()) {
+ // Emit a line of comments.
+ StringRef Comment;
+ std::tie(Comment, Comments) = Comments.split('\n');
+ // MAI.getCommentColumn() assumes that instructions are printed at the
+ // position of 8, while getInstStartColumn() returns the actual position.
+ unsigned CommentColumn =
+ MAI.getCommentColumn() - 8 + getInstStartColumn(STI);
+ FOS.PadToColumn(CommentColumn);
+ FOS << MAI.getCommentString() << ' ' << Comment;
+ }
+ LVP.printAfterInst(FOS);
+ FOS << '\n';
+ } while (!Comments.empty());
+ FOS.flush();
+}
+
static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj,
MCContext &Ctx, MCDisassembler *PrimaryDisAsm,
MCDisassembler *SecondaryDisAsm,
@@ -1396,12 +1419,14 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj,
LVP.update({Index, Section.getIndex()},
{Index + Size, Section.getIndex()}, Index + Size != End);
+ IP->setCommentStream(CommentStream);
+
PIP.printInst(
*IP, Disassembled ? &Inst : nullptr, Bytes.slice(Index, Size),
{SectionAddr + Index + VMAAdjustment, Section.getIndex()}, FOS,
"", *STI, &SP, Obj->getFileName(), &Rels, LVP);
- FOS << CommentStream.str();
- Comments.clear();
+
+ IP->setCommentStream(llvm::nulls());
// If disassembly has failed, avoid analysing invalid/incomplete
// instruction information. Otherwise, try to resolve the target
@@ -1498,8 +1523,10 @@ static void disassembleObject(const Target *TheTarget, const ObjectFile *Obj,
}
}
- LVP.printAfterInst(FOS);
- FOS << "\n";
+ assert(Ctx.getAsmInfo());
+ emitPostInstructionInfo(FOS, *Ctx.getAsmInfo(), *STI,
+ CommentStream.str(), LVP);
+ Comments.clear();
// Hexagon does this in pretty printer
if (Obj->getArch() != Triple::hexagon) {