Skip to content

Commit 92ec7cf

Browse files
committed
[MLIR][mlir-link] Allow linking LLVM aliases
1 parent 0124fef commit 92ec7cf

File tree

1 file changed

+21
-4
lines changed

1 file changed

+21
-4
lines changed

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

Lines changed: 21 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@ LLVM::LLVMSymbolLinkerInterface::LLVMSymbolLinkerInterface(Dialect *dialect)
2727

2828
bool LLVM::LLVMSymbolLinkerInterface::canBeLinked(Operation *op) const {
2929
return isa<LLVM::GlobalOp, LLVM::LLVMFuncOp, LLVM::GlobalCtorsOp,
30-
LLVM::GlobalDtorsOp, LLVM::ComdatOp>(op);
30+
LLVM::GlobalDtorsOp, LLVM::ComdatOp, LLVM::AliasOp>(op);
3131
}
3232

3333
//===--------------------------------------------------------------------===//
@@ -39,6 +39,8 @@ Linkage LLVM::LLVMSymbolLinkerInterface::getLinkage(Operation *op) {
3939
return gv.getLinkage();
4040
if (auto fn = dyn_cast<LLVM::LLVMFuncOp>(op))
4141
return fn.getLinkage();
42+
if (auto alias = dyn_cast<LLVM::AliasOp>(op))
43+
return alias.getLinkage();
4244
if (isa<LLVM::GlobalCtorsOp, LLVM::GlobalDtorsOp, LLVM::ComdatOp>(op))
4345
return Linkage::Appending;
4446
llvm_unreachable("unexpected operation");
@@ -49,6 +51,8 @@ Visibility LLVM::LLVMSymbolLinkerInterface::getVisibility(Operation *op) {
4951
return gv.getVisibility_();
5052
if (auto fn = dyn_cast<LLVM::LLVMFuncOp>(op))
5153
return fn.getVisibility_();
54+
if (auto alias = dyn_cast<LLVM::AliasOp>(op))
55+
return alias.getVisibility_();
5256

5357
if (isa<LLVM::GlobalCtorsOp, LLVM::GlobalDtorsOp, LLVM::ComdatOp>(op))
5458
return Visibility::Default;
@@ -61,6 +65,8 @@ void LLVM::LLVMSymbolLinkerInterface::setVisibility(Operation *op,
6165
return gv.setVisibility_(visibility);
6266
if (auto fn = dyn_cast<LLVM::LLVMFuncOp>(op))
6367
return fn.setVisibility_(visibility);
68+
if (auto alias = dyn_cast<LLVM::AliasOp>(op))
69+
return alias.setVisibility_(visibility);
6470
// GlobalCotrs and Dtors are defined as operations in mlir
6571
// but as globals in LLVM IR
6672
if (isa<LLVM::GlobalCtorsOp, LLVM::GlobalDtorsOp, LLVM::ComdatOp>(op))
@@ -106,7 +112,7 @@ bool LLVM::LLVMSymbolLinkerInterface::isDeclaration(Operation *op) {
106112
return gv.getInitializerRegion().empty() && !gv.getValue();
107113
if (auto fn = dyn_cast<LLVM::LLVMFuncOp>(op))
108114
return fn.getBody().empty();
109-
if (isa<LLVM::GlobalCtorsOp, LLVM::GlobalDtorsOp, LLVM::ComdatOp>(op))
115+
if (isa<LLVM::GlobalCtorsOp, LLVM::GlobalDtorsOp, LLVM::ComdatOp, LLVM::AliasOp>(op))
110116
return false;
111117
llvm_unreachable("unexpected operation");
112118
}
@@ -129,6 +135,10 @@ UnnamedAddr LLVM::LLVMSymbolLinkerInterface::getUnnamedAddr(Operation *op) {
129135
auto addr = fn.getUnnamedAddr();
130136
return addr ? *addr : UnnamedAddr::Global;
131137
}
138+
if (auto alias = dyn_cast<LLVM::AliasOp>(op)) {
139+
auto addr = alias.getUnnamedAddr();
140+
return addr ? *addr : UnnamedAddr::Global;
141+
}
132142
if (isa<LLVM::GlobalCtorsOp, LLVM::GlobalDtorsOp, LLVM::ComdatOp>(op))
133143
return UnnamedAddr::Global;
134144
llvm_unreachable("unexpected operation");
@@ -140,6 +150,8 @@ void LLVM::LLVMSymbolLinkerInterface::setUnnamedAddr(Operation *op,
140150
return gv.setUnnamedAddr(val);
141151
if (auto fn = dyn_cast<LLVM::LLVMFuncOp>(op))
142152
return fn.setUnnamedAddr(val);
153+
if (auto alias = dyn_cast<LLVM::AliasOp>(op))
154+
return alias.setUnnamedAddr(val);
143155
// GlobalCotrs and Dtors are defined as operations in mlir
144156
// but as globals in LLVM IR
145157
if (isa<LLVM::GlobalCtorsOp, LLVM::GlobalDtorsOp, LLVM::ComdatOp>(op))
@@ -153,14 +165,16 @@ LLVM::LLVMSymbolLinkerInterface::getAlignment(Operation *op) {
153165
return gv.getAlignment();
154166
if (auto fn = dyn_cast<LLVM::LLVMFuncOp>(op))
155167
return fn.getAlignment();
156-
if (isa<LLVM::GlobalCtorsOp, LLVM::GlobalDtorsOp>(op))
168+
if (isa<LLVM::GlobalCtorsOp, LLVM::GlobalDtorsOp, LLVM::AliasOp>(op))
157169
return {};
158170
llvm_unreachable("unexpected operation");
159171
}
160172

161173
bool LLVM::LLVMSymbolLinkerInterface::isConstant(Operation *op) {
162174
if (auto gv = dyn_cast<LLVM::GlobalOp>(op))
163175
return gv.getConstant();
176+
if (isa<LLVM::AliasOp>(op))
177+
return true;
164178
if (isa<LLVM::GlobalCtorsOp, LLVM::GlobalDtorsOp>(op))
165179
return false;
166180
llvm_unreachable("unexpected operation");
@@ -175,7 +189,7 @@ llvm::StringRef LLVM::LLVMSymbolLinkerInterface::getSection(Operation *op) {
175189
auto section = fn.getSection();
176190
return section ? section.value() : llvm::StringRef();
177191
}
178-
if (isa<LLVM::GlobalCtorsOp, LLVM::GlobalDtorsOp>(op))
192+
if (isa<LLVM::GlobalCtorsOp, LLVM::GlobalDtorsOp, LLVM::AliasOp>(op))
179193
return llvm::StringRef();
180194
llvm_unreachable("unexpected operation");
181195
}
@@ -184,6 +198,9 @@ uint32_t LLVM::LLVMSymbolLinkerInterface::getAddressSpace(Operation *op) {
184198
if (auto gv = dyn_cast<LLVM::GlobalOp>(op)) {
185199
return gv.getAddrSpace();
186200
}
201+
if (auto alias = dyn_cast<LLVM::AliasOp>(op)) {
202+
return alias.getAddrSpace();
203+
}
187204
if (isa<LLVM::GlobalCtorsOp, LLVM::GlobalDtorsOp>(op))
188205
return 0;
189206
llvm_unreachable("unexpected operation");

0 commit comments

Comments
 (0)