[llvm-branch-commits] [clang] release/20.x: [Clang][MicrosoftMangle] Implement mangling for ConstantMatrixType (#134930) (PR #138017)
via llvm-branch-commits
llvm-branch-commits at lists.llvm.org
Wed Apr 30 12:44:51 PDT 2025
https://github.com/llvmbot created https://github.com/llvm/llvm-project/pull/138017
Backport f5a30f111dc4ad6422863722eb708059a68a9d5c
Requested by: @tstellar
>From bc9b07f09ab1c728e4dcce614eb4ccfa2e5e52c7 Mon Sep 17 00:00:00 2001
From: Losy001 <64610343+Losy001 at users.noreply.github.com>
Date: Sat, 26 Apr 2025 18:04:12 +0200
Subject: [PATCH] [Clang][MicrosoftMangle] Implement mangling for
ConstantMatrixType (#134930)
This pull request implements mangling for ConstantMatrixType, allowing
matrices to be used on Windows.
Related issues: #53158, #127127
This example code:
```cpp
#include <typeinfo>
#include <stdio.h>
typedef float Matrix4 __attribute__((matrix_type(4, 4)));
int main()
{
printf("%s\n", typeid(Matrix4).name());
}
```
Outputs this:
```
struct __clang::__matrix<float,4,4>
```
(cherry picked from commit f5a30f111dc4ad6422863722eb708059a68a9d5c)
---
clang/lib/AST/MicrosoftMangle.cpp | 17 ++++++-
clang/test/CodeGenCXX/mangle-ms-matrix.cpp | 57 ++++++++++++++++++++++
2 files changed, 73 insertions(+), 1 deletion(-)
create mode 100644 clang/test/CodeGenCXX/mangle-ms-matrix.cpp
diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp
index 42b735ccf4a2c..74c995f2f97f0 100644
--- a/clang/lib/AST/MicrosoftMangle.cpp
+++ b/clang/lib/AST/MicrosoftMangle.cpp
@@ -3552,7 +3552,22 @@ void MicrosoftCXXNameMangler::mangleType(const DependentSizedExtVectorType *T,
void MicrosoftCXXNameMangler::mangleType(const ConstantMatrixType *T,
Qualifiers quals, SourceRange Range) {
- Error(Range.getBegin(), "matrix type") << Range;
+ QualType EltTy = T->getElementType();
+ const BuiltinType *ET = EltTy->getAs<BuiltinType>();
+
+ llvm::SmallString<64> TemplateMangling;
+ llvm::raw_svector_ostream Stream(TemplateMangling);
+ MicrosoftCXXNameMangler Extra(Context, Stream);
+
+ Stream << "?$";
+
+ Extra.mangleSourceName("__matrix");
+ Extra.mangleType(EltTy, Range, QMM_Escape);
+
+ Extra.mangleIntegerLiteral(llvm::APSInt::getUnsigned(T->getNumRows()));
+ Extra.mangleIntegerLiteral(llvm::APSInt::getUnsigned(T->getNumColumns()));
+
+ mangleArtificialTagType(TagTypeKind::Struct, TemplateMangling, {"__clang"});
}
void MicrosoftCXXNameMangler::mangleType(const DependentSizedMatrixType *T,
diff --git a/clang/test/CodeGenCXX/mangle-ms-matrix.cpp b/clang/test/CodeGenCXX/mangle-ms-matrix.cpp
new file mode 100644
index 0000000000000..b244aa6e33cfa
--- /dev/null
+++ b/clang/test/CodeGenCXX/mangle-ms-matrix.cpp
@@ -0,0 +1,57 @@
+// RUN: %clang_cc1 -fenable-matrix -fms-extensions -fcxx-exceptions -ffreestanding -target-feature +avx -emit-llvm %s -o - -triple=i686-pc-win32 | FileCheck %s
+// RUN: %clang_cc1 -fenable-matrix -fms-extensions -fcxx-exceptions -ffreestanding -target-feature +avx -emit-llvm %s -o - -triple=i686-pc-win32 -fexperimental-new-constant-interpreter | FileCheck %s
+
+typedef float __attribute__((matrix_type(4, 4))) m4x4f;
+typedef float __attribute__((matrix_type(2, 2))) m2x2f;
+
+typedef int __attribute__((matrix_type(4, 4))) m4x4i;
+typedef int __attribute__((matrix_type(2, 2))) m2x2i;
+
+void thow(int i) {
+ switch (i) {
+ case 0: throw m4x4f();
+ // CHECK: ??_R0U?$__matrix at M$03$03 at __clang@@@8
+ // CHECK: _CT??_R0U?$__matrix at M$03$03 at __clang@@@864
+ // CHECK: _CTA1U?$__matrix at M$03$03 at __clang@@
+ // CHECK: _TI1U?$__matrix at M$03$03 at __clang@@
+ case 1: throw m2x2f();
+ // CHECK: ??_R0U?$__matrix at M$01$01 at __clang@@@8
+ // CHECK: _CT??_R0U?$__matrix at M$01$01 at __clang@@@816
+ // CHECK: _CTA1U?$__matrix at M$01$01 at __clang@@
+ // CHECK: _TI1U?$__matrix at M$01$01 at __clang@@
+ case 2: throw m4x4i();
+ // CHECK: ??_R0U?$__matrix at H$03$03 at __clang@@@8
+ // CHECK: _CT??_R0U?$__matrix at H$03$03 at __clang@@@864
+ // CHECK: _CTA1U?$__matrix at H$03$03 at __clang@@
+ // CHECK: _TI1U?$__matrix at H$03$03 at __clang@@
+ case 3: throw m2x2i();
+ // CHECK: ??_R0U?$__matrix at H$01$01 at __clang@@@8
+ // CHECK: _CT??_R0U?$__matrix at H$01$01 at __clang@@@816
+ // CHECK: _CTA1U?$__matrix at H$01$01 at __clang@@
+ // CHECK: _TI1U?$__matrix at H$01$01 at __clang@@
+ }
+}
+
+void foo44f(m4x4f) {}
+// CHECK: define dso_local void @"?foo44f@@YAXU?$__matrix at M$03$03 at __clang@@@Z"
+
+m4x4f rfoo44f() { return m4x4f(); }
+// CHECK: define dso_local noundef <16 x float> @"?rfoo44f@@YAU?$__matrix at M$03$03 at __clang@@XZ"
+
+void foo22f(m2x2f) {}
+// CHECK: define dso_local void @"?foo22f@@YAXU?$__matrix at M$01$01 at __clang@@@Z"
+
+m2x2f rfoo22f() { return m2x2f(); }
+// CHECK: define dso_local noundef <4 x float> @"?rfoo22f@@YAU?$__matrix at M$01$01 at __clang@@XZ"
+
+void foo44i(m4x4i) {}
+// CHECK: define dso_local void @"?foo44i@@YAXU?$__matrix at H$03$03 at __clang@@@Z"
+
+m4x4i rfoo44i() { return m4x4i(); }
+// CHECK: define dso_local noundef <16 x i32> @"?rfoo44i@@YAU?$__matrix at H$03$03 at __clang@@XZ"
+
+void foo22i(m2x2i) {}
+// CHECK: define dso_local void @"?foo22i@@YAXU?$__matrix at H$01$01 at __clang@@@Z"
+
+m2x2i rfoo22i() { return m2x2i(); }
+// CHECK: define dso_local noundef <4 x i32> @"?rfoo22i@@YAU?$__matrix at H$01$01 at __clang@@XZ"
\ No newline at end of file
More information about the llvm-branch-commits
mailing list