X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=blobdiff_plain;f=include%2Fllvm%2FIR%2FInlineAsm.h;h=1b86902d180092c0da93f4e77a88b14139901134;hp=ba34513aac9a58679763971a92ffd5ff877641a2;hb=c36e746e9802fa1d5c36e6f98c8bc5cb440be59a;hpb=6902c8db2603287335a7e46257b4530674983116 diff --git a/include/llvm/IR/InlineAsm.h b/include/llvm/IR/InlineAsm.h index ba34513aac9..1b86902d180 100644 --- a/include/llvm/IR/InlineAsm.h +++ b/include/llvm/IR/InlineAsm.h @@ -57,15 +57,15 @@ private: /// When the ConstantUniqueMap merges two types and makes two InlineAsms /// identical, it destroys one of them with this method. void destroyConstant(); -public: +public: /// InlineAsm::get - Return the specified uniqued inline asm string. /// static InlineAsm *get(FunctionType *Ty, StringRef AsmString, StringRef Constraints, bool hasSideEffects, bool isAlignStack = false, AsmDialect asmDialect = AD_ATT); - + bool hasSideEffects() const { return HasSideEffects; } bool isAlignStack() const { return IsAlignStack; } AsmDialect getDialect() const { return Dialect; } @@ -75,11 +75,11 @@ public: PointerType *getType() const { return reinterpret_cast(Value::getType()); } - + /// getFunctionType - InlineAsm's are always pointers to functions. /// FunctionType *getFunctionType() const; - + const std::string &getAsmString() const { return AsmString; } const std::string &getConstraintString() const { return Constraints; } @@ -95,9 +95,9 @@ public: isOutput, // '=x' isClobber // '~x' }; - + typedef std::vector ConstraintCodeVector; - + struct SubConstraintInfo { /// MatchingInput - If this is not -1, this is an output constraint where an /// input constraint is required to match it (e.g. "0"). The value is the @@ -114,12 +114,12 @@ public: typedef std::vector SubConstraintInfoVector; struct ConstraintInfo; typedef std::vector ConstraintInfoVector; - + struct ConstraintInfo { /// Type - The basic type of the constraint: input/output/clobber /// ConstraintPrefix Type; - + /// isEarlyClobber - "&": output operand writes result before inputs are all /// read. This is only ever set for an output operand. bool isEarlyClobber; @@ -129,48 +129,48 @@ public: /// constraint number that matches this one (for example, if this is /// constraint #0 and constraint #4 has the value "0", this will be 4). signed char MatchingInput; - + /// hasMatchingInput - Return true if this is an output constraint that has /// a matching input constraint. bool hasMatchingInput() const { return MatchingInput != -1; } - + /// isCommutative - This is set to true for a constraint that is commutative /// with the next operand. bool isCommutative; - + /// isIndirect - True if this operand is an indirect operand. This means /// that the address of the source or destination is present in the call /// instruction, instead of it being returned or passed in explicitly. This /// is represented with a '*' in the asm string. bool isIndirect; - + /// Code - The constraint code, either the register name (in braces) or the /// constraint letter/number. ConstraintCodeVector Codes; - + /// isMultipleAlternative - '|': has multiple-alternative constraints. bool isMultipleAlternative; - + /// multipleAlternatives - If there are multiple alternative constraints, /// this array will contain them. Otherwise it will be empty. SubConstraintInfoVector multipleAlternatives; - + /// The currently selected alternative constraint index. unsigned currentAlternativeIndex; /// Default constructor. ConstraintInfo(); - + /// Parse - Analyze the specified string (e.g. "=*&{eax}") and fill in the /// fields in this structure. If the constraint string is not understood, /// return true, otherwise return false. bool Parse(StringRef Str, ConstraintInfoVector &ConstraintsSoFar); - + /// selectAlternative - Point this constraint to the alternative constraint /// indicated by the index. void selectAlternative(unsigned index); }; - + /// ParseConstraints - Split up the constraint string into the specific /// constraints and their prefixes. If this returns an empty vector, and if /// the constraint string itself isn't empty, there was an error parsing. @@ -181,13 +181,12 @@ public: ConstraintInfoVector ParseConstraints() const { return ParseConstraints(Constraints); } - + // Methods for support type inquiry through isa, cast, and dyn_cast: static inline bool classof(const Value *V) { return V->getValueID() == Value::InlineAsmVal; } - // These are helper methods for dealing with flags in the INLINEASM SDNode // in the backend. // @@ -204,7 +203,7 @@ public: // code. // Else: // Bit 30-16 - The register class ID to use for the operand. - + enum : uint32_t { // Fixed operands on an INLINEASM SDNode. Op_InputChain = 0, @@ -265,13 +264,13 @@ public: Flag_MatchingOperand = 0x80000000 }; - + static unsigned getFlagWord(unsigned Kind, unsigned NumOps) { assert(((NumOps << 3) & ~0xffff) == 0 && "Too many inline asm operands!"); assert(Kind >= Kind_RegUse && Kind <= Kind_Mem && "Invalid Kind"); return Kind | (NumOps << 3); } - + /// getFlagWordForMatchingOp - Augment an existing flag word returned by /// getFlagWord with information indicating that this input operand is tied /// to a previous output operand. @@ -356,7 +355,6 @@ public: RC = High - 1; return true; } - }; } // End llvm namespace