diff options
Diffstat (limited to 'llvm')
| -rw-r--r-- | llvm/lib/LTO/LTOCodeGenerator.cpp | 71 | ||||
| -rw-r--r-- | llvm/test/tools/lto/hide-linkonce-odr.ll | 8 | 
2 files changed, 22 insertions, 57 deletions
diff --git a/llvm/lib/LTO/LTOCodeGenerator.cpp b/llvm/lib/LTO/LTOCodeGenerator.cpp index 712632761ea..30cff727513 100644 --- a/llvm/lib/LTO/LTOCodeGenerator.cpp +++ b/llvm/lib/LTO/LTOCodeGenerator.cpp @@ -348,62 +348,14 @@ std::unique_ptr<TargetMachine> 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<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::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/llvm/test/tools/lto/hide-linkonce-odr.ll b/llvm/test/tools/lto/hide-linkonce-odr.ll index a2b0c6eb930..a1de96e8b33 100644 --- a/llvm/test/tools/lto/hide-linkonce-odr.ll +++ b/llvm/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  | 

