diff options
author | Oliver Stannard <oliver.stannard@arm.com> | 2018-11-23 14:27:21 +0000 |
---|---|---|
committer | Oliver Stannard <oliver.stannard@arm.com> | 2018-11-23 14:27:21 +0000 |
commit | 173bc2bb7f75aab38c2c5a1f8d82704ef830a33e (patch) | |
tree | e4b451ce8b94c46a8314b7b5c3e20aa969ddafe2 /llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp | |
parent | 07a8255a7879451269960276113f97c98c7f0cfc (diff) | |
download | bcm5719-llvm-173bc2bb7f75aab38c2c5a1f8d82704ef830a33e.tar.gz bcm5719-llvm-173bc2bb7f75aab38c2c5a1f8d82704ef830a33e.zip |
[ARM][AsmParser] Improve debug printing of parsed asm operands
In ARMOperand::print:
- Print human-readable register names, instead of numbers.
- Print the correct names for IT condition masks (these were in the wrong order
before).
- Print all parts of memory operands, not just the base register.
This makes the output of llvm-mc -show-inst-operands more readable.
Differential revision: https://reviews.llvm.org/D54850
llvm-svn: 347494
Diffstat (limited to 'llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp')
-rw-r--r-- | llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp | 58 |
1 files changed, 39 insertions, 19 deletions
diff --git a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp index f837db56264..a2883191178 100644 --- a/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp +++ b/llvm/lib/Target/ARM/AsmParser/ARMAsmParser.cpp @@ -8,6 +8,7 @@ //===----------------------------------------------------------------------===// #include "ARMFeatures.h" +#include "InstPrinter/ARMInstPrinter.h" #include "Utils/ARMBaseInfo.h" #include "MCTargetDesc/ARMAddressingModes.h" #include "MCTargetDesc/ARMBaseInfo.h" @@ -3205,17 +3206,26 @@ public: } // end anonymous namespace. void ARMOperand::print(raw_ostream &OS) const { + auto RegName = [](unsigned Reg) { + if (Reg) + return ARMInstPrinter::getRegisterName(Reg); + else + return "noreg"; + }; + switch (Kind) { case k_CondCode: OS << "<ARMCC::" << ARMCondCodeToString(getCondCode()) << ">"; break; case k_CCOut: - OS << "<ccout " << getReg() << ">"; + OS << "<ccout " << RegName(getReg()) << ">"; break; case k_ITCondMask: { static const char *const MaskStr[] = { - "()", "(t)", "(e)", "(tt)", "(et)", "(te)", "(ee)", "(ttt)", "(ett)", - "(tet)", "(eet)", "(tte)", "(ete)", "(tee)", "(eee)" + "(invalid)", "(teee)", "(tee)", "(teet)", + "(te)", "(tete)", "(tet)", "(tett)", + "(t)", "(ttee)", "(tte)", "(ttet)", + "(tt)", "(ttte)", "(ttt)", "(tttt)" }; assert((ITMask.Mask & 0xf) == ITMask.Mask); OS << "<it-mask " << MaskStr[ITMask.Mask] << ">"; @@ -3249,13 +3259,25 @@ void ARMOperand::print(raw_ostream &OS) const { OS << "<ARM_TSB::" << TraceSyncBOptToString(getTraceSyncBarrierOpt()) << ">"; break; case k_Memory: - OS << "<memory " - << " base:" << Memory.BaseRegNum; + OS << "<memory"; + if (Memory.BaseRegNum) + OS << " base:" << RegName(Memory.BaseRegNum); + if (Memory.OffsetImm) + OS << " offset-imm:" << *Memory.OffsetImm; + if (Memory.OffsetRegNum) + OS << " offset-reg:" << (Memory.isNegative ? "-" : "") + << RegName(Memory.OffsetRegNum); + if (Memory.ShiftType != ARM_AM::no_shift) { + OS << " shift-type:" << ARM_AM::getShiftOpcStr(Memory.ShiftType); + OS << " shift-imm:" << Memory.ShiftImm; + } + if (Memory.Alignment) + OS << " alignment:" << Memory.Alignment; OS << ">"; break; case k_PostIndexRegister: OS << "post-idx register " << (PostIdxReg.isAdd ? "" : "-") - << PostIdxReg.RegNum; + << RegName(PostIdxReg.RegNum); if (PostIdxReg.ShiftTy != ARM_AM::no_shift) OS << ARM_AM::getShiftOpcStr(PostIdxReg.ShiftTy) << " " << PostIdxReg.ShiftImm; @@ -3271,23 +3293,21 @@ void ARMOperand::print(raw_ostream &OS) const { break; } case k_Register: - OS << "<register " << getReg() << ">"; + OS << "<register " << RegName(getReg()) << ">"; break; case k_ShifterImmediate: OS << "<shift " << (ShifterImm.isASR ? "asr" : "lsl") << " #" << ShifterImm.Imm << ">"; break; case k_ShiftedRegister: - OS << "<so_reg_reg " - << RegShiftedReg.SrcReg << " " - << ARM_AM::getShiftOpcStr(RegShiftedReg.ShiftTy) - << " " << RegShiftedReg.ShiftReg << ">"; + OS << "<so_reg_reg " << RegName(RegShiftedReg.SrcReg) << " " + << ARM_AM::getShiftOpcStr(RegShiftedReg.ShiftTy) << " " + << RegName(RegShiftedReg.ShiftReg) << ">"; break; case k_ShiftedImmediate: - OS << "<so_reg_imm " - << RegShiftedImm.SrcReg << " " - << ARM_AM::getShiftOpcStr(RegShiftedImm.ShiftTy) - << " #" << RegShiftedImm.ShiftImm << ">"; + OS << "<so_reg_imm " << RegName(RegShiftedImm.SrcReg) << " " + << ARM_AM::getShiftOpcStr(RegShiftedImm.ShiftTy) << " #" + << RegShiftedImm.ShiftImm << ">"; break; case k_RotateImmediate: OS << "<ror " << " #" << (RotImm.Imm * 8) << ">"; @@ -3311,7 +3331,7 @@ void ARMOperand::print(raw_ostream &OS) const { const SmallVectorImpl<unsigned> &RegList = getRegList(); for (SmallVectorImpl<unsigned>::const_iterator I = RegList.begin(), E = RegList.end(); I != E; ) { - OS << *I; + OS << RegName(*I); if (++I < E) OS << ", "; } @@ -3320,15 +3340,15 @@ void ARMOperand::print(raw_ostream &OS) const { } case k_VectorList: OS << "<vector_list " << VectorList.Count << " * " - << VectorList.RegNum << ">"; + << RegName(VectorList.RegNum) << ">"; break; case k_VectorListAllLanes: OS << "<vector_list(all lanes) " << VectorList.Count << " * " - << VectorList.RegNum << ">"; + << RegName(VectorList.RegNum) << ">"; break; case k_VectorListIndexed: OS << "<vector_list(lane " << VectorList.LaneIndex << ") " - << VectorList.Count << " * " << VectorList.RegNum << ">"; + << VectorList.Count << " * " << RegName(VectorList.RegNum) << ">"; break; case k_Token: OS << "'" << getToken() << "'"; |