From dda46307c20b58e33d40dd740684443e74d1d8e8 Mon Sep 17 00:00:00 2001 From: Jonas Paulsson Date: Fri, 26 Oct 2018 00:36:00 +0000 Subject: [SystemZ] Implement SystemZOperand::print() SystemZAsmParser can now handle -debug by printing the operands neatly to the output stream. Before this patch this lead to an llvm_unreachable(). It seems that now '-mllvm -debug' does not cause any crashes anywhere (at least not on SPEC). Review: Ulrich Weigand https://reviews.llvm.org/D53328 llvm-svn: 345349 --- .../Target/SystemZ/AsmParser/SystemZAsmParser.cpp | 67 +++++++++++++++++++++- 1 file changed, 66 insertions(+), 1 deletion(-) (limited to 'llvm/lib/Target/SystemZ/AsmParser') diff --git a/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp b/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp index bde067d6c12..6f4f543caad 100644 --- a/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp +++ b/llvm/lib/Target/SystemZ/AsmParser/SystemZAsmParser.cpp @@ -7,6 +7,7 @@ // //===----------------------------------------------------------------------===// +#include "InstPrinter/SystemZInstPrinter.h" #include "MCTargetDesc/SystemZMCTargetDesc.h" #include "llvm/ADT/STLExtras.h" #include "llvm/ADT/SmallVector.h" @@ -243,6 +244,11 @@ public: return Kind == KindImmTLS; } + const ImmTLSOp getImmTLS() const { + assert(Kind == KindImmTLS && "Not a TLS immediate"); + return ImmTLS; + } + // Memory operands. bool isMem() const override { return Kind == KindMem; @@ -270,6 +276,11 @@ public: return isMemDisp12(BDLMem, RegKind) && inRange(Mem.Length.Imm, 1, 0x100); } + const MemOp& getMem() const { + assert(Kind == KindMem && "Not a Mem operand"); + return Mem; + } + // Override MCParsedAsmOperand. SMLoc getStartLoc() const override { return StartLoc; } SMLoc getEndLoc() const override { return EndLoc; } @@ -623,8 +634,62 @@ static struct InsnMatchEntry InsnMatchTable[] = { { MCK_U48Imm, MCK_BDAddr64Disp12, MCK_BDAddr64Disp12, MCK_AnyReg } } }; +static void printMCExpr(const MCExpr *E, raw_ostream &OS) { + if (!E) + return; + if (auto *CE = dyn_cast(E)) + OS << *CE; + else if (auto *UE = dyn_cast(E)) + OS << *UE; + else if (auto *BE = dyn_cast(E)) + OS << *BE; + else if (auto *SRE = dyn_cast(E)) + OS << *SRE; + else + OS << *E; +} + void SystemZOperand::print(raw_ostream &OS) const { - llvm_unreachable("Not implemented"); + switch (Kind) { + break; + case KindToken: + OS << "Token:" << getToken(); + break; + case KindReg: + OS << "Reg:" << SystemZInstPrinter::getRegisterName(getReg()); + break; + case KindImm: + OS << "Imm:"; + printMCExpr(getImm(), OS); + break; + case KindImmTLS: + OS << "ImmTLS:"; + printMCExpr(getImmTLS().Imm, OS); + if (getImmTLS().Sym) { + OS << ", "; + printMCExpr(getImmTLS().Sym, OS); + } + break; + case KindMem: { + const MemOp &Op = getMem(); + OS << "Mem:" << *cast(Op.Disp); + if (Op.Base) { + OS << "("; + if (Op.MemKind == BDLMem) + OS << *cast(Op.Length.Imm) << ","; + else if (Op.MemKind == BDRMem) + OS << SystemZInstPrinter::getRegisterName(Op.Length.Reg) << ","; + if (Op.Index) + OS << SystemZInstPrinter::getRegisterName(Op.Index) << ","; + OS << SystemZInstPrinter::getRegisterName(Op.Base); + OS << ")"; + } + break; + } + default: + case KindInvalid: + break; + } } // Parse one register of the form %. -- cgit v1.2.3