diff options
author | Andrew V. Tischenko <andrew.v.tischenko@gmail.com> | 2018-01-11 10:31:01 +0000 |
---|---|---|
committer | Andrew V. Tischenko <andrew.v.tischenko@gmail.com> | 2018-01-11 10:31:01 +0000 |
commit | d037b1446bd8acb60364228e5cb1d45ada7322ce (patch) | |
tree | 8cf405b2291b33e3b613e9f197b92072c2962c79 /llvm/lib/Target/X86/AsmParser/X86Operand.h | |
parent | 5481c2176e12204ac9911cf9daca10d760b759be (diff) | |
download | bcm5719-llvm-d037b1446bd8acb60364228e5cb1d45ada7322ce.tar.gz bcm5719-llvm-d037b1446bd8acb60364228e5cb1d45ada7322ce.zip |
Implementation of X86Operand::print.
Differential Revision: https://reviews.llvm.org/D41610
llvm-svn: 322267
Diffstat (limited to 'llvm/lib/Target/X86/AsmParser/X86Operand.h')
-rw-r--r-- | llvm/lib/Target/X86/AsmParser/X86Operand.h | 50 |
1 files changed, 48 insertions, 2 deletions
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<MCConstantExpr>(Val)->getValue()) + OS << VName << Imm; + } else if (Val->getKind() == MCExpr::SymbolRef) { + if (auto *SRE = dyn_cast<MCSymbolRefExpr>(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!"); |