[WebAssembly,MC] Add ref.test_func handling to AsmParser#139642
[WebAssembly,MC] Add ref.test_func handling to AsmParser#139642
Conversation
|
@llvm/pr-subscribers-mc Author: Hood Chatham (hoodmane) ChangesThis will allow us to eliminate the hand-coded webassembly here: cc @tlively @sbc100 3 Files Affected:
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<WebAssemblyRegClass rc, ValueType vt, string ht> {
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<FUNCREF, funcref, "func">;
defm "" : REF_I<EXTERNREF, externref, "extern">;
defm "" : REF_I<EXNREF, exnref, "exn">;
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:
|
|
@llvm/pr-subscribers-backend-webassembly Author: Hood Chatham (hoodmane) ChangesThis will allow us to eliminate the hand-coded webassembly here: cc @tlively @sbc100 3 Files Affected:
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<WebAssemblyRegClass rc, ValueType vt, string ht> {
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<FUNCREF, funcref, "func">;
defm "" : REF_I<EXTERNREF, externref, "extern">;
defm "" : REF_I<EXNREF, exnref, "exn">;
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:
|
| return true; | ||
| ExpectFuncType = true; | ||
| } else if (Name == "ref.test") { | ||
| ExpectFuncType = true; |
There was a problem hiding this comment.
In the long run I guess this should instead be something like ExpectRefType?
There was a problem hiding this comment.
Yeah exactly. But there is no such thing yet...
There was a problem hiding this comment.
I added a comment/
|
✅ With the latest revision this PR passed the C/C++ code formatter. |
|
@sbc100 could you merge it? |
This will allow us to eliminate the hand-coded webassembly here:
https://github.com/python/cpython/blob/main/Python/emscripten_trampoline.c#L138
cc @tlively @sbc100