[clang] [Clang][WebAssembly] Fix crash when using __funcref in C++ code (PR #176237)

Paulo Matos via cfe-commits cfe-commits at lists.llvm.org
Thu Jan 15 12:23:53 PST 2026


https://github.com/pmatos created https://github.com/llvm/llvm-project/pull/176237

Enable address space map mangling for the WebAssembly target. This fixes a crash in the Itanium name mangler when trying to mangle types with the wasm_funcref address space qualifier in C++ mode.

Fixes #176154

>From 5988b1e2238403f0649dd3b98df8b3cd577594ab Mon Sep 17 00:00:00 2001
From: Paulo Matos <pmatos at igalia.com>
Date: Thu, 15 Jan 2026 20:21:45 +0000
Subject: [PATCH] [Clang][WebAssembly] Fix crash when using __funcref in C++
 code

Enable address space map mangling for the WebAssembly target. This fixes
a crash in the Itanium name mangler when trying to mangle types with the
wasm_funcref address space qualifier in C++ mode.

Fixes #176154
---
 clang/lib/Basic/Targets/WebAssembly.h          |  1 +
 clang/test/CodeGenCXX/wasm-reftypes-mangle.cpp | 16 +++++++++++++++-
 2 files changed, 16 insertions(+), 1 deletion(-)

diff --git a/clang/lib/Basic/Targets/WebAssembly.h b/clang/lib/Basic/Targets/WebAssembly.h
index 3634330ec6698..8cf5174300f82 100644
--- a/clang/lib/Basic/Targets/WebAssembly.h
+++ b/clang/lib/Basic/Targets/WebAssembly.h
@@ -81,6 +81,7 @@ class LLVM_LIBRARY_VISIBILITY WebAssemblyTargetInfo : public TargetInfo {
   explicit WebAssemblyTargetInfo(const llvm::Triple &T, const TargetOptions &)
       : TargetInfo(T) {
     AddrSpaceMap = &WebAssemblyAddrSpaceMap;
+    UseAddrSpaceMapMangling = true;
     NoAsmVariants = true;
     SuitableAlign = 128;
     LargeArrayMinWidth = 128;
diff --git a/clang/test/CodeGenCXX/wasm-reftypes-mangle.cpp b/clang/test/CodeGenCXX/wasm-reftypes-mangle.cpp
index c83176c3b7e4c..20e33cfdaa31c 100644
--- a/clang/test/CodeGenCXX/wasm-reftypes-mangle.cpp
+++ b/clang/test/CodeGenCXX/wasm-reftypes-mangle.cpp
@@ -2,5 +2,19 @@
 // RUN: %clang_cc1 %s -triple wasm32-unknown-unknown -target-feature +reference-types -emit-llvm -o - -std=c++11 | FileCheck %s
 // RUN: %clang_cc1 %s -triple wasm64-unknown-unknown -target-feature +reference-types -emit-llvm -o - -std=c++11 | FileCheck %s
 
-// CHECK: _Z2f1u11externref_t
+// Test that funcref can be used in C++ without crashing during codegen.
+// See https://github.com/llvm/llvm-project/issues/176154
+typedef void (*__funcref funcref_t)();
+
+// Global funcref variables - test that codegen doesn't crash.
+// CHECK-DAG: @fptr = global ptr addrspace(20) null
+funcref_t fptr;
+
+// CHECK-DAG: @fpt2 = global ptr addrspace(20) null
+void (*__funcref fpt2)();
+
+// CHECK-DAG: _Z2f1u11externref_t
 void f1(__externref_t) {}
+
+// CHECK-DAG: _Z2f2PU4AS20FvvE
+void f2(funcref_t) {}



More information about the cfe-commits mailing list