From 5b2088d1fac1f464cd51d4b660b29c5db47a54c4 Mon Sep 17 00:00:00 2001 From: Teresa Johnson Date: Wed, 29 May 2019 16:50:46 +0000 Subject: [PATCH] [ThinLTO] Use original alias visibility when importing Summary: When we import an alias, we do so by making a clone of the aliasee. Just as this clone uses the original alias name and linkage, it should also use the same visibility (not the aliasee's visibility). Otherwise, linker behavior is affected (e.g. if the aliasee was hidden, but the alias is not, the resulting imported clone should not be hidden, otherwise the linker will make the final symbol hidden which is incorrect). Reviewers: wmi Subscribers: mehdi_amini, inglorion, eraman, steven_wu, dexonsmith, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D62535 llvm-svn: 361989 --- llvm/lib/Transforms/IPO/FunctionImport.cpp | 5 +++-- llvm/test/ThinLTO/X86/Inputs/alias_import.ll | 2 +- llvm/test/ThinLTO/X86/alias_import.ll | 8 ++++---- 3 files changed, 8 insertions(+), 7 deletions(-) diff --git a/llvm/lib/Transforms/IPO/FunctionImport.cpp b/llvm/lib/Transforms/IPO/FunctionImport.cpp index 71a76a6..9207f5f 100644 --- a/llvm/lib/Transforms/IPO/FunctionImport.cpp +++ b/llvm/lib/Transforms/IPO/FunctionImport.cpp @@ -1053,9 +1053,10 @@ static Function *replaceAliasWithAliasee(Module *SrcModule, GlobalAlias *GA) { ValueToValueMapTy VMap; Function *NewFn = CloneFunction(Fn, VMap); - // Clone should use the original alias's linkage and name, and we ensure - // all uses of alias instead use the new clone (casted if necessary). + // Clone should use the original alias's linkage, visibility and name, and we + // ensure all uses of alias instead use the new clone (casted if necessary). NewFn->setLinkage(GA->getLinkage()); + NewFn->setVisibility(GA->getVisibility()); GA->replaceAllUsesWith(ConstantExpr::getBitCast(NewFn, GA->getType())); NewFn->takeName(GA); return NewFn; diff --git a/llvm/test/ThinLTO/X86/Inputs/alias_import.ll b/llvm/test/ThinLTO/X86/Inputs/alias_import.ll index 7425f23..740ab4b 100644 --- a/llvm/test/ThinLTO/X86/Inputs/alias_import.ll +++ b/llvm/test/ThinLTO/X86/Inputs/alias_import.ll @@ -5,7 +5,7 @@ target datalayout = "e-m:o-i64:64-f80:128-n8:16:32:64-S128" @globalfuncLinkonceAlias = linkonce alias void (...), bitcast (void ()* @globalfunc to void (...)*) @globalfuncWeakODRAlias = weak_odr alias void (...), bitcast (void ()* @globalfunc to void (...)*) @globalfuncLinkonceODRAlias = linkonce_odr alias void (...), bitcast (void ()* @globalfunc to void (...)*) -define void @globalfunc() { +define hidden void @globalfunc() { entry: ret void } diff --git a/llvm/test/ThinLTO/X86/alias_import.ll b/llvm/test/ThinLTO/X86/alias_import.ll index af131e1..6c6716a 100644 --- a/llvm/test/ThinLTO/X86/alias_import.ll +++ b/llvm/test/ThinLTO/X86/alias_import.ll @@ -38,7 +38,7 @@ ; PROMOTE-DAG: @linkonceODRfuncLinkonceAlias = weak alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*) ; PROMOTE-DAG: @linkonceODRfuncLinkonceODRAlias = weak_odr alias void (...), bitcast (void ()* @linkonceODRfunc to void (...)*) -; PROMOTE-DAG: define void @globalfunc() +; PROMOTE-DAG: define hidden void @globalfunc() ; PROMOTE-DAG: define internal void @internalfunc() ; PROMOTE-DAG: define weak_odr void @linkonceODRfunc() ; PROMOTE-DAG: define weak_odr void @weakODRfunc() @@ -52,11 +52,11 @@ ; IMPORT-DAG: define available_externally void @linkonceODRfuncAlias ; IMPORT-DAG: define available_externally void @linkonceODRfuncWeakODRAlias ; IMPORT-DAG: define available_externally void @linkonceODRfuncLinkonceODRAlias -; IMPORT-DAG: define available_externally void @globalfuncAlias() +; IMPORT-DAG: define available_externally dso_local void @globalfuncAlias() ; IMPORT-DAG: declare void @globalfuncWeakAlias() ; IMPORT-DAG: declare void @globalfuncLinkonceAlias() -; IMPORT-DAG: define available_externally void @globalfuncWeakODRAlias() -; IMPORT-DAG: define available_externally void @globalfuncLinkonceODRAlias() +; IMPORT-DAG: define available_externally dso_local void @globalfuncWeakODRAlias() +; IMPORT-DAG: define available_externally dso_local void @globalfuncLinkonceODRAlias() ; IMPORT-DAG: define available_externally dso_local void @internalfuncAlias() ; IMPORT-DAG: declare void @internalfuncWeakAlias() ; IMPORT-DAG: declare void @internalfuncLinkonceAlias() -- 2.7.4