-
Notifications
You must be signed in to change notification settings - Fork 14.1k
[sanitizer][NFCI] Add 'SanitizerAnnotateDebugInfo' #139965
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Conversation
This generalizes the debug info annotation code from llvm#139149 and moves it into a helper function, SanitizerAnnotateDebugInfo(). Future work can use 'ApplyDebugLocation ApplyTrapDI(*this, SanitizerAnnotateDebugInfo(Ordinal));' to add annotations to additional checks.
@llvm/pr-subscribers-clang @llvm/pr-subscribers-clang-codegen Author: Thurston Dang (thurstond) ChangesThis generalizes the debug info annotation code from #139149 and moves it into a helper function, SanitizerAnnotateDebugInfo(). Future work can use 'ApplyDebugLocation ApplyTrapDI(*this, SanitizerAnnotateDebugInfo(Ordinal));' to add annotations to additional checks. Full diff: https://github.com/llvm/llvm-project/pull/139965.diff 2 Files Affected:
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp
index ec01c87c13b1d..37a5678aa61d5 100644
--- a/clang/lib/CodeGen/CGExpr.cpp
+++ b/clang/lib/CodeGen/CGExpr.cpp
@@ -1226,16 +1226,8 @@ void CodeGenFunction::EmitBoundsCheckImpl(const Expr *E, llvm::Value *Bound,
SanitizerScope SanScope(this);
- llvm::DILocation *CheckDI = Builder.getCurrentDebugLocation();
auto CheckKind = SanitizerKind::SO_ArrayBounds;
- // TODO: deprecate ClArrayBoundsPseudoFn
- if ((ClArrayBoundsPseudoFn ||
- CGM.getCodeGenOpts().SanitizeAnnotateDebugInfo.has(CheckKind)) &&
- CheckDI) {
- CheckDI = getDebugInfo()->CreateSyntheticInlineAt(
- Builder.getCurrentDebugLocation(), "__ubsan_check_array_bounds");
- }
- ApplyDebugLocation ApplyTrapDI(*this, CheckDI);
+ ApplyDebugLocation ApplyTrapDI(*this, SanitizerAnnotateDebugInfo(CheckKind));
bool IndexSigned = IndexType->isSignedIntegerOrEnumerationType();
llvm::Value *IndexVal = Builder.CreateIntCast(Index, SizeTy, IndexSigned);
@@ -1252,6 +1244,35 @@ void CodeGenFunction::EmitBoundsCheckImpl(const Expr *E, llvm::Value *Bound,
StaticData, Index);
}
+llvm::DILocation *CodeGenFunction::SanitizerAnnotateDebugInfo(
+ SanitizerKind::SanitizerOrdinal CheckKindOrdinal) {
+ std::string Label;
+ switch (CheckKindOrdinal) {
+#define SANITIZER(NAME, ID) \
+ case SanitizerKind::SO_##ID: \
+ Label = "__ubsan_check_" NAME; \
+ break;
+#include "clang/Basic/Sanitizers.def"
+ default:
+ llvm_unreachable("unexpected sanitizer kind");
+ }
+
+ // Sanitize label
+ for (unsigned int i = 0; i < Label.length(); i++)
+ if (!std::isalpha(Label[i]))
+ Label[i] = '_';
+
+ llvm::DILocation *CheckDI = Builder.getCurrentDebugLocation();
+ // TODO: deprecate ClArrayBoundsPseudoFn
+ if (((ClArrayBoundsPseudoFn &&
+ CheckKindOrdinal == SanitizerKind::SO_ArrayBounds) ||
+ CGM.getCodeGenOpts().SanitizeAnnotateDebugInfo.has(CheckKindOrdinal)) &&
+ CheckDI)
+ CheckDI = getDebugInfo()->CreateSyntheticInlineAt(CheckDI, Label);
+
+ return CheckDI;
+}
+
CodeGenFunction::ComplexPairTy CodeGenFunction::
EmitComplexPrePostIncDec(const UnaryOperator *E, LValue LV,
bool isInc, bool isPre) {
diff --git a/clang/lib/CodeGen/CodeGenFunction.h b/clang/lib/CodeGen/CodeGenFunction.h
index fa4ceafc41893..7104303cba50e 100644
--- a/clang/lib/CodeGen/CodeGenFunction.h
+++ b/clang/lib/CodeGen/CodeGenFunction.h
@@ -2816,6 +2816,11 @@ class CodeGenFunction : public CodeGenTypeCache {
void emitStoresForInitAfterBZero(llvm::Constant *Init, Address Loc,
bool isVolatile, bool IsAutoInit);
+ /// Returns debug info, with additional annotation if enabled by
+ /// CGM.getCodeGenOpts().SanitizeAnnotateDebugInfo[CheckKindOrdinal].
+ llvm::DILocation *
+ SanitizerAnnotateDebugInfo(SanitizerKind::SanitizerOrdinal CheckKindOrdinal);
+
public:
// Captures all the allocas created during the scope of its RAII object.
struct AllocaTrackerRAII {
|
…cks (#139809) This connects the -fsanitize-annotate-debug-info plumbing (#138577) to CFI check codegen, using SanitizerAnnotateDebugInfo() (#139965) and SanitizerInfoFromCFIKind (#140117). Note: SanitizerAnnotateDebugInfo() is updated to a public function because it is needed in ItaniumCXXABI. Updates the tests from #139149.
…for CFI checks (#139809) This connects the -fsanitize-annotate-debug-info plumbing (llvm/llvm-project#138577) to CFI check codegen, using SanitizerAnnotateDebugInfo() (llvm/llvm-project#139965) and SanitizerInfoFromCFIKind (llvm/llvm-project#140117). Note: SanitizerAnnotateDebugInfo() is updated to a public function because it is needed in ItaniumCXXABI. Updates the tests from llvm/llvm-project#139149.
…cks (llvm#139809) This connects the -fsanitize-annotate-debug-info plumbing (llvm#138577) to CFI check codegen, using SanitizerAnnotateDebugInfo() (llvm#139965) and SanitizerInfoFromCFIKind (llvm#140117). Note: SanitizerAnnotateDebugInfo() is updated to a public function because it is needed in ItaniumCXXABI. Updates the tests from llvm#139149.
…cks (llvm#139809) This connects the -fsanitize-annotate-debug-info plumbing (llvm#138577) to CFI check codegen, using SanitizerAnnotateDebugInfo() (llvm#139965) and SanitizerInfoFromCFIKind (llvm#140117). Note: SanitizerAnnotateDebugInfo() is updated to a public function because it is needed in ItaniumCXXABI. Updates the tests from llvm#139149.
This generalizes the debug info annotation code from #139149 and moves it into a helper function, SanitizerAnnotateDebugInfo().
Future work can use 'ApplyDebugLocation ApplyTrapDI(*this, SanitizerAnnotateDebugInfo(Ordinal));' to add annotations to additional checks.