Improve lowering for global variables. (#5492)

- Track the `VarPattern` instruction on the `VarStorage` instruction so
that it's available for name mangling.
- Mangle global variables based on the first binding name within their
pattern.
- Give global variables external rather than internal linkage, except if
they have no bindings whatsoever in their pattern.
- To support lowering references to bindings nested within a global var,
such as for `var (x: i32, b: i32)`, add some basic initial support for
reference constant expressions. Treat a global `var` as a reference
constant, and treat an aggregate access into a reference constant as a
reference constant.
This commit is contained in:
Richard Smith
2025-05-21 00:09:10 +00:00
committed by GitHub
parent 7c2a6ef0e9
commit 5b884ae14d
294 changed files with 2901 additions and 2133 deletions
+4 -4
View File
@@ -32,8 +32,8 @@ fn G() {
// CHECK:STDOUT:
// CHECK:STDOUT: %type = type {}
// CHECK:STDOUT:
// CHECK:STDOUT: @C.val.loc18_3.2 = internal constant {} zeroinitializer
// CHECK:STDOUT: @D.val.loc19_3.2 = internal constant {} zeroinitializer
// CHECK:STDOUT: @C.val.loc18_3 = internal constant {} zeroinitializer
// CHECK:STDOUT: @D.val.loc19_3 = internal constant {} zeroinitializer
// CHECK:STDOUT:
// CHECK:STDOUT: define void @_CG.Main() !dbg !4 {
// CHECK:STDOUT: entry:
@@ -42,9 +42,9 @@ fn G() {
// CHECK:STDOUT: %n.var = alloca i32, align 4, !dbg !9
// CHECK:STDOUT: %m.var = alloca double, align 8, !dbg !10
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(i64 0, ptr %c.var), !dbg !7
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 1 %c.var, ptr align 1 @C.val.loc18_3.2, i64 0, i1 false), !dbg !7
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 1 %c.var, ptr align 1 @C.val.loc18_3, i64 0, i1 false), !dbg !7
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(i64 0, ptr %d.var), !dbg !8
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 1 %d.var, ptr align 1 @D.val.loc19_3.2, i64 0, i1 false), !dbg !8
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 1 %d.var, ptr align 1 @D.val.loc19_3, i64 0, i1 false), !dbg !8
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(i64 4, ptr %n.var), !dbg !9
// CHECK:STDOUT: store i32 0, ptr %n.var, align 4, !dbg !9
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(i64 8, ptr %m.var), !dbg !10
@@ -23,14 +23,14 @@ fn CallF() -> i32 {
// CHECK:STDOUT: ; ModuleID = 'call_method.carbon'
// CHECK:STDOUT: source_filename = "call_method.carbon"
// CHECK:STDOUT:
// CHECK:STDOUT: @C.val.loc18_3.2 = internal constant {} zeroinitializer
// CHECK:STDOUT: @C.val.loc18_3 = internal constant {} zeroinitializer
// CHECK:STDOUT:
// CHECK:STDOUT: define i32 @_CCallF.Main() !dbg !4 {
// CHECK:STDOUT: entry:
// CHECK:STDOUT: %c.var = alloca {}, align 8, !dbg !7
// CHECK:STDOUT: %n.var = alloca i32, align 4, !dbg !8
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(i64 0, ptr %c.var), !dbg !7
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 1 %c.var, ptr align 1 @C.val.loc18_3.2, i64 0, i1 false), !dbg !7
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 1 %c.var, ptr align 1 @C.val.loc18_3, i64 0, i1 false), !dbg !7
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(i64 4, ptr %n.var), !dbg !8
// CHECK:STDOUT: store i32 0, ptr %n.var, align 4, !dbg !8
// CHECK:STDOUT: %.loc20_14 = load i32, ptr %n.var, align 4, !dbg !9