https://github.com/thurstond updated https://github.com/llvm/llvm-project/pull/140117
>From 97c6fe5ac09e5ad7663de556753d5e31c05f7aa5 Mon Sep 17 00:00:00 2001 From: Thurston Dang <thurs...@google.com> Date: Thu, 15 May 2025 18:22:05 +0000 Subject: [PATCH 1/2] [NFCI] Refactor into 'ParseCFITypeCheckKind' 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). --- clang/lib/CodeGen/CGClass.cpp | 56 ++++++++++++++++------------- clang/lib/CodeGen/CodeGenFunction.h | 5 +++ 2 files changed, 37 insertions(+), 24 deletions(-) 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]". >From 94e06467d81379a91fce284b7ab6903082f2b736 Mon Sep 17 00:00:00 2001 From: Thurston Dang <thurs...@google.com> Date: Thu, 15 May 2025 19:36:00 +0000 Subject: [PATCH 2/2] Remove static function from header --- clang/lib/CodeGen/CGClass.cpp | 20 +++++++++++--------- clang/lib/CodeGen/CodeGenFunction.h | 5 ----- 2 files changed, 11 insertions(+), 14 deletions(-) diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp index 3e2725ab06da7..dc9ace6cfacdc 100644 --- a/clang/lib/CodeGen/CGClass.cpp +++ b/clang/lib/CodeGen/CGClass.cpp @@ -2779,31 +2779,33 @@ void CodeGenFunction::EmitTypeMetadataCodeForVCall(const CXXRecordDecl *RD, } } -std::pair<SanitizerKind::SanitizerOrdinal, llvm::SanitizerStatKind> -CodeGenFunction::ParseCFITypeCheckKind(CFITypeCheckKind TCK) { +/// Converts the CFITypeCheckKind into SanitizerKind::SanitizerOrdinal and +/// llvm::SanitizerStatKind. +static std::pair<SanitizerKind::SanitizerOrdinal, llvm::SanitizerStatKind> +ParseCFITypeCheckKind(CodeGenFunction::CFITypeCheckKind TCK) { SanitizerKind::SanitizerOrdinal M; llvm::SanitizerStatKind SSK; switch (TCK) { - case CFITCK_VCall: + case CodeGenFunction::CFITCK_VCall: M = SanitizerKind::SO_CFIVCall; SSK = llvm::SanStat_CFI_VCall; break; - case CFITCK_NVCall: + case CodeGenFunction::CFITCK_NVCall: M = SanitizerKind::SO_CFINVCall; SSK = llvm::SanStat_CFI_NVCall; break; - case CFITCK_DerivedCast: + case CodeGenFunction::CFITCK_DerivedCast: M = SanitizerKind::SO_CFIDerivedCast; SSK = llvm::SanStat_CFI_DerivedCast; break; - case CFITCK_UnrelatedCast: + case CodeGenFunction::CFITCK_UnrelatedCast: M = SanitizerKind::SO_CFIUnrelatedCast; SSK = llvm::SanStat_CFI_UnrelatedCast; break; - case CFITCK_ICall: - case CFITCK_NVMFCall: - case CFITCK_VMFCall: + case CodeGenFunction::CFITCK_ICall: + case CodeGenFunction::CFITCK_NVMFCall: + case CodeGenFunction::CFITCK_VMFCall: llvm_unreachable("unexpected sanitizer kind"); } diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h index aac4f0664273e..7104303cba50e 100644 --- a/clang/lib/CodeGen/CodeGenFunction.h +++ b/clang/lib/CodeGen/CodeGenFunction.h @@ -3358,11 +3358,6 @@ 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]". _______________________________________________ cfe-commits mailing list cfe-commits@lists.llvm.org https://lists.llvm.org/cgi-bin/mailman/listinfo/cfe-commits