@@ -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
@@ -2891,6 +2892,10 @@ void CXXNameMangler::mangleVendorQualifier(StringRef name) {
28912892 Out << ' U' << name.size () << name;
28922893}
28932894
2895+ void CXXNameMangler::mangleVendorType (StringRef name) {
2896+ Out << ' u' << name.size () << name;
2897+ }
2898+
28942899void CXXNameMangler::mangleRefQualifier (RefQualifierKind RefQualifier) {
28952900 // <ref-qualifier> ::= R # lvalue reference
28962901 // ::= O # rvalue-reference
@@ -3413,8 +3418,7 @@ void CXXNameMangler::mangleType(const BuiltinType *T) {
34133418 if (T->getKind () == BuiltinType::SveBFloat16 && \
34143419 isCompatibleWith (LangOptions::ClangABI::Ver17)) { \
34153420 /* 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" ); \
34183422 } else { \
34193423 type_name = MangledName; \
34203424 Out << (type_name == Name ? " u" : " " ) << type_name.size () << type_name; \
@@ -3436,35 +3440,30 @@ void CXXNameMangler::mangleType(const BuiltinType *T) {
34363440 Out << (type_name == Name ? " u" : " " ) << type_name.size () << type_name; \
34373441 break ;
34383442#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); \
34433446 break ;
34443447#include " clang/Basic/PPCTypes.def"
34453448 // TODO: Check the mangling scheme for RISC-V V.
34463449#define RVV_TYPE (Name, Id, SingletonId ) \
34473450 case BuiltinType::Id: \
3448- type_name = Name; \
3449- Out << ' u' << type_name.size () << type_name; \
3451+ mangleVendorType (Name); \
34503452 break ;
34513453#include " clang/Basic/RISCVVTypes.def"
34523454#define WASM_REF_TYPE (InternalName, MangledName, Id, SingletonId, AS ) \
34533455 case BuiltinType::Id: \
3454- type_name = MangledName; \
3455- Out << ' u' << type_name.size () << type_name; \
3456+ mangleVendorType (MangledName); \
34563457 break ;
34573458#include " clang/Basic/WebAssemblyReferenceTypes.def"
34583459#define AMDGPU_TYPE (Name, Id, SingletonId, Width, Align ) \
34593460 case BuiltinType::Id: \
3460- type_name = Name; \
3461- Out << ' u' << type_name.size () << type_name; \
3461+ mangleVendorType (Name); \
34623462 break ;
34633463#include " clang/Basic/AMDGPUTypes.def"
34643464#define HLSL_INTANGIBLE_TYPE (Name, Id, SingletonId ) \
34653465 case BuiltinType::Id: \
3466- type_name = #Name; \
3467- Out << ' u' << type_name.size () << type_name; \
3466+ mangleVendorType (#Name); \
34683467 break ;
34693468#include " clang/Basic/HLSLIntangibleTypes.def"
34703469 }
@@ -4035,8 +4034,9 @@ void CXXNameMangler::mangleAArch64FixedSveVectorType(const VectorType *T) {
40354034 if (T->getVectorKind () == VectorKind::SveFixedLengthPredicate)
40364035 VecSizeInBits *= 8 ;
40374036
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" ;
40404040}
40414041
40424042void CXXNameMangler::mangleAArch64FixedSveVectorType (
@@ -4136,8 +4136,9 @@ void CXXNameMangler::mangleRISCVFixedRVVVectorType(const VectorType *T) {
41364136 }
41374137 TypeNameOS << " _t" ;
41384138
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" ;
41414142}
41424143
41434144void CXXNameMangler::mangleRISCVFixedRVVVectorType (
@@ -4236,8 +4237,7 @@ void CXXNameMangler::mangleType(const ConstantMatrixType *T) {
42364237 // Mangle matrix types as a vendor extended type:
42374238 // u<Len>matrix_typeI<Rows><Columns><element type>E
42384239
4239- StringRef VendorQualifier = " matrix_type" ;
4240- Out << " u" << VendorQualifier.size () << VendorQualifier;
4240+ mangleVendorType (" matrix_type" );
42414241
42424242 Out << " I" ;
42434243 auto &ASTCtx = getASTContext ();
@@ -4255,8 +4255,7 @@ void CXXNameMangler::mangleType(const ConstantMatrixType *T) {
42554255void CXXNameMangler::mangleType (const DependentSizedMatrixType *T) {
42564256 // Mangle matrix types as a vendor extended type:
42574257 // 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" );
42604259
42614260 Out << " I" ;
42624261 mangleTemplateArgExpr (T->getRowExpr ());
@@ -4302,7 +4301,7 @@ void CXXNameMangler::mangleType(const ObjCObjectType *T) {
43024301 StringRef name = I->getName ();
43034302 QualOS << name.size () << name;
43044303 }
4305- Out << ' U ' << QualStr. size () << QualStr;
4304+ mangleVendorQualifier ( QualStr) ;
43064305 }
43074306
43084307 mangleType (T->getBaseType ());
@@ -4436,8 +4435,6 @@ void CXXNameMangler::mangleType(const UnaryTransformType *T) {
44364435 // If this is dependent, we need to record that. If not, we simply
44374436 // mangle it as the underlying type since they are equivalent.
44384437 if (T->isDependentType ()) {
4439- Out << " u" ;
4440-
44414438 StringRef BuiltinName;
44424439 switch (T->getUTTKind ()) {
44434440#define TRANSFORM_TYPE_TRAIT_DEF (Enum, Trait ) \
@@ -4446,7 +4443,7 @@ void CXXNameMangler::mangleType(const UnaryTransformType *T) {
44464443 break ;
44474444#include " clang/Basic/TransformTypeTraits.def"
44484445 }
4449- Out << BuiltinName. size () << BuiltinName;
4446+ mangleVendorType ( BuiltinName) ;
44504447 }
44514448
44524449 Out << " I" ;
@@ -5311,9 +5308,8 @@ void CXXNameMangler::mangleExpression(const Expr *E, unsigned Arity,
53115308 // <expression> ::= u <source-name> <template-arg>* E # vendor extension
53125309 const TypeTraitExpr *TTE = cast<TypeTraitExpr>(E);
53135310 NotPrimaryExpr ();
5314- Out << ' u' ;
53155311 llvm::StringRef Spelling = getTraitSpelling (TTE->getTrait ());
5316- Out << Spelling. size () << Spelling;
5312+ mangleVendorType ( Spelling) ;
53175313 for (TypeSourceInfo *TSI : TTE->getArgs ()) {
53185314 mangleType (TSI->getType ());
53195315 }
0 commit comments