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 += ',';