135e0204eSTeresa Johnson; RUN: opt -module-summary %s -o %t.o
235e0204eSTeresa Johnson; RUN: opt -module-summary %p/Inputs/thinlto_weak_resolution.ll -o %t2.o
335e0204eSTeresa Johnson
435e0204eSTeresa Johnson; Verify that prevailing weak for linker symbol is kept.
535e0204eSTeresa Johnson; Note that gold picks the first copy of a function as the prevailing one,
635e0204eSTeresa Johnson; so listing %t.o first is sufficient to ensure that its copies are prevailing.
73efcfaddSEugene Leviant; RUN: %gold -m elf_x86_64 -plugin %llvmshlibdir/LLVMgold%shlibext \
835e0204eSTeresa Johnson; RUN:     --plugin-opt=thinlto \
935e0204eSTeresa Johnson; RUN:     --plugin-opt=save-temps \
1035e0204eSTeresa Johnson; RUN:     -shared \
1135e0204eSTeresa Johnson; RUN:     -o %t3.o %t.o %t2.o
1235e0204eSTeresa Johnson
1335e0204eSTeresa Johnson; RUN: llvm-nm %t3.o | FileCheck %s
1435e0204eSTeresa Johnson; CHECK: weakfunc
1535e0204eSTeresa Johnson
164566c6dbSTeresa Johnson; The preempted functions should have been eliminated (the plugin will
174566c6dbSTeresa Johnson; set linkage of odr functions to available_externally, and convert
184566c6dbSTeresa Johnson; linkonce and weak to declarations).
199ba95f99STeresa Johnson; RUN: llvm-dis %t2.o.4.opt.bc -o - | FileCheck --check-prefix=OPT2 %s
205269dd7fSBryan Chan; OPT2: target triple =
219ba95f99STeresa Johnson; OPT2-NOT: @
2235e0204eSTeresa Johnson
233bc8abdfSTeresa Johnson; RUN: llvm-dis %t.o.3.import.bc -o - | FileCheck --check-prefix=IMPORT %s
244566c6dbSTeresa Johnson; RUN: llvm-dis %t2.o.3.import.bc -o - | FileCheck --check-prefix=IMPORT2 %s
2535e0204eSTeresa Johnson
262ceb628fSDavide Italianotarget datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
2735e0204eSTeresa Johnsontarget triple = "x86_64-unknown-linux-gnu"
2835e0204eSTeresa Johnson
2935e0204eSTeresa Johnson
3035e0204eSTeresa Johnsondefine i32 @main() #0 {
3135e0204eSTeresa Johnsonentry:
3235e0204eSTeresa Johnson  call void @linkonceodralias()
3335e0204eSTeresa Johnson  call void @linkoncealias()
3435e0204eSTeresa Johnson  call void @linkonceodrfuncwithalias()
3535e0204eSTeresa Johnson  call void @linkoncefuncwithalias()
3635e0204eSTeresa Johnson  call void @linkonceodrfunc()
3735e0204eSTeresa Johnson  call void @linkoncefunc()
3835e0204eSTeresa Johnson  call void @weakodrfunc()
3935e0204eSTeresa Johnson  call void @weakfunc()
4035e0204eSTeresa Johnson  call void @linkonceodrfuncInSingleModule()
4135e0204eSTeresa Johnson  ret i32 0
4235e0204eSTeresa Johnson}
4335e0204eSTeresa Johnson
443bc8abdfSTeresa Johnson; Alias are resolved to weak_odr in prevailing module, but left as linkonce_odr
453bc8abdfSTeresa Johnson; in non-prevailing module (illegal to have an available_externally alias).
46*146f7fecSFangrui Song; IMPORT: @linkonceodralias = weak_odr alias void (), ptr @linkonceodrfuncwithalias
47*146f7fecSFangrui Song; IMPORT2: @linkonceodralias = linkonce_odr alias void (), ptr @linkonceodrfuncwithalias
48*146f7fecSFangrui Song@linkonceodralias = linkonce_odr alias void (), ptr @linkonceodrfuncwithalias
4935e0204eSTeresa Johnson
503bc8abdfSTeresa Johnson; Alias are resolved in prevailing module, but not optimized in
513bc8abdfSTeresa Johnson; non-prevailing module (illegal to have an available_externally alias).
52*146f7fecSFangrui Song; IMPORT: @linkoncealias = weak alias void (), ptr @linkoncefuncwithalias
53*146f7fecSFangrui Song; IMPORT2: @linkoncealias = linkonce alias void (), ptr @linkoncefuncwithalias
54*146f7fecSFangrui Song@linkoncealias = linkonce alias void (), ptr @linkoncefuncwithalias
5535e0204eSTeresa Johnson
563bc8abdfSTeresa Johnson; Function with an alias are resolved in prevailing module, but
573bc8abdfSTeresa Johnson; not optimized in non-prevailing module (illegal to have an
583bc8abdfSTeresa Johnson; available_externally aliasee).
593bc8abdfSTeresa Johnson; IMPORT: define weak_odr void @linkonceodrfuncwithalias()
603bc8abdfSTeresa Johnson; IMPORT2: define linkonce_odr void @linkonceodrfuncwithalias()
6135e0204eSTeresa Johnsondefine linkonce_odr void @linkonceodrfuncwithalias() #0 {
6235e0204eSTeresa Johnsonentry:
6335e0204eSTeresa Johnson  ret void
6435e0204eSTeresa Johnson}
6535e0204eSTeresa Johnson
663bc8abdfSTeresa Johnson; Function with an alias are resolved to weak in prevailing module, but
673bc8abdfSTeresa Johnson; not optimized in non-prevailing module (illegal to have an
683bc8abdfSTeresa Johnson; available_externally aliasee).
693bc8abdfSTeresa Johnson; IMPORT: define weak void @linkoncefuncwithalias()
703bc8abdfSTeresa Johnson; IMPORT2: define linkonce void @linkoncefuncwithalias()
7135e0204eSTeresa Johnsondefine linkonce void @linkoncefuncwithalias() #0 {
7235e0204eSTeresa Johnsonentry:
7335e0204eSTeresa Johnson  ret void
7435e0204eSTeresa Johnson}
7535e0204eSTeresa Johnson
763bc8abdfSTeresa Johnson; IMPORT: define weak_odr void @linkonceodrfunc()
773bc8abdfSTeresa Johnson; IMPORT2: define available_externally void @linkonceodrfunc()
7835e0204eSTeresa Johnsondefine linkonce_odr void @linkonceodrfunc() #0 {
7935e0204eSTeresa Johnsonentry:
8035e0204eSTeresa Johnson  ret void
8135e0204eSTeresa Johnson}
823bc8abdfSTeresa Johnson; IMPORT: define weak void @linkoncefunc()
834566c6dbSTeresa Johnson; IMPORT2: declare void @linkoncefunc()
8435e0204eSTeresa Johnsondefine linkonce void @linkoncefunc() #0 {
8535e0204eSTeresa Johnsonentry:
8635e0204eSTeresa Johnson  ret void
8735e0204eSTeresa Johnson}
883bc8abdfSTeresa Johnson; IMPORT: define weak_odr void @weakodrfunc()
893bc8abdfSTeresa Johnson; IMPORT2: define available_externally void @weakodrfunc()
9035e0204eSTeresa Johnsondefine weak_odr void @weakodrfunc() #0 {
9135e0204eSTeresa Johnsonentry:
9235e0204eSTeresa Johnson  ret void
9335e0204eSTeresa Johnson}
943bc8abdfSTeresa Johnson; IMPORT: define weak void @weakfunc()
954566c6dbSTeresa Johnson; IMPORT2: declare void @weakfunc()
9635e0204eSTeresa Johnsondefine weak void @weakfunc() #0 {
9735e0204eSTeresa Johnsonentry:
9835e0204eSTeresa Johnson  ret void
9935e0204eSTeresa Johnson}
10035e0204eSTeresa Johnson
1013bc8abdfSTeresa Johnson; IMPORT: weak_odr void @linkonceodrfuncInSingleModule()
10235e0204eSTeresa Johnsondefine linkonce_odr void @linkonceodrfuncInSingleModule() #0 {
10335e0204eSTeresa Johnsonentry:
10435e0204eSTeresa Johnson  ret void
10535e0204eSTeresa Johnson}
106