llvmbot wrote:

<!--LLVM PR SUMMARY COMMENT-->

@llvm/pr-subscribers-clang

Author: Demetrius Kanios (QuantumSegfault)

<details>
<summary>Changes</summary>

Allows __funcref pointers to be used as the element type for WASM tables in 
Clang (static, global, zero-length arrays of a reference type). Modifies 
`QualType::isWebAssemblyFuncrefType` to accept function pointer types with the 
`__funcptr`, in addition to pointers in address space 20.

Related: #<!-- -->140933

---
Full diff: https://github.com/llvm/llvm-project/pull/178720.diff


2 Files Affected:

- (modified) clang/lib/AST/Type.cpp (+2-1) 
- (modified) clang/test/CodeGen/WebAssembly/builtins-table.c (+17) 


``````````diff
diff --git a/clang/lib/AST/Type.cpp b/clang/lib/AST/Type.cpp
index 53082bcf78f6a..8cbe49a23c13d 100644
--- a/clang/lib/AST/Type.cpp
+++ b/clang/lib/AST/Type.cpp
@@ -2947,7 +2947,8 @@ bool QualType::isWebAssemblyExternrefType() const {
 
 bool QualType::isWebAssemblyFuncrefType() const {
   return getTypePtr()->isFunctionPointerType() &&
-         getAddressSpace() == LangAS::wasm_funcref;
+         (getAddressSpace() == LangAS::wasm_funcref ||
+          getTypePtr()->hasAttr(attr::WebAssemblyFuncref));
 }
 
 QualType::PrimitiveDefaultInitializeKind
diff --git a/clang/test/CodeGen/WebAssembly/builtins-table.c 
b/clang/test/CodeGen/WebAssembly/builtins-table.c
index 74bb2442fe552..4069da2c4c225 100644
--- a/clang/test/CodeGen/WebAssembly/builtins-table.c
+++ b/clang/test/CodeGen/WebAssembly/builtins-table.c
@@ -65,3 +65,20 @@ static __externref_t other_table[0];
 void test_table_copy(int dst_idx, int src_idx, int nelem) {
   __builtin_wasm_table_copy(table, other_table, dst_idx, src_idx, nelem);
 }
+
+
+typedef void (*__funcref funcref_t)();
+static funcref_t funcref_table[0];
+
+// CHECK-LABEL: define {{[^@]+}}@test_funcref_table
+// CHECK-SAME: (ptr addrspace(20) noundef [[FUNCREF:%.*]], i32 noundef 
[[INDEX:%.*]]) #[[ATTR0]] {
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:    call void @llvm.wasm.table.set.funcref(ptr addrspace(1) 
@funcref_table, i32 [[INDEX]], ptr addrspace(20) [[FUNCREF]])
+// CHECK-NEXT:    [[TMP0:%.*]] = call ptr addrspace(20) 
@llvm.wasm.table.get.funcref(ptr addrspace(1) @funcref_table, i32 [[INDEX]])
+// CHECK-NEXT:    ret ptr addrspace(20) [[TMP0]]
+//
+funcref_t test_funcref_table(funcref_t funcref, int index) {
+  __builtin_wasm_table_set(funcref_table, index, funcref);
+
+  return __builtin_wasm_table_get(funcref_table, index);
+}

``````````

</details>


https://github.com/llvm/llvm-project/pull/178720
_______________________________________________
cfe-commits mailing list
[email protected]
https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits

Reply via email to