From d037b1446bd8acb60364228e5cb1d45ada7322ce Mon Sep 17 00:00:00 2001 From: "Andrew V. Tischenko" Date: Thu, 11 Jan 2018 10:31:01 +0000 Subject: Implementation of X86Operand::print. Differential Revision: https://reviews.llvm.org/D41610 llvm-svn: 322267 --- llvm/lib/Target/X86/AsmParser/X86Operand.h | 50 ++++++++++++++++++++++++++++-- 1 file changed, 48 insertions(+), 2 deletions(-) (limited to 'llvm/lib/Target/X86/AsmParser/X86Operand.h') diff --git a/llvm/lib/Target/X86/AsmParser/X86Operand.h b/llvm/lib/Target/X86/AsmParser/X86Operand.h index 43a0561e769..b3bcf4034ed 100644 --- a/llvm/lib/Target/X86/AsmParser/X86Operand.h +++ b/llvm/lib/Target/X86/AsmParser/X86Operand.h @@ -10,6 +10,7 @@ #ifndef LLVM_LIB_TARGET_X86_ASMPARSER_X86OPERAND_H #define LLVM_LIB_TARGET_X86_ASMPARSER_X86OPERAND_H +#include "InstPrinter/X86IntelInstPrinter.h" #include "MCTargetDesc/X86MCTargetDesc.h" #include "X86AsmParserCommon.h" #include "llvm/ADT/STLExtras.h" @@ -77,7 +78,7 @@ struct X86Operand : public MCParsedAsmOperand { }; X86Operand(KindTy K, SMLoc Start, SMLoc End) - : Kind(K), StartLoc(Start), EndLoc(End) {} + : Kind(K), StartLoc(Start), EndLoc(End) {} StringRef getSymName() override { return SymName; } void *getOpDecl() override { return OpDecl; } @@ -95,7 +96,52 @@ struct X86Operand : public MCParsedAsmOperand { /// getOffsetOfLoc - Get the location of the offset operator. SMLoc getOffsetOfLoc() const override { return OffsetOfLoc; } - void print(raw_ostream &OS) const override {} + void print(raw_ostream &OS) const override { + + auto PrintImmValue = [&](const MCExpr *Val, const char *VName) { + if (Val->getKind() == MCExpr::Constant) { + if (auto Imm = cast(Val)->getValue()) + OS << VName << Imm; + } else if (Val->getKind() == MCExpr::SymbolRef) { + if (auto *SRE = dyn_cast(Val)) { + const MCSymbol &Sym = SRE->getSymbol(); + if (auto SymName = Sym.getName().data()) + OS << VName << SymName; + } + } + }; + + switch (Kind) { + case Token: + OS << Tok.Data; + break; + case Register: + OS << "Reg:" << X86IntelInstPrinter::getRegisterName(Reg.RegNo); + break; + case Immediate: + PrintImmValue(Imm.Val, "Imm:"); + break; + case Prefix: + OS << "Prefix:" << Pref.Prefixes; + break; + case Memory: + OS << "Memory: ModeSize=" << Mem.ModeSize; + if (Mem.Size) + OS << ",Size=" << Mem.Size; + if (Mem.BaseReg) + OS << ",BaseReg=" << X86IntelInstPrinter::getRegisterName(Mem.BaseReg); + if (Mem.IndexReg) + OS << ",IndexReg=" + << X86IntelInstPrinter::getRegisterName(Mem.IndexReg); + if (Mem.Scale) + OS << ",Scale=" << Mem.Scale; + if (Mem.Disp) + PrintImmValue(Mem.Disp, ",Disp="); + if (Mem.SegReg) + OS << ",SegReg=" << X86IntelInstPrinter::getRegisterName(Mem.SegReg); + break; + } + } StringRef getToken() const { assert(Kind == Token && "Invalid access!"); -- cgit v1.2.3