summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorOliver Stannard <oliver.stannard@arm.com>2018-12-03 10:21:28 +0000
committerOliver Stannard <oliver.stannard@arm.com>2018-12-03 10:21:28 +0000
commitc588110f1340d997fb18f4fbbc7d363dc150cd71 (patch)
tree70e6436caba15fd1efd9d79687680557c54e46f4
parent7502e5fc560dcb59f7c3aaf40960a7b5451c5a1e (diff)
downloadbcm5719-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.h2
-rw-r--r--llvm/lib/MC/MCInst.cpp12
-rw-r--r--llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp8
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() &&
OpenPOWER on IntegriCloud