llvmbot wrote:
<!--LLVM PR SUMMARY COMMENT--> @llvm/pr-subscribers-clang-codegen @llvm/pr-subscribers-clang Author: Thurston Dang (thurstond) <details> <summary>Changes</summary> This refactors existing code into a 'ParseCFITypeCheckKind' helper function. This will be useful in future work to annotate CFI checks with debug info (https://github.com/llvm/llvm-project/pull/139809). --- Full diff: https://github.com/llvm/llvm-project/pull/140117.diff 2 Files Affected: - (modified) clang/lib/CodeGen/CGClass.cpp (+32-24) - (modified) clang/lib/CodeGen/CodeGenFunction.h (+5) ``````````diff diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp index befbfc64a680c..3e2725ab06da7 100644 --- a/clang/lib/CodeGen/CGClass.cpp +++ b/clang/lib/CodeGen/CGClass.cpp @@ -2779,6 +2779,37 @@ void CodeGenFunction::EmitTypeMetadataCodeForVCall(const CXXRecordDecl *RD, } } +std::pair<SanitizerKind::SanitizerOrdinal, llvm::SanitizerStatKind> +CodeGenFunction::ParseCFITypeCheckKind(CFITypeCheckKind TCK) { + 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"); + } + + return std::make_pair(M, SSK); +} + void CodeGenFunction::EmitVTablePtrCheckForCall(const CXXRecordDecl *RD, llvm::Value *VTable, CFITypeCheckKind TCK, @@ -2842,30 +2873,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] = ParseCFITypeCheckKind(TCK); std::string TypeName = RD->getQualifiedNameAsString(); if (getContext().getNoSanitizeList().containsType( diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h index 7104303cba50e..aac4f0664273e 100644 --- a/clang/lib/CodeGen/CodeGenFunction.h +++ b/clang/lib/CodeGen/CodeGenFunction.h @@ -3358,6 +3358,11 @@ class CodeGenFunction : public CodeGenTypeCache { SanitizerSet SkippedChecks = SanitizerSet(), llvm::Value *ArraySize = nullptr); + /// Converts the CFITypeCheckKind into SanitizerKind::SanitizerOrdinal and + /// llvm::SanitizerStatKind. + static std::pair<SanitizerKind::SanitizerOrdinal, llvm::SanitizerStatKind> + ParseCFITypeCheckKind(CFITypeCheckKind TCK); + /// Emit a check that \p Base points into an array object, which /// we can access at index \p Index. \p Accessed should be \c false if we /// this expression is used as an lvalue, for instance in "&Arr[Idx]". `````````` </details> https://github.com/llvm/llvm-project/pull/140117 _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits