Skip to content

Commit 31eb8ef

Browse files
committed
[MLIR][mlir-link] Implement visibility resolution
1 parent 966ee90 commit 31eb8ef

File tree

1 file changed

+38
-0
lines changed

1 file changed

+38
-0
lines changed

mlir/lib/Dialect/LLVMIR/IR/LLVMLinkerInterface.cpp

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ using namespace mlir;
1717
using namespace mlir::link;
1818

1919
using Linkage = LLVM::Linkage;
20+
using Visibility = LLVM::Visibility;
2021

2122
static 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+
81114
LLVM_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

Comments
 (0)