From ba4e21486455fcee36e5521050562cd9be35e9b4 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Sat, 10 May 2025 22:01:09 -0400 Subject: [PATCH 1/4] [WebAssembly] Add ref.test_func handling to AsmParser --- .../AsmParser/WebAssemblyAsmParser.cpp | 2 ++ .../lib/Target/WebAssembly/WebAssemblyInstrRef.td | 8 ++++++++ llvm/test/MC/WebAssembly/reference-types.s | 15 +++++++++++++++ 3 files changed, 25 insertions(+) diff --git a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp index 7ee6a3d8304be..3fad1710c30c4 100644 --- a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp +++ b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp @@ -668,6 +668,8 @@ class WebAssemblyAsmParser final : public MCTargetAsmParser { if (parseFunctionTableOperand(&FunctionTable)) return true; ExpectFuncType = true; + } else if (Name == "ref.test_func") { + ExpectFuncType = true; } // Returns true if the next tokens are a catch clause diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td b/llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td index 2654a09387fd4..8786d78c8e5af 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td +++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td @@ -36,6 +36,14 @@ multiclass REF_I { Requires<[HasReferenceTypes]>; } +defm REF_TEST_FUNCREF : + I<(outs I32: $res), + (ins TypeIndex:$type, FUNCREF: $ref), + (outs), + (ins TypeIndex:$type), + [], + "ref.test_func\t$type, $ref", "ref.test_func $type", 0xfb14>; + defm "" : REF_I; defm "" : REF_I; defm "" : REF_I; diff --git a/llvm/test/MC/WebAssembly/reference-types.s b/llvm/test/MC/WebAssembly/reference-types.s index cfadede8295ef..8f3bca79bb68f 100644 --- a/llvm/test/MC/WebAssembly/reference-types.s +++ b/llvm/test/MC/WebAssembly/reference-types.s @@ -27,6 +27,21 @@ ref_null_test: drop end_function +# CHECK-LABEL: ref_test_test: +# CHECK: ref.null_func # encoding: [0xd0,0x70] +# CHECK: ref.test () -> () # encoding: [0xfb,0x14,0x80'A',0x80'A',0x80'A',0x80'A',A] +# CHECK: # fixup A - offset: 2, value: .Ltypeindex0@TYPEINDEX, kind: fixup_uleb128_i32 +# CHECK: ref.null_func # encoding: [0xd0,0x70] +# CHECK: ref.test () -> (i32) # encoding: [0xfb,0x14,0x80'A',0x80'A',0x80'A',0x80'A',A] +# CHECK: # fixup A - offset: 2, value: .Ltypeindex1@TYPEINDEX, kind: fixup_uleb128_i32 +ref_test_test: + .functype ref_test_test () -> (i32, i32) + ref.null_func + ref.test_func () -> () + ref.null_func + ref.test_func () -> (i32) + end_function + # CHECK-LABEL: ref_sig_test_funcref: # CHECK-NEXT: .functype ref_sig_test_funcref (funcref) -> (funcref) ref_sig_test_funcref: From 6a4693a238723f78c9126071b0b0be2ae5481af9 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Mon, 12 May 2025 20:19:55 -0400 Subject: [PATCH 2/4] Rename to ref.test --- .../lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp | 2 +- llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td | 2 +- llvm/test/MC/WebAssembly/reference-types.s | 4 ++-- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp index 3fad1710c30c4..c1b3936c1dcec 100644 --- a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp +++ b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp @@ -668,7 +668,7 @@ class WebAssemblyAsmParser final : public MCTargetAsmParser { if (parseFunctionTableOperand(&FunctionTable)) return true; ExpectFuncType = true; - } else if (Name == "ref.test_func") { + } else if (Name == "ref.test") { ExpectFuncType = true; } diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td b/llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td index 8786d78c8e5af..40b87a084c687 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td +++ b/llvm/lib/Target/WebAssembly/WebAssemblyInstrRef.td @@ -42,7 +42,7 @@ defm REF_TEST_FUNCREF : (outs), (ins TypeIndex:$type), [], - "ref.test_func\t$type, $ref", "ref.test_func $type", 0xfb14>; + "ref.test\t$type, $ref", "ref.test $type", 0xfb14>; defm "" : REF_I; defm "" : REF_I; diff --git a/llvm/test/MC/WebAssembly/reference-types.s b/llvm/test/MC/WebAssembly/reference-types.s index 8f3bca79bb68f..08aafb23969eb 100644 --- a/llvm/test/MC/WebAssembly/reference-types.s +++ b/llvm/test/MC/WebAssembly/reference-types.s @@ -37,9 +37,9 @@ ref_null_test: ref_test_test: .functype ref_test_test () -> (i32, i32) ref.null_func - ref.test_func () -> () + ref.test () -> () ref.null_func - ref.test_func () -> (i32) + ref.test () -> (i32) end_function # CHECK-LABEL: ref_sig_test_funcref: From 06f44359b40e5971029e5c8b9321735ad8cbd0ff Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Mon, 7 Jul 2025 19:52:35 +0200 Subject: [PATCH 3/4] Add comment --- llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp | 1 + 1 file changed, 1 insertion(+) diff --git a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp index c1b3936c1dcec..b1c41bd79fba1 100644 --- a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp +++ b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp @@ -669,6 +669,7 @@ class WebAssemblyAsmParser final : public MCTargetAsmParser { return true; ExpectFuncType = true; } else if (Name == "ref.test") { + // When we get support for wasm-gc types, this should become ExpectRefType. ExpectFuncType = true; } From c294f9c6e04399bc824173db4be0965578ce4086 Mon Sep 17 00:00:00 2001 From: Hood Chatham Date: Mon, 7 Jul 2025 20:01:43 +0200 Subject: [PATCH 4/4] Clang-format --- llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp index b1c41bd79fba1..a2628ac9ace27 100644 --- a/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp +++ b/llvm/lib/Target/WebAssembly/AsmParser/WebAssemblyAsmParser.cpp @@ -669,7 +669,8 @@ class WebAssemblyAsmParser final : public MCTargetAsmParser { return true; ExpectFuncType = true; } else if (Name == "ref.test") { - // When we get support for wasm-gc types, this should become ExpectRefType. + // When we get support for wasm-gc types, this should become + // ExpectRefType. ExpectFuncType = true; }