Przeglądaj źródła

Lower global variables as global definitions, not global declarations. (#4674)

Richard Smith 1 rok temu
rodzic
commit
3e0fdd04eb

+ 5 - 6
toolchain/lower/file_context.cpp

@@ -608,12 +608,11 @@ auto FileContext::BuildGlobalVariableDecl(SemIR::VarStorage var_storage)
   // TODO: Mangle name.
   auto mangled_name =
       *sem_ir().names().GetAsStringIfIdentifier(var_storage.name_id);
-  auto* type =
-      var_storage.type_id.is_valid() ? GetType(var_storage.type_id) : nullptr;
-  return new llvm::GlobalVariable(llvm_module(), type,
-                                  /*isConstant=*/false,
-                                  llvm::GlobalVariable::InternalLinkage,
-                                  /*Initializer=*/nullptr, mangled_name);
+  auto* type = GetType(var_storage.type_id);
+  return new llvm::GlobalVariable(
+      llvm_module(), type,
+      /*isConstant=*/false, llvm::GlobalVariable::InternalLinkage,
+      llvm::Constant::getNullValue(type), mangled_name);
 }
 
 auto FileContext::GetLocForDI(SemIR::InstId inst_id) -> LocForDI {

+ 1 - 1
toolchain/lower/testdata/global/class_obj.carbon

@@ -14,7 +14,7 @@ var a: A = {};
 // CHECK:STDOUT: ; ModuleID = 'class_obj.carbon'
 // CHECK:STDOUT: source_filename = "class_obj.carbon"
 // CHECK:STDOUT:
-// CHECK:STDOUT: @a = internal global {}
+// CHECK:STDOUT: @a = internal global {} zeroinitializer
 // CHECK:STDOUT: @A.val.loc12_14 = internal constant {} zeroinitializer
 // CHECK:STDOUT: @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 0, ptr @_C__global_init.Main, ptr null }]
 // CHECK:STDOUT:

+ 1 - 1
toolchain/lower/testdata/global/class_with_fun.carbon

@@ -18,7 +18,7 @@ var a: A = {};
 // CHECK:STDOUT: ; ModuleID = 'class_with_fun.carbon'
 // CHECK:STDOUT: source_filename = "class_with_fun.carbon"
 // CHECK:STDOUT:
-// CHECK:STDOUT: @a = internal global {}
+// CHECK:STDOUT: @a = internal global {} zeroinitializer
 // CHECK:STDOUT: @A.val.loc13_12 = internal constant {} zeroinitializer
 // CHECK:STDOUT: @A.val.loc16_14 = internal constant {} zeroinitializer
 // CHECK:STDOUT: @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 0, ptr @_C__global_init.Main, ptr null }]

+ 1 - 1
toolchain/lower/testdata/global/decl.carbon

@@ -12,7 +12,7 @@ var a: i32;
 // CHECK:STDOUT: ; ModuleID = 'decl.carbon'
 // CHECK:STDOUT: source_filename = "decl.carbon"
 // CHECK:STDOUT:
-// CHECK:STDOUT: @a = internal global i32
+// CHECK:STDOUT: @a = internal global i32 0
 // CHECK:STDOUT:
 // CHECK:STDOUT: !llvm.module.flags = !{!0, !1}
 // CHECK:STDOUT: !llvm.dbg.cu = !{!2}

+ 2 - 2
toolchain/lower/testdata/global/simple_init.carbon

@@ -12,7 +12,7 @@ var a: i32 = 0;
 // CHECK:STDOUT: ; ModuleID = 'simple_init.carbon'
 // CHECK:STDOUT: source_filename = "simple_init.carbon"
 // CHECK:STDOUT:
-// CHECK:STDOUT: @a = internal global i32
+// CHECK:STDOUT: @a = internal global i32 0
 // CHECK:STDOUT: @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 0, ptr @_C__global_init.Main, ptr null }]
 // CHECK:STDOUT:
 // CHECK:STDOUT: define void @_C__global_init.Main() !dbg !4 {
@@ -22,7 +22,7 @@ var a: i32 = 0;
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; uselistorder directives
-// CHECK:STDOUT: uselistorder i32 0, { 1, 0 }
+// CHECK:STDOUT: uselistorder i32 0, { 1, 0, 2 }
 // CHECK:STDOUT:
 // CHECK:STDOUT: !llvm.module.flags = !{!0, !1}
 // CHECK:STDOUT: !llvm.dbg.cu = !{!2}

+ 2 - 2
toolchain/lower/testdata/global/simple_with_fun.carbon

@@ -17,7 +17,7 @@ var a: i32 = test_a();
 // CHECK:STDOUT: ; ModuleID = 'simple_with_fun.carbon'
 // CHECK:STDOUT: source_filename = "simple_with_fun.carbon"
 // CHECK:STDOUT:
-// CHECK:STDOUT: @a = internal global i32
+// CHECK:STDOUT: @a = internal global i32 0
 // CHECK:STDOUT: @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 0, ptr @_C__global_init.Main, ptr null }]
 // CHECK:STDOUT:
 // CHECK:STDOUT: define i32 @_Ctest_a.Main() !dbg !4 {
@@ -33,7 +33,7 @@ var a: i32 = test_a();
 // CHECK:STDOUT: }
 // CHECK:STDOUT:
 // CHECK:STDOUT: ; uselistorder directives
-// CHECK:STDOUT: uselistorder i32 0, { 1, 0 }
+// CHECK:STDOUT: uselistorder i32 0, { 1, 0, 2 }
 // CHECK:STDOUT:
 // CHECK:STDOUT: !llvm.module.flags = !{!0, !1}
 // CHECK:STDOUT: !llvm.dbg.cu = !{!2}

+ 2 - 2
toolchain/lower/testdata/global/use.carbon

@@ -18,8 +18,8 @@ fn F() -> i32 {
 // CHECK:STDOUT: ; ModuleID = 'use.carbon'
 // CHECK:STDOUT: source_filename = "use.carbon"
 // CHECK:STDOUT:
-// CHECK:STDOUT: @a = internal global i32
-// CHECK:STDOUT: @b = internal global i32
+// CHECK:STDOUT: @a = internal global i32 0
+// CHECK:STDOUT: @b = internal global i32 0
 // CHECK:STDOUT: @llvm.global_ctors = appending global [1 x { i32, ptr, ptr }] [{ i32, ptr, ptr } { i32 0, ptr @_C__global_init.Main, ptr null }]
 // CHECK:STDOUT:
 // CHECK:STDOUT: define i32 @_CF.Main() !dbg !4 {