diff options
author | Chad Rosier <mcrosier@apple.com> | 2013-04-19 20:37:49 +0000 |
---|---|---|
committer | Chad Rosier <mcrosier@apple.com> | 2013-04-19 20:37:49 +0000 |
commit | 87a9f2b2d7fb287ccd9ed5dfdbe75cc4ce906122 (patch) | |
tree | 46b14410d76451ecdfdd7ff5e67adace82929630 /lib/Sema | |
parent | 59d6a71d681adfdc7d976492eeb3deae84e8f2e2 (diff) |
[ms-inline asm] The parsing of C++ identifiers is a task of the front-end parser,
not the asm parser. As such, begin moving the parsing logic in that direction.
This patch is just a temporary hack until the real frontend parser can be hooked
up. Part of rdar://13663589
git-svn-id: https://llvm.org/svn/llvm-project/cfe/trunk@179882 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/Sema')
-rw-r--r-- | lib/Sema/SemaStmtAsm.cpp | 31 |
1 files changed, 31 insertions, 0 deletions
diff --git a/lib/Sema/SemaStmtAsm.cpp b/lib/Sema/SemaStmtAsm.cpp index 2190fc40c3..0ed0fd56f5 100644 --- a/lib/Sema/SemaStmtAsm.cpp +++ b/lib/Sema/SemaStmtAsm.cpp @@ -494,9 +494,40 @@ public: } +// FIXME: Temporary hack until the frontend parser is hooked up to parse +// variables. +static bool isIdentifierChar(char c) { + return isalnum(c) || c == '_' || c == '$' || c == '.' || c == '@'; +} + +static void lexIdentifier(const char *&CurPtr) { + while (isIdentifierChar(*CurPtr)) + ++CurPtr; +} + +static StringRef parseIdentifier(StringRef Identifier) { + const char *StartPtr = Identifier.data(), *EndPtr, *CurPtr; + EndPtr = StartPtr + Identifier.size(); + CurPtr = StartPtr; + while(CurPtr <= EndPtr) { + if (isIdentifierChar(*CurPtr)) + lexIdentifier(CurPtr); + else if (CurPtr[0] == ':' && CurPtr[1] == ':') + CurPtr += 2; + else + break; + } + return StringRef(StartPtr, CurPtr - StartPtr); +} + NamedDecl *Sema::LookupInlineAsmIdentifier(StringRef Name, SourceLocation Loc, unsigned &Length, unsigned &Size, unsigned &Type, bool &IsVarDecl) { + // FIXME: Temporary hack until the frontend parser is hooked up to parse + // variables. + StringRef ParsedName = parseIdentifier(Name); + assert (ParsedName == Name && "Identifier not parsed correctly!"); + Length = 1; Size = 0; Type = 0; |