Update the X86 assembler for .intel_syntax to produce an error for invalid
authorKevin Enderby <enderby@apple.com>
Thu, 23 Jan 2014 21:52:41 +0000 (21:52 +0000)
committerKevin Enderby <enderby@apple.com>
Thu, 23 Jan 2014 21:52:41 +0000 (21:52 +0000)
scale factors in memory addresses. As it does for .att_syntax.

It was producing:
Assertion failed: (((Scale == 1 || Scale == 2 || Scale == 4 || Scale == 8)) && "Invalid scale!"), function CreateMem, file /Volumes/SandBox/llvm/lib/Target/X86/AsmParser/X86AsmParser.cpp, line 1133.

rdar://14967214

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@199942 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Target/X86/AsmParser/X86AsmParser.cpp
test/MC/X86/intel-syntax-invalid-scale.s [new file with mode: 0644]

index ff38e6f8ed86ece4f15d6cfefc99695b53755208..525d4cb331c7a209ae8795552ae781028a344f7f 100644 (file)
@@ -391,7 +391,7 @@ private:
         break;
       }
     }
-    void onInteger(int64_t TmpInt) {
+    bool onInteger(int64_t TmpInt, StringRef &ErrMsg) {
       IntelExprState CurrState = State;
       switch (State) {
       default:
@@ -410,6 +410,10 @@ private:
           assert (!IndexReg && "IndexReg already set!");
           IndexReg = TmpReg;
           Scale = TmpInt;
+          if(Scale != 1 && Scale != 2 && Scale != 4 && Scale != 8) {
+            ErrMsg = "scale factor in address must be 1, 2, 4 or 8";
+            return true;
+          }
           // Get the scale and replace the 'Register * Scale' with '0'.
           IC.popOperator();
         } else if ((PrevState == IES_PLUS || PrevState == IES_MINUS ||
@@ -426,6 +430,7 @@ private:
         break;
       }
       PrevState = CurrState;
+      return false;
     }
     void onStar() {
       PrevState = State;
@@ -1465,6 +1470,7 @@ bool X86AsmParser::ParseIntelExpression(IntelExprStateMachine &SM, SMLoc &End) {
       return Error(Tok.getLoc(), "Unexpected identifier!");
     }
     case AsmToken::Integer: {
+      StringRef ErrMsg;
       if (isParsingInlineAsm() && SM.getAddImmPrefix())
         InstInfo->AsmRewrites->push_back(AsmRewrite(AOK_ImmPrefix,
                                                     Tok.getLoc()));
@@ -1488,10 +1494,12 @@ bool X86AsmParser::ParseIntelExpression(IntelExprStateMachine &SM, SMLoc &End) {
           SM.onIdentifierExpr(Val, Identifier);
           End = consumeToken();
         } else {
-          SM.onInteger(IntVal);
+          if (SM.onInteger(IntVal, ErrMsg))
+            return Error(Loc, ErrMsg);
         }
       } else {
-        SM.onInteger(IntVal);
+        if (SM.onInteger(IntVal, ErrMsg))
+          return Error(Loc, ErrMsg);
       }
       break;
     }
diff --git a/test/MC/X86/intel-syntax-invalid-scale.s b/test/MC/X86/intel-syntax-invalid-scale.s
new file mode 100644 (file)
index 0000000..69c6add
--- /dev/null
@@ -0,0 +1,11 @@
+// RUN: not llvm-mc -triple x86_64-unknown-unknown %s 2> %t.err
+// RUN: FileCheck < %t.err %s
+
+.intel_syntax
+
+// CHECK: error: scale factor in address must be 1, 2, 4 or 8
+    lea rax, [rdi + rdx*64]
+// CHECK: error: scale factor in address must be 1, 2, 4 or 8
+    lea rax, [rdi + rdx*32]
+// CHECK: error: scale factor in address must be 1, 2, 4 or 8
+    lea rax, [rdi + rdx*16]