Add sema support for symbolic names in inline asm statements.

git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@62441 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Basic/TargetInfo.cpp b/lib/Basic/TargetInfo.cpp
index 2ea1f23..eb912d5 100644
--- a/lib/Basic/TargetInfo.cpp
+++ b/lib/Basic/TargetInfo.cpp
@@ -188,6 +188,36 @@
   return true;
 }
 
+bool TargetInfo::resolveSymbolicName(const char *&Name,
+                                     const std::string *OutputNamesBegin,
+                                     const std::string *OutputNamesEnd,
+                                     unsigned &Index) const
+{
+  assert(*Name == '[' && "Symbolic name did not start with '['");
+
+  Name++;
+  const char *Start = Name;
+  while (*Name && *Name != ']')
+    Name++;
+  
+  if (!*Name) {
+    // Missing ']'
+    return false;
+  }
+  
+  std::string SymbolicName(Start, Name - Start);
+  
+  Index = 0;
+  for (const std::string *it = OutputNamesBegin; 
+       it != OutputNamesEnd; 
+       ++it, Index++) {
+    if (SymbolicName == *it)
+      return true;
+  }
+
+  return false;
+}
+
 bool TargetInfo::validateInputConstraint(const char *Name,
                                          const std::string *OutputNamesBegin,
                                          const std::string *OutputNamesEnd,
@@ -210,7 +240,15 @@
         // add more constraints as we hit it.  Eventually, an unknown
         // constraint should just be treated as 'g'.
         return false;
-      }        
+      }
+      break;
+    case '[': {
+      unsigned Index = 0;
+      if (!resolveSymbolicName(Name, OutputNamesBegin, OutputNamesEnd, Index))
+        return false;
+    
+      break;
+    }          
     case '%': // commutative
       // FIXME: Fail if % is used with the last operand.
       break;
diff --git a/lib/CodeGen/CGStmt.cpp b/lib/CodeGen/CGStmt.cpp
index d86c3f4..04fc26d 100644
--- a/lib/CodeGen/CGStmt.cpp
+++ b/lib/CodeGen/CGStmt.cpp
@@ -980,7 +980,7 @@
                                                  S.begin_output_names(),
                                                  S.end_output_names(),
                                                  Info);
-    assert(result && "Failed to parse input constraint"); result=result;
+    assert(result && "Failed to parse input constraint");
     
     if (i != 0 || S.getNumOutputs() > 0)
       Constraints += ',';