Changes in directory llvm/lib/VMCore:
InlineAsm.cpp updated: 1.7 -> 1.8 --- Log message: validate matching constraints and remember when we see them. --- Diffs of the changes: (+15 -5) InlineAsm.cpp | 20 +++++++++++++++----- 1 files changed, 15 insertions(+), 5 deletions(-) Index: llvm/lib/VMCore/InlineAsm.cpp diff -u llvm/lib/VMCore/InlineAsm.cpp:1.7 llvm/lib/VMCore/InlineAsm.cpp:1.8 --- llvm/lib/VMCore/InlineAsm.cpp:1.7 Tue Jan 31 22:37:04 2006 +++ llvm/lib/VMCore/InlineAsm.cpp Wed Feb 1 18:23:53 2006 @@ -42,13 +42,15 @@ /// 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 @@ 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 @@ 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; } _______________________________________________ llvm-commits mailing list llvm-commits@cs.uiuc.edu http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits