[llvm-branch-commits] [compiler-rt] b968a02 - Revert "[asan] Optimize initialization order checking (#101837)"

via llvm-branch-commits llvm-branch-commits at lists.llvm.org
Wed Aug 14 10:54:37 PDT 2024


Author: Florian Mayer
Date: 2024-08-14T10:54:34-07:00
New Revision: b968a0229074ad32accd7feef50f4f5394d7ac96

URL: https://github.com/llvm/llvm-project/commit/b968a0229074ad32accd7feef50f4f5394d7ac96
DIFF: https://github.com/llvm/llvm-project/commit/b968a0229074ad32accd7feef50f4f5394d7ac96.diff

LOG: Revert "[asan] Optimize initialization order checking (#101837)"

This reverts commit 29e849bfd35782b24c80db23267937b888b4aa36.

Added: 
    

Modified: 
    compiler-rt/lib/asan/asan_globals.cpp
    compiler-rt/test/asan/TestCases/initialization-nobug.cpp

Removed: 
    compiler-rt/test/asan/TestCases/Linux/initialization-nobug-lld.cpp


################################################################################
diff  --git a/compiler-rt/lib/asan/asan_globals.cpp b/compiler-rt/lib/asan/asan_globals.cpp
index c83b782cb85f89..293e771e1dc060 100644
--- a/compiler-rt/lib/asan/asan_globals.cpp
+++ b/compiler-rt/lib/asan/asan_globals.cpp
@@ -520,43 +520,6 @@ void __asan_before_dynamic_init(const char *module_name) {
   current_dynamic_init_module_name = module_name;
 }
 
-// Maybe SANITIZER_CAN_USE_PREINIT_ARRAY is to conservative for `.init_array`,
-// however we should not make mistake here. If `UnpoisonBeforeMain` was not
-// executed at all we will have false reports on globals.
-#if SANITIZER_CAN_USE_PREINIT_ARRAY
-// This optimization aims to reduce the overhead of `__asan_after_dynamic_init`
-// calls by leveraging incremental unpoisoning/poisoning in
-// `__asan_before_dynamic_init`. We expect most `__asan_after_dynamic_init
-// calls` to be no-ops. However, to ensure all globals are unpoisoned before the
-// `main`, we force `UnpoisonBeforeMain` to fully execute
-// `__asan_after_dynamic_init`.
-
-// With lld, `UnpoisonBeforeMain` runs after standard `.init_array`, making it
-// the final `__asan_after_dynamic_init` call for the static runtime. In
-// contrast, GNU ld executes it earlier, causing subsequent
-// `__asan_after_dynamic_init` calls to perform full unpoisoning, losing the
-// optimization.
-bool allow_after_dynamic_init SANITIZER_GUARDED_BY(mu_for_globals) = false;
-
-static void UnpoisonBeforeMain(void) {
-  {
-    Lock lock(&mu_for_globals);
-    if (allow_after_dynamic_init)
-      return;
-    allow_after_dynamic_init = true;
-  }
-  if (flags()->report_globals >= 3)
-    Printf("UnpoisonBeforeMain\n");
-  __asan_after_dynamic_init();
-}
-
-__attribute__((section(".init_array.65537"), used)) static void (
-    *asan_after_init_array)(void) = UnpoisonBeforeMain;
-#else
-// Incremental poisoning is disabled, unpoison globals immediately.
-static constexpr bool allow_after_dynamic_init = true;
-#endif  // SANITIZER_CAN_USE_PREINIT_ARRAY
-
 // This method runs immediately after dynamic initialization in each TU, when
 // all dynamically initialized globals except for those defined in the current
 // TU are poisoned.  It simply unpoisons all dynamically initialized globals.
