diff options
author | Alexey Samsonov <samsonov@google.com> | 2013-03-26 13:06:12 +0000 |
---|---|---|
committer | Alexey Samsonov <samsonov@google.com> | 2013-03-26 13:06:12 +0000 |
commit | 05e16a028d26503153a8fe512a500676cad66031 (patch) | |
tree | 2e671e9ee46d936b59a2d72e29ef6926c88f9ba0 /lib | |
parent | 09a19b221bc60863bc10f1aad1d210ce9999990c (diff) | |
download | compiler-rt-05e16a028d26503153a8fe512a500676cad66031.tar.gz compiler-rt-05e16a028d26503153a8fe512a500676cad66031.tar.bz2 compiler-rt-05e16a028d26503153a8fe512a500676cad66031.tar.xz |
[ASan] Change the ABI of __asan_before_dynamic_init function: now it takes pointer to private string with module name. This string serves as a unique module ID in ASan runtime. compiler-rt part
git-svn-id: https://llvm.org/svn/llvm-project/compiler-rt/trunk@178014 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r-- | lib/asan/asan_globals.cc | 27 | ||||
-rw-r--r-- | lib/asan/asan_interface_internal.h | 8 | ||||
-rw-r--r-- | lib/asan/asan_rtl.cc | 2 |
3 files changed, 16 insertions, 21 deletions
diff --git a/lib/asan/asan_globals.cc b/lib/asan/asan_globals.cc index 8d041287..e9de46f1 100644 --- a/lib/asan/asan_globals.cc +++ b/lib/asan/asan_globals.cc @@ -48,6 +48,12 @@ static void PoisonRedZones(const Global &g) { } } +static void ReportGlobal(const Global &g, const char *prefix) { + Report("%s Global: beg=%p size=%zu/%zu name=%s module=%s dyn_init=%zu\n", + prefix, (void*)g.beg, g.size, g.size_with_redzone, g.name, + g.module_name, g.has_dynamic_init); +} + bool DescribeAddressIfGlobal(uptr addr, uptr size) { if (!flags()->report_globals) return false; BlockingMutexLock lock(&mu_for_globals); @@ -55,8 +61,7 @@ bool DescribeAddressIfGlobal(uptr addr, uptr size) { for (ListOfGlobals *l = list_of_all_globals; l; l = l->next) { const Global &g = *l->g; if (flags()->report_globals >= 2) - Report("Search Global: beg=%p size=%zu name=%s\n", - (void*)g.beg, g.size, (char*)g.name); + ReportGlobal(g, "Search"); res |= DescribeAddressRelativeToGlobal(addr, size, g); } return res; @@ -68,9 +73,7 @@ bool DescribeAddressIfGlobal(uptr addr, uptr size) { static void RegisterGlobal(const Global *g) { CHECK(asan_inited); if (flags()->report_globals >= 2) - Report("Added Global: beg=%p size=%zu/%zu name=%s dyn.init=%zu\n", - (void*)g->beg, g->size, g->size_with_redzone, g->name, - g->has_dynamic_init); + ReportGlobal(*g, "Added"); CHECK(flags()->report_globals); CHECK(AddrIsInMem(g->beg)); CHECK(AddrIsAlignedByGranularity(g->beg)); @@ -153,23 +156,15 @@ void __asan_unregister_globals(__asan_global *globals, uptr n) { // when all dynamically initialized globals are unpoisoned. This method // poisons all global variables not defined in this TU, so that a dynamic // initializer can only touch global variables in the same TU. -void __asan_before_dynamic_init(uptr first_addr, uptr last_addr) { +void __asan_before_dynamic_init(const char *module_name) { if (!flags()->check_initialization_order) return; CHECK(list_of_dynamic_init_globals); + CHECK(module_name); BlockingMutexLock lock(&mu_for_globals); - bool from_current_tu = false; - // The list looks like: - // a => ... => b => last_addr => ... => first_addr => c => ... - // The globals of the current TU reside between last_addr and first_addr. for (ListOfGlobals *l = list_of_dynamic_init_globals; l; l = l->next) { - if (l->g->beg == last_addr) - from_current_tu = true; - if (!from_current_tu) + if (l->g->module_name != module_name) PoisonGlobalAndRedzones(l->g); - if (l->g->beg == first_addr) - from_current_tu = false; } - CHECK(!from_current_tu); } // This method runs immediately after dynamic initialization in each TU, when diff --git a/lib/asan/asan_interface_internal.h b/lib/asan/asan_interface_internal.h index d0f3ba95..24f76253 100644 --- a/lib/asan/asan_interface_internal.h +++ b/lib/asan/asan_interface_internal.h @@ -39,7 +39,8 @@ extern "C" { uptr size; // The original size of the global. uptr size_with_redzone; // The size with the redzone. const char *name; // Name as a C string. - const char *module_name; // Module name as a C string. + const char *module_name; // Module name as a C string. This pointer is a + // unique identifier of a module. uptr has_dynamic_init; // Non-zero if the global has dynamic initializer. }; @@ -51,9 +52,8 @@ extern "C" { SANITIZER_INTERFACE_ATTRIBUTE; // These two functions should be called before and after dynamic initializers - // run, respectively. They should be called with parameters describing all - // dynamically initialized globals defined in the calling TU. - void __asan_before_dynamic_init(uptr first_addr, uptr last_addr) + // of a single module run, respectively. + void __asan_before_dynamic_init(const char *module_name) SANITIZER_INTERFACE_ATTRIBUTE; void __asan_after_dynamic_init() SANITIZER_INTERFACE_ATTRIBUTE; diff --git a/lib/asan/asan_rtl.cc b/lib/asan/asan_rtl.cc index 308d4e30..ebdb5710 100644 --- a/lib/asan/asan_rtl.cc +++ b/lib/asan/asan_rtl.cc @@ -290,7 +290,7 @@ static NOINLINE void force_interface_symbols() { case 27: __asan_set_error_exit_code(0); break; case 28: __asan_stack_free(0, 0, 0); break; case 29: __asan_stack_malloc(0, 0); break; - case 30: __asan_before_dynamic_init(0, 0); break; + case 30: __asan_before_dynamic_init(0); break; case 31: __asan_after_dynamic_init(); break; case 32: __asan_poison_stack_memory(0, 0); break; case 33: __asan_unpoison_stack_memory(0, 0); break; |