@@ -2784,6 +2784,29 @@ void CodeGenFunction::EmitTypeMetadataCodeForVCall(const CXXRecordDecl *RD,
2784
2784
}
2785
2785
}
2786
2786
2787
+ // / Converts the CFITypeCheckKind into SanitizerKind::SanitizerOrdinal and
2788
+ // / llvm::SanitizerStatKind.
2789
+ static std::pair<SanitizerKind::SanitizerOrdinal, llvm::SanitizerStatKind>
2790
+ SanitizerInfoFromCFICheckKind (CodeGenFunction::CFITypeCheckKind TCK) {
2791
+ switch (TCK) {
2792
+ case CodeGenFunction::CFITCK_VCall:
2793
+ return std::make_pair (SanitizerKind::SO_CFIVCall, llvm::SanStat_CFI_VCall);
2794
+ case CodeGenFunction::CFITCK_NVCall:
2795
+ return std::make_pair (SanitizerKind::SO_CFINVCall,
2796
+ llvm::SanStat_CFI_NVCall);
2797
+ case CodeGenFunction::CFITCK_DerivedCast:
2798
+ return std::make_pair (SanitizerKind::SO_CFIDerivedCast,
2799
+ llvm::SanStat_CFI_DerivedCast);
2800
+ case CodeGenFunction::CFITCK_UnrelatedCast:
2801
+ return std::make_pair (SanitizerKind::SO_CFIUnrelatedCast,
2802
+ llvm::SanStat_CFI_UnrelatedCast);
2803
+ case CodeGenFunction::CFITCK_ICall:
2804
+ case CodeGenFunction::CFITCK_NVMFCall:
2805
+ case CodeGenFunction::CFITCK_VMFCall:
2806
+ llvm_unreachable (" unexpected sanitizer kind" );
2807
+ }
2808
+ }
2809
+
2787
2810
void CodeGenFunction::EmitVTablePtrCheckForCall (const CXXRecordDecl *RD,
2788
2811
llvm::Value *VTable,
2789
2812
CFITypeCheckKind TCK,
@@ -2847,30 +2870,7 @@ void CodeGenFunction::EmitVTablePtrCheck(const CXXRecordDecl *RD,
2847
2870
!CGM.HasHiddenLTOVisibility (RD))
2848
2871
return ;
2849
2872
2850
- SanitizerKind::SanitizerOrdinal M;
2851
- llvm::SanitizerStatKind SSK;
2852
- switch (TCK) {
2853
- case CFITCK_VCall:
2854
- M = SanitizerKind::SO_CFIVCall;
2855
- SSK = llvm::SanStat_CFI_VCall;
2856
- break ;
2857
- case CFITCK_NVCall:
2858
- M = SanitizerKind::SO_CFINVCall;
2859
- SSK = llvm::SanStat_CFI_NVCall;
2860
- break ;
2861
- case CFITCK_DerivedCast:
2862
- M = SanitizerKind::SO_CFIDerivedCast;
2863
- SSK = llvm::SanStat_CFI_DerivedCast;
2864
- break ;
2865
- case CFITCK_UnrelatedCast:
2866
- M = SanitizerKind::SO_CFIUnrelatedCast;
2867
- SSK = llvm::SanStat_CFI_UnrelatedCast;
2868
- break ;
2869
- case CFITCK_ICall:
2870
- case CFITCK_NVMFCall:
2871
- case CFITCK_VMFCall:
2872
- llvm_unreachable (" unexpected sanitizer kind" );
2873
- }
2873
+ auto [M, SSK] = SanitizerInfoFromCFICheckKind (TCK);
2874
2874
2875
2875
std::string TypeName = RD->getQualifiedNameAsString ();
2876
2876
if (getContext ().getNoSanitizeList ().containsType (
0 commit comments