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