[Mlir-commits] [mlir] [MLIR][LLVMIR] Add support for empty global ctor/dtor lists (PR #128969)
Tobias Gysi
llvmlistbot at llvm.org
Thu Feb 27 11:31:16 PST 2025
================
@@ -1071,32 +1071,39 @@ LogicalResult
ModuleImport::convertGlobalCtorsAndDtors(llvm::GlobalVariable *globalVar) {
if (!globalVar->hasInitializer() || !globalVar->hasAppendingLinkage())
return failure();
- auto *initializer =
- dyn_cast<llvm::ConstantArray>(globalVar->getInitializer());
- if (!initializer)
+ llvm::Constant *initializer = globalVar->getInitializer();
+
+ bool knownInit = isa<llvm::ConstantArray>(initializer) ||
+ isa<llvm::ConstantAggregateZero>(initializer);
+ if (!knownInit)
return failure();
SmallVector<Attribute> funcs;
SmallVector<int32_t> priorities;
- for (llvm::Value *operand : initializer->operands()) {
- auto *aggregate = dyn_cast<llvm::ConstantAggregate>(operand);
- if (!aggregate || aggregate->getNumOperands() != 3)
- return failure();
+ if (isa<llvm::ConstantArray>(initializer)) {
+ for (llvm::Value *operand : initializer->operands()) {
+ auto *aggregate = dyn_cast<llvm::ConstantAggregate>(operand);
+ if (!aggregate || aggregate->getNumOperands() != 3)
+ return failure();
- auto *priority = dyn_cast<llvm::ConstantInt>(aggregate->getOperand(0));
- auto *func = dyn_cast<llvm::Function>(aggregate->getOperand(1));
- auto *data = dyn_cast<llvm::Constant>(aggregate->getOperand(2));
- if (!priority || !func || !data)
- return failure();
+ auto *priority = dyn_cast<llvm::ConstantInt>(aggregate->getOperand(0));
+ auto *func = dyn_cast<llvm::Function>(aggregate->getOperand(1));
+ auto *data = dyn_cast<llvm::Constant>(aggregate->getOperand(2));
+ if (!priority || !func || !data)
+ return failure();
- // GlobalCtorsOps and GlobalDtorsOps do not support non-null data fields.
- if (!data->isNullValue())
- return failure();
+ // GlobalCtorsOps and GlobalDtorsOps do not support non-null data fields.
+ if (!data->isNullValue())
+ return failure();
- funcs.push_back(FlatSymbolRefAttr::get(context, func->getName()));
- priorities.push_back(priority->getValue().getZExtValue());
+ funcs.push_back(FlatSymbolRefAttr::get(context, func->getName()));
+ priorities.push_back(priority->getValue().getZExtValue());
+ }
}
+ // Note: no action needed for ConstantAggregateZero, which implies empty
----------------
gysit wrote:
AFAIK a ConstantAggregateZero can have a non-zero size (there is a getElementCount() function). I wonder if it would make sense to check that above? Or is there some sort of guarantee we will never see a non-zero size ConstantAggregateZero.
https://github.com/llvm/llvm-project/pull/128969
More information about the Mlir-commits
mailing list