[llvm] 0126375 - [WebAssembly] Use location of operand for operand-based type check errors

Alex Bradbury via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 23 01:51:54 PDT 2022


Author: Alex Bradbury
Date: 2022-03-23T08:51:15Z
New Revision: 012637514ceba3ed419faea15b2a2d39f81e0558

URL: https://github.com/llvm/llvm-project/commit/012637514ceba3ed419faea15b2a2d39f81e0558
DIFF: https://github.com/llvm/llvm-project/commit/012637514ceba3ed419faea15b2a2d39f81e0558.diff

LOG: [WebAssembly] Use location of operand for operand-based type check errors

This addresses a series of FIXMEs introduced in D122020.

A follow-up patch (D122128) addresses the bug that is exposed by this
change (an issue with source location information when lexing
identifiers).

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

Added: 
    

Modified: 
    llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp
    llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmTypeCheck.cpp
    llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmTypeCheck.h
    llvm/test/MC/WebAssembly/type-checker-errors.s

Removed: 
    


################################################################################
diff  --git a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp
index 7505a9a2bdfd7..aa9b011e50121 100644
--- a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp
+++ b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp
@@ -1017,7 +1017,7 @@ class WebAssemblyAsmParser final : public MCTargetAsmParser {
           Inst.setOpcode(Opc64);
         }
       }
