Skip to content

Commit

Permalink
[ThinLTO] Teach ThinLTO about auto hide symbols
Browse files Browse the repository at this point in the history
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
  • Loading branch information
cachemeifyoucan committed Feb 9, 2018
1 parent 37a9889 commit 33ba93c
Show file tree
Hide file tree
Showing 3 changed files with 18 additions and 1 deletion.
7 changes: 7 additions & 0 deletions llvm/lib/Transforms/IPO/FunctionImport.cpp
Expand Up @@ -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);
Expand Down
10 changes: 10 additions & 0 deletions llvm/test/ThinLTO/X86/linkonce_odr_unnamed_addr.ll
@@ -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
2 changes: 1 addition & 1 deletion llvm/test/ThinLTO/X86/linkonce_resolution_comdat.ll
Expand Up @@ -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
Expand Down

0 comments on commit 33ba93c

Please sign in to comment.