-
Notifications
You must be signed in to change notification settings - Fork 12.6k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[WebAssembly] Print instructions with type checking errors #111067
Conversation
When there was a type checking error, we didn't run `InstPrinter`. This can be confusing because when there is an error in, say, block parameter type, `InstPrinter` doesn't run even if it has nothing to do with block parameter types, and all those updates to `ControlFlowStack` or `TryStack` do not happen: https://github.com/llvm/llvm-project/blob/c20b90ab8557b38efe8e8e993d41d8c08b798267/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyInstPrinter.cpp#L135-L151 For example, ```wast block (i32) -> () ;; Block input parameter error end_block ;; Now this errors out as "End marker mismatch" ``` This is confusing because there is a `block` and the `end_block` is not a mismatch. Only that `block` has a type checking error, but that's not an end marker mismatch. I think we can just print the instruction whether we had a type checking error or not, and this will be less confusing.
@llvm/pr-subscribers-mc @llvm/pr-subscribers-backend-webassembly Author: Heejin Ahn (aheejin) ChangesWhen there was a type checking error, we didn't run llvm-project/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyInstPrinter.cpp Lines 135 to 151 in c20b90a
For example, block (i32) -> () ;; Block input parameter error
end_block ;; Now this errors out as "End marker mismatch" This is confusing because there is a I think we can just print the instruction whether we had a type checking error or not, and this will be less confusing. Full diff: https://github.com/llvm/llvm-project/pull/111067.diff 2 Files Affected:
diff --git a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp
index 5ea6c6bc0758b9..ee8686d1166a5b 100644
--- a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp
+++ b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp
@@ -1157,8 +1157,8 @@ class WebAssemblyAsmParser final : public MCTargetAsmParser {
Inst.setOpcode(Opc64);
}
}
- if (!SkipTypeCheck && TC.typeCheck(IDLoc, Inst, Operands))
- return true;
+ if (!SkipTypeCheck)
+ TC.typeCheck(IDLoc, Inst, Operands);
Out.emitInstruction(Inst, getSTI());
if (CurrentState == EndFunction) {
onEndOfFunction(IDLoc);
diff --git a/llvm/test/MC/WebAssembly/annotations-typecheck.s b/llvm/test/MC/WebAssembly/annotations-typecheck.s
new file mode 100644
index 00000000000000..1fcdb9c0e35878
--- /dev/null
+++ b/llvm/test/MC/WebAssembly/annotations-typecheck.s
@@ -0,0 +1,11 @@
+# RUN: not llvm-mc -triple=wasm32-unknown-unknown < %s | FileCheck %s
+
+# This tests annotations are handled correctly even if there is a type checking
+# error (which are unrelated to the block annotations).
+test_annotation:
+ .functype test_annotation () -> ()
+ block (i32) -> ()
+ drop
+# CHECK-NOT: # End marker mismatch!
+ end_block
+ end_function
|
@@ -0,0 +1,11 @@ | |||
# RUN: not llvm-mc -triple=wasm32-unknown-unknown < %s | FileCheck %s |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
so this means that the assembly as a whole still fails, right?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It fails because type checking fails. But at least InstPrinter
and its annotation printer is not printing confusing messages.
When there was a type checking error, we didn't run `InstPrinter`. This can be confusing because when there is an error in, say, block parameter type, `InstPrinter` doesn't run even if it has nothing to do with block parameter types, and all those updates to `ControlFlowStack` or `TryStack` do not happen: https://github.com/llvm/llvm-project/blob/c20b90ab8557b38efe8e8e993d41d8c08b798267/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyInstPrinter.cpp#L135-L151 For example, ```wast block (i32) -> () ;; Block input parameter error end_block ;; Now this errors out as "End marker mismatch" ``` This is confusing because there is a `block` and the `end_block` is not a mismatch. Only that `block` has a type checking error, but that's not an end marker mismatch. I think we can just print the instruction whether we had a type checking error or not, and this will be less confusing.
When there was a type checking error, we didn't run
InstPrinter
. This can be confusing because when there is an error in, say, block parameter type,InstPrinter
doesn't run even if it has nothing to do with block parameter types, and all those updates toControlFlowStack
orTryStack
do not happen:llvm-project/llvm/lib/Target/WebAssembly/MCTargetDesc/WebAssemblyInstPrinter.cpp
Lines 135 to 151 in c20b90a
For example,
This is confusing because there is a
block
and theend_block
is not a mismatch. Only thatblock
has a type checking error, but that's not an end marker mismatch.I think we can just print the instruction whether we had a type checking error or not, and this will be less confusing.