@@ -447,8 +447,8 @@ class MicrosoftCXXNameMangler {
447
447
void mangleDecayedArrayType (const ArrayType *T);
448
448
void mangleArrayType (const ArrayType *T);
449
449
void mangleFunctionClass (const FunctionDecl *FD);
450
- void mangleCallingConvention (CallingConv CC);
451
- void mangleCallingConvention (const FunctionType *T);
450
+ void mangleCallingConvention (CallingConv CC, SourceRange Range );
451
+ void mangleCallingConvention (const FunctionType *T, SourceRange Range );
452
452
void mangleIntegerLiteral (const llvm::APSInt &Number,
453
453
const NonTypeTemplateParmDecl *PD = nullptr ,
454
454
QualType TemplateArgType = QualType());
@@ -888,7 +888,8 @@ void MicrosoftCXXNameMangler::mangleVirtualMemPtrThunk(
888
888
Out << " $B" ;
889
889
mangleNumber (OffsetInVFTable);
890
890
Out << ' A' ;
891
- mangleCallingConvention (MD->getType ()->castAs <FunctionProtoType>());
891
+ mangleCallingConvention (MD->getType ()->castAs <FunctionProtoType>(),
892
+ MD->getSourceRange ());
892
893
}
893
894
894
895
void MicrosoftCXXNameMangler::mangleName (GlobalDecl GD) {
@@ -2768,7 +2769,7 @@ void MicrosoftCXXNameMangler::mangleFunctionType(const FunctionType *T,
2768
2769
mangleQualifiers (Quals, /* IsMember=*/ false );
2769
2770
}
2770
2771
2771
- mangleCallingConvention (CC);
2772
+ mangleCallingConvention (CC, Range );
2772
2773
2773
2774
// <return-type> ::= <type>
2774
2775
// ::= @ # structors (they have no declared return type)
@@ -2949,7 +2950,8 @@ void MicrosoftCXXNameMangler::mangleFunctionClass(const FunctionDecl *FD) {
2949
2950
Out << ' Y' ;
2950
2951
}
2951
2952
}
2952
- void MicrosoftCXXNameMangler::mangleCallingConvention (CallingConv CC) {
2953
+ void MicrosoftCXXNameMangler::mangleCallingConvention (CallingConv CC,
2954
+ SourceRange Range) {
2953
2955
// <calling-convention> ::= A # __cdecl
2954
2956
// ::= B # __export __cdecl
2955
2957
// ::= C # __pascal
@@ -2962,7 +2964,10 @@ void MicrosoftCXXNameMangler::mangleCallingConvention(CallingConv CC) {
2962
2964
// ::= J # __export __fastcall
2963
2965
// ::= Q # __vectorcall
2964
2966
// ::= S # __attribute__((__swiftcall__)) // Clang-only
2965
- // ::= T # __attribute__((__swiftasynccall__))
2967
+ // ::= W # __attribute__((__swiftasynccall__))
2968
+ // ::= U # __attribute__((__preserve_most__))
2969
+ // ::= V # __attribute__((__preserve_none__)) //
2970
+ // Clang-only
2966
2971
// // Clang-only
2967
2972
// ::= w # __regcall
2968
2973
// ::= x # __regcall4
@@ -2974,28 +2979,55 @@ void MicrosoftCXXNameMangler::mangleCallingConvention(CallingConv CC) {
2974
2979
2975
2980
switch (CC) {
2976
2981
default :
2977
- llvm_unreachable ( " Unsupported CC for mangling " ) ;
2982
+ break ;
2978
2983
case CC_Win64:
2979
2984
case CC_X86_64SysV:
2980
- case CC_C: Out << ' A' ; break ;
2981
- case CC_X86Pascal: Out << ' C' ; break ;
2982
- case CC_X86ThisCall: Out << ' E' ; break ;
2983
- case CC_X86StdCall: Out << ' G' ; break ;
2984
- case CC_X86FastCall: Out << ' I' ; break ;
2985
- case CC_X86VectorCall: Out << ' Q' ; break ;
2986
- case CC_Swift: Out << ' S' ; break ;
2987
- case CC_SwiftAsync: Out << ' W' ; break ;
2988
- case CC_PreserveMost: Out << ' U' ; break ;
2985
+ case CC_C:
2986
+ Out << ' A' ;
2987
+ return ;
2988
+ case CC_X86Pascal:
2989
+ Out << ' C' ;
2990
+ return ;
2991
+ case CC_X86ThisCall:
2992
+ Out << ' E' ;
2993
+ return ;
2994
+ case CC_X86StdCall:
2995
+ Out << ' G' ;
2996
+ return ;
2997
+ case CC_X86FastCall:
2998
+ Out << ' I' ;
2999
+ return ;
3000
+ case CC_X86VectorCall:
3001
+ Out << ' Q' ;
3002
+ return ;
3003
+ case CC_Swift:
3004
+ Out << ' S' ;
3005
+ return ;
3006
+ case CC_SwiftAsync:
3007
+ Out << ' W' ;
3008
+ return ;
3009
+ case CC_PreserveMost:
3010
+ Out << ' U' ;
3011
+ return ;
3012
+ case CC_PreserveNone:
3013
+ Out << ' V' ;
3014
+ return ;
2989
3015
case CC_X86RegCall:
2990
3016
if (getASTContext ().getLangOpts ().RegCall4 )
2991
3017
Out << " x" ;
2992
3018
else
2993
3019
Out << " w" ;
2994
- break ;
3020
+ return ;
2995
3021
}
3022
+
3023
+ DiagnosticsEngine &Diags = Context.getDiags ();
3024
+ unsigned DiagID = Diags.getCustomDiagID (
3025
+ DiagnosticsEngine::Error, " cannot mangle this calling convention yet" );
3026
+ Diags.Report (Range.getBegin (), DiagID) << Range;
2996
3027
}
2997
- void MicrosoftCXXNameMangler::mangleCallingConvention (const FunctionType *T) {
2998
- mangleCallingConvention (T->getCallConv ());
3028
+ void MicrosoftCXXNameMangler::mangleCallingConvention (const FunctionType *T,
3029
+ SourceRange Range) {
3030
+ mangleCallingConvention (T->getCallConv (), Range);
2999
3031
}
3000
3032
3001
3033
void MicrosoftCXXNameMangler::mangleThrowSpecification (
0 commit comments