Skip to content

Commit 54a940b

Browse files
authored
[NFC][asan] Switch to IntrusiveList in asan_globals (#101577)
It's preparation for switching to hash table in #101596.
1 parent 46bc11d commit 54a940b

File tree

1 file changed

+10
-25
lines changed

1 file changed

+10
-25
lines changed

compiler-rt/lib/asan/asan_globals.cpp

Lines changed: 10 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -42,15 +42,13 @@ typedef IntrusiveList<GlobalListNode> ListOfGlobals;
4242
static Mutex mu_for_globals;
4343
static ListOfGlobals list_of_all_globals SANITIZER_GUARDED_BY(mu_for_globals);
4444

45-
static const int kDynamicInitGlobalsInitialCapacity = 512;
4645
struct DynInitGlobal {
47-
Global g;
48-
bool initialized;
46+
Global g = {};
47+
bool initialized = false;
48+
DynInitGlobal *next = nullptr;
4949
};
50-
typedef InternalMmapVector<DynInitGlobal> VectorOfGlobals;
51-
// Lazy-initialized and never deleted.
52-
static VectorOfGlobals *dynamic_init_globals
53-
SANITIZER_GUARDED_BY(mu_for_globals);
50+
typedef IntrusiveList<DynInitGlobal> DynInitGlobals;
51+
static DynInitGlobals dynamic_init_globals SANITIZER_GUARDED_BY(mu_for_globals);
5452

5553
// We want to remember where a certain range of globals was registered.
5654
struct GlobalRegistrationSite {
@@ -259,12 +257,8 @@ static void RegisterGlobal(const Global *g) SANITIZER_REQUIRES(mu_for_globals) {
259257
AddGlobalToList(list_of_all_globals, g);
260258

261259
if (g->has_dynamic_init) {
262-
if (!dynamic_init_globals) {
263-
dynamic_init_globals = new (GetGlobalLowLevelAllocator()) VectorOfGlobals;
264-
dynamic_init_globals->reserve(kDynamicInitGlobalsInitialCapacity);
265-
}
266-
DynInitGlobal dyn_global = { *g, false };
267-
dynamic_init_globals->push_back(dyn_global);
260+
dynamic_init_globals.push_back(new (GetGlobalLowLevelAllocator())
261+
DynInitGlobal{*g, false});
268262
}
269263
}
270264

@@ -294,11 +288,8 @@ void StopInitOrderChecking() {
294288
if (!flags()->check_initialization_order)
295289
return;
296290
Lock lock(&mu_for_globals);
297-
if (!dynamic_init_globals)
298-
return;
299291
flags()->check_initialization_order = false;
300-
for (uptr i = 0, n = dynamic_init_globals->size(); i < n; ++i) {
301-
DynInitGlobal &dyn_g = (*dynamic_init_globals)[i];
292+
for (const DynInitGlobal &dyn_g : dynamic_init_globals) {
302293
const Global *g = &dyn_g.g;
303294
// Unpoison the whole global.
304295
PoisonShadowForGlobal(g, 0);
@@ -465,12 +456,9 @@ void __asan_before_dynamic_init(const char *module_name) {
465456
CHECK(module_name);
466457
CHECK(AsanInited());
467458
Lock lock(&mu_for_globals);
468-
if (!dynamic_init_globals)
469-
return;
470459
if (flags()->report_globals >= 3)
471460
Printf("DynInitPoison module: %s\n", module_name);
472-
for (uptr i = 0, n = dynamic_init_globals->size(); i < n; ++i) {
473-
DynInitGlobal &dyn_g = (*dynamic_init_globals)[i];
461+
for (DynInitGlobal &dyn_g : dynamic_init_globals) {
474462
const Global *g = &dyn_g.g;
475463
if (dyn_g.initialized)
476464
continue;
@@ -489,11 +477,8 @@ void __asan_after_dynamic_init() {
489477
return;
490478
CHECK(AsanInited());
491479
Lock lock(&mu_for_globals);
492-
if (!dynamic_init_globals)
493-
return;
494480
// FIXME: Optionally report that we're unpoisoning globals from a module.
495-
for (uptr i = 0, n = dynamic_init_globals->size(); i < n; ++i) {
496-
DynInitGlobal &dyn_g = (*dynamic_init_globals)[i];
481+
for (const DynInitGlobal &dyn_g : dynamic_init_globals) {
497482
const Global *g = &dyn_g.g;
498483
if (!dyn_g.initialized) {
499484
// Unpoison the whole global.

0 commit comments

Comments
 (0)