[llvm-commits] [llvm] r166212 - in /llvm/trunk: include/llvm/MC/MCParser/MCAsmParser.h lib/MC/MCParser/AsmParser.cpp

Chad Rosier mcrosier at apple.com
Thu Oct 18 12:39:30 PDT 2012


Author: mcrosier
Date: Thu Oct 18 14:39:30 2012
New Revision: 166212

URL: http://llvm.org/viewvc/llvm-project?rev=166212&view=rev
Log:
[ms-inline asm] Have the LookupInlineAsmIdentifier() callback function return a
*NamedDecl.  In turn, build the expressions after we're finished parsing the
asm.  This avoids a crasher if the lookup fails.

Modified:
    llvm/trunk/include/llvm/MC/MCParser/MCAsmParser.h
    llvm/trunk/lib/MC/MCParser/AsmParser.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=166212&r1=166211&r2=166212&view=diff
==============================================================================
--- llvm/trunk/include/llvm/MC/MCParser/MCAsmParser.h (original)
+++ llvm/trunk/include/llvm/MC/MCParser/MCAsmParser.h Thu Oct 18 14:39:30 2012
@@ -34,8 +34,7 @@
 /// MCAsmParserSemaCallback - Generic Sema callback for assembly parser.
 class MCAsmParserSemaCallback {
 public:
-  virtual void *LookupInlineAsmIdentifier(StringRef Name, void *Loc,
-                                          void **IdentifierInfoPtr) = 0;
+  virtual void *LookupInlineAsmIdentifier(StringRef Name, void *Loc) = 0;
 };
 
 /// MCAsmParser - Generic assembler parser interface, for use by target specific
@@ -89,9 +88,8 @@
   /// ParseMSInlineAsm - Parse ms-style inline assembly.
   virtual bool ParseMSInlineAsm(void *AsmLoc, std::string &AsmString,
                                 unsigned &NumOutputs, unsigned &NumInputs,
-                                SmallVectorImpl<void *> &Names,
+                                SmallVectorImpl<void *> &OpDecls,
                                 SmallVectorImpl<std::string> &Constraints,
-                                SmallVectorImpl<void *> &Exprs,
                                 SmallVectorImpl<std::string> &Clobbers,
                                 const MCInstrInfo *MII,
                                 const MCInstPrinter *IP,

Modified: llvm/trunk/lib/MC/MCParser/AsmParser.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/MC/MCParser/AsmParser.cpp?rev=166212&r1=166211&r2=166212&view=diff
==============================================================================
--- llvm/trunk/lib/MC/MCParser/AsmParser.cpp (original)
+++ llvm/trunk/lib/MC/MCParser/AsmParser.cpp Thu Oct 18 14:39:30 2012
@@ -190,9 +190,8 @@
 
   bool ParseMSInlineAsm(void *AsmLoc, std::string &AsmString,
                         unsigned &NumOutputs, unsigned &NumInputs,
-                        SmallVectorImpl<void *> &Names,
+                        SmallVectorImpl<void *> &OpDecls,
                         SmallVectorImpl<std::string> &Constraints,
-                        SmallVectorImpl<void *> &Exprs,
                         SmallVectorImpl<std::string> &Clobbers,
                         const MCInstrInfo *MII,
                         const MCInstPrinter *IP,
@@ -3592,19 +3591,16 @@
 
 bool AsmParser::ParseMSInlineAsm(void *AsmLoc, std::string &AsmString,
                                  unsigned &NumOutputs, unsigned &NumInputs,
-                                 SmallVectorImpl<void *> &Names,
+                                 SmallVectorImpl<void *> &OpDecls,
                                  SmallVectorImpl<std::string> &Constraints,
-                                 SmallVectorImpl<void *> &Exprs,
                                  SmallVectorImpl<std::string> &Clobbers,
                                  const MCInstrInfo *MII,
                                  const MCInstPrinter *IP,
                                  MCAsmParserSemaCallback &SI) {
-  SmallVector<void*, 4> Inputs;
-  SmallVector<void*, 4> Outputs;
+  SmallVector<void*, 4> InputDecls;
+  SmallVector<void*, 4> OutputDecls;
   SmallVector<std::string, 4> InputConstraints;
   SmallVector<std::string, 4> OutputConstraints;
-  SmallVector<void*, 4> InputExprs;
-  SmallVector<void*, 4> OutputExprs;
   std::set<std::string> ClobberRegs;
 
   SmallVector<struct AsmOpRewrite, 4> AsmStrRewrites;
@@ -3647,24 +3643,20 @@
         }
 
         // Expr/Input or Output.
-        void *II;
-        void *ExprResult = SI.LookupInlineAsmIdentifier(Operand->getName(),
-                                                        AsmLoc, &II);
-        if (ExprResult) {
+        void *OpDecl = SI.LookupInlineAsmIdentifier(Operand->getName(), AsmLoc);
+        if (OpDecl) {
           bool isOutput = (i == 1) && Desc.mayStore();
           if (isOutput) {
             std::string Constraint = "=";
             ++InputIdx;
-            Outputs.push_back(II);
-            OutputExprs.push_back(ExprResult);
+            OutputDecls.push_back(OpDecl);
             Constraint += Operand->getConstraint().str();
             OutputConstraints.push_back(Constraint);
             AsmStrRewrites.push_back(AsmOpRewrite(AOK_Output,
                                                   Operand->getStartLoc(),
                                                   Operand->getNameLen()));
           } else {
-            Inputs.push_back(II);
-            InputExprs.push_back(ExprResult);
+            InputDecls.push_back(OpDecl);
             InputConstraints.push_back(Operand->getConstraint().str());
             AsmStrRewrites.push_back(AsmOpRewrite(AOK_Input,
                                                   Operand->getStartLoc(),
@@ -3680,8 +3672,8 @@
   }
 
   // Set the number of Outputs and Inputs.
-  NumOutputs = Outputs.size();
-  NumInputs = Inputs.size();
+  NumOutputs = OutputDecls.size();
+  NumInputs = InputDecls.size();
 
   // Set the unique clobbers.
   for (std::set<std::string>::iterator I = ClobberRegs.begin(),
@@ -3691,18 +3683,15 @@
   // Merge the various outputs and inputs.  Output are expected first.
   if (NumOutputs || NumInputs) {
     unsigned NumExprs = NumOutputs + NumInputs;
-    Names.resize(NumExprs);
+    OpDecls.resize(NumExprs);
     Constraints.resize(NumExprs);
-    Exprs.resize(NumExprs);
     for (unsigned i = 0; i < NumOutputs; ++i) {
-      Names[i] = Outputs[i];
+      OpDecls[i] = OutputDecls[i];
       Constraints[i] = OutputConstraints[i];
-      Exprs[i] = OutputExprs[i];
     }
     for (unsigned i = 0, j = NumOutputs; i < NumInputs; ++i, ++j) {
-      Names[j] = Inputs[i];
+      OpDecls[j] = InputDecls[i];
       Constraints[j] = InputConstraints[i];
-      Exprs[j] = InputExprs[i];
     }
   }
 





More information about the llvm-commits mailing list