-      if (!SkipTypeCheck && TC.typeCheck(IDLoc, Inst))
+      if (!SkipTypeCheck && TC.typeCheck(IDLoc, Inst, Operands))
         return true;
       Out.emitInstruction(Inst, getSTI());
       if (CurrentState == EndFunction) {

diff  --git a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmTypeCheck.cpp b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmTypeCheck.cpp
index fedc61100fc3b..465267abab2c2 100644
--- a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmTypeCheck.cpp
+++ b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmTypeCheck.cpp
@@ -210,50 +210,51 @@ bool WebAssemblyAsmTypeCheck::endOfFunction(SMLoc ErrorLoc) {
   return false;
 }
 
-bool WebAssemblyAsmTypeCheck::typeCheck(SMLoc ErrorLoc, const MCInst &Inst) {
+bool WebAssemblyAsmTypeCheck::typeCheck(SMLoc ErrorLoc, const MCInst &Inst,
+                                        OperandVector &Operands) {
   auto Opc = Inst.getOpcode();
   auto Name = GetMnemonic(Opc);
   dumpTypeStack("typechecking " + Name + ": ");
   wasm::ValType Type;
   if (Name == "local.get") {
-    if (getLocal(ErrorLoc, Inst, Type))
+    if (getLocal(Operands[1]->getStartLoc(), Inst, Type))
       return true;
     Stack.push_back(Type);
   } else if (Name == "local.set") {
-    if (getLocal(ErrorLoc, Inst, Type))
+    if (getLocal(Operands[1]->getStartLoc(), Inst, Type))
       return true;
     if (popType(ErrorLoc, Type))
       return true;
   } else if (Name == "local.tee") {
-    if (getLocal(ErrorLoc, Inst, Type))
+    if (getLocal(Operands[1]->getStartLoc(), Inst, Type))
       return true;
     if (popType(ErrorLoc, Type))
       return true;
     Stack.push_back(Type);
   } else if (Name == "global.get") {
-    if (getGlobal(ErrorLoc, Inst, Type))
+    if (getGlobal(Operands[1]->getStartLoc(), Inst, Type))
       return true;
     Stack.push_back(Type);
   } else if (Name == "global.set") {
-    if (getGlobal(ErrorLoc, Inst, Type))
+    if (getGlobal(Operands[1]->getStartLoc(), Inst, Type))
       return true;
     if (popType(ErrorLoc, Type))
       return true;
   } else if (Name == "table.get") {
-    if (getTable(ErrorLoc, Inst, Type))
+    if (getTable(Operands[1]->getStartLoc(), Inst, Type))
       return true;
     if (popType(ErrorLoc, wasm::ValType::I32))
       return true;
     Stack.push_back(Type);
   } else if (Name == "table.set") {
-    if (getTable(ErrorLoc, Inst, Type))
+    if (getTable(Operands[1]->getStartLoc(), Inst, Type))
       return true;
     if (popType(ErrorLoc, Type))
       return true;
     if (popType(ErrorLoc, wasm::ValType::I32))
       return true;
   } else if (Name == "table.fill") {
-    if (getTable(ErrorLoc, Inst, Type))
+    if (getTable(Operands[1]->getStartLoc(), Inst, Type))
       return true;
     if (popType(ErrorLoc, wasm::ValType::I32))
       return true;
@@ -281,25 +282,27 @@ bool WebAssemblyAsmTypeCheck::typeCheck(SMLoc ErrorLoc, const MCInst &Inst) {
       return true;
   } else if (Name == "call" || Name == "return_call") {
     const MCSymbolRefExpr *SymRef;
-    if (getSymRef(ErrorLoc, Inst, SymRef))
+    if (getSymRef(Operands[1]->getStartLoc(), Inst, SymRef))
       return true;
     auto WasmSym = cast<MCSymbolWasm>(&SymRef->getSymbol());
     auto Sig = WasmSym->getSignature();
     if (!Sig || WasmSym->getType() != wasm::WASM_SYMBOL_TYPE_FUNCTION)
-      return typeError(ErrorLoc, StringRef("symbol ") + WasmSym->getName() +
-                                      " missing .functype");
+      return typeError(Operands[1]->getStartLoc(), StringRef("symbol ") +
+                                                       WasmSym->getName() +
+                                                       " missing .functype");
     if (checkSig(ErrorLoc, *Sig)) return true;
     if (Name == "return_call" && endOfFunction(ErrorLoc))
       return true;
   } else if (Name == "catch") {
     const MCSymbolRefExpr *SymRef;
-    if (getSymRef(ErrorLoc, Inst, SymRef))
+    if (getSymRef(Operands[1]->getStartLoc(), Inst, SymRef))
       return true;
     const auto *WasmSym = cast<MCSymbolWasm>(&SymRef->getSymbol());
     const auto *Sig = WasmSym->getSignature();
     if (!Sig || WasmSym->getType() != wasm::WASM_SYMBOL_TYPE_TAG)
-      return typeError(ErrorLoc, StringRef("symbol ") + WasmSym->getName() +
-                                     " missing .tagtype");
+      return typeError(Operands[1]->getStartLoc(), StringRef("symbol ") +
+                                                       WasmSym->getName() +
+                                                       " missing .tagtype");
     // catch instruction pushes values whose types are specified in the tag's
     // "params" part
     Stack.insert(Stack.end(), Sig->Params.begin(), Sig->Params.end());

diff  --git a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmTypeCheck.h b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmTypeCheck.h
index a186762dc2de4..033287b7445ba 100644
--- a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmTypeCheck.h
+++ b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmTypeCheck.h
@@ -16,9 +16,10 @@
 #ifndef LLVM_LIB_TARGET_WEBASSEMBLY_ASMPARSER_TYPECHECK_H
 #define LLVM_LIB_TARGET_WEBASSEMBLY_ASMPARSER_TYPECHECK_H
 
-#include "llvm/MC/MCParser/MCAsmParser.h"
-#include "llvm/MC/MCInstrInfo.h"
 #include "llvm/BinaryFormat/Wasm.h"
+#include "llvm/MC/MCInstrInfo.h"
+#include "llvm/MC/MCParser/MCAsmParser.h"
+#include "llvm/MC/MCParser/MCTargetAsmParser.h"
 #include "llvm/MC/MCSymbol.h"
 
 namespace llvm {
@@ -53,7 +54,7 @@ class WebAssemblyAsmTypeCheck final {
   void localDecl(const SmallVector<wasm::ValType, 4> &Locals);
   void setLastSig(const wasm::WasmSignature &Sig) { LastSig = Sig; }
   bool endOfFunction(SMLoc ErrorLoc);
-  bool typeCheck(SMLoc ErrorLoc, const MCInst &Inst);
+  bool typeCheck(SMLoc ErrorLoc, const MCInst &Inst, OperandVector &Operands);
 
   void Clear() {
     Stack.clear();

diff  --git a/llvm/test/MC/WebAssembly/type-checker-errors.s b/llvm/test/MC/WebAssembly/type-checker-errors.s
index 2df64aeaeea70..0f890408510cc 100644
--- a/llvm/test/MC/WebAssembly/type-checker-errors.s
+++ b/llvm/test/MC/WebAssembly/type-checker-errors.s
@@ -6,15 +6,13 @@
 
 local_get_no_local_type:
   .functype local_get_no_local_type () -> ()
-# FIXME: Error location should be at operand.
-# CHECK: :[[@LINE+1]]:3: error: no local type specified for index 0
+# CHECK: :[[@LINE+1]]:13: error: no local type specified for index 0
   local.get 0
   end_function
 
 local_set_no_local_type:
   .functype local_set_no_local_type () -> ()
-# FIXME: Error location should be at operand.
-# CHECK: :[[@LINE+1]]:3: error: no local type specified for index 0
+# CHECK: :[[@LINE+1]]:13: error: no local type specified for index 0
   local.set 0
   end_function
 
@@ -35,8 +33,7 @@ local_set_type_mismatch:
 
 local_tee_no_local_type:
   .functype local_tee_no_local_type () -> ()
-# FIXME: Error location should be at operand.
-# CHECK: :[[@LINE+1]]:3: error: no local type specified for index 0
+# CHECK: :[[@LINE+1]]:13: error: no local type specified for index 0
   local.tee 0
   end_function
 
@@ -57,29 +54,27 @@ local_tee_type_mismatch:
 
 global_get_missing_globaltype:
   .functype global_get_missing_globaltype () -> ()
-# FIXME: Error location should be at operand.
-# CHECK: :[[@LINE+1]]:3: error: symbol foo missing .globaltype
+# FIXME: Error location should be at beginning of operand.
+# CHECK: :[[@LINE+1]]:17: error: symbol foo missing .globaltype
   global.get foo
   end_function
 
 global_get_expected_expression_operand:
   .functype global_get_expected_expression_operand () -> ()
-# FIXME: Error location should be at operand.
-# CHECK: :[[@LINE+1]]:3: error: expected expression operand
+# CHECK: :[[@LINE+1]]:14: error: expected expression operand
   global.get 1
   end_function
 
 global_set_missing_globaltype:
   .functype global_set_missing_globaltype () -> ()
-# FIXME: Error location should be at operand.
-# CHECK: :[[@LINE+1]]:3: error: symbol foo missing .globaltype
+# FIXME: Error location should be at beginning of operand.
+# CHECK: :[[@LINE+1]]:17: error: symbol foo missing .globaltype
   global.set foo
   end_function
 
 global_set_expected_expression_operand:
   .functype global_set_expected_expression_operand () -> ()
-# FIXME: Error location should be at operand.
-# CHECK: :[[@LINE+1]]:3: error: expected expression operand
+# CHECK: :[[@LINE+1]]:14: error: expected expression operand
   global.set 1
   end_function
 
@@ -100,15 +95,14 @@ global_set_type_mismatch:
 
 table_get_expected_expression_operand:
   .functype table_get_expected_expression_operand () -> ()
-# FIXME: Error location should be at operand.
-# CHECK: :[[@LINE+1]]:3: error: expected expression operand
+# CHECK: :[[@LINE+1]]:13: error: expected expression operand
   table.get 1
   end_function
 
 table_get_missing_tabletype:
   .functype table_get_missing_tabletype () -> ()
-# FIXME: Error location should be at operand.
-# CHECK: :[[@LINE+1]]:3: error: symbol foo missing .tabletype
+# FIXME: Error location should be at beginning of operand.
+# CHECK: :[[@LINE+1]]:16: error: symbol foo missing .tabletype
   table.get foo
   end_function
 
@@ -129,15 +123,14 @@ table_get_type_mismatch:
 
 table_set_expected_expression_operand:
   .functype table_set_expected_expression_operand () -> ()
-# FIXME: Error location should be at operand.
-# CHECK: :[[@LINE+1]]:3: error: expected expression operand
+# CHECK: :[[@LINE+1]]:13: error: expected expression operand
   table.set 1
   end_function
 
 table_set_missing_tabletype:
   .functype table_set_missing_tabletype () -> ()
-# FIXME: Error location should be at operand.
-# CHECK: :[[@LINE+1]]:3: error: symbol foo missing .tabletype
+# FIXME: Error location should be at beginning ofoperand.
+# CHECK: :[[@LINE+1]]:16: error: symbol foo missing .tabletype
   table.set foo
   end_function
 
@@ -171,15 +164,14 @@ table_set_type_mismatch_2:
 
 table_fill_expected_expression_operand:
   .functype table_fill_expected_expression_operand () -> ()
-# FIXME: Error location should be at operand.
-# CHECK: :[[@LINE+1]]:3: error: expected expression operand
+# CHECK: :[[@LINE+1]]:14: error: expected expression operand
   table.fill 1
   end_function
 
 table_fill_missing_tabletype:
   .functype table_fill_missing_tabletype () -> ()
-# FIXME: Error location should be at operand.
-# CHECK: :[[@LINE+1]]:3: error: symbol foo missing .tabletype
+# FIXME: Error location should be at beginning of operand.
+# CHECK: :[[@LINE+1]]:17: error: symbol foo missing .tabletype
   table.fill foo
   end_function
 
@@ -397,8 +389,7 @@ return_call_indirect_empty_stack_while_popping_2:
 
 call_expected_expression_operand:
   .functype call_expected_expression_operand () -> ()
-# FIXME: Error location should be at operand.
-# CHECK: :[[@LINE+1]]:3: error: expected expression operand
+# CHECK: :[[@LINE+1]]:8: error: expected expression operand
   call 1
   end_function
 
@@ -427,14 +418,14 @@ call_superfluous_value_at_end:
 
 call_missing_functype:
   .functype call_missing_functype () -> ()
-# CHECK: :[[@LINE+1]]:3: error: symbol no_functype missing .functype
+# FIXME: Error location should be at beginning of operand.
+# CHECK: :[[@LINE+1]]:19: error: symbol no_functype missing .functype
   call no_functype
   end_function
 
 return_call_expected_expression_operand:
   .functype return_call_expected_expression_operand () -> ()
-# FIXME: Error location should be at operand.
-# CHECK: :[[@LINE+1]]:3: error: expected expression operand
+# CHECK: :[[@LINE+1]]:15: error: expected expression operand
   return_call 1
   end_function
 
@@ -453,16 +444,15 @@ return_call_type_mismatch:
 
 return_call_missing_functype:
   .functype return_call_missing_functype () -> ()
-# FIXME: Error location should be at operand.
-# CHECK: :[[@LINE+1]]:3: error: symbol no_functype missing .functype
+# FIXME: Error location should be at beginning of operand.
+# CHECK: :[[@LINE+1]]:26: error: symbol no_functype missing .functype
   return_call no_functype
   end_function
 
 catch_expected_expression_operand:
   .functype catch_expected_expression_operand () -> ()
   try
-# FIXME: Error location should be at operand.
-# CHECK: :[[@LINE+1]]:3: error: expected expression operand
+# CHECK: :[[@LINE+1]]:9: error: expected expression operand
   catch 1
   end_try
   end_function
@@ -470,8 +460,8 @@ catch_expected_expression_operand:
 catch_missing_tagtype:
   .functype catch_missing_tagtype () -> ()
   try
-# FIXME: Error location should be at operand.
-# CHECK: :[[@LINE+1]]:3: error: symbol no_tagtype missing .tagtype
+# FIXME: Error location should be at beginning of operand.
+# CHECK: :[[@LINE+1]]:19: error: symbol no_tagtype missing .tagtype
   catch no_tagtype
   end_try
   end_function


        


More information about the llvm-commits mailing list