mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-06 07:54:41 +01:00
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:
+4
-4
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user