@@ -565,8 +528,6 @@ void __asan_after_dynamic_init() {
     return;
   CHECK(AsanInited());
   Lock lock(&mu_for_globals);
-  if (!allow_after_dynamic_init)
-    return;
   if (!current_dynamic_init_module_name)
     return;
 

diff  --git a/compiler-rt/test/asan/TestCases/Linux/initialization-nobug-lld.cpp b/compiler-rt/test/asan/TestCases/Linux/initialization-nobug-lld.cpp
deleted file mode 100644
index 5cec029811cbc8..00000000000000
--- a/compiler-rt/test/asan/TestCases/Linux/initialization-nobug-lld.cpp
+++ /dev/null
@@ -1,14 +0,0 @@
-// RUN: %clangxx_asan -O3 %S/../initialization-nobug.cpp %S/../Helpers/initialization-nobug-extra.cpp -fuse-ld=lld -o %t && %env_asan_opts=check_initialization_order=true:report_globals=3 %run %t 2>&1 | FileCheck %s --implicit-check-not "DynInit"
-
-// Same as initialization-nobug.cpp, but with lld we expect just one
-// `DynInitUnpoison` executed after `AfterDynamicInit` at the end.
-// REQUIRES: lld-available
-
-// With dynamic runtimes `AfterDynamicInit` will called before `executable`
-// contructors, with constructors of dynamic runtime.
-// XFAIL: asan-dynamic-runtime
-
-// CHECK: DynInitPoison
-// CHECK: DynInitPoison
-// CHECK: UnpoisonBeforeMain
-// CHECK: DynInitUnpoison

diff  --git a/compiler-rt/test/asan/TestCases/initialization-nobug.cpp b/compiler-rt/test/asan/TestCases/initialization-nobug.cpp
index f66d501124bc48..d75f002866235a 100644
--- a/compiler-rt/test/asan/TestCases/initialization-nobug.cpp
+++ b/compiler-rt/test/asan/TestCases/initialization-nobug.cpp
@@ -1,10 +1,10 @@
 // A collection of various initializers which shouldn't trip up initialization
 // order checking.  If successful, this will just return 0.
 
-// RUN: %clangxx_asan -O0 %s %p/Helpers/initialization-nobug-extra.cpp -o %t && %env_asan_opts=check_initialization_order=true:report_globals=3 %run %t 2>&1 | FileCheck %s --implicit-check-not "DynInitPoison"
-// RUN: %clangxx_asan -O1 %s %p/Helpers/initialization-nobug-extra.cpp -o %t && %env_asan_opts=check_initialization_order=true:report_globals=3 %run %t 2>&1 | FileCheck %s --implicit-check-not "DynInitPoison"
-// RUN: %clangxx_asan -O2 %s %p/Helpers/initialization-nobug-extra.cpp -o %t && %env_asan_opts=check_initialization_order=true:report_globals=3 %run %t 2>&1 | FileCheck %s --implicit-check-not "DynInitPoison"
-// RUN: %clangxx_asan -O3 %s %p/Helpers/initialization-nobug-extra.cpp -o %t && %env_asan_opts=check_initialization_order=true:report_globals=3 %run %t 2>&1 | FileCheck %s --implicit-check-not "DynInitPoison"
+// RUN: %clangxx_asan -O0 %s %p/Helpers/initialization-nobug-extra.cpp -o %t && %env_asan_opts=check_initialization_order=true:report_globals=3 %run %t 2>&1 | FileCheck %s --implicit-check-not "DynInit"
+// RUN: %clangxx_asan -O1 %s %p/Helpers/initialization-nobug-extra.cpp -o %t && %env_asan_opts=check_initialization_order=true:report_globals=3 %run %t 2>&1 | FileCheck %s --implicit-check-not "DynInit"
+// RUN: %clangxx_asan -O2 %s %p/Helpers/initialization-nobug-extra.cpp -o %t && %env_asan_opts=check_initialization_order=true:report_globals=3 %run %t 2>&1 | FileCheck %s --implicit-check-not "DynInit"
+// RUN: %clangxx_asan -O3 %s %p/Helpers/initialization-nobug-extra.cpp -o %t && %env_asan_opts=check_initialization_order=true:report_globals=3 %run %t 2>&1 | FileCheck %s --implicit-check-not "DynInit"
 
 // Simple access:
 // Make sure that accessing a global in the same TU is safe
@@ -44,10 +44,6 @@ int getStructWithDtorValue() { return struct_with_dtor.value; }
 int main() { return 0; }
 
 // CHECK: DynInitPoison
+// CHECK: DynInitUnpoison
 // CHECK: DynInitPoison
-
-// In general case entire set of DynInitPoison must be followed by at lest one
-// DynInitUnpoison. In some cases we can limit the number of DynInitUnpoison,
-// see initialization-nobug-lld.cpp.
-
 // CHECK: DynInitUnpoison


        


More information about the llvm-branch-commits mailing list