145220a84394758c86cc29ee0e3fe6738946fbcd0Chris Lattner//===-- llvm/MC/MCParsedAsmOperand.h - Asm Parser Operand -------*- C++ -*-===// 245220a84394758c86cc29ee0e3fe6738946fbcd0Chris Lattner// 345220a84394758c86cc29ee0e3fe6738946fbcd0Chris Lattner// The LLVM Compiler Infrastructure 445220a84394758c86cc29ee0e3fe6738946fbcd0Chris Lattner// 545220a84394758c86cc29ee0e3fe6738946fbcd0Chris Lattner// This file is distributed under the University of Illinois Open Source 645220a84394758c86cc29ee0e3fe6738946fbcd0Chris Lattner// License. See LICENSE.TXT for details. 745220a84394758c86cc29ee0e3fe6738946fbcd0Chris Lattner// 845220a84394758c86cc29ee0e3fe6738946fbcd0Chris Lattner//===----------------------------------------------------------------------===// 945220a84394758c86cc29ee0e3fe6738946fbcd0Chris Lattner 10674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#ifndef LLVM_MC_MCPARSER_MCPARSEDASMOPERAND_H 11674be02d525d4e24bc6943ed9274958c580bcfbcJakub Staszak#define LLVM_MC_MCPARSER_MCPARSEDASMOPERAND_H 1245220a84394758c86cc29ee0e3fe6738946fbcd0Chris Lattner 1345220a84394758c86cc29ee0e3fe6738946fbcd0Chris Lattnernamespace llvm { 143581d662e9c39b38c1cd8c243bbf7f03869f30deJeffrey Yasskinclass SMLoc; 15b3cb6967949493a2e1b10d015ac08b746736764eDaniel Dunbarclass raw_ostream; 1645220a84394758c86cc29ee0e3fe6738946fbcd0Chris Lattner 1745220a84394758c86cc29ee0e3fe6738946fbcd0Chris Lattner/// MCParsedAsmOperand - This abstract class represents a source-level assembly 1845220a84394758c86cc29ee0e3fe6738946fbcd0Chris Lattner/// instruction operand. It should be subclassed by target-specific code. This 1945220a84394758c86cc29ee0e3fe6738946fbcd0Chris Lattner/// base class is used by target-independent clients and is the interface 2045220a84394758c86cc29ee0e3fe6738946fbcd0Chris Lattner/// between parsing an asm instruction and recognizing it. 2145220a84394758c86cc29ee0e3fe6738946fbcd0Chris Lattnerclass MCParsedAsmOperand { 220d218994f1ccaacd7c31792af2331ae82bc79c03Chad Rosier /// MCOperandNum - The corresponding MCInst operand number. Only valid when 230d218994f1ccaacd7c31792af2331ae82bc79c03Chad Rosier /// parsing MS-style inline assembly. 240d218994f1ccaacd7c31792af2331ae82bc79c03Chad Rosier unsigned MCOperandNum; 250d218994f1ccaacd7c31792af2331ae82bc79c03Chad Rosier 260d218994f1ccaacd7c31792af2331ae82bc79c03Chad Rosier /// Constraint - The constraint on this operand. Only valid when parsing 270d218994f1ccaacd7c31792af2331ae82bc79c03Chad Rosier /// MS-style inline assembly. 280d218994f1ccaacd7c31792af2331ae82bc79c03Chad Rosier std::string Constraint; 290d218994f1ccaacd7c31792af2331ae82bc79c03Chad Rosier 3098311ecb4ae9c82baba9e3a48acf756a81c8e9a4Jim Grosbachpublic: 31f007e853e26845cd6866b52d646455fc69f4e0afChris Lattner MCParsedAsmOperand() {} 32f007e853e26845cd6866b52d646455fc69f4e0afChris Lattner virtual ~MCParsedAsmOperand() {} 3398311ecb4ae9c82baba9e3a48acf756a81c8e9a4Jim Grosbach 340d218994f1ccaacd7c31792af2331ae82bc79c03Chad Rosier void setConstraint(StringRef C) { Constraint = C.str(); } 350d218994f1ccaacd7c31792af2331ae82bc79c03Chad Rosier StringRef getConstraint() { return Constraint; } 360d218994f1ccaacd7c31792af2331ae82bc79c03Chad Rosier 370d218994f1ccaacd7c31792af2331ae82bc79c03Chad Rosier void setMCOperandNum (unsigned OpNum) { MCOperandNum = OpNum; } 380d218994f1ccaacd7c31792af2331ae82bc79c03Chad Rosier unsigned getMCOperandNum() { return MCOperandNum; } 390d218994f1ccaacd7c31792af2331ae82bc79c03Chad Rosier 400d218994f1ccaacd7c31792af2331ae82bc79c03Chad Rosier unsigned getNameLen() { 410d218994f1ccaacd7c31792af2331ae82bc79c03Chad Rosier assert (getStartLoc().isValid() && "Invalid StartLoc!"); 420d218994f1ccaacd7c31792af2331ae82bc79c03Chad Rosier assert (getEndLoc().isValid() && "Invalid EndLoc!"); 430d218994f1ccaacd7c31792af2331ae82bc79c03Chad Rosier return getEndLoc().getPointer() - getStartLoc().getPointer(); 440d218994f1ccaacd7c31792af2331ae82bc79c03Chad Rosier } 450d218994f1ccaacd7c31792af2331ae82bc79c03Chad Rosier 460d218994f1ccaacd7c31792af2331ae82bc79c03Chad Rosier StringRef getName() { 470d218994f1ccaacd7c31792af2331ae82bc79c03Chad Rosier return StringRef(getStartLoc().getPointer(), getNameLen()); 480d218994f1ccaacd7c31792af2331ae82bc79c03Chad Rosier } 490d218994f1ccaacd7c31792af2331ae82bc79c03Chad Rosier 502a3fcb382ef43374327b7b7672fe1e1e178041daChad Rosier /// isToken - Is this a token operand? 51fde528fa2b206604bc80618af815bf5dab3fed8eChad Rosier virtual bool isToken() const = 0; 522a3fcb382ef43374327b7b7672fe1e1e178041daChad Rosier /// isImm - Is this an immediate operand? 53fde528fa2b206604bc80618af815bf5dab3fed8eChad Rosier virtual bool isImm() const = 0; 542a3fcb382ef43374327b7b7672fe1e1e178041daChad Rosier /// isReg - Is this a register operand? 55fde528fa2b206604bc80618af815bf5dab3fed8eChad Rosier virtual bool isReg() const = 0; 5617be8a51b09c976d35360916952f275f76acf3b3Chad Rosier virtual unsigned getReg() const = 0; 5717be8a51b09c976d35360916952f275f76acf3b3Chad Rosier 582a3fcb382ef43374327b7b7672fe1e1e178041daChad Rosier /// isMem - Is this a memory operand? 59fde528fa2b206604bc80618af815bf5dab3fed8eChad Rosier virtual bool isMem() const = 0; 6096d58e64cfe88356f8be4ce622b829fbd9fb5908Chad Rosier virtual unsigned getMemSize() const { return 0; } 61fde528fa2b206604bc80618af815bf5dab3fed8eChad Rosier 629d3c755fd6bf33335fad66dca9a629c630fc3bf2Chris Lattner /// getStartLoc - Get the location of the first token of this operand. 63b3cb6967949493a2e1b10d015ac08b746736764eDaniel Dunbar virtual SMLoc getStartLoc() const = 0; 649d3c755fd6bf33335fad66dca9a629c630fc3bf2Chris Lattner /// getEndLoc - Get the location of the last token of this operand. 65b3cb6967949493a2e1b10d015ac08b746736764eDaniel Dunbar virtual SMLoc getEndLoc() const = 0; 66b3cb6967949493a2e1b10d015ac08b746736764eDaniel Dunbar 67efcb3d9c1cd9410949b4005fbe6f2817f8dfe395Chad Rosier /// needAsmRewrite - AsmRewrites happen in both the target-independent and 68efcb3d9c1cd9410949b4005fbe6f2817f8dfe395Chad Rosier /// target-dependent parsers. The target-independent parser calls this 69efcb3d9c1cd9410949b4005fbe6f2817f8dfe395Chad Rosier /// function to determine if the target-dependent parser has already taken 70efcb3d9c1cd9410949b4005fbe6f2817f8dfe395Chad Rosier /// care of the rewrites. Only valid when parsing MS-style inline assembly. 71efcb3d9c1cd9410949b4005fbe6f2817f8dfe395Chad Rosier virtual bool needAsmRewrite() const { return true; } 72efcb3d9c1cd9410949b4005fbe6f2817f8dfe395Chad Rosier 73c1ec207b615cb058d30dc642ee311ed06fe59cfeChad Rosier /// needAddressOf - Do we need to emit code to get the address of the 74c1ec207b615cb058d30dc642ee311ed06fe59cfeChad Rosier /// variable/label? Only valid when parsing MS-style inline assembly. 75c1ec207b615cb058d30dc642ee311ed06fe59cfeChad Rosier virtual bool needAddressOf() const { return false; } 76c1ec207b615cb058d30dc642ee311ed06fe59cfeChad Rosier 77a703fb9e5e86ed29f7334736f7c085ec81a2006fChad Rosier /// isOffsetOf - Do we need to emit code to get the offset of the variable, 78a703fb9e5e86ed29f7334736f7c085ec81a2006fChad Rosier /// rather then the value of the variable? Only valid when parsing MS-style 79a703fb9e5e86ed29f7334736f7c085ec81a2006fChad Rosier /// inline assembly. 80a703fb9e5e86ed29f7334736f7c085ec81a2006fChad Rosier virtual bool isOffsetOf() const { return false; } 81a703fb9e5e86ed29f7334736f7c085ec81a2006fChad Rosier 825a719fcb5ea91ec4e7af6fc2e48ec31774a859ddChad Rosier /// getOffsetOfLoc - Get the location of the offset operator. 835a719fcb5ea91ec4e7af6fc2e48ec31774a859ddChad Rosier virtual SMLoc getOffsetOfLoc() const { return SMLoc(); } 845a719fcb5ea91ec4e7af6fc2e48ec31774a859ddChad Rosier 8596d58e64cfe88356f8be4ce622b829fbd9fb5908Chad Rosier /// needSizeDirective - Do we need to emit a sizing directive for this 8696d58e64cfe88356f8be4ce622b829fbd9fb5908Chad Rosier /// operand? Only valid when parsing MS-style inline assembly. 8796d58e64cfe88356f8be4ce622b829fbd9fb5908Chad Rosier virtual bool needSizeDirective() const { return false; } 8896d58e64cfe88356f8be4ce622b829fbd9fb5908Chad Rosier 89b7f689bab98777236a2bf600f299d232d246bb61Jim Grosbach /// print - Print a debug representation of the operand to the given stream. 90b7f689bab98777236a2bf600f299d232d246bb61Jim Grosbach virtual void print(raw_ostream &OS) const = 0; 91b7f689bab98777236a2bf600f299d232d246bb61Jim Grosbach /// dump - Print to the debug stream. 92b7f689bab98777236a2bf600f299d232d246bb61Jim Grosbach virtual void dump() const; 9345220a84394758c86cc29ee0e3fe6738946fbcd0Chris Lattner}; 9445220a84394758c86cc29ee0e3fe6738946fbcd0Chris Lattner 95b7f689bab98777236a2bf600f299d232d246bb61Jim Grosbach//===----------------------------------------------------------------------===// 96b7f689bab98777236a2bf600f299d232d246bb61Jim Grosbach// Debugging Support 97b7f689bab98777236a2bf600f299d232d246bb61Jim Grosbach 98b7f689bab98777236a2bf600f299d232d246bb61Jim Grosbachinline raw_ostream& operator<<(raw_ostream &OS, const MCParsedAsmOperand &MO) { 99b7f689bab98777236a2bf600f299d232d246bb61Jim Grosbach MO.print(OS); 100b7f689bab98777236a2bf600f299d232d246bb61Jim Grosbach return OS; 101b7f689bab98777236a2bf600f299d232d246bb61Jim Grosbach} 102b7f689bab98777236a2bf600f299d232d246bb61Jim Grosbach 10345220a84394758c86cc29ee0e3fe6738946fbcd0Chris Lattner} // end namespace llvm. 10445220a84394758c86cc29ee0e3fe6738946fbcd0Chris Lattner 10545220a84394758c86cc29ee0e3fe6738946fbcd0Chris Lattner#endif 106