diff --git a/clang/include/clang/CIR/MissingFeatures.h b/clang/include/clang/CIR/MissingFeatures.h index afc1e6b4f148..c5f01a5aae84 100644 --- a/clang/include/clang/CIR/MissingFeatures.h +++ b/clang/include/clang/CIR/MissingFeatures.h @@ -68,7 +68,6 @@ struct MissingFeatures { // Address space related static bool addressSpace() { return false; } - static bool addressSpaceInGlobalVar() { return false; } // Clang codegen options static bool strictVTablePointers() { return false; } diff --git a/clang/lib/CIR/CodeGen/CIRGenDecl.cpp b/clang/lib/CIR/CodeGen/CIRGenDecl.cpp index e6bcb0d6bf04..6fa387483492 100644 --- a/clang/lib/CIR/CodeGen/CIRGenDecl.cpp +++ b/clang/lib/CIR/CodeGen/CIRGenDecl.cpp @@ -575,19 +575,7 @@ cir::GlobalOp CIRGenFunction::addInitializerToStaticVarDecl( // because some types, like unions, can't be completely represented // in the LLVM type system.) if (GV.getSymType() != Init.getType()) { - cir::GlobalOp OldGV = GV; - GV = builder.createGlobal(CGM.getModule(), getLoc(D.getSourceRange()), - OldGV.getName(), Init.getType(), - OldGV.getConstant(), GV.getLinkage()); - // FIXME(cir): OG codegen inserts new GV before old one, we probably don't - // need that? - GV.setVisibility(OldGV.getVisibility()); - GV.setGlobalVisibilityAttr(OldGV.getGlobalVisibilityAttr()); - GV.setInitialValueAttr(Init); - GV.setTlsModelAttr(OldGV.getTlsModelAttr()); - assert(!cir::MissingFeatures::setDSOLocal()); - assert(!cir::MissingFeatures::setComdat()); - assert(!cir::MissingFeatures::addressSpaceInGlobalVar()); + GV.setSymType(Init.getType()); // Normally this should be done with a call to CGM.replaceGlobal(OldGV, GV), // but since at this point the current block hasn't been really attached, @@ -595,8 +583,7 @@ cir::GlobalOp CIRGenFunction::addInitializerToStaticVarDecl( // Given those constraints, thread in the GetGlobalOp and update it // directly. GVAddr.getAddr().setType( - cir::PointerType::get(&getMLIRContext(), Init.getType())); - OldGV->erase(); + getBuilder().getPointerTo(Init.getType(), GV.getAddrSpaceAttr())); } bool NeedsDtor = diff --git a/clang/test/CIR/CodeGen/stmtexpr-init.c b/clang/test/CIR/CodeGen/stmtexpr-init.c index 27e909d2b39c..66b676400761 100644 --- a/clang/test/CIR/CodeGen/stmtexpr-init.c +++ b/clang/test/CIR/CodeGen/stmtexpr-init.c @@ -33,11 +33,11 @@ struct outer { }; void T2(void) { - // CIR-DAG: cir.global "private" constant internal @T2._a = #cir.const_struct<{#cir.int<2> : !s32i, #cir.const_array<[#cir.int<50> : !s32i, #cir.int<60> : !s32i]> : !cir.array}> + // CIR-DAG: cir.global "private" constant internal dsolocal @T2._a = #cir.const_struct<{#cir.int<2> : !s32i, #cir.const_array<[#cir.int<50> : !s32i, #cir.int<60> : !s32i]> : !cir.array}> // LLVM-DAG: internal constant { i32, [2 x i32] } { i32 2, [2 x i32] [i32 50, i32 60] } const struct sized_array *A = ARRAY_PTR(50, 60); - // CIR-DAG: cir.global "private" constant internal @T2._a.1 = #cir.const_struct<{#cir.int<3> : !s32i, #cir.const_array<[#cir.int<10> : !s32i, #cir.int<20> : !s32i, #cir.int<30> : !s32i]> : !cir.array}> + // CIR-DAG: cir.global "private" constant internal dsolocal @T2._a.1 = #cir.const_struct<{#cir.int<3> : !s32i, #cir.const_array<[#cir.int<10> : !s32i, #cir.int<20> : !s32i, #cir.int<30> : !s32i]> : !cir.array}> // LLVM-DAG: internal constant { i32, [3 x i32] } { i32 3, [3 x i32] [i32 10, i32 20, i32 30] } struct outer X = {ARRAY_PTR(10, 20, 30)};