Skip to content

Commit 9c9d482

Browse files
committed
[CIR][CodeGen] Added missing handling of cir::ConstRecordAttr for global replacement
1 parent b647f4b commit 9c9d482

File tree

1 file changed

+24
-12
lines changed

1 file changed

+24
-12
lines changed

clang/lib/CIR/CodeGen/CIRGenModule.cpp

Lines changed: 24 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -968,22 +968,34 @@ static mlir::Attribute getNewInitValue(CIRGenModule &cgm, GlobalOp newGlob,
968968
if (auto oldView = mlir::dyn_cast<cir::GlobalViewAttr>(oldInit)) {
969969
return createNewGlobalView(cgm, newGlob, oldView, oldTy);
970970
}
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));
979980
else
980-
newArray.push_back(elt);
981+
newElements.push_back(elt);
981982
}
983+
return mlir::ArrayAttr::get(cgm.getBuilder().getContext(), newElements);
984+
};
982985

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);
986997
}
998+
987999
llvm_unreachable("NYI");
9881000
}
9891001

0 commit comments

Comments
 (0)