From: Mehdi Amini Date: Thu, 5 May 2016 05:14:20 +0000 (+0000) Subject: Revert "LTOCodeGenerator: turns linkonce(_odr) into weak_(odr) when present "MustPres... X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=3556cc73fe6ec3152f21e3087310097834e32c52;p=llvm Revert "LTOCodeGenerator: turns linkonce(_odr) into weak_(odr) when present "MustPreserve" set" This reverts commit r267644. Turning linkonce_odr into weak_odr is a sementic change on Darwin: because of `llvm::canBeOmittedFromSymbolTable()` we may emit the symbol as weak_def_can_be_hidden instead of weak_definition. From: Mehdi Amini git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@268606 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/lib/LTO/LTOCodeGenerator.cpp b/lib/LTO/LTOCodeGenerator.cpp index 712632761ea..30cff727513 100644 --- a/lib/LTO/LTOCodeGenerator.cpp +++ b/lib/LTO/LTOCodeGenerator.cpp @@ -348,62 +348,14 @@ std::unique_ptr LTOCodeGenerator::createTargetMachine() { RelocModel, CodeModel::Default, CGOptLevel)); } -// If a linkonce global is present in the MustPreserveSymbols, we need to make -// sure we honor this. To force the compiler to not drop it, we turn its linkage -// to the weak equivalent. -static void -preserveDiscardableGVs(Module &TheModule, - function_ref mustPreserveGV) { - auto mayPreserveGlobal = [&](GlobalValue &GV) { - if (!GV.isDiscardableIfUnused() || GV.isDeclaration()) - return; - if (!mustPreserveGV(GV)) - return; - if (GV.hasAvailableExternallyLinkage() || GV.hasLocalLinkage()) - report_fatal_error("The linker asked LTO to preserve a symbol with an" - "unexpected linkage"); - GV.setLinkage(GlobalValue::getWeakLinkage(GV.hasLinkOnceODRLinkage())); - }; - - for (auto &GV : TheModule) - mayPreserveGlobal(GV); - for (auto &GV : TheModule.globals()) - mayPreserveGlobal(GV); - for (auto &GV : TheModule.aliases()) - mayPreserveGlobal(GV); -} - void LTOCodeGenerator::applyScopeRestrictions() { - if (ScopeRestrictionsDone) - return; - - // Declare a callback for the internalize pass that will ask for every - // candidate GlobalValue if it can be internalized or not. - SmallString<64> MangledName; - auto mustPreserveGV = [&](const GlobalValue &GV) -> bool { - // Unnamed globals can't be mangled, but they can't be preserved either. - if (!GV.hasName()) - return false; - - // Need to mangle the GV as the "MustPreserveSymbols" StringSet is filled - // with the linker supplied name, which on Darwin includes a leading - // underscore. - MangledName.clear(); - MangledName.reserve(GV.getName().size() + 1); - Mangler::getNameWithPrefix(MangledName, GV.getName(), - MergedModule->getDataLayout()); - return MustPreserveSymbols.count(MangledName); - }; - - // Preserve linkonce value on linker request - preserveDiscardableGVs(*MergedModule, mustPreserveGV); - - if (!ShouldInternalize) + if (ScopeRestrictionsDone || !ShouldInternalize) return; if (ShouldRestoreGlobalsLinkage) { // Record the linkage type of non-local symbols so they can be restored - // prior to module splitting. + // prior + // to module splitting. auto RecordLinkage = [&](const GlobalValue &GV) { if (!GV.hasAvailableExternallyLinkage() && !GV.hasLocalLinkage() && GV.hasName()) @@ -421,7 +373,22 @@ void LTOCodeGenerator::applyScopeRestrictions() { // symbols referenced from asm UpdateCompilerUsed(*MergedModule, *TargetMach, AsmUndefinedRefs); - internalizeModule(*MergedModule, mustPreserveGV); + // Declare a callback for the internalize pass that will ask for every + // candidate GlobalValue if it can be internalized or not. + Mangler Mangler; + SmallString<64> MangledName; + auto MustPreserveGV = [&](const GlobalValue &GV) -> bool { + // Need to mangle the GV as the "MustPreserveSymbols" StringSet is filled + // with the linker supplied name, which on Darwin includes a leading + // underscore. + MangledName.clear(); + MangledName.reserve(GV.getName().size() + 1); + Mangler::getNameWithPrefix(MangledName, GV.getName(), + MergedModule->getDataLayout()); + return MustPreserveSymbols.count(MangledName); + }; + + internalizeModule(*MergedModule, MustPreserveGV); ScopeRestrictionsDone = true; } diff --git a/test/tools/lto/hide-linkonce-odr.ll b/test/tools/lto/hide-linkonce-odr.ll index a2b0c6eb930..a1de96e8b33 100644 --- a/test/tools/lto/hide-linkonce-odr.ll +++ b/test/tools/lto/hide-linkonce-odr.ll @@ -1,11 +1,9 @@ ; RUN: llvm-as %s -o %t.o -; RUN: %ld64 -lto_library %llvmshlibdir/libLTO.dylib -dylib -arch x86_64 -macosx_version_min 10.10.0 -lSystem -o %t.dylib %t.o -save-temps -undefined dynamic_lookup -exported_symbol _c -exported_symbol _b +; RUN: %ld64 -lto_library %llvmshlibdir/libLTO.dylib -dylib -arch x86_64 -macosx_version_min 10.10.0 -lSystem -o %t.dylib %t.o -save-temps -undefined dynamic_lookup ; RUN: llvm-dis %t.dylib.lto.opt.bc -o - | FileCheck --check-prefix=IR %s -; check that @a is no longer a linkonce_odr definition -; IR-NOT: define linkonce_odr void @a() -; check that @b is turned into weak because it is exported -; IR: define weak_odr void @b() #1 { +; check that @a is still a linkonce_odr definition +; IR: define linkonce_odr void @a() ; RUN: llvm-nm %t.dylib | FileCheck --check-prefix=NM %s ; check that the linker can hide @a but not @b