diff options
author | Anders Carlsson <andersca@mac.com> | 2009-01-18 01:56:57 +0000 |
---|---|---|
committer | Anders Carlsson <andersca@mac.com> | 2009-01-18 01:56:57 +0000 |
commit | a79203be8566b4cc67d9bf1832c94fdf2f0a0d47 (patch) | |
tree | 8ceadcca1bb6b56206d42fdb1911b1384ba18824 /clang/lib/Basic/TargetInfo.cpp | |
parent | bb70bf6dbbdaa88abf51bc62beab19eac015903f (diff) | |
download | bcm5719-llvm-a79203be8566b4cc67d9bf1832c94fdf2f0a0d47.tar.gz bcm5719-llvm-a79203be8566b4cc67d9bf1832c94fdf2f0a0d47.zip |
Add sema support for symbolic names in inline asm statements.
llvm-svn: 62441
Diffstat (limited to 'clang/lib/Basic/TargetInfo.cpp')
-rw-r--r-- | clang/lib/Basic/TargetInfo.cpp | 40 |
1 files changed, 39 insertions, 1 deletions
diff --git a/clang/lib/Basic/TargetInfo.cpp b/clang/lib/Basic/TargetInfo.cpp index 2ea1f232bfd..eb912d578e3 100644 --- a/clang/lib/Basic/TargetInfo.cpp +++ b/clang/lib/Basic/TargetInfo.cpp @@ -188,6 +188,36 @@ bool TargetInfo::validateOutputConstraint(const char *Name, 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 @@ bool TargetInfo::validateInputConstraint(const char *Name, // 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; |