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> {
2527public:
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