From: Chad Rosier Date: Fri, 19 Apr 2013 20:37:49 +0000 (+0000) Subject: [ms-inline asm] The parsing of C++ identifiers is a task of the front-end parser, X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=87a9f2b2d7fb287ccd9ed5dfdbe75cc4ce906122;p=clang [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 --- 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;