std::string AsmString, Constraints;
bool HasSideEffects;
+ bool IsAlignStack;
- InlineAsm(const FunctionType *Ty, const std::string &AsmString,
- const std::string &Constraints, bool hasSideEffects);
+ InlineAsm(const FunctionType *Ty, StringRef AsmString,
+ StringRef Constraints, bool hasSideEffects,
+ bool isAlignStack = false);
virtual ~InlineAsm();
public:
/// InlineAsm::get - Return the the specified uniqued inline asm string.
///
- static InlineAsm *get(const FunctionType *Ty, const std::string &AsmString,
- const std::string &Constraints, bool hasSideEffects);
+ static InlineAsm *get(const FunctionType *Ty, StringRef AsmString,
+ StringRef Constraints, bool hasSideEffects,
+ bool isAlignStack = false);
bool hasSideEffects() const { return HasSideEffects; }
+ bool isAlignStack() const { return IsAlignStack; }
/// getType - InlineAsm's are always pointers.
///
/// the specified constraint string is legal for the type. This returns true
/// if legal, false if not.
///
- static bool Verify(const FunctionType *Ty, const std::string &Constraints);
+ static bool Verify(const FunctionType *Ty, StringRef Constraints);
// Constraint String Parsing
enum ConstraintPrefix {
/// 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(const std::string &Str,
+ bool Parse(StringRef Str,
std::vector<InlineAsm::ConstraintInfo> &ConstraintsSoFar);
};
/// constraints and their prefixes. If this returns an empty vector, and if
/// the constraint string itself isn't empty, there was an error parsing.
static std::vector<ConstraintInfo>
- ParseConstraints(const std::string &ConstraintString);
+ ParseConstraints(StringRef ConstraintString);
/// ParseConstraints - Parse the constraints of this inlineasm object,
/// returning them the same way that ParseConstraints(str) does.
static inline bool classof(const Value *V) {
return V->getValueID() == Value::InlineAsmVal;
}
+
+ /// getNumOperandRegisters - Extract the number of registers field from the
+ /// inline asm operand flag.
+ static unsigned getNumOperandRegisters(unsigned Flag) {
+ return (Flag & 0xffff) >> 3;
+ }
+
+ /// isUseOperandTiedToDef - Return true if the flag of the inline asm
+ /// operand indicates it is an use operand that's matched to a def operand.
+ static bool isUseOperandTiedToDef(unsigned Flag, unsigned &Idx) {
+ if ((Flag & 0x80000000) == 0)
+ return false;
+ Idx = (Flag & ~0x80000000) >> 16;
+ return true;
+ }
+
+
};
} // End llvm namespace