[compiler-rt] 3a7861e - [NFC][asan] Track current dynamic init module (#101597)
via llvm-commits
llvm-commits at lists.llvm.org
Sat Aug 3 12:56:07 PDT 2024
Author: Vitaly Buka
Date: 2024-08-03T12:56:04-07:00
New Revision: 3a7861ee2381bc3b60b906411f67a719b5d4292a
URL: https://github.com/llvm/llvm-project/commit/3a7861ee2381bc3b60b906411f67a719b5d4292a
DIFF: https://github.com/llvm/llvm-project/commit/3a7861ee2381bc3b60b906411f67a719b5d4292a.diff
LOG: [NFC][asan] Track current dynamic init module (#101597)
This patch allows sequences like:
`__asan_before_dynamic_init`
`__asan_before_dynamic_init`
...
`__asan_before_dynamic_init`
to do minimal incrementa poisoning.
It's NFC as now callbacks invokes in pairs:
`__asan_before_dynamic_init`
`__asan_after_dynamic_init`
`__asan_before_dynamic_init`
`__asan_after_dynamic_init`
and `__asan_after_dynamic_init` unpoisons
everything anyway.
For #101837
Added:
Modified:
compiler-rt/lib/asan/asan_globals.cpp
Removed:
################################################################################
diff --git a/compiler-rt/lib/asan/asan_globals.cpp b/compiler-rt/lib/asan/asan_globals.cpp
index b45c79d325448..293e771e1dc06 100644
--- a/compiler-rt/lib/asan/asan_globals.cpp
+++ b/compiler-rt/lib/asan/asan_globals.cpp
@@ -70,6 +70,9 @@ static ListOfGlobals &GlobalsByIndicator(uptr odr_indicator)
return (*globals_by_indicator)[odr_indicator];
}
+static const char *current_dynamic_init_module_name
+ SANITIZER_GUARDED_BY(mu_for_globals) = nullptr;
+
using DynInitGlobalsByModule =
DenseMap<const char *, IntrusiveList<DynInitGlobal>>;
@@ -492,18 +495,29 @@ void __asan_before_dynamic_init(const char *module_name) {
CHECK(module_name);
CHECK(AsanInited());
Lock lock(&mu_for_globals);
+ if (current_dynamic_init_module_name == module_name)
+ return;
if (flags()->report_globals >= 3)
Printf("DynInitPoison module: %s\n", module_name);
- DynInitGlobals().forEach([&](auto &kv) {
- if (kv.first != module_name) {
- PoisonDynamicGlobals(kv.second);
- } else {
- UnpoisonDynamicGlobals(kv.second,
- /*mark_initialized=*/!strict_init_order);
- }
- return true;
- });
+ if (current_dynamic_init_module_name == nullptr) {
+ // First call, poison all globals from other modules.
+ DynInitGlobals().forEach([&](auto &kv) {
+ if (kv.first != module_name) {
+ PoisonDynamicGlobals(kv.second);
+ } else {
+ UnpoisonDynamicGlobals(kv.second,
+ /*mark_initialized=*/!strict_init_order);
+ }
+ return true;
+ });
+ } else {
+ // Module changed.
+ PoisonDynamicGlobals(DynInitGlobals()[current_dynamic_init_module_name]);
+ UnpoisonDynamicGlobals(DynInitGlobals()[module_name],
+ /*mark_initialized=*/!strict_init_order);
+ }
+ current_dynamic_init_module_name = module_name;
}
// This method runs immediately after dynamic initialization in each TU, when
@@ -514,6 +528,9 @@ void __asan_after_dynamic_init() {
return;
CHECK(AsanInited());
Lock lock(&mu_for_globals);
+ if (!current_dynamic_init_module_name)
+ return;
+
if (flags()->report_globals >= 3)
Printf("DynInitUnpoison\n");
@@ -521,4 +538,6 @@ void __asan_after_dynamic_init() {
UnpoisonDynamicGlobals(kv.second, /*mark_initialized=*/false);
return true;
});
+
+ current_dynamic_init_module_name = nullptr;
}
More information about the llvm-commits
mailing list