MCParsedAsmOperand.h revision efcb3d9c1cd9410949b4005fbe6f2817f8dfe395
1600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//===-- llvm/MC/MCParsedAsmOperand.h - Asm Parser Operand -------*- C++ -*-===// 2600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 3600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// The LLVM Compiler Infrastructure 4600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 5600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// This file is distributed under the University of Illinois Open Source 6600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// License. See LICENSE.TXT for details. 7600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// 8600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//===----------------------------------------------------------------------===// 9600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 10600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang#ifndef LLVM_MC_MCASMOPERAND_H 11600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang#define LLVM_MC_MCASMOPERAND_H 12600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 13600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangnamespace llvm { 14600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangclass SMLoc; 15600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangclass raw_ostream; 16600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 17600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/// MCParsedAsmOperand - This abstract class represents a source-level assembly 18600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/// instruction operand. It should be subclassed by target-specific code. This 19600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/// base class is used by target-independent clients and is the interface 20600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang/// between parsing an asm instruction and recognizing it. 21600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangclass MCParsedAsmOperand { 22600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /// MCOperandNum - The corresponding MCInst operand number. Only valid when 23600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /// parsing MS-style inline assembly. 24600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang unsigned MCOperandNum; 25600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 26600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /// Constraint - The constraint on this operand. Only valid when parsing 27600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /// MS-style inline assembly. 28600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang std::string Constraint; 29600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 30600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wangpublic: 31600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang MCParsedAsmOperand() {} 32600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang virtual ~MCParsedAsmOperand() {} 33600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 34600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang void setConstraint(StringRef C) { Constraint = C.str(); } 35600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang StringRef getConstraint() { return Constraint; } 36600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 37600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang void setMCOperandNum (unsigned OpNum) { MCOperandNum = OpNum; } 38600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang unsigned getMCOperandNum() { return MCOperandNum; } 39600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 40600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang unsigned getNameLen() { 41600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang assert (getStartLoc().isValid() && "Invalid StartLoc!"); 42600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang assert (getEndLoc().isValid() && "Invalid EndLoc!"); 43600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return getEndLoc().getPointer() - getStartLoc().getPointer(); 44600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 45600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 46600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang StringRef getName() { 47600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return StringRef(getStartLoc().getPointer(), getNameLen()); 48600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang } 49600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 50600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /// isToken - Is this a token operand? 51600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang virtual bool isToken() const = 0; 52600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /// isImm - Is this an immediate operand? 53600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang virtual bool isImm() const = 0; 54600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /// isReg - Is this a register operand? 55600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang virtual bool isReg() const = 0; 56600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang virtual unsigned getReg() const = 0; 57600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 58600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /// isMem - Is this a memory operand? 59600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang virtual bool isMem() const = 0; 60600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang virtual unsigned getMemSize() const { return 0; } 61600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 62600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /// getStartLoc - Get the location of the first token of this operand. 63600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang virtual SMLoc getStartLoc() const = 0; 64600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /// getEndLoc - Get the location of the last token of this operand. 65600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang virtual SMLoc getEndLoc() const = 0; 66600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 67600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /// needAsmRewrite - AsmRewrites happen in both the target-independent and 68600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /// target-dependent parsers. The target-independent parser calls this 69600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /// function to determine if the target-dependent parser has already taken 70600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /// care of the rewrites. Only valid when parsing MS-style inline assembly. 71600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang virtual bool needAsmRewrite() const { return true; } 72600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 73600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /// isOffsetOf - Do we need to emit code to get the offset of the variable, 74600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /// rather then the value of the variable? Only valid when parsing MS-style 75600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /// inline assembly. 76600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang virtual bool isOffsetOf() const { return false; } 77600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 78600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /// getOffsetOfLoc - Get the location of the offset operator. 79600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang virtual SMLoc getOffsetOfLoc() const { return SMLoc(); } 80600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 81600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /// needSizeDirective - Do we need to emit a sizing directive for this 82600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /// operand? Only valid when parsing MS-style inline assembly. 83600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang virtual bool needSizeDirective() const { return false; } 84600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 85600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /// print - Print a debug representation of the operand to the given stream. 86600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang virtual void print(raw_ostream &OS) const = 0; 87600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang /// dump - Print to the debug stream. 88600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang virtual void dump() const; 89600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang}; 90600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 91600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang//===----------------------------------------------------------------------===// 92600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang// Debugging Support 93600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 94600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wanginline raw_ostream& operator<<(raw_ostream &OS, const MCParsedAsmOperand &MO) { 95600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang MO.print(OS); 96600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang return OS; 97600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang} 98600c7a4bbc7348167293eac928192e695b4ad5baChung-yih Wang 99} // end namespace llvm. 100 101#endif 102