Skip to content

Commit 97c6fe5

Browse files
committed
[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 (llvm#139809).
1 parent 58b9b86 commit 97c6fe5

File tree

2 files changed

+37
-24
lines changed

2 files changed

+37
-24
lines changed

clang/lib/CodeGen/CGClass.cpp

Lines changed: 32 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -2779,6 +2779,37 @@ void CodeGenFunction::EmitTypeMetadataCodeForVCall(const CXXRecordDecl *RD,
27792779
}
27802780
}
27812781

2782+
std::pair<SanitizerKind::SanitizerOrdinal, llvm::SanitizerStatKind>
2783+
CodeGenFunction::ParseCFITypeCheckKind(CFITypeCheckKind TCK) {
2784+
SanitizerKind::SanitizerOrdinal M;
2785+
llvm::SanitizerStatKind SSK;
2786+
2787+
switch (TCK) {
2788+
case CFITCK_VCall:
2789+
M = SanitizerKind::SO_CFIVCall;
2790+
SSK = llvm::SanStat_CFI_VCall;
2791+
break;
2792+
case CFITCK_NVCall:
2793+
M = SanitizerKind::SO_CFINVCall;
2794+
SSK = llvm::SanStat_CFI_NVCall;
2795+
break;
2796+
case CFITCK_DerivedCast:
2797+
M = SanitizerKind::SO_CFIDerivedCast;
2798+
SSK = llvm::SanStat_CFI_DerivedCast;
2799+
break;
2800+
case CFITCK_UnrelatedCast:
2801+
M = SanitizerKind::SO_CFIUnrelatedCast;
2802+
SSK = llvm::SanStat_CFI_UnrelatedCast;
2803+
break;
2804+
case CFITCK_ICall:
2805+
case CFITCK_NVMFCall:
2806+
case CFITCK_VMFCall:
2807+
llvm_unreachable("unexpected sanitizer kind");
2808+
}
2809+
2810+
return std::make_pair(M, SSK);
2811+
}
2812+
27822813
void CodeGenFunction::EmitVTablePtrCheckForCall(const CXXRecordDecl *RD,
27832814
llvm::Value *VTable,
27842815
CFITypeCheckKind TCK,
@@ -2842,30 +2873,7 @@ void CodeGenFunction::EmitVTablePtrCheck(const CXXRecordDecl *RD,
28422873
!CGM.HasHiddenLTOVisibility(RD))
28432874
return;
28442875

2845-
SanitizerKind::SanitizerOrdinal M;
2846-
llvm::SanitizerStatKind SSK;
2847-
switch (TCK) {
2848-
case CFITCK_VCall:
2849-
M = SanitizerKind::SO_CFIVCall;
2850-
SSK = llvm::SanStat_CFI_VCall;
2851-
break;
2852-
case CFITCK_NVCall:
2853-
M = SanitizerKind::SO_CFINVCall;
2854-
SSK = llvm::SanStat_CFI_NVCall;
2855-
break;
2856-
case CFITCK_DerivedCast:
2857-
M = SanitizerKind::SO_CFIDerivedCast;
2858-
SSK = llvm::SanStat_CFI_DerivedCast;
2859-
break;
2860-
case CFITCK_UnrelatedCast:
2861-
M = SanitizerKind::SO_CFIUnrelatedCast;
2862-
SSK = llvm::SanStat_CFI_UnrelatedCast;
2863-
break;
2864-
case CFITCK_ICall:
2865-
case CFITCK_NVMFCall:
2866-
case CFITCK_VMFCall:
2867-
llvm_unreachable("unexpected sanitizer kind");
2868-
}
2876+
auto [M, SSK] = ParseCFITypeCheckKind(TCK);
28692877

28702878
std::string TypeName = RD->getQualifiedNameAsString();
28712879
if (getContext().getNoSanitizeList().containsType(

clang/lib/CodeGen/CodeGenFunction.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3358,6 +3358,11 @@ class CodeGenFunction : public CodeGenTypeCache {
33583358
SanitizerSet SkippedChecks = SanitizerSet(),
33593359
llvm::Value *ArraySize = nullptr);
33603360

3361+
/// Converts the CFITypeCheckKind into SanitizerKind::SanitizerOrdinal and
3362+
/// llvm::SanitizerStatKind.
3363+
static std::pair<SanitizerKind::SanitizerOrdinal, llvm::SanitizerStatKind>
3364+
ParseCFITypeCheckKind(CFITypeCheckKind TCK);
3365+
33613366
/// Emit a check that \p Base points into an array object, which
33623367
/// we can access at index \p Index. \p Accessed should be \c false if we
33633368
/// this expression is used as an lvalue, for instance in "&Arr[Idx]".

0 commit comments

Comments
 (0)