From 8c0798f368356e50f59a2598b28e7cac8770ea4c Mon Sep 17 00:00:00 2001 From: Heejin Ahn Date: Fri, 7 Apr 2023 20:29:25 -0700 Subject: [PATCH] [WebAssembly] Fix type index block type handling in type checker The current code is ``` ExpectBlockType = false; TC.setLastSig(*Signature.get()); if (ExpectBlockType) NestingStack.back().Sig = *Signature.get(); ``` Because of the first line, the third line's `if (ExpectBlockType)` is always false and we don't get to update `NestingStack.back().Sig`. This results in not correctly erroring out when the types of remaining values on the stack do not match the block type if the block type is written in the form of a function type. We should set `ExpectBlockType` to false after the `if`. Reviewed By: sbc100 Differential Revision: https://reviews.llvm.org/D147837 --- .../lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp | 2 +- llvm/test/MC/WebAssembly/type-checker-errors.s | 11 +++++++++-- 2 files changed, 10 insertions(+), 3 deletions(-) diff --git a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp index ded5abd..eeffc5a 100644 --- a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp +++ b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp @@ -637,10 +637,10 @@ public: if (parseSignature(Signature.get())) return true; // Got signature as block type, don't need more - ExpectBlockType = false; TC.setLastSig(*Signature.get()); if (ExpectBlockType) NestingStack.back().Sig = *Signature.get(); + ExpectBlockType = false; auto &Ctx = getContext(); // The "true" here will cause this to be a nameless symbol. MCSymbol *Sym = Ctx.createTempSymbol("typeindex", true); diff --git a/llvm/test/MC/WebAssembly/type-checker-errors.s b/llvm/test/MC/WebAssembly/type-checker-errors.s index dcb9dc1..4b75cd5 100644 --- a/llvm/test/MC/WebAssembly/type-checker-errors.s +++ b/llvm/test/MC/WebAssembly/type-checker-errors.s @@ -221,13 +221,20 @@ drop_empty_stack_while_popping: drop end_function -end_block_insufficient_values_on_stack: - .functype end_block_insufficient_values_on_stack () -> () +end_block_insufficient_values_on_stack_1: + .functype end_block_insufficient_values_on_stack_1 () -> () block i32 # CHECK: :[[@LINE+1]]:3: error: end: insufficient values on the type stack end_block end_function +end_block_insufficient_values_on_stack_2: + .functype end_block_insufficient_values_on_stack_2 () -> () + block () -> (i32) +# CHECK: :[[@LINE+1]]:3: error: end: insufficient values on the type stack + end_block + end_function + end_block_type_mismatch: .functype end_block_type_mismatch () -> () block i32 -- 2.7.4