diff options
Diffstat (limited to 'lib/Target/X86/AsmParser/X86Operand.h')
| -rw-r--r-- | lib/Target/X86/AsmParser/X86Operand.h | 88 | 
1 files changed, 60 insertions, 28 deletions
diff --git a/lib/Target/X86/AsmParser/X86Operand.h b/lib/Target/X86/AsmParser/X86Operand.h index 43a0561e769b..4d4aae0a1c6a 100644 --- a/lib/Target/X86/AsmParser/X86Operand.h +++ b/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" @@ -28,8 +29,8 @@ namespace llvm {  /// X86Operand - Instances of this class represent a parsed X86 machine  /// instruction. -struct X86Operand : public MCParsedAsmOperand { -  enum KindTy { Token, Register, Immediate, Memory, Prefix } Kind; +struct X86Operand final : public MCParsedAsmOperand { +  enum KindTy { Token, Register, Immediate, Memory, Prefix, DXRegister } Kind;    SMLoc StartLoc, EndLoc;    SMLoc OffsetOfLoc; @@ -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,55 @@ 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 DXRegister: +      OS << "DXReg"; +      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!"); @@ -395,6 +444,7 @@ struct X86Operand : public MCParsedAsmOperand {    bool isPrefix() const { return Kind == Prefix; }    bool isReg() const override { return Kind == Register; } +  bool isDXReg() const { return Kind == DXRegister; }    bool isGR32orGR64() const {      return Kind == Register && @@ -415,34 +465,11 @@ struct X86Operand : public MCParsedAsmOperand {      Inst.addOperand(MCOperand::createReg(getReg()));    } -  static unsigned getGR32FromGR64(unsigned RegNo) { -    switch (RegNo) { -    default: llvm_unreachable("Unexpected register"); -    case X86::RAX: return X86::EAX; -    case X86::RCX: return X86::ECX; -    case X86::RDX: return X86::EDX; -    case X86::RBX: return X86::EBX; -    case X86::RBP: return X86::EBP; -    case X86::RSP: return X86::ESP; -    case X86::RSI: return X86::ESI; -    case X86::RDI: return X86::EDI; -    case X86::R8: return X86::R8D; -    case X86::R9: return X86::R9D; -    case X86::R10: return X86::R10D; -    case X86::R11: return X86::R11D; -    case X86::R12: return X86::R12D; -    case X86::R13: return X86::R13D; -    case X86::R14: return X86::R14D; -    case X86::R15: return X86::R15D; -    case X86::RIP: return X86::EIP; -    } -  } -    void addGR32orGR64Operands(MCInst &Inst, unsigned N) const {      assert(N == 1 && "Invalid number of operands!");      unsigned RegNo = getReg();      if (X86MCRegisterClasses[X86::GR64RegClassID].contains(RegNo)) -      RegNo = getGR32FromGR64(RegNo); +      RegNo = getX86SubSuperRegister(RegNo, 32);      Inst.addOperand(MCOperand::createReg(RegNo));    } @@ -517,6 +544,11 @@ struct X86Operand : public MCParsedAsmOperand {    }    static std::unique_ptr<X86Operand> +  CreateDXReg(SMLoc StartLoc, SMLoc EndLoc) { +    return llvm::make_unique<X86Operand>(DXRegister, StartLoc, EndLoc); +  } + +  static std::unique_ptr<X86Operand>    CreatePrefix(unsigned Prefixes, SMLoc StartLoc, SMLoc EndLoc) {      auto Res = llvm::make_unique<X86Operand>(Prefix, StartLoc, EndLoc);      Res->Pref.Prefixes = Prefixes;  | 
