[llvm] r268606 - Revert "LTOCodeGenerator: turns linkonce(_odr) into weak_(odr) when present "MustPreserve" set"
Mehdi Amini via llvm-commits
llvm-commits at lists.llvm.org
Wed May 4 22:14:20 PDT 2016
Author: mehdi_amini
Date: Thu May 5 00:14:20 2016
New Revision: 268606
URL: http://llvm.org/viewvc/llvm-project?rev=268606&view=rev
Log:
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 <mehdi.amini at apple.com>
Modified:
llvm/trunk/lib/LTO/LTOCodeGenerator.cpp
llvm/trunk/test/tools/lto/hide-linkonce-odr.ll
Modified: llvm/trunk/lib/LTO/LTOCodeGenerator.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/LTO/LTOCodeGenerator.cpp?rev=268606&r1=268605&r2=268606&view=diff
==============================================================================
--- llvm/trunk/lib/LTO/LTOCodeGenerator.cpp (original)
+++ llvm/trunk/lib/LTO/LTOCodeGenerator.cpp Thu May 5 00:14:20 2016
@@ -348,62 +348,14 @@ std::unique_ptr<TargetMachine> LTOCodeGe
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<bool(const GlobalValue &)> 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::applyScopeRestric
// 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;
}
Modified: llvm/trunk/test/tools/lto/hide-linkonce-odr.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/lto/hide-linkonce-odr.ll?rev=268606&r1=268605&r2=268606&view=diff
==============================================================================
--- llvm/trunk/test/tools/lto/hide-linkonce-odr.ll (original)
+++ llvm/trunk/test/tools/lto/hide-linkonce-odr.ll Thu May 5 00:14:20 2016
@@ -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
More information about the llvm-commits
mailing list