[compiler-rt] 06c74b5 - Revert D138095 Use InernalAlloc in DemangleCXXABI

Fangrui Song via llvm-commits llvm-commits at lists.llvm.org
Tue Nov 22 16:29:29 PST 2022


Author: Fangrui Song
Date: 2022-11-22T16:29:24-08:00
New Revision: 06c74b5e7367b41e9b4ea3d74c971aace5681fb8

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

LOG: Revert D138095 Use InernalAlloc in DemangleCXXABI

Broke 2/3 tests on macOS which seem to be related to
`free(demangled_name)` in DemangleCXXABI.

Added: 
    

Modified: 
    compiler-rt/lib/asan/asan_globals.cpp
    compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cpp
    llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
    llvm/test/Instrumentation/AddressSanitizer/local_alias.ll

Removed: 
    


################################################################################
diff  --git a/compiler-rt/lib/asan/asan_globals.cpp b/compiler-rt/lib/asan/asan_globals.cpp
index 2b4a9e01c8a36..b780128c9adb4 100644
--- a/compiler-rt/lib/asan/asan_globals.cpp
+++ b/compiler-rt/lib/asan/asan_globals.cpp
@@ -149,8 +149,8 @@ static void CheckODRViolationViaIndicator(const Global *g) {
     if (g->odr_indicator == l->g->odr_indicator &&
         (flags()->detect_odr_violation >= 2 || g->size != l->g->size) &&
         !IsODRViolationSuppressed(g->name))
-      ReportODRViolation(g, FindRegistrationSite(g), l->g,
-                         FindRegistrationSite(l->g));
+      ReportODRViolation(g, FindRegistrationSite(g),
+                         l->g, FindRegistrationSite(l->g));
   }
 }
 

diff  --git a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cpp b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cpp
index d505d96bd653a..b223f6cd01e34 100644
--- a/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cpp
+++ b/compiler-rt/lib/sanitizer_common/sanitizer_symbolizer_posix_libcdep.cpp
@@ -49,17 +49,12 @@ const char *DemangleCXXABI(const char *name) {
   // FIXME: __cxa_demangle aggressively insists on allocating memory.
   // There's not much we can do about that, short of providing our
   // own demangler (libc++abi's implementation could be adapted so that
-  // it does not allocate). For now, we just call it anyway, and use
-  // InternalAlloc to prevent lsan error.
-  if (&__cxxabiv1::__cxa_demangle) {
-    if (char *demangled_name = __cxxabiv1::__cxa_demangle(name, 0, 0, 0)) {
-      size_t size = internal_strlen(demangled_name) + 1;
-      char *buf = (char *)InternalAlloc(size);
-      internal_memcpy(buf, demangled_name, size);
-      free(demangled_name);
-      return buf;
-    }
-  }
+  // it does not allocate). For now, we just call it anyway, and we leak
+  // the returned value.
+  if (&__cxxabiv1::__cxa_demangle)
+    if (const char *demangled_name =
+          __cxxabiv1::__cxa_demangle(name, 0, 0, 0))
+      return demangled_name;
 
   return name;
 }

diff  --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
index a4d4cc73c4828..ff05454aa920e 100644
--- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
@@ -2264,12 +2264,11 @@ bool ModuleAddressSanitizer::InstrumentGlobals(IRBuilder<> &IRB, Module &M,
     if (G->hasSanitizerMetadata())
       MD = G->getSanitizerMetadata();
 
-    // The runtime library tries demangling symbol names in the descriptor but
-    // functionality like __cxa_demangle may be unavailable (e.g.
-    // -static-libstdc++). So we demangle the symbol names here.
-    std::string NameForGlobal = G->getName().str();
+    // TODO: Symbol names in the descriptor can be demangled by the runtime
+    // library. This could save ~0.4% of VM size for a private large binary.
+    std::string NameForGlobal = llvm::demangle(G->getName().str());
     GlobalVariable *Name =
-        createPrivateGlobalForString(M, llvm::demangle(NameForGlobal),
+        createPrivateGlobalForString(M, NameForGlobal,
                                      /*AllowMerging*/ true, kAsanGenPrefix);
 
     Type *Ty = G->getValueType();

diff  --git a/llvm/test/Instrumentation/AddressSanitizer/local_alias.ll b/llvm/test/Instrumentation/AddressSanitizer/local_alias.ll
index ada8120155e5e..b772d5c76167c 100644
--- a/llvm/test/Instrumentation/AddressSanitizer/local_alias.ll
+++ b/llvm/test/Instrumentation/AddressSanitizer/local_alias.ll
@@ -13,20 +13,17 @@ target triple = "x86_64-unknown-linux-gnu"
 @a = dso_local global [2 x i32] zeroinitializer, align 4
 @b = private global [2 x i32] zeroinitializer, align 4
 @c = internal global [2 x i32] zeroinitializer, align 4
- at _ZL1d = unnamed_addr global [2 x i32] zeroinitializer, align 4
+ at d = unnamed_addr global [2 x i32] zeroinitializer, align 4
 
 ; Check that we generate internal alias and odr indicator symbols for global to be protected.
 ; CHECK-NOINDICATOR-NOT: __odr_asan_gen_a
 ; CHECK-NOALIAS-NOT: private alias
-; CHECK-INDICATOR: @___asan_gen_.1 = private unnamed_addr constant [2 x i8] c"a\00", align 1
 ; CHECK-INDICATOR: @__odr_asan_gen_a = global i8 0, align 1
-; CHECK-INDICATOR: @___asan_gen_.4 = private unnamed_addr constant [2 x i8] c"d\00", align 1
-; CHECK-INDICATOR: @__odr_asan_gen__ZL1d = global i8 0, align 1
 ; CHECK-ALIAS: @0 = private alias { [2 x i32], [24 x i8] }, ptr @a
 
 ; CHECK-ALIAS: @1 = private alias { [2 x i32], [24 x i8] }, ptr @b
 ; CHECK-ALIAS: @2 = private alias { [2 x i32], [24 x i8] }, ptr @c
-; CHECK-ALIAS: @3 = private alias { [2 x i32], [24 x i8] }, ptr @_ZL1d
+; CHECK-ALIAS: @3 = private alias { [2 x i32], [24 x i8] }, ptr @d
 
 ; Function Attrs: nounwind sanitize_address uwtable
 define i32 @foo(i32 %M) #0 {


        


More information about the llvm-commits mailing list