@@ -2784,6 +2784,29 @@ void CodeGenFunction::EmitTypeMetadataCodeForVCall(const CXXRecordDecl *RD,
27842784 }
27852785}
27862786
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+
27872810void CodeGenFunction::EmitVTablePtrCheckForCall (const CXXRecordDecl *RD,
27882811 llvm::Value *VTable,
27892812 CFITypeCheckKind TCK,
@@ -2847,30 +2870,7 @@ void CodeGenFunction::EmitVTablePtrCheck(const CXXRecordDecl *RD,
28472870 !CGM.HasHiddenLTOVisibility (RD))
28482871 return ;
28492872
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);
28742874
28752875 std::string TypeName = RD->getQualifiedNameAsString ();
28762876 if (getContext ().getNoSanitizeList ().containsType (
0 commit comments