[llvm-commits] [llvm] r166698 - /llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp

Chad Rosier mcrosier at apple.com
Thu Oct 25 10:37:43 PDT 2012


Author: mcrosier
Date: Thu Oct 25 12:37:43 2012
New Revision: 166698

URL: http://llvm.org/viewvc/llvm-project?rev=166698&view=rev
Log:
[ms-inline asm] Add error handling to the ParseIntelDotOperator() function.

Modified:
    llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp

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=166698&r1=166697&r2=166698&view=diff
==============================================================================
--- llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp (original)
+++ llvm/trunk/lib/Target/X86/AsmParser/X86AsmParser.cpp Thu Oct 25 12:37:43 2012
@@ -60,7 +60,8 @@
   X86Operand *ParseIntelBracExpression(unsigned SegReg, unsigned Size);
   X86Operand *ParseMemOperand(unsigned SegReg, SMLoc StartLoc);
 
-  const MCExpr *ParseIntelDotOperator(const MCExpr *Disp);
+  bool ParseIntelDotOperator(const MCExpr *Disp, const MCExpr **NewDisp,
+                             SmallString<64> &Err);
 
   bool ParseDirectiveWord(unsigned Size, SMLoc L);
   bool ParseDirectiveCode(StringRef IDVal, SMLoc L);
@@ -744,8 +745,15 @@
   Parser.Lex();
   End = Tok.getLoc();
 
-  if (Tok.getString().startswith("."))
-    Disp = ParseIntelDotOperator(Disp);
+  if (Tok.getString().startswith(".")) {
+    SmallString<64> Err;
+    const MCExpr *NewDisp;
+    if (ParseIntelDotOperator(Disp, &NewDisp, Err))
+      return ErrorOperand(Tok.getLoc(), Err);
+    
+    Parser.Lex();  // Eat the field.
+    Disp = NewDisp;
+  }
 
   End = Tok.getLoc();
 
@@ -809,30 +817,41 @@
 }
 
 /// Parse the '.' operator.
-const MCExpr *X86AsmParser::ParseIntelDotOperator(const MCExpr *Disp) {
+bool X86AsmParser::ParseIntelDotOperator(const MCExpr *Disp,
+                                         const MCExpr **NewDisp,
+                                         SmallString<64> &Err) {
   AsmToken Tok = *&Parser.getTok();
+  uint64_t OrigDispVal, DotDispVal;
+
+  // FIXME: Handle non-constant expressions.
+  if (const MCConstantExpr *OrigDisp = dyn_cast<MCConstantExpr>(Disp)) {
+    OrigDispVal = OrigDisp->getValue();
+  } else {
+    Err = "Non-constant offsets are not supported!";
+    return true;
+  }
 
   // Drop the '.'.
   StringRef DotDispStr = Tok.getString().drop_front(1);
 
-  Lex(); // Eat .field.
-
   // .Imm gets lexed as a real.
   if (Tok.is(AsmToken::Real)) {
     APInt DotDisp;
     DotDispStr.getAsInteger(10, DotDisp);
-    uint64_t DotDispVal = DotDisp.getZExtValue();
-
-    // Special case zero dot displacement.
-    if (!DotDispVal) return Disp;
+    DotDispVal = DotDisp.getZExtValue();
+  } else {
+    Err = "Unexpected token type!";
+    return true;
+  }
 
-    // FIXME: Handle non-constant expressions.
-    if (const MCConstantExpr *OrigDisp = dyn_cast<MCConstantExpr>(Disp)) {
-      uint64_t OrigDispVal = OrigDisp->getValue();
-      return MCConstantExpr::Create(OrigDispVal + DotDispVal, getContext());
-    }
+  // Special case zero dot displacement.
+  if (!DotDispVal) {
+    *NewDisp = Disp;
+    return false;
   }
-  return Disp;
+
+  *NewDisp = MCConstantExpr::Create(OrigDispVal + DotDispVal, getContext());
+  return false;
 }
 
 /// Parse the 'offset' operator.  This operator is used to specify the





More information about the llvm-commits mailing list