mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2025-02-09 22:04:10 +00:00
[ThinLTO] Teach ThinLTO about auto hide symbols
Summary: For symbols that has linkonce_odr linkage and unnamed_addr, it can be auto hide by linker to avoid weak external symbols. Teach ThinLTO to perform auto hide so it can safely promote linkonce_odr to weak symbols without breaking this nice property. Reviewers: tejohnson, mehdi_amini Reviewed By: tejohnson Subscribers: inglorion, eraman, rnk, pcc, llvm-commits Differential Revision: https://reviews.llvm.org/D43130 llvm-svn: 324757
This commit is contained in:
parent
6201ac53ac
commit
40e575fa49
@ -683,6 +683,13 @@ void llvm::thinLTOResolveWeakForLinkerModule(
|
||||
// changed to enable this for aliases.
|
||||
llvm_unreachable("Expected GV to be converted");
|
||||
} else {
|
||||
// If the original symbols has global unnamed addr and linkonce_odr linkage,
|
||||
// it should be an auto hide symbol. Add hidden visibility to the symbol to
|
||||
// preserve the property.
|
||||
if (GV.hasLinkOnceODRLinkage() && GV.hasGlobalUnnamedAddr() &&
|
||||
NewLinkage == GlobalValue::WeakODRLinkage)
|
||||
GV.setVisibility(GlobalValue::HiddenVisibility);
|
||||
|
||||
DEBUG(dbgs() << "ODR fixing up linkage for `" << GV.getName() << "` from "
|
||||
<< GV.getLinkage() << " to " << NewLinkage << "\n");
|
||||
GV.setLinkage(NewLinkage);
|
||||
|
10
test/ThinLTO/X86/linkonce_odr_unnamed_addr.ll
Normal file
10
test/ThinLTO/X86/linkonce_odr_unnamed_addr.ll
Normal file
@ -0,0 +1,10 @@
|
||||
; This test ensures that when linkonce_odr + unnamed_addr symbols promoted to
|
||||
; weak symbols, it preserves the auto hide property.
|
||||
|
||||
; RUN: opt -module-summary %s -o %t.bc
|
||||
; RUN: opt -module-summary %s -o %t2.bc
|
||||
; RUN: llvm-lto -thinlto-action=thinlink -o %t3.bc %t.bc %t2.bc
|
||||
; RUN: llvm-lto -thinlto-action=promote %t.bc -thinlto-index=%t3.bc -o - | llvm-dis -o - | FileCheck %s
|
||||
|
||||
; CHECK: @linkonceodrunnamed = weak_odr hidden unnamed_addr constant i32 0
|
||||
@linkonceodrunnamed = linkonce_odr unnamed_addr constant i32 0
|
@ -10,7 +10,7 @@
|
||||
; Copy from first module is prevailing and converted to weak_odr, copy
|
||||
; from second module is preempted and converted to available_externally and
|
||||
; removed from comdat.
|
||||
; IMPORT1: define weak_odr i32 @f(i8*) unnamed_addr comdat($c1) {
|
||||
; IMPORT1: define weak_odr hidden i32 @f(i8*) unnamed_addr comdat($c1) {
|
||||
; IMPORT2: define available_externally i32 @f(i8*) unnamed_addr {
|
||||
|
||||
; RUN: llvm-nm -o - < %t1.bc.thinlto.o | FileCheck %s --check-prefix=NM1
|
||||
|
Loading…
x
Reference in New Issue
Block a user