mirror of
https://github.com/carbon-language/carbon-lang.git
synced 2026-10-05 22:02:55 +01:00
Propagate Carbon type alignments into LLVM IR. (#7290)
Use the Carbon-computed alignment for allocas, loads, stores, and memcpys. Previously we used whatever LLVM felt like giving us, which would result in ABI mismatches and runtime crashes due to misalignment when creating objects of imported C++ class types, as well as resulting in some surprising choices like `(i32, i32)` and `()` having 8-byte alignment instead of 4 and 1, respectively.
This commit is contained in:
@@ -30,7 +30,7 @@ fn Main() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CMain.Main() #0 !dbg !8 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %_.var = alloca {}, align 8, !dbg !9
|
||||
// CHECK:STDOUT: %_.var = alloca {}, align 1, !dbg !9
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %_.var), !dbg !9
|
||||
// CHECK:STDOUT: call void @_CEcho.Main(), !dbg !10
|
||||
// CHECK:STDOUT: ret void, !dbg !11
|
||||
|
||||
@@ -30,7 +30,7 @@ fn Main() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CMain.Main() #0 !dbg !8 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %_.var = alloca {}, align 8, !dbg !9
|
||||
// CHECK:STDOUT: %_.var = alloca {}, align 1, !dbg !9
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %_.var), !dbg !9
|
||||
// CHECK:STDOUT: call void @_CEcho.Main(), !dbg !10
|
||||
// CHECK:STDOUT: ret void, !dbg !11
|
||||
|
||||
@@ -37,8 +37,8 @@ fn Main() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CMain.Main() #0 !dbg !10 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %_.var = alloca {}, align 8, !dbg !11
|
||||
// CHECK:STDOUT: %.loc19_23.1.temp = alloca {}, align 8, !dbg !12
|
||||
// CHECK:STDOUT: %_.var = alloca {}, align 1, !dbg !11
|
||||
// CHECK:STDOUT: %.loc19_23.1.temp = alloca {}, align 1, !dbg !12
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %_.var), !dbg !11
|
||||
// CHECK:STDOUT: call void @_CFoo.Main(), !dbg !12
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc19_23.1.temp), !dbg !12
|
||||
|
||||
@@ -30,7 +30,7 @@ fn Main() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CMain.Main() #0 !dbg !8 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %_.var = alloca {}, align 8, !dbg !9
|
||||
// CHECK:STDOUT: %_.var = alloca {}, align 1, !dbg !9
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %_.var), !dbg !9
|
||||
// CHECK:STDOUT: call void @_CMakeImplicitEmptyTuple.Main(), !dbg !10
|
||||
// CHECK:STDOUT: ret void, !dbg !11
|
||||
|
||||
@@ -43,7 +43,7 @@ fn Main() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CMain.Main() #0 !dbg !16 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.loc18_21.1.temp = alloca { i32, i32, i32 }, align 8, !dbg !19
|
||||
// CHECK:STDOUT: %.loc18_21.1.temp = alloca { i32, i32, i32 }, align 4, !dbg !19
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc18_21.1.temp), !dbg !19
|
||||
// CHECK:STDOUT: call void @_CF.Main(ptr %.loc18_21.1.temp, { i32 } { i32 1 }, ptr @tuple.c4c.loc18_20.6), !dbg !19
|
||||
// CHECK:STDOUT: call void @"_COp.9eed32d146d768a4:core.Destroy.Core"(ptr %.loc18_21.1.temp), !dbg !19
|
||||
|
||||
@@ -89,7 +89,7 @@ fn InitLet() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CCallF.Main() #0 !dbg !11 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.loc12_6.2.temp = alloca {}, align 8, !dbg !14
|
||||
// CHECK:STDOUT: %.loc12_6.2.temp = alloca {}, align 1, !dbg !14
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc12_6.2.temp), !dbg !14
|
||||
// CHECK:STDOUT: call void @_CF.Main(ptr @C.val.loc12_6.6), !dbg !15
|
||||
// CHECK:STDOUT: call void @_CG.Main(), !dbg !16
|
||||
@@ -150,7 +150,7 @@ fn InitLet() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CCallF.Main() #0 !dbg !11 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %_.var = alloca {}, align 8, !dbg !14
|
||||
// CHECK:STDOUT: %_.var = alloca {}, align 1, !dbg !14
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %_.var), !dbg !14
|
||||
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 1 %_.var, ptr align 1 @C.val.loc6, i64 0, i1 false), !dbg !14
|
||||
// CHECK:STDOUT: call void @_CF.Main(ptr %_.var), !dbg !15
|
||||
@@ -223,7 +223,7 @@ fn InitLet() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CInitVar.Main() #0 !dbg !12 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %_.var = alloca {}, align 8, !dbg !15
|
||||
// CHECK:STDOUT: %_.var = alloca {}, align 1, !dbg !15
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %_.var), !dbg !15
|
||||
// CHECK:STDOUT: call void @_CF.Main(ptr %_.var), !dbg !16
|
||||
// CHECK:STDOUT: call void @_CG.Main(), !dbg !17
|
||||
@@ -240,7 +240,7 @@ fn InitLet() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CInitLet.Main() #0 !dbg !25 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %.loc22_16.1.temp = alloca {}, align 8, !dbg !26
|
||||
// CHECK:STDOUT: %.loc22_16.1.temp = alloca {}, align 1, !dbg !26
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc22_16.1.temp), !dbg !26
|
||||
// CHECK:STDOUT: call void @_CF.Main(ptr %.loc22_16.1.temp), !dbg !26
|
||||
// CHECK:STDOUT: call void @_CG.Main(), !dbg !27
|
||||
|
||||
@@ -68,12 +68,12 @@ fn Call() {
|
||||
// CHECK:STDOUT: define void @_CCall.Main() #0 !dbg !35 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %_.var.loc15 = alloca i32, align 4, !dbg !38
|
||||
// CHECK:STDOUT: %_.var.loc16 = alloca {}, align 8, !dbg !39
|
||||
// CHECK:STDOUT: %_.var.loc16 = alloca {}, align 1, !dbg !39
|
||||
// CHECK:STDOUT: %_.var.loc18_12 = alloca i32, align 4, !dbg !40
|
||||
// CHECK:STDOUT: %_.var.loc18_24 = alloca {}, align 8, !dbg !41
|
||||
// CHECK:STDOUT: %_.var.loc18_24 = alloca {}, align 1, !dbg !41
|
||||
// CHECK:STDOUT: %_.var.loc20 = alloca i32, align 4, !dbg !42
|
||||
// CHECK:STDOUT: %.loc27_18.2.temp = alloca {}, align 8, !dbg !43
|
||||
// CHECK:STDOUT: %_.var.loc21 = alloca {}, align 8, !dbg !44
|
||||
// CHECK:STDOUT: %.loc27_18.2.temp = alloca {}, align 1, !dbg !43
|
||||
// CHECK:STDOUT: %_.var.loc21 = alloca {}, align 1, !dbg !44
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %_.var.loc15), !dbg !38
|
||||
// CHECK:STDOUT: store i32 1, ptr %_.var.loc15, align 4, !dbg !38
|
||||
// CHECK:STDOUT: call void @_COneVar_i32.Main(ptr %_.var.loc15), !dbg !45
|
||||
|
||||
+2
-2
@@ -40,8 +40,8 @@ fn G() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define void @_CG.Main() #0 !dbg !4 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %c.var = alloca {}, align 8, !dbg !7
|
||||
// CHECK:STDOUT: %d.var = alloca {}, align 8, !dbg !8
|
||||
// CHECK:STDOUT: %c.var = alloca {}, align 1, !dbg !7
|
||||
// CHECK:STDOUT: %d.var = alloca {}, align 1, !dbg !8
|
||||
// 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(ptr %c.var), !dbg !7
|
||||
|
||||
@@ -131,8 +131,8 @@ fn M() {
|
||||
// CHECK:STDOUT: %ptr_i32.var = alloca ptr, align 8, !dbg !55
|
||||
// CHECK:STDOUT: %ptr_f64.var = alloca ptr, align 8, !dbg !56
|
||||
// CHECK:STDOUT: %ptr_i8.var = alloca ptr, align 8, !dbg !57
|
||||
// CHECK:STDOUT: %c.var = alloca {}, align 8, !dbg !58
|
||||
// CHECK:STDOUT: %.loc43_6.2.temp = alloca {}, align 8, !dbg !59
|
||||
// CHECK:STDOUT: %c.var = alloca {}, align 1, !dbg !58
|
||||
// CHECK:STDOUT: %.loc43_6.2.temp = alloca {}, align 1, !dbg !59
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc29_6.2.temp), !dbg !51
|
||||
// CHECK:STDOUT: %H.call.loc29 = call i32 @_CH.Main.980bd46fd9fb5b99(i32 %x), !dbg !51
|
||||
// CHECK:STDOUT: store i32 %H.call.loc29, ptr %.loc29_6.2.temp, align 4, !dbg !51
|
||||
@@ -188,8 +188,8 @@ fn M() {
|
||||
// CHECK:STDOUT: %ptr_i32.var = alloca ptr, align 8, !dbg !81
|
||||
// CHECK:STDOUT: %ptr_f64.var = alloca ptr, align 8, !dbg !82
|
||||
// CHECK:STDOUT: %ptr_i8.var = alloca ptr, align 8, !dbg !83
|
||||
// CHECK:STDOUT: %c.var = alloca {}, align 8, !dbg !84
|
||||
// CHECK:STDOUT: %.loc43_6.2.temp = alloca {}, align 8, !dbg !85
|
||||
// CHECK:STDOUT: %c.var = alloca {}, align 1, !dbg !84
|
||||
// CHECK:STDOUT: %.loc43_6.2.temp = alloca {}, align 1, !dbg !85
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %.loc29_6.2.temp), !dbg !77
|
||||
// CHECK:STDOUT: %H.call.loc29 = call double @_CH.Main.3eb991d272a034fb(double %x), !dbg !77
|
||||
// CHECK:STDOUT: store double %H.call.loc29, ptr %.loc29_6.2.temp, align 8, !dbg !77
|
||||
|
||||
@@ -30,7 +30,7 @@ fn CallF() -> i32 {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define i32 @_CCallF.Main() #0 !dbg !4 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %c.var = alloca {}, align 8, !dbg !8
|
||||
// CHECK:STDOUT: %c.var = alloca {}, align 1, !dbg !8
|
||||
// CHECK:STDOUT: %n.var = alloca i32, align 4, !dbg !9
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %c.var), !dbg !8
|
||||
// CHECK:STDOUT: call void @llvm.memcpy.p0.p0.i64(ptr align 1 %c.var, ptr align 1 @C.val.loc20_3, i64 0, i1 false), !dbg !8
|
||||
|
||||
@@ -59,8 +59,8 @@ fn M() {
|
||||
// CHECK:STDOUT: %m.var = alloca double, align 8, !dbg !15
|
||||
// CHECK:STDOUT: %ptr_i32.var = alloca ptr, align 8, !dbg !16
|
||||
// CHECK:STDOUT: %ptr_f64.var = alloca ptr, align 8, !dbg !17
|
||||
// CHECK:STDOUT: %c.var = alloca {}, align 8, !dbg !18
|
||||
// CHECK:STDOUT: %.loc40_9.2.temp = alloca {}, align 8, !dbg !19
|
||||
// CHECK:STDOUT: %c.var = alloca {}, align 1, !dbg !18
|
||||
// CHECK:STDOUT: %.loc40_9.2.temp = alloca {}, align 1, !dbg !19
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %n.var), !dbg !14
|
||||
// CHECK:STDOUT: store i32 0, ptr %n.var, align 4, !dbg !14
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %m.var), !dbg !15
|
||||
|
||||
+2
-2
@@ -72,7 +72,7 @@ fn M() {
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %val_i32.var), !dbg !8
|
||||
// CHECK:STDOUT: store i32 poison, ptr %val_i32.var, align 4, !dbg !8
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %val_i64.var), !dbg !9
|
||||
// CHECK:STDOUT: store i64 poison, ptr %val_i64.var, align 4, !dbg !9
|
||||
// CHECK:STDOUT: store i64 poison, ptr %val_i64.var, align 8, !dbg !9
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %val_f64.var), !dbg !10
|
||||
// CHECK:STDOUT: store double poison, ptr %val_f64.var, align 8, !dbg !10
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %val_bool.var), !dbg !11
|
||||
@@ -98,7 +98,7 @@ fn M() {
|
||||
// CHECK:STDOUT: %.loc40_15 = load ptr, ptr %ptr_bool.var, align 8, !dbg !25
|
||||
// CHECK:STDOUT: %.loc40_25 = load ptr, ptr %ptr_i16.var, align 8, !dbg !26
|
||||
// CHECK:STDOUT: %F.call.loc40 = call i32 @_CF.Main.e1d834dc162d21b2(i1 %.loc40_51, ptr %.loc40_15, ptr %.loc40_25, i32 0), !dbg !27
|
||||
// CHECK:STDOUT: %.loc41_5 = load i64, ptr %val_i64.var, align 4, !dbg !28
|
||||
// CHECK:STDOUT: %.loc41_5 = load i64, ptr %val_i64.var, align 8, !dbg !28
|
||||
// CHECK:STDOUT: %.loc41_14 = load i8, ptr %val_bool.var, align 1, !dbg !29
|
||||
// CHECK:STDOUT: %.loc41_142 = trunc i8 %.loc41_14 to i1, !dbg !29
|
||||
// CHECK:STDOUT: %.loc41_24 = load ptr, ptr %ptr_bool.var, align 8, !dbg !30
|
||||
|
||||
@@ -63,7 +63,7 @@ fn M() {
|
||||
// CHECK:STDOUT: %ptr_i8.var = alloca ptr, align 8, !dbg !16
|
||||
// CHECK:STDOUT: %var_i32.var = alloca i32, align 4, !dbg !17
|
||||
// CHECK:STDOUT: %var_f64.var = alloca double, align 8, !dbg !18
|
||||
// CHECK:STDOUT: %_.var = alloca {}, align 8, !dbg !19
|
||||
// CHECK:STDOUT: %_.var = alloca {}, align 1, !dbg !19
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %ptr_i32.var), !dbg !14
|
||||
// CHECK:STDOUT: store ptr poison, ptr %ptr_i32.var, align 8, !dbg !14
|
||||
// CHECK:STDOUT: %.loc34_5 = load ptr, ptr %ptr_i32.var, align 8, !dbg !20
|
||||
@@ -138,7 +138,7 @@ fn M() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define linkonce_odr ptr @_CG.Main.3890ad819211e245(ptr %x) #0 !dbg !67 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %c.var = alloca {}, align 8, !dbg !70
|
||||
// CHECK:STDOUT: %c.var = alloca {}, align 1, !dbg !70
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %c.var), !dbg !70
|
||||
// CHECK:STDOUT: %C.Cfn.call = call ptr @_CCfn.C.Main.3890ad819211e245(ptr %c.var, ptr %x), !dbg !71
|
||||
// CHECK:STDOUT: call void @"_COp.b8b1f433ad216ca6:core.Destroy.Core"(ptr %c.var), !dbg !70
|
||||
@@ -148,7 +148,7 @@ fn M() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define linkonce_odr i32 @_CG.Main.980bd46fd9fb5b99(i32 %x) #0 !dbg !73 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %c.var = alloca {}, align 8, !dbg !76
|
||||
// CHECK:STDOUT: %c.var = alloca {}, align 1, !dbg !76
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %c.var), !dbg !76
|
||||
// CHECK:STDOUT: %C.Cfn.call = call i32 @_CCfn.C.Main.980bd46fd9fb5b99(ptr %c.var, i32 %x), !dbg !77
|
||||
// CHECK:STDOUT: call void @"_COp.b8b1f433ad216ca6:core.Destroy.Core"(ptr %c.var), !dbg !76
|
||||
@@ -158,7 +158,7 @@ fn M() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define linkonce_odr double @_CG.Main.3eb991d272a034fb(double %x) #0 !dbg !79 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %c.var = alloca {}, align 8, !dbg !82
|
||||
// CHECK:STDOUT: %c.var = alloca {}, align 1, !dbg !82
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %c.var), !dbg !82
|
||||
// CHECK:STDOUT: %C.Cfn.call = call double @_CCfn.C.Main.3eb991d272a034fb(ptr %c.var, double %x), !dbg !83
|
||||
// CHECK:STDOUT: call void @"_COp.b8b1f433ad216ca6:core.Destroy.Core"(ptr %c.var), !dbg !82
|
||||
@@ -168,7 +168,7 @@ fn M() {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define linkonce_odr %type @_CG.Main.22a6f624d7af1d76(%type %x) #0 !dbg !85 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %c.var = alloca {}, align 8, !dbg !88
|
||||
// CHECK:STDOUT: %c.var = alloca {}, align 1, !dbg !88
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %c.var), !dbg !88
|
||||
// CHECK:STDOUT: %C.Cfn.call = call %type @_CCfn.C.Main.22a6f624d7af1d76(ptr %c.var, %type %x), !dbg !89
|
||||
// CHECK:STDOUT: call void @"_COp.b8b1f433ad216ca6:core.Destroy.Core"(ptr %c.var), !dbg !88
|
||||
|
||||
@@ -211,7 +211,7 @@ fn F_nested_tuple(a: ((i32, i32), X)) -> ((i32, i32), X) {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define linkonce_odr void @_CF.Main.e4214cdf04e44ea0(ptr sret({ i32, i32 }) %return, ptr %a) #0 !dbg !91 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %_.var = alloca { i32, i32 }, align 8, !dbg !94
|
||||
// CHECK:STDOUT: %_.var = alloca { i32, i32 }, align 4, !dbg !94
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %_.var), !dbg !94
|
||||
// CHECK:STDOUT: call void @"_COp.X.Main:Copy.Main"(ptr %_.var, ptr %a), !dbg !95
|
||||
// CHECK:STDOUT: call void @"_COp.X.Main:Copy.Main"(ptr %return, ptr %a), !dbg !96
|
||||
@@ -222,7 +222,7 @@ fn F_nested_tuple(a: ((i32, i32), X)) -> ((i32, i32), X) {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define linkonce_odr void @_CF.Main.6942691454f579cd() #0 !dbg !98 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %_.var = alloca {}, align 8, !dbg !99
|
||||
// CHECK:STDOUT: %_.var = alloca {}, align 1, !dbg !99
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %_.var), !dbg !99
|
||||
// CHECK:STDOUT: call void @"_COp.61ea2aba74ab3bf1:Copy.Main"(), !dbg !100
|
||||
// CHECK:STDOUT: call void @"_COp.61ea2aba74ab3bf1:Copy.Main"(), !dbg !101
|
||||
@@ -232,7 +232,7 @@ fn F_nested_tuple(a: ((i32, i32), X)) -> ((i32, i32), X) {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define linkonce_odr void @_CF.Main.52eb52f0ffbd1db6(ptr sret({ i32, i32 }) %return, ptr %a) #0 !dbg !103 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %_.var = alloca { i32, i32 }, align 8, !dbg !106
|
||||
// CHECK:STDOUT: %_.var = alloca { i32, i32 }, align 4, !dbg !106
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %_.var), !dbg !106
|
||||
// CHECK:STDOUT: call void @"_COp.87cc08e781602b22:Copy.Main"(ptr %_.var, ptr %a), !dbg !107
|
||||
// CHECK:STDOUT: call void @"_COp.87cc08e781602b22:Copy.Main"(ptr %return, ptr %a), !dbg !108
|
||||
@@ -243,7 +243,7 @@ fn F_nested_tuple(a: ((i32, i32), X)) -> ((i32, i32), X) {
|
||||
// CHECK:STDOUT: ; Function Attrs: nounwind
|
||||
// CHECK:STDOUT: define linkonce_odr void @_CF.Main.cbd425227ee9ed4b(ptr sret({ { i32, i32 }, { i32, i32 } }) %return, ptr %a) #0 !dbg !110 {
|
||||
// CHECK:STDOUT: entry:
|
||||
// CHECK:STDOUT: %_.var = alloca { { i32, i32 }, { i32, i32 } }, align 8, !dbg !113
|
||||
// CHECK:STDOUT: %_.var = alloca { { i32, i32 }, { i32, i32 } }, align 4, !dbg !113
|
||||
// CHECK:STDOUT: call void @llvm.lifetime.start.p0(ptr %_.var), !dbg !113
|
||||
// CHECK:STDOUT: call void @"_COp.b1957bb3c5dab115:Copy.Main"(ptr %_.var, ptr %a), !dbg !114
|
||||
// CHECK:STDOUT: call void @"_COp.b1957bb3c5dab115:Copy.Main"(ptr %return, ptr %a), !dbg !115
|
||||
|
||||
Reference in New Issue
Block a user