[clang] [NFCI] Refactor into 'ParseCFITypeCheckKind' (PR #140117)
Thurston Dang via cfe-commits
cfe-commits at lists.llvm.org
Thu May 15 12:41:46 PDT 2025
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 <thurston at 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 <thurston at 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]".
More information about the cfe-commits
mailing list