diff options
author | Coby Tayree <coby.tayree@intel.com> | 2017-09-29 07:02:49 +0000 |
---|---|---|
committer | Coby Tayree <coby.tayree@intel.com> | 2017-09-29 07:02:49 +0000 |
commit | 6150419d7161defbba157d0d92b98070f2a9d63b (patch) | |
tree | 47a1cf66b8d68b5569512d5295d5fd879edeb070 /clang/lib/Parse/ParseStmtAsm.cpp | |
parent | c3d24118e8232864e347f1db3420e8ed89c61219 (diff) | |
download | bcm5719-llvm-6150419d7161defbba157d0d92b98070f2a9d63b.tar.gz bcm5719-llvm-6150419d7161defbba157d0d92b98070f2a9d63b.zip |
[X86][MS-InlineAsm] Extended support for variables / identifiers on memory / immediate expressions
Allow the proper recognition of Enum values and global variables inside ms inline-asm memory / immediate expressions, as they require some additional overhead and treated incorrect if doesn't early recognized.
supersedes D33278, D35774
Differential Revision: https://reviews.llvm.org/D37413
llvm-svn: 314494
Diffstat (limited to 'clang/lib/Parse/ParseStmtAsm.cpp')
-rw-r--r-- | clang/lib/Parse/ParseStmtAsm.cpp | 26 |
1 files changed, 10 insertions, 16 deletions
diff --git a/clang/lib/Parse/ParseStmtAsm.cpp b/clang/lib/Parse/ParseStmtAsm.cpp index 181bd413c5d..f38ad279bcd 100644 --- a/clang/lib/Parse/ParseStmtAsm.cpp +++ b/clang/lib/Parse/ParseStmtAsm.cpp @@ -54,9 +54,9 @@ public: assert(AsmToks.size() == AsmTokOffsets.size()); } - void *LookupInlineAsmIdentifier(StringRef &LineBuf, - llvm::InlineAsmIdentifierInfo &Info, - bool IsUnevaluatedContext) override { + void LookupInlineAsmIdentifier(StringRef &LineBuf, + llvm::InlineAsmIdentifierInfo &Info, + bool IsUnevaluatedContext) override { // Collect the desired tokens. SmallVector<Token, 16> LineToks; const Token *FirstOrigToken = nullptr; @@ -64,7 +64,7 @@ public: unsigned NumConsumedToks; ExprResult Result = TheParser.ParseMSAsmIdentifier( - LineToks, NumConsumedToks, &Info, IsUnevaluatedContext); + LineToks, NumConsumedToks, IsUnevaluatedContext); // If we consumed the entire line, tell MC that. // Also do this if we consumed nothing as a way of reporting failure. @@ -89,9 +89,10 @@ public: LineBuf = LineBuf.substr(0, TotalOffset); } - // Initialize the "decl" with the lookup result. - Info.OpDecl = static_cast<void *>(Result.get()); - return Info.OpDecl; + // Initialize Info with the lookup result. + if (!Result.isUsable()) + return; + TheParser.getActions().FillInlineAsmIdentifierInfo(Result.get(), Info); } StringRef LookupInlineAsmLabel(StringRef Identifier, llvm::SourceMgr &LSM, @@ -178,16 +179,9 @@ private: } /// Parse an identifier in an MS-style inline assembly block. -/// -/// \param CastInfo - a void* so that we don't have to teach Parser.h -/// about the actual type. ExprResult Parser::ParseMSAsmIdentifier(llvm::SmallVectorImpl<Token> &LineToks, unsigned &NumLineToksConsumed, - void *CastInfo, bool IsUnevaluatedContext) { - llvm::InlineAsmIdentifierInfo &Info = - *(llvm::InlineAsmIdentifierInfo *)CastInfo; - // Push a fake token on the end so that we don't overrun the token // stream. We use ';' because it expression-parsing should never // overrun it. @@ -227,7 +221,7 @@ ExprResult Parser::ParseMSAsmIdentifier(llvm::SmallVectorImpl<Token> &LineToks, /*AllowDeductionGuide=*/false, /*ObjectType=*/nullptr, TemplateKWLoc, Id); // Perform the lookup. - Result = Actions.LookupInlineAsmIdentifier(SS, TemplateKWLoc, Id, Info, + Result = Actions.LookupInlineAsmIdentifier(SS, TemplateKWLoc, Id, IsUnevaluatedContext); } // While the next two tokens are 'period' 'identifier', repeatedly parse it as @@ -241,7 +235,7 @@ ExprResult Parser::ParseMSAsmIdentifier(llvm::SmallVectorImpl<Token> &LineToks, IdentifierInfo *Id = Tok.getIdentifierInfo(); ConsumeToken(); // Consume the identifier. Result = Actions.LookupInlineAsmVarDeclField(Result.get(), Id->getName(), - Info, Tok.getLocation()); + Tok.getLocation()); } // Figure out how many tokens we are into LineToks. |