@@ -968,22 +968,34 @@ static mlir::Attribute getNewInitValue(CIRGenModule &cgm, GlobalOp newGlob,
968
968
if (auto oldView = mlir::dyn_cast<cir::GlobalViewAttr>(oldInit)) {
969
969
return createNewGlobalView (cgm, newGlob, oldView, oldTy);
970
970
}
971
- if (auto oldArray = mlir::dyn_cast<ConstArrayAttr>(oldInit)) {
972
- llvm::SmallVector<mlir::Attribute> newArray;
973
- auto eltsAttr = dyn_cast<mlir::ArrayAttr>(oldArray.getElts ());
974
- for (auto elt : eltsAttr) {
975
- if (auto view = dyn_cast<GlobalViewAttr>(elt))
976
- newArray.push_back (createNewGlobalView (cgm, newGlob, view, oldTy));
977
- else if (auto view = dyn_cast<ConstArrayAttr>(elt))
978
- newArray.push_back (getNewInitValue (cgm, newGlob, oldTy, user, elt));
971
+
972
+ auto getNewInitElements =
973
+ [&](mlir::ArrayAttr oldElements) -> mlir::ArrayAttr {
974
+ llvm::SmallVector<mlir::Attribute> newElements;
975
+ for (auto elt : oldElements) {
976
+ if (auto view = mlir::dyn_cast<cir::GlobalViewAttr>(elt))
977
+ newElements.push_back (createNewGlobalView (cgm, newGlob, view, oldTy));
978
+ else if (mlir::isa<cir::ConstArrayAttr, cir::ConstRecordAttr>(elt))
979
+ newElements.push_back (getNewInitValue (cgm, newGlob, oldTy, user, elt));
979
980
else
980
- newArray .push_back (elt);
981
+ newElements .push_back (elt);
981
982
}
983
+ return mlir::ArrayAttr::get (cgm.getBuilder ().getContext (), newElements);
984
+ };
982
985
983
- auto &builder = cgm.getBuilder ();
984
- mlir::Attribute ar = mlir::ArrayAttr::get (builder.getContext (), newArray);
985
- return builder.getConstArray (ar, cast<cir::ArrayType>(oldArray.getType ()));
986
+ if (auto oldArray = mlir::dyn_cast<cir::ConstArrayAttr>(oldInit)) {
987
+ mlir::Attribute newElements =
988
+ getNewInitElements (mlir::dyn_cast<mlir::ArrayAttr>(oldArray.getElts ()));
989
+ return cgm.getBuilder ().getConstArray (
990
+ newElements, mlir::cast<cir::ArrayType>(oldArray.getType ()));
991
+ }
992
+ if (auto oldRecord = mlir::dyn_cast<cir::ConstRecordAttr>(oldInit)) {
993
+ mlir::ArrayAttr newMembers = getNewInitElements (oldRecord.getMembers ());
994
+ auto recordTy = mlir::cast<cir::RecordType>(oldRecord.getType ());
995
+ return cgm.getBuilder ().getConstRecordOrZeroAttr (
996
+ newMembers, recordTy.getPacked (), recordTy.getPadded (), recordTy);
986
997
}
998
+
987
999
llvm_unreachable (" NYI" );
988
1000
}
989
1001
0 commit comments