summaryrefslogtreecommitdiff
path: root/clang/lib/CodeGen/CGClass.cpp
diff options
context:
space:
mode:
authorThurston Dang <thurston@google.com>2025-05-15 16:59:38 -0700
committerGitHub <noreply@github.com>2025-05-15 16:59:38 -0700
commitb07e19fe5d0521bf0652bd073a6cedc0c4984f2b (patch)
tree470d64e5198aa8adc8914c6d5aa343270edb2005 /clang/lib/CodeGen/CGClass.cpp
parent6d7b5c3742165d35100adc1605220b590c93ef89 (diff)
[NFCI][cfi] Refactor into 'SanitizerInfoFromCFICheckKind' (#140117)
This refactors existing code into a 'SanitizerInfoFromCFICheckKind' helper function. This will be useful in future work to annotate CFI checks with debug info (https://github.com/llvm/llvm-project/pull/139809).
Diffstat (limited to 'clang/lib/CodeGen/CGClass.cpp')
-rw-r--r--clang/lib/CodeGen/CGClass.cpp48
1 files changed, 24 insertions, 24 deletions
diff --git a/clang/lib/CodeGen/CGClass.cpp b/clang/lib/CodeGen/CGClass.cpp
index 44062739d5dd..7710b1aee6f2 100644
--- a/clang/lib/CodeGen/CGClass.cpp
+++ b/clang/lib/CodeGen/CGClass.cpp
@@ -2784,6 +2784,29 @@ void CodeGenFunction::EmitTypeMetadataCodeForVCall(const CXXRecordDecl *RD,
}
}
+/// Converts the CFITypeCheckKind into SanitizerKind::SanitizerOrdinal and
+/// llvm::SanitizerStatKind.
+static std::pair<SanitizerKind::SanitizerOrdinal, llvm::SanitizerStatKind>
+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,
@@ -2847,30 +2870,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(