@@ -468,6 +468,7 @@ class CXXNameMangler {
468468 void mangleLambdaSig (const CXXRecordDecl *Lambda);
469469 void mangleModuleNamePrefix (StringRef Name, bool IsPartition = false );
470470 void mangleVendorQualifier (StringRef Name);
471+ void mangleVendorType (StringRef Name);
471472
472473private:
473474
@@ -2871,6 +2872,10 @@ void CXXNameMangler::mangleVendorQualifier(StringRef name) {
28712872 Out << ' U' << name.size () << name;
28722873}
28732874
2875+ void CXXNameMangler::mangleVendorType (StringRef name) {
2876+ Out << ' u' << name.size () << name;
2877+ }
2878+
28742879void CXXNameMangler::mangleRefQualifier (RefQualifierKind RefQualifier) {
28752880 // <ref-qualifier> ::= R # lvalue reference
28762881 // ::= O # rvalue-reference
@@ -3389,8 +3394,7 @@ void CXXNameMangler::mangleType(const BuiltinType *T) {
33893394 if (T->getKind () == BuiltinType::SveBFloat16 && \
33903395 isCompatibleWith (LangOptions::ClangABI::Ver17)) { \
33913396 /* Prior to Clang 18.0 we used this incorrect mangled name */ \
3392- type_name = " __SVBFloat16_t" ; \
3393- Out << " u" << type_name.size () << type_name; \
3397+ mangleVendorType (" __SVBFloat16_t" ); \
33943398 } else { \
33953399 type_name = MangledName; \
33963400 Out << (type_name == Name ? " u" : " " ) << type_name.size () << type_name; \
@@ -3407,35 +3411,30 @@ void CXXNameMangler::mangleType(const BuiltinType *T) {
34073411 Out << (type_name == Name ? " u" : " " ) << type_name.size () << type_name; \
34083412 break ;
34093413#include " clang/Basic/AArch64SVEACLETypes.def"
3410- #define PPC_VECTOR_TYPE (Name, Id, Size ) \
3411- case BuiltinType::Id: \
3412- type_name = #Name; \
3413- Out << ' u' << type_name.size () << type_name; \
3414+ #define PPC_VECTOR_TYPE (Name, Id, Size ) \
3415+ case BuiltinType::Id: \
3416+ mangleVendorType (#Name); \
34143417 break ;
34153418#include " clang/Basic/PPCTypes.def"
34163419 // TODO: Check the mangling scheme for RISC-V V.
34173420#define RVV_TYPE (Name, Id, SingletonId ) \
34183421 case BuiltinType::Id: \
3419- type_name = Name; \
3420- Out << ' u' << type_name.size () << type_name; \
3422+ mangleVendorType (Name); \
34213423 break ;
34223424#include " clang/Basic/RISCVVTypes.def"
34233425#define WASM_REF_TYPE (InternalName, MangledName, Id, SingletonId, AS ) \
34243426 case BuiltinType::Id: \
3425- type_name = MangledName; \
3426- Out << ' u' << type_name.size () << type_name; \
3427+ mangleVendorType (MangledName); \
34273428 break ;
34283429#include " clang/Basic/WebAssemblyReferenceTypes.def"
34293430#define AMDGPU_TYPE (Name, Id, SingletonId ) \
34303431 case BuiltinType::Id: \
3431- type_name = Name; \
3432- Out << ' u' << type_name.size () << type_name; \
3432+ mangleVendorType (Name); \
34333433 break ;
34343434#include " clang/Basic/AMDGPUTypes.def"
34353435#define HLSL_INTANGIBLE_TYPE (Name, Id, SingletonId ) \
34363436 case BuiltinType::Id: \
3437- type_name = #Name; \
3438- Out << ' u' << type_name.size () << type_name; \
3437+ mangleVendorType (#Name); \
34393438 break ;
34403439#include " clang/Basic/HLSLIntangibleTypes.def"
34413440 }
@@ -4006,8 +4005,9 @@ void CXXNameMangler::mangleAArch64FixedSveVectorType(const VectorType *T) {
40064005 if (T->getVectorKind () == VectorKind::SveFixedLengthPredicate)
40074006 VecSizeInBits *= 8 ;
40084007
4009- Out << " 9__SVE_VLSI" << ' u' << TypeName.size () << TypeName << " Lj"
4010- << VecSizeInBits << " EE" ;
4008+ Out << " 9__SVE_VLSI" ;
4009+ mangleVendorType (TypeName);
4010+ Out << " Lj" << VecSizeInBits << " EE" ;
40114011}
40124012
40134013void CXXNameMangler::mangleAArch64FixedSveVectorType (
@@ -4107,8 +4107,9 @@ void CXXNameMangler::mangleRISCVFixedRVVVectorType(const VectorType *T) {
41074107 }
41084108 TypeNameOS << " _t" ;
41094109
4110- Out << " 9__RVV_VLSI" << ' u' << TypeNameStr.size () << TypeNameStr << " Lj"
4111- << VecSizeInBits << " EE" ;
4110+ Out << " 9__RVV_VLSI" ;
4111+ mangleVendorType (TypeNameStr);
4112+ Out << " Lj" << VecSizeInBits << " EE" ;
41124113}
41134114
41144115void CXXNameMangler::mangleRISCVFixedRVVVectorType (
@@ -4207,8 +4208,7 @@ void CXXNameMangler::mangleType(const ConstantMatrixType *T) {
42074208 // Mangle matrix types as a vendor extended type:
42084209 // u<Len>matrix_typeI<Rows><Columns><element type>E
42094210
4210- StringRef VendorQualifier = " matrix_type" ;
4211- Out << " u" << VendorQualifier.size () << VendorQualifier;
4211+ mangleVendorType (" matrix_type" );
42124212
42134213 Out << " I" ;
42144214 auto &ASTCtx = getASTContext ();
@@ -4226,8 +4226,7 @@ void CXXNameMangler::mangleType(const ConstantMatrixType *T) {
42264226void CXXNameMangler::mangleType (const DependentSizedMatrixType *T) {
42274227 // Mangle matrix types as a vendor extended type:
42284228 // u<Len>matrix_typeI<row expr><column expr><element type>E
4229- StringRef VendorQualifier = " matrix_type" ;
4230- Out << " u" << VendorQualifier.size () << VendorQualifier;
4229+ mangleVendorType (" matrix_type" );
42314230
42324231 Out << " I" ;
42334232 mangleTemplateArgExpr (T->getRowExpr ());
@@ -4273,7 +4272,7 @@ void CXXNameMangler::mangleType(const ObjCObjectType *T) {
42734272 StringRef name = I->getName ();
42744273 QualOS << name.size () << name;
42754274 }
4276- Out << ' U ' << QualStr. size () << QualStr;
4275+ mangleVendorQualifier ( QualStr) ;
42774276 }
42784277
42794278 mangleType (T->getBaseType ());
@@ -4407,8 +4406,6 @@ void CXXNameMangler::mangleType(const UnaryTransformType *T) {
44074406 // If this is dependent, we need to record that. If not, we simply
44084407 // mangle it as the underlying type since they are equivalent.
44094408 if (T->isDependentType ()) {
4410- Out << " u" ;
4411-
44124409 StringRef BuiltinName;
44134410 switch (T->getUTTKind ()) {
44144411#define TRANSFORM_TYPE_TRAIT_DEF (Enum, Trait ) \
@@ -4417,7 +4414,7 @@ void CXXNameMangler::mangleType(const UnaryTransformType *T) {
44174414 break ;
44184415#include " clang/Basic/TransformTypeTraits.def"
44194416 }
4420- Out << BuiltinName. size () << BuiltinName;
4417+ mangleVendorType ( BuiltinName) ;
44214418 }
44224419
44234420 Out << " I" ;
@@ -5250,9 +5247,8 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity,
52505247 // <expression> ::= u <source-name> <template-arg>* E # vendor extension
52515248 const TypeTraitExpr *TTE = cast<TypeTraitExpr>(E);
52525249 NotPrimaryExpr ();
5253- Out << ' u' ;
52545250 llvm::StringRef Spelling = getTraitSpelling (TTE->getTrait ());
5255- Out << Spelling. size () << Spelling;
5251+ mangleVendorType ( Spelling) ;
52565252 for (TypeSourceInfo *TSI : TTE->getArgs ()) {
52575253 mangleType (TSI->getType ());
52585254 }
0 commit comments