[llvm] 297a183 - [asan] Don't demangle __odr_asan_gen_* symbols
Fangrui Song via llvm-commits
llvm-commits at lists.llvm.org
Tue Nov 22 16:47:38 PST 2022
Author: Fangrui Song
Date: 2022-11-22T16:47:33-08:00
New Revision: 297a1830228a0cdc61fa2a0014ace3817497982e
URL: https://github.com/llvm/llvm-project/commit/297a1830228a0cdc61fa2a0014ace3817497982e
DIFF: https://github.com/llvm/llvm-project/commit/297a1830228a0cdc61fa2a0014ace3817497982e.diff
LOG: [asan] Don't demangle __odr_asan_gen_* symbols
This relands the ODR indicator part of D138095 (reverted by 06c74b5e7367b41e9b4ea3d74c971aace5681fb8):
a `__odr_asan_gen_*` symbol should use a mangled name as its associated symbol does.
Added:
Modified:
llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
llvm/test/Instrumentation/AddressSanitizer/local_alias.ll
Removed:
################################################################################
diff --git a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
index ff05454aa920e..a4d4cc73c4828 100644
--- a/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
+++ b/llvm/lib/Transforms/Instrumentation/AddressSanitizer.cpp
@@ -2264,11 +2264,12 @@ bool ModuleAddressSanitizer::InstrumentGlobals(IRBuilder<> &IRB, Module &M,
if (G->hasSanitizerMetadata())
MD = G->getSanitizerMetadata();
- // 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());
+ // 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();
GlobalVariable *Name =
- createPrivateGlobalForString(M, NameForGlobal,
+ createPrivateGlobalForString(M, llvm::demangle(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 b772d5c76167c..ada8120155e5e 100644
--- a/llvm/test/Instrumentation/AddressSanitizer/local_alias.ll
+++ b/llvm/test/Instrumentation/AddressSanitizer/local_alias.ll
@@ -13,17 +13,20 @@ 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 d = unnamed_addr global [2 x i32] zeroinitializer, align 4
+ at _ZL1d = 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 @d
+; CHECK-ALIAS: @3 = private alias { [2 x i32], [24 x i8] }, ptr @_ZL1d
; Function Attrs: nounwind sanitize_address uwtable
define i32 @foo(i32 %M) #0 {
More information about the llvm-commits
mailing list