Skip to content

Commit db016fe

Browse files
committed
[CIR][cir-link] Implement CIRSymbolLinkerInterface
1 parent 6ff77e6 commit db016fe

File tree

1 file changed

+101
-19
lines changed

1 file changed

+101
-19
lines changed

clang/lib/CIR/Interfaces/CIRLinkerInterface.cpp

Lines changed: 101 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
//===----------------------------------------------------------------------===//
1212

1313
#include "clang/CIR/Interfaces/CIRLinkerInterface.h"
14+
#include "mlir/Linker/LLVMLinkerMixin.h"
1415
#include "mlir/Linker/LinkerInterface.h"
1516
#include "clang/CIR/Dialect/IR/CIRDialect.h"
1617

@@ -21,41 +22,122 @@ using namespace mlir::link;
2122
// CIRSymbolLinkerInterface
2223
//===----------------------------------------------------------------------===//
2324

24-
class CIRSymbolLinkerInterface : public SymbolLinkerInterface {
25+
class CIRSymbolLinkerInterface
26+
: public SymbolAttrLLVMLinkerInterface<CIRSymbolLinkerInterface> {
2527
public:
26-
using SymbolLinkerInterface::SymbolLinkerInterface;
28+
CIRSymbolLinkerInterface(Dialect *dialect)
29+
: SymbolAttrLLVMLinkerInterface(dialect) {}
2730

28-
bool canBeLinked(Operation *op) const override { llvm_unreachable("NYI"); }
31+
bool canBeLinked(Operation *op) const override {
32+
return isa<cir::GlobalOp>(op) || isa<cir::FuncOp>(op);
33+
}
2934

30-
StringRef getSymbol(Operation *op) const override { llvm_unreachable("NYI"); }
35+
//===--------------------------------------------------------------------===//
36+
// LLVMLinkerMixin required methods from derived linker interface
37+
//===--------------------------------------------------------------------===//
38+
39+
// TODO: expose convertLinkage from LowerToLLVM.cpp
40+
static Linkage toLLVMLinkage(cir::GlobalLinkageKind linkage) {
41+
using CIR = cir::GlobalLinkageKind;
42+
using LLVM = mlir::LLVM::Linkage;
43+
44+
switch (linkage) {
45+
case CIR::AvailableExternallyLinkage:
46+
return LLVM::AvailableExternally;
47+
case CIR::CommonLinkage:
48+
return LLVM::Common;
49+
case CIR::ExternalLinkage:
50+
return LLVM::External;
51+
case CIR::ExternalWeakLinkage:
52+
return LLVM::ExternWeak;
53+
case CIR::InternalLinkage:
54+
return LLVM::Internal;
55+
case CIR::LinkOnceAnyLinkage:
56+
return LLVM::Linkonce;
57+
case CIR::LinkOnceODRLinkage:
58+
return LLVM::LinkonceODR;
59+
case CIR::PrivateLinkage:
60+
return LLVM::Private;
61+
case CIR::WeakAnyLinkage:
62+
return LLVM::Weak;
63+
case CIR::WeakODRLinkage:
64+
return LLVM::WeakODR;
65+
};
66+
}
3167

32-
Conflict findConflict(Operation *src) const override {
33-
llvm_unreachable("NYI");
68+
static Linkage getLinkage(Operation *op) {
69+
if (auto gv = dyn_cast<cir::GlobalOp>(op))
70+
return toLLVMLinkage(gv.getLinkage());
71+
if (auto fn = dyn_cast<cir::FuncOp>(op))
72+
return toLLVMLinkage(fn.getLinkage());
73+
llvm_unreachable("unexpected operation");
3474
}
3575

36-
bool isLinkNeeded(Conflict pair, bool forDependency) const override {
37-
llvm_unreachable("NYI");
76+
// TODO: expose lowerCIRVisibilityToLLVMVisibility from LowerToLLVM.cpp
77+
static Visibility toLLVMVisibility(cir::VisibilityAttr visibility) {
78+
return toLLVMVisibility(visibility.getValue());
3879
}
3980

40-
LogicalResult resolveConflict(Conflict pair) override {
41-
llvm_unreachable("NYI");
81+
static Visibility toLLVMVisibility(cir::VisibilityKind visibility) {
82+
using CIR = cir::VisibilityKind;
83+
using LLVM = mlir::LLVM::Visibility;
84+
85+
switch (visibility) {
86+
case CIR::Default:
87+
return LLVM::Default;
88+
case CIR::Hidden:
89+
return LLVM::Hidden;
90+
case CIR::Protected:
91+
return LLVM::Protected;
92+
};
4293
}
4394

44-
void registerForLink(Operation *op) override { llvm_unreachable("NYI"); }
95+
static cir::VisibilityKind toCIRVisibility(Visibility visibility) {
96+
using CIR = cir::VisibilityKind;
97+
using LLVM = mlir::LLVM::Visibility;
98+
99+
switch (visibility) {
100+
case LLVM::Default:
101+
return CIR::Default;
102+
case LLVM::Hidden:
103+
return CIR::Hidden;
104+
case LLVM::Protected:
105+
return CIR::Protected;
106+
};
107+
}
45108

46-
LogicalResult initialize(ModuleOp src) override { return success(); }
109+
static cir::VisibilityAttr toCIRVisibilityAttr(Visibility visibility,
110+
MLIRContext *mlirContext) {
111+
return cir::VisibilityAttr::get(mlirContext, toCIRVisibility(visibility));
112+
}
47113

48-
LogicalResult link(LinkState &state) const override {
49-
llvm_unreachable("NYI");
114+
static Visibility getVisibility(Operation *op) {
115+
if (auto gv = dyn_cast<cir::GlobalOp>(op))
116+
return toLLVMVisibility(gv.getGlobalVisibility());
117+
if (auto fn = dyn_cast<cir::FuncOp>(op))
118+
return toLLVMVisibility(fn.getGlobalVisibility());
119+
llvm_unreachable("unexpected operation");
50120
}
51121

52-
Operation *materialize(Operation *src, LinkState &state) const override {
53-
llvm_unreachable("NYI");
54-
}
122+
static void setVisibility(Operation *op, Visibility visibility) {
123+
if (auto gv = dyn_cast<cir::GlobalOp>(op))
124+
return gv.setGlobalVisibilityAttr(
125+
toCIRVisibilityAttr(visibility, op->getContext()));
126+
if (auto fn = dyn_cast<cir::FuncOp>(op))
127+
return fn.setGlobalVisibilityAttr(
128+
toCIRVisibilityAttr(visibility, op->getContext()));
129+
llvm_unreachable("unexpected operation");
130+
}
55131

56-
SmallVector<Operation *> dependencies(Operation *op) const override {
57-
llvm_unreachable("NYI");
132+
static bool isDeclaration(Operation *op) {
133+
if (auto gv = dyn_cast<cir::GlobalOp>(op))
134+
return gv.isDeclaration();
135+
if (auto fn = dyn_cast<cir::FuncOp>(op))
136+
return fn.isDeclaration();
137+
llvm_unreachable("unexpected operation");
58138
}
139+
140+
static unsigned getBitWidth(Operation *op) { llvm_unreachable("NYI"); }
59141
};
60142

61143
//===----------------------------------------------------------------------===//

0 commit comments

Comments
 (0)