diff options
author | Oliver Stannard <oliver.stannard@arm.com> | 2018-12-03 10:21:28 +0000 |
---|---|---|
committer | Oliver Stannard <oliver.stannard@arm.com> | 2018-12-03 10:21:28 +0000 |
commit | c588110f1340d997fb18f4fbbc7d363dc150cd71 (patch) | |
tree | 70e6436caba15fd1efd9d79687680557c54e46f4 | |
parent | 7502e5fc560dcb59f7c3aaf40960a7b5451c5a1e (diff) | |
download | bcm5719-llvm-c588110f1340d997fb18f4fbbc7d363dc150cd71.tar.gz bcm5719-llvm-c588110f1340d997fb18f4fbbc7d363dc150cd71.zip |
[ARM][Asm] Debug trace for the processInstruction loop
In the Arm assembly parser, we first match an instruction, then call
processInstruction to possibly change it to a different encoding, to
match rules in the architecture manual which can't be expressed by the
table-generated matcher.
This adds debug printing so that this process is visible when using the
-debug option.
To support this, I've added a new overload of MCInst::dump_pretty which
takes the opcode name as a StringRef, since we don't have an InstPrinter
instance in the assembly parser. Instead, we can get the same
information directly from the MCInstrInfo.
Differential revision: https://reviews.llvm.org/D54852
llvm-svn: 348113
-rw-r--r-- | llvm/include/llvm/MC/MCInst.h | 2 | ||||
-rw-r--r-- | llvm/lib/MC/MCInst.cpp | 12 | ||||
-rw-r--r-- | llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp | 8 |
3 files changed, 18 insertions, 4 deletions
diff --git a/llvm/include/llvm/MC/MCInst.h b/llvm/include/llvm/MC/MCInst.h index 67bb11a7038..d501b686bb2 100644 --- a/llvm/include/llvm/MC/MCInst.h +++ b/llvm/include/llvm/MC/MCInst.h @@ -208,6 +208,8 @@ public: /// string. void dump_pretty(raw_ostream &OS, const MCInstPrinter *Printer = nullptr, StringRef Separator = " ") const; + void dump_pretty(raw_ostream &OS, StringRef Name, + StringRef Separator = " ") const; }; inline raw_ostream& operator<<(raw_ostream &OS, const MCOperand &MO) { diff --git a/llvm/lib/MC/MCInst.cpp b/llvm/lib/MC/MCInst.cpp index f9b71caaf91..64f111fc711 100644 --- a/llvm/lib/MC/MCInst.cpp +++ b/llvm/lib/MC/MCInst.cpp @@ -72,11 +72,17 @@ void MCInst::print(raw_ostream &OS) const { void MCInst::dump_pretty(raw_ostream &OS, const MCInstPrinter *Printer, StringRef Separator) const { + StringRef InstName = Printer ? Printer->getOpcodeName(getOpcode()) : ""; + dump_pretty(OS, InstName, Separator); +} + +void MCInst::dump_pretty(raw_ostream &OS, StringRef Name, + StringRef Separator) const { OS << "<MCInst #" << getOpcode(); - // Show the instruction opcode name if we have access to a printer. - if (Printer) - OS << ' ' << Printer->getOpcodeName(getOpcode()); + // Show the instruction opcode name if we have it. + if (!Name.empty()) + OS << ' ' << Name; for (unsigned i = 0, e = getNumOperands(); i != e; ++i) { OS << Separator; diff --git a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index a2883191178..203da11ed32 100644 --- a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -9310,6 +9310,10 @@ bool ARMAsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, switch (MatchResult) { case Match_Success: + LLVM_DEBUG(dbgs() << "Parsed as: "; + Inst.dump_pretty(dbgs(), MII.getName(Inst.getOpcode())); + dbgs() << "\n"); + // Context sensitive operand constraints aren't handled by the matcher, // so check them here. if (validateInstruction(Inst, Operands)) { @@ -9327,7 +9331,9 @@ bool ARMAsmParser::MatchAndEmitInstruction(SMLoc IDLoc, unsigned &Opcode, // individual transformations can chain off each other. E.g., // tPOP(r8)->t2LDMIA_UPD(sp,r8)->t2STR_POST(sp,r8) while (processInstruction(Inst, Operands, Out)) - ; + LLVM_DEBUG(dbgs() << "Changed to: "; + Inst.dump_pretty(dbgs(), MII.getName(Inst.getOpcode())); + dbgs() << "\n"); // Only after the instruction is fully processed, we can validate it if (wasInITBlock && hasV8Ops() && isThumb() && |