[sanitizer][NFCI] Add 'SanitizerAnnotateDebugInfo' (#139965)
This generalizes the debug info annotation code from https://github.com/llvm/llvm-project/pull/139149 and moves it into a helper function, SanitizerAnnotateDebugInfo().
Future work can use 'ApplyDebugLocation ApplyTrapDI(*this, SanitizerAnnotateDebugInfo(Ordinal));' to add annotations to additional checks.
diff --git a/clang/lib/CodeGen/CGExpr.cpp b/clang/lib/CodeGen/CGExpr.cpp
index ec01c87..37a5678 100644
--- a/clang/lib/CodeGen/CGExpr.cpp
+++ b/clang/lib/CodeGen/CGExpr.cpp
@@ -1226,16 +1226,8 @@
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 @@
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 fa4ceaf..7104303 100644
--- a/clang/lib/CodeGen/CodeGenFunction.h
+++ b/clang/lib/CodeGen/CodeGenFunction.h
@@ -2816,6 +2816,11 @@
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 {