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