diff options
| author | Chris Lattner <sabre@nondot.org> | 2006-02-02 00:23:53 +0000 |
|---|---|---|
| committer | Chris Lattner <sabre@nondot.org> | 2006-02-02 00:23:53 +0000 |
| commit | 2f34a9e332471b1ae51423283527e930023e2755 (patch) | |
| tree | d3d11a31438c0a085e157f6b4d1be92001e6670a /llvm/lib | |
| parent | 4f5ff85ceb79e186c821baf91ee64835d57fee49 (diff) | |
| download | bcm5719-llvm-2f34a9e332471b1ae51423283527e930023e2755.tar.gz bcm5719-llvm-2f34a9e332471b1ae51423283527e930023e2755.zip | |
validate matching constraints and remember when we see them.
llvm-svn: 25892
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/VMCore/InlineAsm.cpp | 20 |
1 files changed, 15 insertions, 5 deletions
diff --git a/llvm/lib/VMCore/InlineAsm.cpp b/llvm/lib/VMCore/InlineAsm.cpp index 54367204175..cdb8c46e95f 100644 --- a/llvm/lib/VMCore/InlineAsm.cpp +++ b/llvm/lib/VMCore/InlineAsm.cpp @@ -42,13 +42,15 @@ const FunctionType *InlineAsm::getFunctionType() const { /// 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 InlineAsm::ConstraintInfo::Parse(const std::string &Str) { +bool InlineAsm::ConstraintInfo::Parse(const std::string &Str, + std::vector<InlineAsm::ConstraintInfo> &ConstraintsSoFar) { std::string::const_iterator I = Str.begin(), E = Str.end(); // Initialize Type = isInput; isEarlyClobber = false; - isIndirectOutput =false; + isIndirectOutput = false; + hasMatchingInput = false; // Parse the prefix. if (*I == '~') { @@ -94,12 +96,20 @@ bool InlineAsm::ConstraintInfo::Parse(const std::string &Str) { if (ConstraintEnd == E) return true; // "{foo" Codes.push_back(std::string(I, ConstraintEnd+1)); I = ConstraintEnd+1; - } else if (isdigit(*I)) { + } else if (isdigit(*I)) { // Matching Constraint // Maximal munch numbers. std::string::const_iterator NumStart = I; while (I != E && isdigit(*I)) ++I; Codes.push_back(std::string(NumStart, I)); + unsigned N = atoi(Codes.back().c_str()); + // Check that this is a valid matching constraint! + if (N >= ConstraintsSoFar.size() || ConstraintsSoFar[N].Type != isOutput|| + Type != isInput) + return true; // Invalid constraint number. + + // Note that operand #n has a matching input. + ConstraintsSoFar[N].hasMatchingInput = true; } else { // Single letter constraint. Codes.push_back(std::string(I, I+1)); @@ -123,8 +133,8 @@ InlineAsm::ParseConstraints(const std::string &Constraints) { std::string::const_iterator ConstraintEnd = std::find(I, E, ','); if (ConstraintEnd == I || // Empty constraint like ",," - Info.Parse(std::string(I, ConstraintEnd))) { // Erroneous constraint? - Result.clear(); + Info.Parse(std::string(I, ConstraintEnd), Result)) { + Result.clear(); // Erroneous constraint? break; } |

