[compiler-rt] [rtsan] Remove std::variant from rtsan diagnostics (PR #109786)
via llvm-commits
llvm-commits at lists.llvm.org
Tue Sep 24 06:31:00 PDT 2024
https://github.com/davidtrevelyan updated https://github.com/llvm/llvm-project/pull/109786
>From 39fd64409fc0982555ada0691d5bfba58ed73a64 Mon Sep 17 00:00:00 2001
From: David Trevelyan <david.trevelyan at gmail.com>
Date: Tue, 24 Sep 2024 13:05:23 +0100
Subject: [PATCH 1/2] [rtsan] Remove std::variant from rtsan diagnostics
---
compiler-rt/lib/rtsan/rtsan.cpp | 6 ++-
compiler-rt/lib/rtsan/rtsan_diagnostics.cpp | 58 ++++++++++-----------
compiler-rt/lib/rtsan/rtsan_diagnostics.h | 19 ++-----
3 files changed, 37 insertions(+), 46 deletions(-)
diff --git a/compiler-rt/lib/rtsan/rtsan.cpp b/compiler-rt/lib/rtsan/rtsan.cpp
index 2afdf3c76696e7..b288da64ffbe25 100644
--- a/compiler-rt/lib/rtsan/rtsan.cpp
+++ b/compiler-rt/lib/rtsan/rtsan.cpp
@@ -87,7 +87,8 @@ __rtsan_notify_intercepted_call(const char *func_name) {
GET_CALLER_PC_BP;
ExpectNotRealtime(
GetContextForThisThread(),
- PrintDiagnosticsAndDieAction({InterceptedCallInfo{func_name}, pc, bp}));
+ PrintDiagnosticsAndDieAction(
+ {DiagnosticsInfoType::InterceptedCall, func_name, pc, bp}));
}
SANITIZER_INTERFACE_ATTRIBUTE void
@@ -96,7 +97,8 @@ __rtsan_notify_blocking_call(const char *func_name) {
GET_CALLER_PC_BP;
ExpectNotRealtime(
GetContextForThisThread(),
- PrintDiagnosticsAndDieAction({BlockingCallInfo{func_name}, pc, bp}));
+ PrintDiagnosticsAndDieAction(
+ {DiagnosticsInfoType::BlockingCall, func_name, pc, bp}));
}
} // extern "C"
diff --git a/compiler-rt/lib/rtsan/rtsan_diagnostics.cpp b/compiler-rt/lib/rtsan/rtsan_diagnostics.cpp
index ac13b0743be069..839b3f047bccd4 100644
--- a/compiler-rt/lib/rtsan/rtsan_diagnostics.cpp
+++ b/compiler-rt/lib/rtsan/rtsan_diagnostics.cpp
@@ -37,12 +37,6 @@ class Decorator : public __sanitizer::SanitizerCommonDecorator {
const char *FunctionName() const { return Green(); }
const char *Reason() const { return Blue(); }
};
-
-template <class... Ts> struct Overloaded : Ts... {
- using Ts::operator()...;
-};
-// TODO: Remove below when c++20
-template <class... Ts> Overloaded(Ts...) -> Overloaded<Ts...>;
} // namespace
static void PrintStackTrace(uptr pc, uptr bp) {
@@ -53,35 +47,39 @@ static void PrintStackTrace(uptr pc, uptr bp) {
}
static void PrintError(const Decorator &decorator,
- const DiagnosticsCallerInfo &info) {
- const char *violation_type = std::visit(
- Overloaded{
- [](const InterceptedCallInfo &) { return "unsafe-library-call"; },
- [](const BlockingCallInfo &) { return "blocking-call"; }},
- info);
+ const DiagnosticsInfo &info) {
+ const auto error_type_str = [&info]() -> const char * {
+ switch (info.type) {
+ case DiagnosticsInfoType::InterceptedCall:
+ return "unsafe-library-call";
+ case DiagnosticsInfoType::BlockingCall:
+ return "blocking-call";
+ }
+ return "(unknown error)";
+ };
Printf("%s", decorator.Error());
- Report("ERROR: RealtimeSanitizer: %s\n", violation_type);
+ Report("ERROR: RealtimeSanitizer: %s\n", error_type_str());
}
static void PrintReason(const Decorator &decorator,
- const DiagnosticsCallerInfo &info) {
+ const DiagnosticsInfo &info) {
Printf("%s", decorator.Reason());
- std::visit(
- Overloaded{[decorator](const InterceptedCallInfo &call) {
- Printf("Intercepted call to real-time unsafe function "
- "`%s%s%s` in real-time context!",
- decorator.FunctionName(),
- call.intercepted_function_name_, decorator.Reason());
- },
- [decorator](const BlockingCallInfo &arg) {
- Printf("Call to blocking function "
- "`%s%s%s` in real-time context!",
- decorator.FunctionName(), arg.blocking_function_name_,
- decorator.Reason());
- }},
- info);
+ switch (info.type) {
+ case DiagnosticsInfoType::InterceptedCall: {
+ Printf("Intercepted call to real-time unsafe function "
+ "`%s%s%s` in real-time context!",
+ decorator.FunctionName(), info.func_name, decorator.Reason());
+ break;
+ }
+ case DiagnosticsInfoType::BlockingCall: {
+ Printf("Call to blocking function "
+ "`%s%s%s` in real-time context!",
+ decorator.FunctionName(), info.func_name, decorator.Reason());
+ break;
+ }
+ }
Printf("\n");
}
@@ -90,8 +88,8 @@ void __rtsan::PrintDiagnostics(const DiagnosticsInfo &info) {
ScopedErrorReportLock l;
Decorator d;
- PrintError(d, info.call_info);
- PrintReason(d, info.call_info);
+ PrintError(d, info);
+ PrintReason(d, info);
Printf("%s", d.Default());
PrintStackTrace(info.pc, info.bp);
}
diff --git a/compiler-rt/lib/rtsan/rtsan_diagnostics.h b/compiler-rt/lib/rtsan/rtsan_diagnostics.h
index 8aec512584b309..f8a6b8a954a24a 100644
--- a/compiler-rt/lib/rtsan/rtsan_diagnostics.h
+++ b/compiler-rt/lib/rtsan/rtsan_diagnostics.h
@@ -15,25 +15,16 @@
#include "sanitizer_common/sanitizer_common.h"
#include "sanitizer_common/sanitizer_internal_defs.h"
-#include <variant>
-
namespace __rtsan {
-struct InterceptedCallInfo {
- const char *intercepted_function_name_;
-};
-
-struct BlockingCallInfo {
-public:
- const char *blocking_function_name_;
+enum class DiagnosticsInfoType {
+ InterceptedCall,
+ BlockingCall,
};
-using DiagnosticsCallerInfo =
- std::variant<InterceptedCallInfo, BlockingCallInfo>;
-
struct DiagnosticsInfo {
- DiagnosticsCallerInfo call_info;
-
+ DiagnosticsInfoType type;
+ const char *func_name;
__sanitizer::uptr pc;
__sanitizer::uptr bp;
};
>From beabb25a2ef4781b4c940c2a0301b7ab47728928 Mon Sep 17 00:00:00 2001
From: David Trevelyan <david.trevelyan at gmail.com>
Date: Tue, 24 Sep 2024 14:30:42 +0100
Subject: [PATCH 2/2] [rtsan] Change lambda name style to PascalCase
---
compiler-rt/lib/rtsan/rtsan_diagnostics.cpp | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/compiler-rt/lib/rtsan/rtsan_diagnostics.cpp b/compiler-rt/lib/rtsan/rtsan_diagnostics.cpp
index 839b3f047bccd4..f82001f5b2057c 100644
--- a/compiler-rt/lib/rtsan/rtsan_diagnostics.cpp
+++ b/compiler-rt/lib/rtsan/rtsan_diagnostics.cpp
@@ -48,7 +48,7 @@ static void PrintStackTrace(uptr pc, uptr bp) {
static void PrintError(const Decorator &decorator,
const DiagnosticsInfo &info) {
- const auto error_type_str = [&info]() -> const char * {
+ const auto ErrorTypeStr = [&info]() -> const char * {
switch (info.type) {
case DiagnosticsInfoType::InterceptedCall:
return "unsafe-library-call";
@@ -59,7 +59,7 @@ static void PrintError(const Decorator &decorator,
};
Printf("%s", decorator.Error());
- Report("ERROR: RealtimeSanitizer: %s\n", error_type_str());
+ Report("ERROR: RealtimeSanitizer: %s\n", ErrorTypeStr());
}
static void PrintReason(const Decorator &decorator,
More information about the llvm-commits
mailing list