@@ -17,6 +17,7 @@ using namespace mlir;
1717using namespace mlir ::link;
1818
1919using Linkage = LLVM::Linkage;
20+ using Visibility = LLVM::Visibility;
2021
2122static Linkage getLinkage (Operation *op) {
2223 if (auto gv = dyn_cast<LLVM::GlobalOp>(op))
@@ -78,6 +79,38 @@ static bool isExternalWeakLinkage(Linkage linkage) {
7879 return linkage == Linkage::ExternWeak;
7980}
8081
82+ static Visibility getVisibility (Operation *op) {
83+ if (auto gv = dyn_cast<LLVM::GlobalOp>(op))
84+ return gv.getVisibility_ ();
85+ if (auto fn = dyn_cast<LLVM::LLVMFuncOp>(op))
86+ return fn.getVisibility_ ();
87+ llvm_unreachable (" unexpected operation" );
88+ }
89+
90+ static void setVisibility (Operation *op, Visibility visibility) {
91+ if (auto gv = dyn_cast<LLVM::GlobalOp>(op))
92+ return gv.setVisibility_ (visibility);
93+ if (auto fn = dyn_cast<LLVM::LLVMFuncOp>(op))
94+ return fn.setVisibility_ (visibility);
95+ llvm_unreachable (" unexpected operation" );
96+ }
97+
98+ static bool isHiddenVisibility (Visibility visibility) {
99+ return visibility == Visibility::Hidden;
100+ }
101+
102+ static bool isProtectedVisibility (Visibility visibility) {
103+ return visibility == Visibility::Protected;
104+ }
105+
106+ static Visibility getMinVisibility (Visibility lhs, Visibility rhs) {
107+ if (isHiddenVisibility (lhs) || isHiddenVisibility (rhs))
108+ return Visibility::Hidden;
109+ if (isProtectedVisibility (lhs) || isProtectedVisibility (rhs))
110+ return Visibility::Protected;
111+ return Visibility::Default;
112+ }
113+
81114LLVM_ATTRIBUTE_UNUSED static bool isCommonLinkage (Linkage linkage) {
82115 return linkage == Linkage::Common;
83116}
@@ -245,6 +278,11 @@ class LLVMSymbolLinkerInterface : public SymbolLinkerInterface {
245278 Linkage srcLinkage = getLinkage (pair.src );
246279 Linkage dstLinkage = getLinkage (pair.dst );
247280
281+ Visibility visibility =
282+ getMinVisibility (getVisibility (pair.src ), getVisibility (pair.dst ));
283+ setVisibility (pair.src , visibility);
284+ setVisibility (pair.dst , visibility);
285+
248286 const bool srcIsDeclaration = isDeclarationForLinker (pair.src );
249287 const bool dstIsDeclaration = isDeclarationForLinker (pair.dst );
250288
0 commit comments