Author: Edward Nathan Varghese Date: 2026-05-25T22:13:43-07:00 New Revision: 386e356b5f0a3e49e42b80c350a6847c1d3bc661
URL: https://github.com/llvm/llvm-project/commit/386e356b5f0a3e49e42b80c350a6847c1d3bc661 DIFF: https://github.com/llvm/llvm-project/commit/386e356b5f0a3e49e42b80c350a6847c1d3bc661.diff LOG: [AArch64] Add support for MSVC-style mangling for SVE (#196738) Fixes #196170 Recent MSVC toolchains added support for AArch64 SVE types and use dedicated builtin manglings such as `$_CD` instead of the older artificial `__clang` struct manglings. Update Clang's Microsoft mangling implementation to match MSVC for supported SVE builtin types. Unsupported SVE types continue using the existing artificial tag mangling until MSVC gains support for them. Adds representative coverage for: * scalar SVE types * tuple/vector SVE types * fallback manglings for unsupported types Added: Modified: clang/docs/ReleaseNotes.rst clang/lib/AST/MicrosoftMangle.cpp clang/test/CodeGenCXX/aarch64-mangle-sve-vectors-msvc.cpp Removed: ################################################################################ diff --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst index 3813a61d51b62..f514c4ff3277f 100644 --- a/clang/docs/ReleaseNotes.rst +++ b/clang/docs/ReleaseNotes.rst @@ -104,6 +104,9 @@ ABI Changes in This Version - Fixed Itanium mangling for lambdas in instantiated non-static data member initializers by preserving the field-name closure-prefix. This changes the mangled names for affected lambdas. (#GH190555) +- Clang now uses MSVC-compatible manglings for supported AArch64 SVE builtin + types when targeting the Microsoft ABI. This changes symbol names for + affected declarations compared to previous Clang releases. (#GH196170) AST Dumping Potentially Breaking Changes ---------------------------------------- diff --git a/clang/lib/AST/MicrosoftMangle.cpp b/clang/lib/AST/MicrosoftMangle.cpp index 7d0c60d57253c..5c0bc14b6780c 100644 --- a/clang/lib/AST/MicrosoftMangle.cpp +++ b/clang/lib/AST/MicrosoftMangle.cpp @@ -2831,14 +2831,202 @@ void MicrosoftCXXNameMangler::mangleType(const BuiltinType *T, Qualifiers, break; #include "clang/Basic/HLSLIntangibleTypes.def" -#define SVE_TYPE(Name, Id, SingletonId) \ - case BuiltinType::Id: \ - mangleArtificialTagType(TagTypeKind::Struct, #Name, {"__clang"}); \ + case BuiltinType::SveBool: + Out << "$_CA"; + break; + + case BuiltinType::SveInt8: + Out << "$_CB"; + break; + case BuiltinType::SveInt16: + Out << "$_CC"; + break; + case BuiltinType::SveInt32: + Out << "$_CD"; + break; + case BuiltinType::SveInt64: + Out << "$_CE"; + break; + + case BuiltinType::SveUint8: + Out << "$_CF"; + break; + case BuiltinType::SveUint16: + Out << "$_CG"; + break; + case BuiltinType::SveUint32: + Out << "$_CH"; + break; + case BuiltinType::SveUint64: + Out << "$_CI"; + break; + + case BuiltinType::SveBFloat16: + Out << "$_CJ"; + break; + case BuiltinType::SveFloat16: + Out << "$_CK"; + break; + case BuiltinType::SveFloat32: + Out << "$_CL"; + break; + case BuiltinType::SveFloat64: + Out << "$_CM"; + break; + + case BuiltinType::SveInt8x2: + Out << "$_C2B"; + break; + case BuiltinType::SveInt16x2: + Out << "$_C2C"; + break; + case BuiltinType::SveInt32x2: + Out << "$_C2D"; + break; + case BuiltinType::SveInt64x2: + Out << "$_C2E"; + break; + + case BuiltinType::SveUint8x2: + Out << "$_C2F"; + break; + case BuiltinType::SveUint16x2: + Out << "$_C2G"; + break; + case BuiltinType::SveUint32x2: + Out << "$_C2H"; + break; + case BuiltinType::SveUint64x2: + Out << "$_C2I"; + break; + + case BuiltinType::SveBFloat16x2: + Out << "$_C2J"; + break; + case BuiltinType::SveFloat16x2: + Out << "$_C2K"; + break; + case BuiltinType::SveFloat32x2: + Out << "$_C2L"; + break; + case BuiltinType::SveFloat64x2: + Out << "$_C2M"; + break; + + case BuiltinType::SveInt8x3: + Out << "$_C3B"; + break; + case BuiltinType::SveInt16x3: + Out << "$_C3C"; + break; + case BuiltinType::SveInt32x3: + Out << "$_C3D"; + break; + case BuiltinType::SveInt64x3: + Out << "$_C3E"; + break; + + case BuiltinType::SveUint8x3: + Out << "$_C3F"; + break; + case BuiltinType::SveUint16x3: + Out << "$_C3G"; + break; + case BuiltinType::SveUint32x3: + Out << "$_C3H"; + break; + case BuiltinType::SveUint64x3: + Out << "$_C3I"; + break; + + case BuiltinType::SveBFloat16x3: + Out << "$_C3J"; + break; + case BuiltinType::SveFloat16x3: + Out << "$_C3K"; + break; + case BuiltinType::SveFloat32x3: + Out << "$_C3L"; + break; + case BuiltinType::SveFloat64x3: + Out << "$_C3M"; + break; + + case BuiltinType::SveInt8x4: + Out << "$_C4B"; + break; + case BuiltinType::SveInt16x4: + Out << "$_C4C"; + break; + case BuiltinType::SveInt32x4: + Out << "$_C4D"; + break; + case BuiltinType::SveInt64x4: + Out << "$_C4E"; + break; + + case BuiltinType::SveUint8x4: + Out << "$_C4F"; + break; + case BuiltinType::SveUint16x4: + Out << "$_C4G"; + break; + case BuiltinType::SveUint32x4: + Out << "$_C4H"; + break; + case BuiltinType::SveUint64x4: + Out << "$_C4I"; + break; + + case BuiltinType::SveBFloat16x4: + Out << "$_C4J"; + break; + case BuiltinType::SveFloat16x4: + Out << "$_C4K"; + break; + case BuiltinType::SveFloat32x4: + Out << "$_C4L"; + break; + case BuiltinType::SveFloat64x4: + Out << "$_C4M"; + break; + + // SVE types not supported by MSVC still use clang-specific + // artificial tag mangling + case BuiltinType::SveMFloat8: + mangleArtificialTagType(TagTypeKind::Struct, "__SVMfloat8_t", {"__clang"}); + break; + + case BuiltinType::SveMFloat8x2: + mangleArtificialTagType(TagTypeKind::Struct, "__clang_svmfloat8x2_t", + {"__clang"}); + break; + + case BuiltinType::SveMFloat8x3: + mangleArtificialTagType(TagTypeKind::Struct, "__clang_svmfloat8x3_t", + {"__clang"}); + break; + + case BuiltinType::SveMFloat8x4: + mangleArtificialTagType(TagTypeKind::Struct, "__clang_svmfloat8x4_t", + {"__clang"}); + break; + + case BuiltinType::SveBoolx2: + mangleArtificialTagType(TagTypeKind::Struct, "__clang_svboolx2_t", + {"__clang"}); + break; + + case BuiltinType::SveBoolx4: + mangleArtificialTagType(TagTypeKind::Struct, "__clang_svboolx4_t", + {"__clang"}); + break; + + case BuiltinType::SveCount: + mangleArtificialTagType(TagTypeKind::Struct, "__SVCount_t", {"__clang"}); break; -#define SVE_SCALAR_TYPE(Name, MangledName, Id, SingletonId, Bits) -#include "clang/Basic/AArch64ACLETypes.def" - // Issue an error for any type not explicitly handled. + // Issue an error for any type not explicitly handled. default: Error(Range.getBegin(), "built-in type: ", T->getName(Context.getASTContext().getPrintingPolicy())) diff --git a/clang/test/CodeGenCXX/aarch64-mangle-sve-vectors-msvc.cpp b/clang/test/CodeGenCXX/aarch64-mangle-sve-vectors-msvc.cpp index 3ed75b9494c2a..798f980d316c5 100644 --- a/clang/test/CodeGenCXX/aarch64-mangle-sve-vectors-msvc.cpp +++ b/clang/test/CodeGenCXX/aarch64-mangle-sve-vectors-msvc.cpp @@ -1,13 +1,55 @@ -// RUN: %clang_cc1 -triple aarch64-unknown-windows-msvc %s -emit-llvm \ -// RUN: -o - | FileCheck %s +// RUN: %clang_cc1 -triple aarch64-unknown-windows-msvc \ +// RUN: -target-feature +sve -emit-llvm -o - %s | FileCheck %s -template<typename T> struct S {}; +template <typename T> struct S {}; -// CHECK: void @"?f1@@YAXU?$S@U__SVInt8_t@__clang@@@@@Z" +// Scalar SVE types. + +// CHECK: void @"?f1@@YAXU?$S@$_CB@@@Z" void f1(S<__SVInt8_t>) {} -// CHECK: void @"?f2@@YAXU?$S@U__SVInt32_t@__clang@@@@@Z" + +// CHECK: void @"?f2@@YAXU?$S@$_CD@@@Z" void f2(S<__SVInt32_t>) {} -// CHECK: void @"?f3@@YAXU?$S@U__SVBool_t@__clang@@@@@Z" + +// CHECK: void @"?f3@@YAXU?$S@$_CA@@@Z" void f3(S<__SVBool_t>) {} -// CHECK: void @"?f4@@YAXU?$S@U__clang_svfloat64x4_t@__clang@@@@@Z" -void f4(S<__clang_svfloat64x4_t>) {} + +// CHECK: void @"?f4@@YAXU?$S@$_CH@@@Z" +void f4(S<__SVUint32_t>) {} + +// CHECK: void @"?f5@@YAXU?$S@$_CL@@@Z" +void f5(S<__SVFloat32_t>) {} + +// CHECK: void @"?f13@@YAXU?$S@$_CJ@@@Z" +void f13(S<__SVBfloat16_t>) {} + +// Tuple SVE types. + +// CHECK: void @"?f6@@YAXU?$S@$_C2B@@@Z" +void f6(S<__clang_svint8x2_t>) {} + +// CHECK: void @"?f7@@YAXU?$S@$_C3B@@@Z" +void f7(S<__clang_svint8x3_t>) {} + +// CHECK: void @"?f8@@YAXU?$S@$_C4B@@@Z" +void f8(S<__clang_svint8x4_t>) {} + +// CHECK: void @"?f9@@YAXU?$S@$_C4M@@@Z" +void f9(S<__clang_svfloat64x4_t>) {} + +// CHECK: void @"?f14@@YAXU?$S@$_C2H@@@Z" +void f14(S<__clang_svuint32x2_t>) {} + +// CHECK: void @"?f15@@YAXU?$S@$_C3L@@@Z" +void f15(S<__clang_svfloat32x3_t>) {} + +// Unsupported types should continue using legacy artificial tag mangling. + +// CHECK: void @"?f10@@YAXU?$S@U__SVMfloat8_t@__clang@@@@@Z" +void f10(S<__SVMfloat8_t>) {} + +// CHECK: void @"?f11@@YAXU?$S@U__clang_svboolx2_t@__clang@@@@@Z" +void f11(S<__clang_svboolx2_t>) {} + +// CHECK: void @"?f12@@YAXU?$S@U__SVCount_t@__clang@@@@@Z" +void f12(S<__SVCount_t>) {} _______________________________________________ cfe-commits mailing list [email protected] https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits
