[llvm] r262727 - [ThinLTO] Ensure prevailing linkonce emitted as weak in ThinLTO backends

Teresa Johnson via llvm-commits llvm-commits at lists.llvm.org
Fri Mar 4 13:15:13 PST 2016


Thanks, H.J.

Did you commit this or do you want me to go ahead and do that?

Teresa

On Fri, Mar 4, 2016 at 1:08 PM, H.J. Lu <hjl.tools at gmail.com> wrote:

> On Fri, Mar 4, 2016 at 9:48 AM, Teresa Johnson via llvm-commits
> <llvm-commits at lists.llvm.org> wrote:
> > Author: tejohnson
> > Date: Fri Mar  4 11:48:35 2016
> > New Revision: 262727
> >
> > URL: http://llvm.org/viewvc/llvm-project?rev=262727&view=rev
> > Log:
> > [ThinLTO] Ensure prevailing linkonce emitted as weak in ThinLTO backends
> >
> > Summary:
> > Since IR files are all compiled into separate independent object files
> > in ThinLTO mode, the prevailing linkonce symbols must be emitted in its
> > object file even if it is no longer referenced there, e.g. if no
> > references remain in the module after inlining, since it may be
> > referenced by another ThinLTO compiled object file. This is done by
> > changing LDPR_PREVAILING_DEF_IRONLY* symbols to LDPR_PREVAILING_DEF,
> > which converts the prevailing linkonce to weak. We also don't need the
> > other prevailing IRONLY handling for internalization, which is not
> > currently performed for ThinLTO.
> >
> > Test case included.
> >
> > Reviewers: davidxl, rafael
> >
> > Subscribers: rafael, joker.eph, llvm-commits
> >
> > Differential Revision: http://reviews.llvm.org/D16173
> >
> > Added:
> >     llvm/trunk/test/tools/gold/X86/Inputs/thinlto_linkonceresolution.ll
> >     llvm/trunk/test/tools/gold/X86/thinlto_linkonceresolution.ll
> > Modified:
> >     llvm/trunk/tools/gold/gold-plugin.cpp
> >
> > Added:
> llvm/trunk/test/tools/gold/X86/Inputs/thinlto_linkonceresolution.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/gold/X86/Inputs/thinlto_linkonceresolution.ll?rev=262727&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/test/tools/gold/X86/Inputs/thinlto_linkonceresolution.ll
> (added)
> > +++ llvm/trunk/test/tools/gold/X86/Inputs/thinlto_linkonceresolution.ll
> Fri Mar  4 11:48:35 2016
> > @@ -0,0 +1,4 @@
> > +target triple = "x86_64-unknown-linux-gnu"
> > +define linkonce_odr hidden void @f() {
> > +  ret void
> > +}
> >
> > Added: llvm/trunk/test/tools/gold/X86/thinlto_linkonceresolution.ll
> > URL:
> http://llvm.org/viewvc/llvm-project/llvm/trunk/test/tools/gold/X86/thinlto_linkonceresolution.ll?rev=262727&view=auto
> >
> ==============================================================================
> > --- llvm/trunk/test/tools/gold/X86/thinlto_linkonceresolution.ll (added)
> > +++ llvm/trunk/test/tools/gold/X86/thinlto_linkonceresolution.ll Fri
> Mar  4 11:48:35 2016
> > @@ -0,0 +1,32 @@
> > +; RUN: llvm-as -function-summary %s -o %t.o
> > +; RUN: llvm-as -function-summary
> %p/Inputs/thinlto_linkonceresolution.ll -o %t2.o
> > +
> > +; Ensure the plugin ensures that for ThinLTO the prevailing copy of a
> > +; linkonce symbol is changed to weak to ensure it is not eliminated.
> > +; Note that gold picks the first copy of f() as the prevailing one,
> > +; so listing %t2.o first is sufficient to ensure that this copy is
> > +; preempted. Also, set the import-instr-limit to 0 to prevent f() from
> > +; being imported from %t2.o which hides the problem.
> > +; RUN: %gold -plugin %llvmshlibdir/LLVMgold.so \
> > +; RUN:     --plugin-opt=thinlto \
> > +; RUN:     --plugin-opt=-import-instr-limit=0 \
> > +; RUN:     --plugin-opt=save-temps \
> > +; RUN:     -o %t3.o %t2.o %t.o
> > +; RUN: llvm-nm %t3.o | FileCheck %s
> > +; RUN: llvm-dis %t.o.opt.bc -o - | FileCheck --check-prefix=OPT %s
> > +; RUN: llvm-dis %t2.o.opt.bc -o - | FileCheck --check-prefix=OPT2 %s
> > +
> > +; Ensure that f() is defined in resulting object file, and also
> > +; confirm the weak linkage directly in the saved opt bitcode files.
> > +; CHECK-NOT: U f
> > +; OPT: declare extern_weak hidden void @f()
> > +; OPT2: define weak_odr hidden void @f()
> > +
> > +target triple = "x86_64-unknown-linux-gnu"
>
> When you specify target triple, you should pass -m elf_x86_64
> to linker since the default linker target may be different.
>
>
> --
> H.J.
> ----
> diff --git a/test/tools/gold/X86/thinlto_linkonceresolution.ll
> b/test/tools/gold/X86/thinlto_linkonceresolution.ll
> index 044087b..e6ed95b 100644
> --- a/test/tools/gold/X86/thinlto_linkonceresolution.ll
> +++ b/test/tools/gold/X86/thinlto_linkonceresolution.ll
> @@ -7,7 +7,7 @@
>  ; so listing %t2.o first is sufficient to ensure that this copy is
>  ; preempted. Also, set the import-instr-limit to 0 to prevent f() from
>  ; being imported from %t2.o which hides the problem.
> -; RUN: %gold -plugin %llvmshlibdir/LLVMgold.so \
> +; RUN: %gold -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold.so \
>  ; RUN:     --plugin-opt=thinlto \
>  ; RUN:     --plugin-opt=-import-instr-limit=0 \
>  ; RUN:     --plugin-opt=save-temps \
>



-- 
Teresa Johnson |  Software Engineer |  tejohnson at google.com |  408-460-2413
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-commits/attachments/20160304/0b83415d/attachment.html>


More information about the llvm-commits mailing list