summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorAlexey Samsonov <samsonov@google.com>2013-03-26 13:06:12 +0000
committerAlexey Samsonov <samsonov@google.com>2013-03-26 13:06:12 +0000
commit05e16a028d26503153a8fe512a500676cad66031 (patch)
tree2e671e9ee46d936b59a2d72e29ef6926c88f9ba0 /lib
parent09a19b221bc60863bc10f1aad1d210ce9999990c (diff)
downloadcompiler-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.cc27
-rw-r--r--lib/asan/asan_interface_internal.h8
-rw-r--r--lib/asan/asan_rtl.cc2
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;