@@ -819,11 +819,11 @@ class ModuleAddressSanitizer {
819819private:
820820 void initializeCallbacks (Module &M);
821821
822- void instrumentGlobals (IRBuilder<> &IRB, Module &M, bool *CtorComdat);
822+ bool InstrumentGlobals (IRBuilder<> &IRB, Module &M, bool *CtorComdat);
823823 void InstrumentGlobalsCOFF (IRBuilder<> &IRB, Module &M,
824824 ArrayRef<GlobalVariable *> ExtendedGlobals,
825825 ArrayRef<Constant *> MetadataInitializers);
826- void instrumentGlobalsELF (IRBuilder<> &IRB, Module &M,
826+ void InstrumentGlobalsELF (IRBuilder<> &IRB, Module &M,
827827 ArrayRef<GlobalVariable *> ExtendedGlobals,
828828 ArrayRef<Constant *> MetadataInitializers,
829829 const std::string &UniqueModuleId);
@@ -2177,7 +2177,7 @@ void ModuleAddressSanitizer::InstrumentGlobalsCOFF(
21772177 appendToCompilerUsed (M, MetadataGlobals);
21782178}
21792179
2180- void ModuleAddressSanitizer::instrumentGlobalsELF (
2180+ void ModuleAddressSanitizer::InstrumentGlobalsELF (
21812181 IRBuilder<> &IRB, Module &M, ArrayRef<GlobalVariable *> ExtendedGlobals,
21822182 ArrayRef<Constant *> MetadataInitializers,
21832183 const std::string &UniqueModuleId) {
@@ -2187,7 +2187,7 @@ void ModuleAddressSanitizer::instrumentGlobalsELF(
21872187 // false negative odr violations at link time. If odr indicators are used, we
21882188 // keep the comdat sections, as link time odr violations will be dectected on
21892189 // the odr indicator symbols.
2190- bool UseComdatForGlobalsGC = UseOdrIndicator && !UniqueModuleId. empty () ;
2190+ bool UseComdatForGlobalsGC = UseOdrIndicator;
21912191
21922192 SmallVector<GlobalValue *, 16 > MetadataGlobals (ExtendedGlobals.size ());
21932193 for (size_t i = 0 ; i < ExtendedGlobals.size (); i++) {
@@ -2237,7 +2237,7 @@ void ModuleAddressSanitizer::instrumentGlobalsELF(
22372237
22382238 // We also need to unregister globals at the end, e.g., when a shared library
22392239 // gets closed.
2240- if (DestructorKind != AsanDtorKind::None && !MetadataGlobals. empty () ) {
2240+ if (DestructorKind != AsanDtorKind::None) {
22412241 IRBuilder<> IrbDtor (CreateAsanModuleDtor (M));
22422242 IrbDtor.CreateCall (AsanUnregisterElfGlobals,
22432243 {IRB.CreatePointerCast (RegisteredFlag, IntptrTy),
@@ -2343,8 +2343,10 @@ void ModuleAddressSanitizer::InstrumentGlobalsWithMetadataArray(
23432343// redzones and inserts this function into llvm.global_ctors.
23442344// Sets *CtorComdat to true if the global registration code emitted into the
23452345// asan constructor is comdat-compatible.
2346- void ModuleAddressSanitizer::instrumentGlobals (IRBuilder<> &IRB, Module &M,
2346+ bool ModuleAddressSanitizer::InstrumentGlobals (IRBuilder<> &IRB, Module &M,
23472347 bool *CtorComdat) {
2348+ *CtorComdat = false ;
2349+
23482350 // Build set of globals that are aliased by some GA, where
23492351 // getExcludedAliasedGlobal(GA) returns the relevant GlobalVariable.
23502352 SmallPtrSet<const GlobalVariable *, 16 > AliasedGlobalExclusions;
@@ -2362,6 +2364,11 @@ void ModuleAddressSanitizer::instrumentGlobals(IRBuilder<> &IRB, Module &M,
23622364 }
23632365
23642366 size_t n = GlobalsToChange.size ();
2367+ if (n == 0 ) {
2368+ *CtorComdat = true ;
2369+ return false ;
2370+ }
2371+
23652372 auto &DL = M.getDataLayout ();
23662373
23672374 // A global is described by a structure
@@ -2384,11 +2391,8 @@ void ModuleAddressSanitizer::instrumentGlobals(IRBuilder<> &IRB, Module &M,
23842391
23852392 // We shouldn't merge same module names, as this string serves as unique
23862393 // module ID in runtime.
2387- GlobalVariable *ModuleName =
2388- n != 0
2389- ? createPrivateGlobalForString (M, M.getModuleIdentifier (),
2390- /* AllowMerging*/ false , kAsanGenPrefix )
2391- : nullptr ;
2394+ GlobalVariable *ModuleName = createPrivateGlobalForString (
2395+ M, M.getModuleIdentifier (), /* AllowMerging*/ false , kAsanGenPrefix );
23922396
23932397 for (size_t i = 0 ; i < n; i++) {
23942398 GlobalVariable *G = GlobalsToChange[i];
@@ -2513,34 +2517,27 @@ void ModuleAddressSanitizer::instrumentGlobals(IRBuilder<> &IRB, Module &M,
25132517 }
25142518 appendToCompilerUsed (M, ArrayRef<GlobalValue *>(GlobalsToAddToUsedList));
25152519
2516- if (UseGlobalsGC && TargetTriple.isOSBinFormatELF ()) {
2517- // Use COMDAT and register globals even if n == 0 to ensure that (a) the
2518- // linkage unit will only have one module constructor, and (b) the register
2519- // function will be called. The module destructor is not created when n ==
2520- // 0.
2520+ std::string ELFUniqueModuleId =
2521+ (UseGlobalsGC && TargetTriple.isOSBinFormatELF ()) ? getUniqueModuleId (&M)
2522+ : " " ;
2523+
2524+ if (!ELFUniqueModuleId.empty ()) {
2525+ InstrumentGlobalsELF (IRB, M, NewGlobals, Initializers, ELFUniqueModuleId);
25212526 *CtorComdat = true ;
2522- instrumentGlobalsELF (IRB, M, NewGlobals, Initializers,
2523- getUniqueModuleId (&M));
2524- } else if (n == 0 ) {
2525- // When UseGlobalsGC is false, COMDAT can still be used if n == 0, because
2526- // all compile units will have identical module constructor/destructor.
2527- *CtorComdat = TargetTriple.isOSBinFormatELF ();
2527+ } else if (UseGlobalsGC && TargetTriple.isOSBinFormatCOFF ()) {
2528+ InstrumentGlobalsCOFF (IRB, M, NewGlobals, Initializers);
2529+ } else if (UseGlobalsGC && ShouldUseMachOGlobalsSection ()) {
2530+ InstrumentGlobalsMachO (IRB, M, NewGlobals, Initializers);
25282531 } else {
2529- *CtorComdat = false ;
2530- if (UseGlobalsGC && TargetTriple.isOSBinFormatCOFF ()) {
2531- InstrumentGlobalsCOFF (IRB, M, NewGlobals, Initializers);
2532- } else if (UseGlobalsGC && ShouldUseMachOGlobalsSection ()) {
2533- InstrumentGlobalsMachO (IRB, M, NewGlobals, Initializers);
2534- } else {
2535- InstrumentGlobalsWithMetadataArray (IRB, M, NewGlobals, Initializers);
2536- }
2532+ InstrumentGlobalsWithMetadataArray (IRB, M, NewGlobals, Initializers);
25372533 }
25382534
25392535 // Create calls for poisoning before initializers run and unpoisoning after.
25402536 if (HasDynamicallyInitializedGlobals)
25412537 createInitializerPoisonCalls (M, ModuleName);
25422538
25432539 LLVM_DEBUG (dbgs () << M);
2540+ return true ;
25442541}
25452542
25462543uint64_t
@@ -2604,10 +2601,10 @@ bool ModuleAddressSanitizer::instrumentModule(Module &M) {
26042601 assert (AsanCtorFunction || ConstructorKind == AsanCtorKind::None);
26052602 if (AsanCtorFunction) {
26062603 IRBuilder<> IRB (AsanCtorFunction->getEntryBlock ().getTerminator ());
2607- instrumentGlobals (IRB, M, &CtorComdat);
2604+ InstrumentGlobals (IRB, M, &CtorComdat);
26082605 } else {
26092606 IRBuilder<> IRB (*C);
2610- instrumentGlobals (IRB, M, &CtorComdat);
2607+ InstrumentGlobals (IRB, M, &CtorComdat);
26112608 }
26122609 }
26132610
0 commit comments