From e6f6980d5ba338fb40eb2d294fee878ddf44fd01 Mon Sep 17 00:00:00 2001 From: Ehsan Akhgari Date: Mon, 22 Sep 2014 20:40:36 +0000 Subject: [PATCH] ms-inline-asm: Fix parsing label names inside bracket expressions Summary: This fixes a couple of issues. One is ensuring that AOK_Label rewrite rules have a lower priority than AOK_Skip rules, as AOK_Skip needs to be able to skip the brackets properly. The other part of the fix ensures that we don't overwrite Identifier when looking up the identifier, and that we use the locally available information to generate the AOK_Label rewrite in ParseIntelIdentifier. Doing that in CreateMemForInlineAsm would be problematic since the Start location there may point to the beginning of a bracket expression, and not necessarily the beginning of an identifier. This also means that we don't need to carry around the InternlName field, which helps simplify the code. Test Plan: This will be tested on the clang side. Reviewers: rnk Subscribers: llvm-commits Differential Revision: http://reviews.llvm.org/D5445 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@218270 91177308-0d34-0410-b5e6-96231b3b80d8 --- include/llvm/MC/MCParser/MCAsmParser.h | 2 -- include/llvm/MC/MCTargetAsmParser.h | 18 +++++++++--------- lib/Target/X86/AsmParser/X86AsmParser.cpp | 17 ++++++++--------- 3 files changed, 17 insertions(+), 20 deletions(-) diff --git a/include/llvm/MC/MCParser/MCAsmParser.h b/include/llvm/MC/MCParser/MCAsmParser.h index ffe89e6fa1c..bfcb5cd6259 100644 --- a/include/llvm/MC/MCParser/MCAsmParser.h +++ b/include/llvm/MC/MCParser/MCAsmParser.h @@ -35,7 +35,6 @@ public: void *OpDecl; bool IsVarDecl; unsigned Length, Size, Type; - StringRef InternalName; void clear() { OpDecl = nullptr; @@ -43,7 +42,6 @@ public: Length = 1; Size = 0; Type = 0; - InternalName = ""; } }; diff --git a/include/llvm/MC/MCTargetAsmParser.h b/include/llvm/MC/MCTargetAsmParser.h index 80bf7dc4de0..cf9230758f2 100644 --- a/include/llvm/MC/MCTargetAsmParser.h +++ b/include/llvm/MC/MCTargetAsmParser.h @@ -44,16 +44,16 @@ enum AsmRewriteKind { const char AsmRewritePrecedence [] = { 0, // AOK_Delete - 1, // AOK_Align - 1, // AOK_DotOperator - 1, // AOK_Emit - 3, // AOK_Imm - 3, // AOK_ImmPrefix - 2, // AOK_Input - 2, // AOK_Output - 4, // AOK_SizeDirective + 2, // AOK_Align + 2, // AOK_DotOperator + 2, // AOK_Emit + 4, // AOK_Imm + 4, // AOK_ImmPrefix + 3, // AOK_Input + 3, // AOK_Output + 5, // AOK_SizeDirective 1, // AOK_Label - 1 // AOK_Skip + 2 // AOK_Skip }; struct AsmRewrite { diff --git a/lib/Target/X86/AsmParser/X86AsmParser.cpp b/lib/Target/X86/AsmParser/X86AsmParser.cpp index 8fec1c3a49d..519ada2b4b9 100644 --- a/lib/Target/X86/AsmParser/X86AsmParser.cpp +++ b/lib/Target/X86/AsmParser/X86AsmParser.cpp @@ -1047,12 +1047,6 @@ std::unique_ptr X86AsmParser::CreateMemForInlineAsm( InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_SizeDirective, Start, /*Len=*/0, Size)); } - if (!Info.InternalName.empty()) { - // Push a rewrite for replacing the identifier name with the internal name. - InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_Label, Start, - End.getPointer() - Start.getPointer(), - Info.InternalName)); - } } // When parsing inline assembly we set the base register to a non-zero value @@ -1347,9 +1341,14 @@ bool X86AsmParser::ParseIntelIdentifier(const MCExpr *&Val, // If the identifier lookup was unsuccessful, assume that we are dealing with // a label. if (!Result) { - Identifier = SemaCallback->LookupInlineAsmLabel(Identifier, getSourceManager(), Loc, false); - assert(Identifier.size() && "We should have an internal name here."); - Info.InternalName = Identifier; + StringRef InternalName = + SemaCallback->LookupInlineAsmLabel(Identifier, getSourceManager(), + Loc, false); + assert(InternalName.size() && "We should have an internal name here."); + // Push a rewrite for replacing the identifier name with the internal name. + InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_Label, Loc, + Identifier.size(), + InternalName)); } // Create the symbol reference. -- 2.34.1