OSDN Git Service

[MIRPraser] Improve error checking for typed immediate operands
authorHeejin Ahn <aheejin@gmail.com>
Sat, 5 May 2018 20:53:23 +0000 (20:53 +0000)
committerHeejin Ahn <aheejin@gmail.com>
Sat, 5 May 2018 20:53:23 +0000 (20:53 +0000)
Summary:
This improves error checks for typed immediate operands introduced in
D45948 (rL331586), and removes a code block copied by mistake.

Reviewers: rtereshin

Subscribers: dschuff, sbc100, jgravelle-google, llvm-commits

Differential Revision: https://reviews.llvm.org/D46491

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

lib/CodeGen/MIRParser/MIParser.cpp
test/CodeGen/MIR/WebAssembly/typed-immediate-operand-invalid0.mir [new file with mode: 0644]
test/CodeGen/MIR/WebAssembly/typed-immediate-operand-invalid1.mir [new file with mode: 0644]

index 3cc4258..acb4ab6 100644 (file)
@@ -1303,11 +1303,11 @@ bool MIParser::parseIRConstant(StringRef::iterator Loc, const Constant *&C) {
 }
 
 bool MIParser::parseLowLevelType(StringRef::iterator Loc, LLT &Ty) {
-  if (Token.range().front() == 's' || Token.range().front() == 'p')
-    if (!llvm::all_of(Token.range().drop_front(), isdigit))
+  if (Token.range().front() == 's' || Token.range().front() == 'p') {
+    StringRef SizeStr = Token.range().drop_front();
+    if (SizeStr.size() == 0 || !llvm::all_of(SizeStr, isdigit))
       return error("Expected integers after 's'/'p' type character");
-  if (!llvm::all_of(Token.range().drop_front(), isdigit))
-    return error("Expected integers after 's'/'p' type character");
+  }
 
   if (Token.range().front() == 's') {
     Ty = LLT::scalar(APSInt(Token.range().drop_front()).getZExtValue());
@@ -1339,7 +1339,8 @@ bool MIParser::parseLowLevelType(StringRef::iterator Loc, LLT &Ty) {
 
   if (Token.range().front() != 's')
     return error(Loc, "expected '<N x sM>' for vector type");
-  if (!llvm::all_of(Token.range().drop_front(), isdigit))
+  StringRef SizeStr = Token.range().drop_front();
+  if (SizeStr.size() == 0 || !llvm::all_of(SizeStr, isdigit))
     return error("Expected integers after 's' type character");
   uint64_t ScalarSize = APSInt(Token.range().drop_front()).getZExtValue();
   lex();
@@ -1354,7 +1355,13 @@ bool MIParser::parseLowLevelType(StringRef::iterator Loc, LLT &Ty) {
 
 bool MIParser::parseTypedImmediateOperand(MachineOperand &Dest) {
   assert(Token.is(MIToken::Identifier));
-  if (!llvm::all_of(Token.range().drop_front(), isdigit))
+  StringRef TypeStr = Token.range();
+  if (TypeStr.front() != 'i' && TypeStr.front() != 's' &&
+      TypeStr.front() != 'p')
+    return error(
+        "A typed immediate operand should start with one of 'i', 's', or 'p'");
+  StringRef SizeStr = Token.range().drop_front();
+  if (SizeStr.size() == 0 || !llvm::all_of(SizeStr, isdigit))
     return error("Expected integers after 'i'/'s'/'p' type character");
 
   auto Loc = Token.location();
diff --git a/test/CodeGen/MIR/WebAssembly/typed-immediate-operand-invalid0.mir b/test/CodeGen/MIR/WebAssembly/typed-immediate-operand-invalid0.mir
new file mode 100644 (file)
index 0000000..dcb940c
--- /dev/null
@@ -0,0 +1,13 @@
+# RUN: not llc -mtriple=wasm32-unknown-unknown -run-pass none -o /dev/null %s 2>&1 | FileCheck %s
+# When a typed immediate operand is only a single 'i'/'s'/'p' character
+---
+name: test_typed_immediate_operand_invalid0
+liveins:
+  - { reg: '$arguments' }
+body: |
+  bb.0:
+    liveins: $arguments
+    ; CHECK: [[@LINE+1]]:24: Expected integers after 'i'/'s'/'p' type character
+    %0:i32 = CONST_I32 i 0, implicit-def dead $arguments
+    RETURN_VOID implicit-def dead $arguments
+...
diff --git a/test/CodeGen/MIR/WebAssembly/typed-immediate-operand-invalid1.mir b/test/CodeGen/MIR/WebAssembly/typed-immediate-operand-invalid1.mir
new file mode 100644 (file)
index 0000000..032bdf3
--- /dev/null
@@ -0,0 +1,13 @@
+# RUN: not llc -mtriple=wasm32-unknown-unknown -run-pass none -o /dev/null %s 2>&1 | FileCheck %s
+# When a typed immediate operand does not start with 'i', 's', or 'p'
+---
+name: test_typed_immediate_operand_invalid1
+liveins:
+  - { reg: '$arguments' }
+body: |
+  bb.0:
+    liveins: $arguments
+    ; CHECK: [[@LINE+1]]:24: A typed immediate operand should start with one of 'i', 's', or 'p'
+    %0:i32 = CONST_I32 abc 0, implicit-def dead $arguments
+    RETURN_VOID implicit-def dead $arguments
+...