X-Git-Url: http://demsky.eecs.uci.edu/git/?a=blobdiff_plain;f=include%2Fllvm%2FInlineAsm.h;h=fe8a714dd9244c86ff5e359854388ff4a539c68f;hb=1b84cce77f8bccc905b4800927ce9016f76c1c40;hp=9343834325546c2ebead4f09dbafdb23f10c90e2;hpb=44ab89eb376af838d1123293a79975aede501464;p=oota-llvm.git diff --git a/include/llvm/InlineAsm.h b/include/llvm/InlineAsm.h index 93438343255..fe8a714dd92 100644 --- a/include/llvm/InlineAsm.h +++ b/include/llvm/InlineAsm.h @@ -16,8 +16,8 @@ #ifndef LLVM_INLINEASM_H #define LLVM_INLINEASM_H -#include "llvm/ADT/SmallVector.h" #include "llvm/Value.h" +#include namespace llvm { @@ -25,15 +25,16 @@ class PointerType; class FunctionType; class Module; struct InlineAsmKeyType; -template +template class ConstantUniqueMap; template struct ConstantCreator; class InlineAsm : public Value { friend struct ConstantCreator; - friend class ConstantUniqueMap; + friend class ConstantUniqueMap; InlineAsm(const InlineAsm &); // do not implement void operator=(const InlineAsm&); // do not implement @@ -42,7 +43,7 @@ class InlineAsm : public Value { bool HasSideEffects; bool IsAlignStack; - InlineAsm(const PointerType *Ty, const std::string &AsmString, + InlineAsm(PointerType *Ty, const std::string &AsmString, const std::string &Constraints, bool hasSideEffects, bool isAlignStack); virtual ~InlineAsm(); @@ -54,7 +55,7 @@ public: /// InlineAsm::get - Return the specified uniqued inline asm string. /// - static InlineAsm *get(const FunctionType *Ty, StringRef AsmString, + static InlineAsm *get(FunctionType *Ty, StringRef AsmString, StringRef Constraints, bool hasSideEffects, bool isAlignStack = false); @@ -63,13 +64,13 @@ public: /// getType - InlineAsm's are always pointers. /// - const PointerType *getType() const { - return reinterpret_cast(Value::getType()); + PointerType *getType() const { + return reinterpret_cast(Value::getType()); } /// getFunctionType - InlineAsm's are always pointers to functions. /// - const FunctionType *getFunctionType() const; + FunctionType *getFunctionType() const; const std::string &getAsmString() const { return AsmString; } const std::string &getConstraintString() const { return Constraints; } @@ -78,7 +79,7 @@ public: /// the specified constraint string is legal for the type. This returns true /// if legal, false if not. /// - static bool Verify(const FunctionType *Ty, StringRef Constraints); + static bool Verify(FunctionType *Ty, StringRef Constraints); // Constraint String Parsing enum ConstraintPrefix { @@ -87,7 +88,7 @@ public: isClobber // '~x' }; - typedef SmallVector ConstraintCodeVector; + typedef std::vector ConstraintCodeVector; struct SubConstraintInfo { /// MatchingInput - If this is not -1, this is an output constraint where an @@ -102,9 +103,9 @@ public: SubConstraintInfo() : MatchingInput(-1) {} }; - typedef SmallVector SubConstraintInfoVector; + typedef std::vector SubConstraintInfoVector; struct ConstraintInfo; - typedef SmallVector ConstraintInfoVector; + typedef std::vector ConstraintInfoVector; struct ConstraintInfo { /// Type - The basic type of the constraint: input/output/clobber @@ -187,18 +188,32 @@ public: // in the backend. enum { + // Fixed operands on an INLINEASM SDNode. Op_InputChain = 0, Op_AsmString = 1, Op_MDNode = 2, - Op_IsAlignStack = 3, + Op_ExtraInfo = 3, // HasSideEffects, IsAlignStack Op_FirstOperand = 4, - - Kind_RegUse = 1, - Kind_RegDef = 2, - Kind_Imm = 3, - Kind_Mem = 4, - Kind_RegDefEarlyClobber = 6, - + + // Fixed operands on an INLINEASM MachineInstr. + MIOp_AsmString = 0, + MIOp_ExtraInfo = 1, // HasSideEffects, IsAlignStack + MIOp_FirstOperand = 2, + + // Interpretation of the MIOp_ExtraInfo bit field. + Extra_HasSideEffects = 1, + Extra_IsAlignStack = 2, + + // Inline asm operands map to multiple SDNode / MachineInstr operands. + // The first operand is an immediate describing the asm operand, the low + // bits is the kind: + Kind_RegUse = 1, // Input register, "r". + Kind_RegDef = 2, // Output register, "=r". + Kind_RegDefEarlyClobber = 3, // Early-clobber output register, "=&r". + Kind_Clobber = 4, // Clobbered register, "~r". + Kind_Imm = 5, // Immediate. + Kind_Mem = 6, // Memory operand, "m". + Flag_MatchingOperand = 0x80000000 }; @@ -225,7 +240,10 @@ public: static bool isRegDefEarlyClobberKind(unsigned Flag) { return getKind(Flag) == Kind_RegDefEarlyClobber; } - + static bool isClobberKind(unsigned Flag) { + return getKind(Flag) == Kind_Clobber; + } + /// getNumOperandRegisters - Extract the number of registers field from the /// inline asm operand flag. static unsigned getNumOperandRegisters(unsigned Flag) {