[llvm-commits] CVS: llvm/lib/VMCore/InlineAsm.cpp

Chris Lattner lattner at cs.uiuc.edu
Wed Feb 1 16:24:05 PST 2006



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;
     }
 






More information about the llvm-commits mailing list