diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp index befbfc64a680c..ba7b7099023c0 100644 --- a/clang/lib/CodeGen/CGClass.cpp +++ b/clang/lib/CodeGen/CGClass.cpp @@ -2779,6 +2779,29 @@ void CodeGenFunction::EmitTypeMetadataCodeForVCall(const CXXRecordDecl *RD, } } +/// Converts the CFITypeCheckKind into SanitizerKind::SanitizerOrdinal and +/// llvm::SanitizerStatKind. +static std::pair +SanitizerInfoFromCFICheckKind(CodeGenFunction::CFITypeCheckKind TCK) { + switch (TCK) { + case CodeGenFunction::CFITCK_VCall: + return std::make_pair(SanitizerKind::SO_CFIVCall, llvm::SanStat_CFI_VCall); + case CodeGenFunction::CFITCK_NVCall: + return std::make_pair(SanitizerKind::SO_CFINVCall, + llvm::SanStat_CFI_NVCall); + case CodeGenFunction::CFITCK_DerivedCast: + return std::make_pair(SanitizerKind::SO_CFIDerivedCast, + llvm::SanStat_CFI_DerivedCast); + case CodeGenFunction::CFITCK_UnrelatedCast: + return std::make_pair(SanitizerKind::SO_CFIUnrelatedCast, + llvm::SanStat_CFI_UnrelatedCast); + case CodeGenFunction::CFITCK_ICall: + case CodeGenFunction::CFITCK_NVMFCall: + case CodeGenFunction::CFITCK_VMFCall: + llvm_unreachable("unexpected sanitizer kind"); + } +} + void CodeGenFunction::EmitVTablePtrCheckForCall(const CXXRecordDecl *RD, llvm::Value *VTable, CFITypeCheckKind TCK, @@ -2842,30 +2865,7 @@ void CodeGenFunction::EmitVTablePtrCheck(const CXXRecordDecl *RD, !CGM.HasHiddenLTOVisibility(RD)) return; - SanitizerKind::SanitizerOrdinal M; - llvm::SanitizerStatKind SSK; - switch (TCK) { - case CFITCK_VCall: - M = SanitizerKind::SO_CFIVCall; - SSK = llvm::SanStat_CFI_VCall; - break; - case CFITCK_NVCall: - M = SanitizerKind::SO_CFINVCall; - SSK = llvm::SanStat_CFI_NVCall; - break; - case CFITCK_DerivedCast: - M = SanitizerKind::SO_CFIDerivedCast; - SSK = llvm::SanStat_CFI_DerivedCast; - break; - case CFITCK_UnrelatedCast: - M = SanitizerKind::SO_CFIUnrelatedCast; - SSK = llvm::SanStat_CFI_UnrelatedCast; - break; - case CFITCK_ICall: - case CFITCK_NVMFCall: - case CFITCK_VMFCall: - llvm_unreachable("unexpected sanitizer kind"); - } + auto [M, SSK] = SanitizerInfoFromCFICheckKind(TCK); std::string TypeName = RD->getQualifiedNameAsString(); if (getContext().getNoSanitizeList().containsType(