Author: Jameson Nash
Date: 2026-03-02T17:46:52-05:00
New Revision: 4e3e4f25bc4a23de29a358953317dd71e45982e8

URL: 
https://github.com/llvm/llvm-project/commit/4e3e4f25bc4a23de29a358953317dd71e45982e8
DIFF: 
https://github.com/llvm/llvm-project/commit/4e3e4f25bc4a23de29a358953317dd71e45982e8.diff

LOG: [WASM] add CheckWasmTableElement helper (#181172)

Discard qualifiers from the types (e.g. addrspace, volatile, etc) before
checking that the underlying types are the same, and DRY the code to
emit a consistent Sema.Diag before returning failure.

Added: 
    

Modified: 
    clang/lib/Sema/SemaWasm.cpp
    clang/test/CodeGen/WebAssembly/builtins-table-externref.c

Removed: 
    


################################################################################
diff  --git a/clang/lib/Sema/SemaWasm.cpp b/clang/lib/Sema/SemaWasm.cpp
index e7731136720e8..083460eb6e201 100644
--- a/clang/lib/Sema/SemaWasm.cpp
+++ b/clang/lib/Sema/SemaWasm.cpp
@@ -40,6 +40,20 @@ static bool CheckWasmBuiltinArgIsTable(Sema &S, CallExpr *E, 
unsigned ArgIndex,
   return false;
 }
 
+static bool CheckWasmTableElement(Sema &S, QualType &ElTy, CallExpr *E,
+                                  unsigned TableIndex, unsigned ArgIndex) {
+  Expr *NewElemArg = E->getArg(ArgIndex);
+  QualType QT = NewElemArg->getType();
+  // Compare the types after removing insignificant qualifiers
+  if (!S.getASTContext().hasSameType(ElTy.getTypePtr(), QT.getTypePtr())) {
+    return S.Diag(NewElemArg->getBeginLoc(),
+                  diag::err_wasm_builtin_arg_must_match_table_element_type)
+           << (ArgIndex + 1) << (TableIndex + 1)
+           << NewElemArg->getSourceRange();
+  }
+  return false;
+}
+
 /// Checks the argument at the given index is an integer.
 static bool CheckWasmBuiltinArgIsInteger(Sema &S, CallExpr *E,
                                          unsigned ArgIndex) {
@@ -115,7 +129,7 @@ bool SemaWasm::BuiltinWasmTableGet(CallExpr *TheCall) {
   return false;
 }
 
-/// Check that the first argumnet is a WebAssembly table, the second is
+/// Check that the first argument is a WebAssembly table, the second is
 /// an index to use as index into the table and the third is the reference
 /// type to set into the table.
 bool SemaWasm::BuiltinWasmTableSet(CallExpr *TheCall) {
@@ -129,7 +143,7 @@ bool SemaWasm::BuiltinWasmTableSet(CallExpr *TheCall) {
   if (CheckWasmBuiltinArgIsInteger(SemaRef, TheCall, 1))
     return true;
 
-  if (!getASTContext().hasSameType(ElTy, TheCall->getArg(2)->getType()))
+  if (CheckWasmTableElement(SemaRef, ElTy, TheCall, 0, 2))
     return true;
 
   return false;
@@ -158,12 +172,8 @@ bool SemaWasm::BuiltinWasmTableGrow(CallExpr *TheCall) {
   if (CheckWasmBuiltinArgIsTable(SemaRef, TheCall, 0, ElTy))
     return true;
 
-  Expr *NewElemArg = TheCall->getArg(1);
-  if (!getASTContext().hasSameType(ElTy, NewElemArg->getType())) {
-    return Diag(NewElemArg->getBeginLoc(),
-                diag::err_wasm_builtin_arg_must_match_table_element_type)
-           << 2 << 1 << NewElemArg->getSourceRange();
-  }
+  if (CheckWasmTableElement(SemaRef, ElTy, TheCall, 0, 1))
+    return true;
 
   if (CheckWasmBuiltinArgIsInteger(SemaRef, TheCall, 2))
     return true;
@@ -185,12 +195,8 @@ bool SemaWasm::BuiltinWasmTableFill(CallExpr *TheCall) {
   if (CheckWasmBuiltinArgIsInteger(SemaRef, TheCall, 1))
     return true;
 
-  Expr *NewElemArg = TheCall->getArg(2);
-  if (!getASTContext().hasSameType(ElTy, NewElemArg->getType())) {
-    return Diag(NewElemArg->getBeginLoc(),
-                diag::err_wasm_builtin_arg_must_match_table_element_type)
-           << 3 << 1 << NewElemArg->getSourceRange();
-  }
+  if (CheckWasmTableElement(SemaRef, ElTy, TheCall, 0, 2))
+    return true;
 
   if (CheckWasmBuiltinArgIsInteger(SemaRef, TheCall, 3))
     return true;
@@ -214,7 +220,7 @@ bool SemaWasm::BuiltinWasmTableCopy(CallExpr *TheCall) {
     return true;
 
   Expr *TableYArg = TheCall->getArg(1);
-  if (!getASTContext().hasSameType(XElTy, YElTy)) {
+  if (!getASTContext().hasSameType(XElTy.getTypePtr(), YElTy.getTypePtr())) {
     return Diag(TableYArg->getBeginLoc(),
                 diag::err_wasm_builtin_arg_must_match_table_element_type)
            << 2 << 1 << TableYArg->getSourceRange();

diff  --git a/clang/test/CodeGen/WebAssembly/builtins-table-externref.c 
b/clang/test/CodeGen/WebAssembly/builtins-table-externref.c
index 74bb2442fe552..7600a53ba3aa2 100644
--- a/clang/test/CodeGen/WebAssembly/builtins-table-externref.c
+++ b/clang/test/CodeGen/WebAssembly/builtins-table-externref.c
@@ -3,6 +3,7 @@
 // REQUIRES: webassembly-registered-target
 
 static __externref_t table[0];
+static const __externref_t const_table[0];
 
 // CHECK-LABEL: define {{[^@]+}}@test_builtin_wasm_table_get
 // CHECK-SAME: (i32 noundef [[INDEX:%.*]]) #[[ATTR0:[0-9]+]] {
@@ -14,16 +15,40 @@ __externref_t test_builtin_wasm_table_get(int index) {
   return __builtin_wasm_table_get(table, index);
 }
 
+// CHECK-LABEL: define {{[^@]+}}@test_builtin_wasm_table_get_const
+// CHECK-SAME: (i32 noundef [[INDEX:%.*]]) #[[ATTR0]] {
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:    [[TMP0:%.*]] = call ptr addrspace(10) 
@llvm.wasm.table.get.externref(ptr addrspace(1) @table, i32 [[INDEX]])
+// CHECK-NEXT:    ret ptr addrspace(10) [[TMP0]]
+//
+__externref_t test_builtin_wasm_table_get_const(const int index) {
+  return __builtin_wasm_table_get(table, index);
+}
+
 // CHECK-LABEL: define {{[^@]+}}@test_builtin_wasm_table_set
 // CHECK-SAME: (i32 noundef [[INDEX:%.*]], ptr addrspace(10) [[REF:%.*]]) 
#[[ATTR0]] {
 // CHECK-NEXT:  entry:
+// CHECK-NEXT:    call void @llvm.wasm.table.set.externref(ptr addrspace(1) 
@const_table, i32 [[INDEX]], ptr addrspace(10) [[REF]])
 // CHECK-NEXT:    call void @llvm.wasm.table.set.externref(ptr addrspace(1) 
@table, i32 [[INDEX]], ptr addrspace(10) [[REF]])
 // CHECK-NEXT:    ret void
 //
-void test_builtin_wasm_table_set(int index, __externref_t ref) {
+void test_builtin_wasm_table_set(const int index, __externref_t ref) {
+  __builtin_wasm_table_set(const_table, index, ref);
   return __builtin_wasm_table_set(table, index, ref);
 }
 
+// CHECK-LABEL: define {{[^@]+}}@test_builtin_wasm_table_set_const
+// CHECK-SAME: (i32 noundef [[INDEX:%.*]], ptr addrspace(10) [[REF:%.*]]) 
#[[ATTR0]] {
+// CHECK-NEXT:  entry:
+// CHECK-NEXT:    call void @llvm.wasm.table.set.externref(ptr addrspace(1) 
@table, i32 [[INDEX]], ptr addrspace(10) [[REF]])
+// CHECK-NEXT:    call void @llvm.wasm.table.set.externref(ptr addrspace(1) 
@const_table, i32 [[INDEX]], ptr addrspace(10) [[REF]])
+// CHECK-NEXT:    ret void
+//
+void test_builtin_wasm_table_set_const(const int index, const __externref_t 
ref) {
+  __builtin_wasm_table_set(table, index, ref);
+  return __builtin_wasm_table_set(const_table, index, ref);
+}
+
 // CHECK-LABEL: define {{[^@]+}}@test_builtin_wasm_table_size
 // CHECK-SAME: () #[[ATTR0]] {
 // CHECK-NEXT:  entry:


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

Reply via email to