[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