@@ -85,23 +85,25 @@ static bool hasComdat(Operation *op) {
85
85
static SymbolRefAttr getComdatSymbol (Operation *op) {
86
86
assert (hasComdat (op) && " Operation with Comdat expected" );
87
87
if (auto gv = dyn_cast<LLVM::GlobalOp>(op))
88
- return gv.getComdat ().value ();
88
+ return gv.getComdat ().value ();
89
89
if (auto fn = dyn_cast<LLVM::LLVMFuncOp>(op))
90
- return fn.getComdat ().value ();
90
+ return fn.getComdat ().value ();
91
91
llvm_unreachable (" unexpected operation" );
92
92
}
93
93
94
94
bool LLVM::LLVMSymbolLinkerInterface::isComdat (Operation *op) {
95
95
return isa<LLVM::ComdatOp>(op);
96
96
}
97
97
98
- std::optional<mlir::link::ComdatSelector> LLVM::LLVMSymbolLinkerInterface::getComdatSelector (Operation *op) {
98
+ std::optional<mlir::link::ComdatSelector>
99
+ LLVM::LLVMSymbolLinkerInterface::getComdatSelector (Operation *op) {
99
100
if (!hasComdat (op))
100
101
return std::nullopt ;
101
102
102
103
auto symbol = getComdatSymbol (op);
103
104
auto *symTabOp = SymbolTable::getNearestSymbolTable (op);
104
- auto comdatSelector = cast<mlir::LLVM::ComdatSelectorOp>(SymbolTable::lookupSymbolIn (symTabOp, symbol));
105
+ auto comdatSelector = cast<mlir::LLVM::ComdatSelectorOp>(
106
+ SymbolTable::lookupSymbolIn (symTabOp, symbol));
105
107
return {{comdatSelector.getSymName (), comdatSelector.getComdat ()}};
106
108
}
107
109
@@ -112,7 +114,8 @@ bool LLVM::LLVMSymbolLinkerInterface::isDeclaration(Operation *op) {
112
114
return gv.getInitializerRegion ().empty () && !gv.getValue ();
113
115
if (auto fn = dyn_cast<LLVM::LLVMFuncOp>(op))
114
116
return fn.getBody ().empty ();
115
- if (isa<LLVM::GlobalCtorsOp, LLVM::GlobalDtorsOp, LLVM::ComdatOp, LLVM::AliasOp>(op))
117
+ if (isa<LLVM::GlobalCtorsOp, LLVM::GlobalDtorsOp, LLVM::ComdatOp,
118
+ LLVM::AliasOp>(op))
116
119
return false ;
117
120
llvm_unreachable (" unexpected operation" );
118
121
}
@@ -446,48 +449,50 @@ getAppendedOpWithInitRegion(llvm::ArrayRef<mlir::Operation *> globs,
446
449
return targetGV;
447
450
}
448
451
449
- static Operation *appendGlobalOps (ArrayRef<Operation *> globs, LLVM::GlobalOp lastGV, LinkState &state) {
452
+ static Operation *appendGlobalOps (ArrayRef<Operation *> globs,
453
+ LLVM::GlobalOp lastGV, LinkState &state) {
450
454
// Src ops that are declarations are ignored in favour of dst operation
451
455
// This mimics the behaviour of linkAppendingVarProto in llvm-link
452
456
if (globs.size () == 1 )
453
- return state.clone (globs.front ());
457
+ return state.clone (globs.front ());
454
458
455
459
if (!lastGV.getInitializer ().empty ()) {
456
- return getAppendedOpWithInitRegion (globs, state);
460
+ return getAppendedOpWithInitRegion (globs, state);
457
461
} else {
458
- auto [value, type] = getAppendedAttr (globs, state);
462
+ auto [value, type] = getAppendedAttr (globs, state);
459
463
460
- auto valueAttrName = lastGV.getValueAttrName ();
461
- auto typeAttrName = lastGV.getGlobalTypeAttrName ();
464
+ auto valueAttrName = lastGV.getValueAttrName ();
465
+ auto typeAttrName = lastGV.getGlobalTypeAttrName ();
462
466
463
- auto cloned = state.clone (globs.back ());
464
- cloned->setAttr (valueAttrName, value);
465
- cloned->setAttr (typeAttrName, TypeAttr::get (type));
466
- return cloned;
467
+ auto cloned = state.clone (globs.back ());
468
+ cloned->setAttr (valueAttrName, value);
469
+ cloned->setAttr (typeAttrName, TypeAttr::get (type));
470
+ return cloned;
467
471
}
468
472
llvm_unreachable (" unknown value attribute type" );
469
473
}
470
474
471
- static Operation *appendComdatOps (ArrayRef<Operation *> globs, LLVM::ComdatOp comdat, LinkState &state) {
475
+ static Operation *appendComdatOps (ArrayRef<Operation *> globs,
476
+ LLVM::ComdatOp comdat, LinkState &state) {
472
477
auto result = cast<LLVM::ComdatOp>(state.clone (comdat));
473
478
llvm::StringMap<Operation *> selectors;
474
479
475
480
for (auto selector : result.getOps <LLVM::ComdatSelectorOp>()) {
476
- selectors[selector.getSymName ()] = selector;
481
+ selectors[selector.getSymName ()] = selector;
477
482
}
478
483
479
484
for (auto *glob : globs) {
480
485
comdat = dyn_cast<LLVM::ComdatOp>(glob);
481
- for (auto &op : comdat.getBody ().getOps ()) {
482
- auto selector = cast<LLVM::ComdatSelectorOp>(op);
483
- auto selectorName = selector.getSymName ();
484
- if (selectors.contains (selectorName)) {
485
- continue ;
486
- }
487
- auto *cloned = state.clone (selector);
488
- cloned->moveBefore (&result.getBody ().front ().back ());
489
- selectors[selectorName] = cloned;
486
+ for (auto &op : comdat.getBody ().getOps ()) {
487
+ auto selector = cast<LLVM::ComdatSelectorOp>(op);
488
+ auto selectorName = selector.getSymName ();
489
+ if (selectors.contains (selectorName)) {
490
+ continue ;
490
491
}
492
+ auto *cloned = state.clone (selector);
493
+ cloned->moveBefore (&result.getBody ().front ().back ());
494
+ selectors[selectorName] = cloned;
495
+ }
491
496
}
492
497
return result;
493
498
}
@@ -500,6 +505,8 @@ Operation *LLVM::LLVMSymbolLinkerInterface::appendGlobals(llvm::StringRef glob,
500
505
return appendGlobalStructors<LLVM::GlobalDtorsOp>(state);
501
506
502
507
const auto &globs = append.lookup (glob);
508
+ if (globs.empty ())
509
+ return nullptr ;
503
510
if (auto lastGV = dyn_cast<LLVM::GlobalOp>(globs.back ()))
504
511
return appendGlobalOps (globs, lastGV, state);
505
512
if (auto comdat = dyn_cast<LLVM::ComdatOp>(globs.back ()))
0 commit comments