diff options
author | Chris Lattner <sabre@nondot.org> | 2006-02-01 01:27:37 +0000 |
---|---|---|
committer | Chris Lattner <sabre@nondot.org> | 2006-02-01 01:27:37 +0000 |
commit | 2a09ffe2f92249e7186b8ea4ffdbde9a3e7e707d (patch) | |
tree | 4a21767bd4010c497023131a71d2ef892afdf830 | |
parent | a24617f5d4e901c08d06cdb98ab50a34075f7809 (diff) | |
download | bcm5719-llvm-2a09ffe2f92249e7186b8ea4ffdbde9a3e7e707d.tar.gz bcm5719-llvm-2a09ffe2f92249e7186b8ea4ffdbde9a3e7e707d.zip |
Beef up the interface to inline asm constraint parsing, making it more
general, useful, and easier to use.
llvm-svn: 25864
-rw-r--r-- | llvm/include/llvm/InlineAsm.h | 30 |
1 files changed, 27 insertions, 3 deletions
diff --git a/llvm/include/llvm/InlineAsm.h b/llvm/include/llvm/InlineAsm.h index 50d00058fad..94d3bc86957 100644 --- a/llvm/include/llvm/InlineAsm.h +++ b/llvm/include/llvm/InlineAsm.h @@ -70,17 +70,41 @@ public: enum ConstraintPrefix { isInput, // 'x' isOutput, // '=x' - isIndirectOutput, // '==x' isClobber, // '~x' }; + 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; + + /// isIndirectOutput - If this is true for an output constraint, the address + /// to store the output result is passed as an operand to the call. + bool isIndirectOutput; + + /// Code - The constraint code, either the register name (in braces) or the + /// constraint letter/number. + std::vector<std::string> Codes; + + /// 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); + }; + /// 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. - static std::vector<std::pair<ConstraintPrefix, std::string> > + static std::vector<ConstraintInfo> ParseConstraints(const std::string &ConstraintString); - std::vector<std::pair<ConstraintPrefix, std::string> > + /// ParseConstraints - Parse the constraints of this inlineasm object, + /// returning them the same way that ParseConstraints(str) does. + std::vector<ConstraintInfo> ParseConstraints() const { return ParseConstraints(Constraints); } |