@@ -468,6 +468,7 @@ class CXXNameMangler {
468
468
void mangleLambdaSig (const CXXRecordDecl *Lambda);
469
469
void mangleModuleNamePrefix (StringRef Name, bool IsPartition = false );
470
470
void mangleVendorQualifier (StringRef Name);
471
+ void mangleVendorType (StringRef Name);
471
472
472
473
private:
473
474
@@ -2891,6 +2892,10 @@ void CXXNameMangler::mangleVendorQualifier(StringRef name) {
2891
2892
Out << ' U' << name.size () << name;
2892
2893
}
2893
2894
2895
+ void CXXNameMangler::mangleVendorType (StringRef name) {
2896
+ Out << ' u' << name.size () << name;
2897
+ }
2898
+
2894
2899
void CXXNameMangler::mangleRefQualifier (RefQualifierKind RefQualifier) {
2895
2900
// <ref-qualifier> ::= R # lvalue reference
2896
2901
// ::= O # rvalue-reference
@@ -3413,8 +3418,7 @@ void CXXNameMangler::mangleType(const BuiltinType *T) {
3413
3418
if (T->getKind () == BuiltinType::SveBFloat16 && \
3414
3419
isCompatibleWith (LangOptions::ClangABI::Ver17)) { \
3415
3420
/* Prior to Clang 18.0 we used this incorrect mangled name */ \
3416
- type_name = " __SVBFloat16_t" ; \
3417
- Out << " u" << type_name.size () << type_name; \
3421
+ mangleVendorType (" __SVBFloat16_t" ); \
3418
3422
} else { \
3419
3423
type_name = MangledName; \
3420
3424
Out << (type_name == Name ? " u" : " " ) << type_name.size () << type_name; \
@@ -3436,35 +3440,30 @@ void CXXNameMangler::mangleType(const BuiltinType *T) {
3436
3440
Out << (type_name == Name ? " u" : " " ) << type_name.size () << type_name; \
3437
3441
break ;
3438
3442
#include " clang/Basic/AArch64SVEACLETypes.def"
3439
- #define PPC_VECTOR_TYPE (Name, Id, Size ) \
3440
- case BuiltinType::Id: \
3441
- type_name = #Name; \
3442
- Out << ' u' << type_name.size () << type_name; \
3443
+ #define PPC_VECTOR_TYPE (Name, Id, Size ) \
3444
+ case BuiltinType::Id: \
3445
+ mangleVendorType (#Name); \
3443
3446
break ;
3444
3447
#include " clang/Basic/PPCTypes.def"
3445
3448
// TODO: Check the mangling scheme for RISC-V V.
3446
3449
#define RVV_TYPE (Name, Id, SingletonId ) \
3447
3450
case BuiltinType::Id: \
3448
- type_name = Name; \
3449
- Out << ' u' << type_name.size () << type_name; \
3451
+ mangleVendorType (Name); \
3450
3452
break ;
3451
3453
#include " clang/Basic/RISCVVTypes.def"
3452
3454
#define WASM_REF_TYPE (InternalName, MangledName, Id, SingletonId, AS ) \
3453
3455
case BuiltinType::Id: \
3454
- type_name = MangledName; \
3455
- Out << ' u' << type_name.size () << type_name; \
3456
+ mangleVendorType (MangledName); \
3456
3457
break ;
3457
3458
#include " clang/Basic/WebAssemblyReferenceTypes.def"
3458
3459
#define AMDGPU_TYPE (Name, Id, SingletonId, Width, Align ) \
3459
3460
case BuiltinType::Id: \
3460
- type_name = Name; \
3461
- Out << ' u' << type_name.size () << type_name; \
3461
+ mangleVendorType (Name); \
3462
3462
break ;
3463
3463
#include " clang/Basic/AMDGPUTypes.def"
3464
3464
#define HLSL_INTANGIBLE_TYPE (Name, Id, SingletonId ) \
3465
3465
case BuiltinType::Id: \
3466
- type_name = #Name; \
3467
- Out << ' u' << type_name.size () << type_name; \
3466
+ mangleVendorType (#Name); \
3468
3467
break ;
3469
3468
#include " clang/Basic/HLSLIntangibleTypes.def"
3470
3469
}
@@ -4035,8 +4034,9 @@ void CXXNameMangler::mangleAArch64FixedSveVectorType(const VectorType *T) {
4035
4034
if (T->getVectorKind () == VectorKind::SveFixedLengthPredicate)
4036
4035
VecSizeInBits *= 8 ;
4037
4036
4038
- Out << " 9__SVE_VLSI" << ' u' << TypeName.size () << TypeName << " Lj"
4039
- << VecSizeInBits << " EE" ;
4037
+ Out << " 9__SVE_VLSI" ;
4038
+ mangleVendorType (TypeName);
4039
+ Out << " Lj" << VecSizeInBits << " EE" ;
4040
4040
}
4041
4041
4042
4042
void CXXNameMangler::mangleAArch64FixedSveVectorType (
@@ -4136,8 +4136,9 @@ void CXXNameMangler::mangleRISCVFixedRVVVectorType(const VectorType *T) {
4136
4136
}
4137
4137
TypeNameOS << " _t" ;
4138
4138
4139
- Out << " 9__RVV_VLSI" << ' u' << TypeNameStr.size () << TypeNameStr << " Lj"
4140
- << VecSizeInBits << " EE" ;
4139
+ Out << " 9__RVV_VLSI" ;
4140
+ mangleVendorType (TypeNameStr);
4141
+ Out << " Lj" << VecSizeInBits << " EE" ;
4141
4142
}
4142
4143
4143
4144
void CXXNameMangler::mangleRISCVFixedRVVVectorType (
@@ -4236,8 +4237,7 @@ void CXXNameMangler::mangleType(const ConstantMatrixType *T) {
4236
4237
// Mangle matrix types as a vendor extended type:
4237
4238
// u<Len>matrix_typeI<Rows><Columns><element type>E
4238
4239
4239
- StringRef VendorQualifier = " matrix_type" ;
4240
- Out << " u" << VendorQualifier.size () << VendorQualifier;
4240
+ mangleVendorType (" matrix_type" );
4241
4241
4242
4242
Out << " I" ;
4243
4243
auto &ASTCtx = getASTContext ();
@@ -4255,8 +4255,7 @@ void CXXNameMangler::mangleType(const ConstantMatrixType *T) {
4255
4255
void CXXNameMangler::mangleType (const DependentSizedMatrixType *T) {
4256
4256
// Mangle matrix types as a vendor extended type:
4257
4257
// u<Len>matrix_typeI<row expr><column expr><element type>E
4258
- StringRef VendorQualifier = " matrix_type" ;
4259
- Out << " u" << VendorQualifier.size () << VendorQualifier;
4258
+ mangleVendorType (" matrix_type" );
4260
4259
4261
4260
Out << " I" ;
4262
4261
mangleTemplateArgExpr (T->getRowExpr ());
@@ -4302,7 +4301,7 @@ void CXXNameMangler::mangleType(const ObjCObjectType *T) {
4302
4301
StringRef name = I->getName ();
4303
4302
QualOS << name.size () << name;
4304
4303
}
4305
- Out << ' U ' << QualStr. size () << QualStr;
4304
+ mangleVendorQualifier ( QualStr) ;
4306
4305
}
4307
4306
4308
4307
mangleType (T->getBaseType ());
@@ -4436,8 +4435,6 @@ void CXXNameMangler::mangleType(const UnaryTransformType *T) {
4436
4435
// If this is dependent, we need to record that. If not, we simply
4437
4436
// mangle it as the underlying type since they are equivalent.
4438
4437
if (T->isDependentType ()) {
4439
- Out << " u" ;
4440
-
4441
4438
StringRef BuiltinName;
4442
4439
switch (T->getUTTKind ()) {
4443
4440
#define TRANSFORM_TYPE_TRAIT_DEF (Enum, Trait ) \
@@ -4446,7 +4443,7 @@ void CXXNameMangler::mangleType(const UnaryTransformType *T) {
4446
4443
break ;
4447
4444
#include " clang/Basic/TransformTypeTraits.def"
4448
4445
}
4449
- Out << BuiltinName. size () << BuiltinName;
4446
+ mangleVendorType ( BuiltinName) ;
4450
4447
}
4451
4448
4452
4449
Out << " I" ;
@@ -5311,9 +5308,8 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity,
5311
5308
// <expression> ::= u <source-name> <template-arg>* E # vendor extension
5312
5309
const TypeTraitExpr *TTE = cast<TypeTraitExpr>(E);
5313
5310
NotPrimaryExpr ();
5314
- Out << ' u' ;
5315
5311
llvm::StringRef Spelling = getTraitSpelling (TTE->getTrait ());
5316
- Out << Spelling. size () << Spelling;
5312
+ mangleVendorType ( Spelling) ;
5317
5313
for (TypeSourceInfo *TSI : TTE->getArgs ()) {
5318
5314
mangleType (TSI->getType ());
5319
5315
}
0 commit comments