[PATCH] D41988: [ThinLTO] - Set WeakAnyLinkage for all LinkerRedefined symbols.

Rafael Avila de Espindola via llvm-commits llvm-commits at lists.llvm.org
Fri Jan 12 08:42:27 PST 2018


I would suggest putting the full patch (llvm+lld) up for review.

To be clear, I think that the current version is a bit of a hack, but I
am at a loss as to what the correct fix in ThinLTO is.

The root problem is ThinLTO giving back symbols that are not prevailing.

Cheers,
Rafael

George Rimar via Phabricator <reviews at reviews.llvm.org> writes:

> grimar created this revision.
> grimar added reviewers: pcc, tejohnson.
> Herald added subscribers: inglorion, mehdi_amini.
>
> We faced an issue in one of testcases of https://reviews.llvm.org/D41987 patch (ELF/lto/defsym.ll).
>
> There we have 2 symbols declarations:
>
>   define hidden void @bar2() {
>     call void @this_is_bar2()
>     ret void
>   }
>   
>   define hidden void @bar3() {
>     call void @this_is_bar3()
>     ret void
>   }
>
> and want to redefine one of them with -defsym=bar2=bar3 linker option.
> We define `bar2` on linker side before calling LTO code. With that resolution for `bar2` we pass to
> ThinLTO is Prevealing=0, VisibleToRegularObj=1,LinkerRedefined=1.
> ThinLTO returns us strong `bar2` symbol and we fail with multiple symbol definition of 'bar2'.
>
> Patch sets WeakAnyLinkage for all LinkerRedefined symbols and not only those that are Prevealing.
>
> Such change stops `bar2` from being exported:
> https://github.com/llvm-mirror/llvm/blob/master/lib/Transforms/IPO/FunctionImport.cpp#L181
> and then LTO sets `bar2` linkage to internal here:
> https://github.com/llvm-mirror/llvm/blob/master/lib/LTO/LTO.cpp#L329
>
> Symbol never shows up in the output anymore and that fixes the issue for us.
>
> Though as was mentioned by Rafael in https://reviews.llvm.org/D38239 thread, "This seems to be a bit of a hack. 
> With it llvm sets the linkage to weak to prevent inlining and that ends up avoiding the symbol for being used,
> but that seems to happen in a profitability logic, not correctness."
>
> Posting it to discussion how this can be fixed in a better way.
>
>
> https://reviews.llvm.org/D41988
>
> Files:
>   lib/LTO/LTO.cpp
>   test/LTO/Resolution/X86/linker-redef-thin.ll
>
>
> Index: test/LTO/Resolution/X86/linker-redef-thin.ll
> ===================================================================
> --- test/LTO/Resolution/X86/linker-redef-thin.ll
> +++ test/LTO/Resolution/X86/linker-redef-thin.ll
> @@ -8,6 +8,11 @@
>  ; CHECK-NEXT: Binding: Weak
>  ; CHECK-NEXT: Type: Function
>  
> +; RUN: llvm-lto2 run -o %t1.o %t.o -r %t.o,patatino,r
> +; RUN: llvm-readobj -t %t1.o.1 | FileCheck %s --check-prefix=NOSYM
> +
> +; NOSYM-NOT: Name: patatino
> +
>  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
>  target triple = "x86_64-unknown-linux-gnu"
>  
> Index: lib/LTO/LTO.cpp
> ===================================================================
> --- lib/LTO/LTO.cpp
> +++ lib/LTO/LTO.cpp
> @@ -704,18 +704,17 @@
>      if (!Sym.getIRName().empty()) {
>        auto GUID = GlobalValue::getGUID(GlobalValue::getGlobalIdentifier(
>            Sym.getIRName(), GlobalValue::ExternalLinkage, ""));
> -      if (Res.Prevailing) {
> +      if (Res.Prevailing)
>          ThinLTO.PrevailingModuleForGUID[GUID] = BM.getModuleIdentifier();
>  
> -        // For linker redefined symbols (via --wrap or --defsym) we want to
> -        // switch the linkage to `weak` to prevent IPOs from happening.
> -        // Find the summary in the module for this very GV and record the new
> -        // linkage so that we can switch it when we import the GV.
> -        if (Res.LinkerRedefined)
> -          if (auto S = ThinLTO.CombinedIndex.findSummaryInModule(
> -                  GUID, BM.getModuleIdentifier()))
> -            S->setLinkage(GlobalValue::WeakAnyLinkage);
> -      }
> +      // For linker redefined symbols (via --wrap or --defsym) we want to
> +      // switch the linkage to `weak` to prevent IPOs from happening.
> +      // Find the summary in the module for this very GV and record the new
> +      // linkage so that we can switch it when we import the GV.
> +      if (Res.LinkerRedefined)
> +        if (auto S = ThinLTO.CombinedIndex.findSummaryInModule(
> +                GUID, BM.getModuleIdentifier()))
> +          S->setLinkage(GlobalValue::WeakAnyLinkage);
>  
>        // If the linker resolved the symbol to a local definition then mark it
>        // as local in the summary for the module we are adding.
>
>
> Index: test/LTO/Resolution/X86/linker-redef-thin.ll
> ===================================================================
> --- test/LTO/Resolution/X86/linker-redef-thin.ll
> +++ test/LTO/Resolution/X86/linker-redef-thin.ll
> @@ -8,6 +8,11 @@
>  ; CHECK-NEXT: Binding: Weak
>  ; CHECK-NEXT: Type: Function
>  
> +; RUN: llvm-lto2 run -o %t1.o %t.o -r %t.o,patatino,r
> +; RUN: llvm-readobj -t %t1.o.1 | FileCheck %s --check-prefix=NOSYM
> +
> +; NOSYM-NOT: Name: patatino
> +
>  target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
>  target triple = "x86_64-unknown-linux-gnu"
>  
> Index: lib/LTO/LTO.cpp
> ===================================================================
> --- lib/LTO/LTO.cpp
> +++ lib/LTO/LTO.cpp
> @@ -704,18 +704,17 @@
>      if (!Sym.getIRName().empty()) {
>        auto GUID = GlobalValue::getGUID(GlobalValue::getGlobalIdentifier(
>            Sym.getIRName(), GlobalValue::ExternalLinkage, ""));
> -      if (Res.Prevailing) {
> +      if (Res.Prevailing)
>          ThinLTO.PrevailingModuleForGUID[GUID] = BM.getModuleIdentifier();
>  
> -        // For linker redefined symbols (via --wrap or --defsym) we want to
> -        // switch the linkage to `weak` to prevent IPOs from happening.
> -        // Find the summary in the module for this very GV and record the new
> -        // linkage so that we can switch it when we import the GV.
> -        if (Res.LinkerRedefined)
> -          if (auto S = ThinLTO.CombinedIndex.findSummaryInModule(
> -                  GUID, BM.getModuleIdentifier()))
> -            S->setLinkage(GlobalValue::WeakAnyLinkage);
> -      }
> +      // For linker redefined symbols (via --wrap or --defsym) we want to
> +      // switch the linkage to `weak` to prevent IPOs from happening.
> +      // Find the summary in the module for this very GV and record the new
> +      // linkage so that we can switch it when we import the GV.
> +      if (Res.LinkerRedefined)
> +        if (auto S = ThinLTO.CombinedIndex.findSummaryInModule(
> +                GUID, BM.getModuleIdentifier()))
> +          S->setLinkage(GlobalValue::WeakAnyLinkage);
>  
>        // If the linker resolved the symbol to a local definition then mark it
>        // as local in the summary for the module we are adding.


More information about the llvm-commits mailing list