[llvm] r218270 - ms-inline-asm: Fix parsing label names inside bracket expressions

Ehsan Akhgari ehsan.akhgari at gmail.com
Mon Sep 22 13:40:37 PDT 2014


Author: ehsan
Date: Mon Sep 22 15:40:36 2014
New Revision: 218270

URL: http://llvm.org/viewvc/llvm-project?rev=218270&view=rev
Log:
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

Modified:
    llvm/trunk/include/llvm/MC/MCParser/MCAsmParser.h
    llvm/trunk/include/llvm/MC/MCTargetAsmParser.h
    llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp

Modified: llvm/trunk/include/llvm/MC/MCParser/MCAsmParser.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCParser/MCAsmParser.h?rev=218270&r1=218269&r2=218270&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCParser/MCAsmParser.h (original)
+++ llvm/trunk/include/llvm/MC/MCParser/MCAsmParser.h Mon Sep 22 15:40:36 2014
@@ -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 = "";
   }
 };
 

Modified: llvm/trunk/include/llvm/MC/MCTargetAsmParser.h
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/include/llvm/MC/MCTargetAsmParser.h?rev=218270&r1=218269&r2=218270&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCTargetAsmParser.h (original)
+++ llvm/trunk/include/llvm/MC/MCTargetAsmParser.h Mon Sep 22 15:40:36 2014
@@ -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 {

Modified: llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp?rev=218270&r1=218269&r2=218270&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp (original)
+++ llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp Mon Sep 22 15:40:36 2014
@@ -1047,12 +1047,6 @@ std::unique_ptr<X86Operand> X86AsmParser
         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(
   // 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.





More information about the llvm-commits mailing list