diff --git a/cl/_testgo/complitassign/expect.txt b/cl/_testgo/complitassign/expect.txt new file mode 100644 index 0000000000..9766475a41 --- /dev/null +++ b/cl/_testgo/complitassign/expect.txt @@ -0,0 +1 @@ +ok diff --git a/cl/_testgo/complitassign/in.go b/cl/_testgo/complitassign/in.go new file mode 100644 index 0000000000..5d5b838d60 --- /dev/null +++ b/cl/_testgo/complitassign/in.go @@ -0,0 +1,38 @@ +// LITTEST +package main + +type pair struct { + x int + y int +} + +var state pair + +// The right-hand side must be completely evaluated before state is replaced. +// CHECK-LABEL: define void @main.assignGlobal(){{.*}} { +// CHECK: call i64 @main.first() +// CHECK: call i64 @main.second() +// CHECK: store %main.pair %{{[0-9]+}}, ptr @main.state +func assignGlobal() { + state = pair{first(), second()} + if state != (pair{1, 2}) { + panic("global composite assignment produced the wrong value") + } +} + +func first() int { + state.x = 42 + return 1 +} + +func second() int { + if state.x != 42 { + panic("composite assignment committed a field before evaluating its right-hand side") + } + return 2 +} + +func main() { + assignGlobal() + println("ok") +} diff --git a/cl/_testgo/complitnil/expect.txt b/cl/_testgo/complitnil/expect.txt new file mode 100644 index 0000000000..9766475a41 --- /dev/null +++ b/cl/_testgo/complitnil/expect.txt @@ -0,0 +1 @@ +ok diff --git a/cl/_testgo/complitnil/in.go b/cl/_testgo/complitnil/in.go new file mode 100644 index 0000000000..00efc71d08 --- /dev/null +++ b/cl/_testgo/complitnil/in.go @@ -0,0 +1,38 @@ +// LITTEST +package main + +type pair struct { + x int + y int +} + +var calls int + +// Both calls must run before assigning through the nil pointer panics. +// CHECK-LABEL: define void @main.assignNil(){{.*}} { +// CHECK: call i64 @main.count() +// CHECK: call i64 @main.count() +// CHECK: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref" +func assignNil() { + defer func() { + if recover() == nil { + panic("nil composite assignment did not panic") + } + if calls != 2 { + panic("nil composite assignment panicked before evaluating its right-hand side") + } + }() + + var dst *pair + *dst = pair{count(), count()} +} + +func count() int { + calls++ + return calls +} + +func main() { + assignNil() + println("ok") +} diff --git a/cl/_testgo/equal/in.go b/cl/_testgo/equal/in.go index 7464bc4198..b165d36aa7 100644 --- a/cl/_testgo/equal/in.go +++ b/cl/_testgo/equal/in.go @@ -26,10 +26,8 @@ package main // Arrays: all three elements participate in equality, and inequality negates // the aggregate result rather than changing element semantics. // CHECK-LABEL: define void @"main.init#2"(){{.*}} { -// CHECK: %[[ARRAY_L:[0-9]+]] = load [3 x i64], ptr %{{[0-9]+}} -// CHECK: %[[ARRAY_R:[0-9]+]] = load [3 x i64], ptr %{{[0-9]+}} -// CHECK: extractvalue [3 x i64] %[[ARRAY_L]], 0 -// CHECK: extractvalue [3 x i64] %[[ARRAY_R]], 0 +// CHECK: extractvalue [3 x i64] %[[ARRAY_L:[0-9]+]], 0 +// CHECK: extractvalue [3 x i64] %[[ARRAY_R:[0-9]+]], 0 // CHECK: extractvalue [3 x i64] %[[ARRAY_L]], 1 // CHECK: extractvalue [3 x i64] %[[ARRAY_R]], 1 // CHECK: extractvalue [3 x i64] %[[ARRAY_L]], 2 diff --git a/cl/_testgo/tptypes/in.go b/cl/_testgo/tptypes/in.go index aa489e62e4..8be7423517 100644 --- a/cl/_testgo/tptypes/in.go +++ b/cl/_testgo/tptypes/in.go @@ -108,6 +108,7 @@ func main() { // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 0) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) // CHECK-NEXT: %[[TMP16:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) +// CHECK-NEXT: store %"main.Slice{{\[\[}}]int,int]" zeroinitializer, ptr %[[TMP16]], align 8 // CHECK-NEXT: %[[TMP17:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 8) // CHECK-NEXT: %[[TMP18:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP17]], i64 0 // CHECK-NEXT: store i64 100, ptr %[[TMP18]], align 8 @@ -116,6 +117,7 @@ func main() { // CHECK-NEXT: %[[TMP21:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP20]], i64 1, 2 // CHECK-NEXT: %[[TMP22:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.Slice" @"main.(*Slice{{\[\[}}]int,int]).Append"(ptr %[[TMP16]], %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP21]]) // CHECK-NEXT: %[[TMP23:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) +// CHECK-NEXT: store %"main.Slice{{\[\[}}]string,string]" zeroinitializer, ptr %[[TMP23]], align 8 // CHECK-NEXT: %[[TMP24:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) // CHECK-NEXT: %[[TMP25:[0-9]+]] = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP24]], i64 0 // CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB0]], i64 5 }, ptr %[[TMP25]], align 8 @@ -124,6 +126,7 @@ func main() { // CHECK-NEXT: %[[TMP28:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP27]], i64 1, 2 // CHECK-NEXT: %[[TMP29:[0-9]+]] = call %"{{.*}}/runtime/internal/runtime.Slice" @"main.(*Slice{{\[\[}}]string,string]).Append"(ptr %[[TMP23]], %"{{.*}}/runtime/internal/runtime.Slice" %[[TMP28]]) // CHECK-NEXT: %[[TMP30:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 24) +// CHECK-NEXT: store %"main.Slice{{\[\[}}]int,int]" zeroinitializer, ptr %[[TMP30]], align 8 // CHECK-NEXT: %[[TMP31:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) // CHECK-NEXT: %[[TMP32:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP31]], i64 0 // CHECK-NEXT: store i64 1, ptr %[[TMP32]], align 8 diff --git a/cl/_testrt/gblarray/in.go b/cl/_testrt/gblarray/in.go index 42b2f044db..481f55de0b 100644 --- a/cl/_testrt/gblarray/in.go +++ b/cl/_testrt/gblarray/in.go @@ -84,8 +84,13 @@ func main() { // CHECK-NEXT: _llgo_[[BB1]]: // CHECK-NEXT: store i1 true, ptr @"main.init$guard", align 1 // CHECK-NEXT: call void @"{{.*}}/runtime/abi.init"() -// CHECK-NEXT: %[[TMP1:[0-9]+]] = call ptr @main.basicType(i64 24) -// CHECK-NEXT: store ptr %[[TMP1]], ptr getelementptr inbounds (ptr, ptr @main.basicTypes, i64 24), align 8 +// CHECK-NEXT: %[[TMP1:[0-9]+]] = alloca [25 x ptr], align 8 +// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP1]], i8 0, i64 200, i1 false) +// CHECK-NEXT: %[[TMP2:[0-9]+]] = getelementptr inbounds ptr, ptr %[[TMP1]], i64 24 +// CHECK-NEXT: %[[TMP3:[0-9]+]] = call ptr @main.basicType(i64 24) +// CHECK-NEXT: store ptr %[[TMP3]], ptr %[[TMP2]], align 8 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = load [25 x ptr], ptr %[[TMP1]], align 8 +// CHECK-NEXT: store [25 x ptr] %[[TMP4]], ptr @main.basicTypes, align 8 // CHECK-NEXT: br label %_llgo_[[BB2]] // CHECK-EMPTY: // CHECK-NEXT: _llgo_[[BB2]]: diff --git a/cl/_testrt/index/in.go b/cl/_testrt/index/in.go index 481184aec0..ccfd1a9b4b 100644 --- a/cl/_testrt/index/in.go +++ b/cl/_testrt/index/in.go @@ -15,11 +15,15 @@ type S []int // that selected value are consumed. // CHECK: %[[POINT:[0-9]+]] = alloca %main.point // CHECK: %[[POINTS:[0-9]+]] = alloca [3 x %main.point] -// CHECK: %[[POINT2_INIT:[0-9]+]] = getelementptr inbounds %main.point, ptr %[[POINTS]], i64 2 -// CHECK: %[[POINT2_X:[0-9]+]] = getelementptr inbounds %main.point, ptr %[[POINT2_INIT]], i32 0, i32 0 -// CHECK: %[[POINT2_Y:[0-9]+]] = getelementptr inbounds %main.point, ptr %[[POINT2_INIT]], i32 0, i32 1 -// CHECK: store i64 5, ptr %[[POINT2_X]] -// CHECK: store i64 6, ptr %[[POINT2_Y]] +// CHECK: %[[POINT2_DST:[0-9]+]] = getelementptr inbounds %main.point, ptr %[[POINTS]], i64 2 +// CHECK: %[[POINT2_TMP:[0-9]+]] = alloca %main.point +// CHECK: %[[POINT2_INIT_X:[0-9]+]] = getelementptr inbounds %main.point, ptr %[[POINT2_TMP]], i32 0, i32 0 +// CHECK: %[[POINT2_INIT_Y:[0-9]+]] = getelementptr inbounds %main.point, ptr %[[POINT2_TMP]], i32 0, i32 1 +// CHECK: store i64 5, ptr %[[POINT2_INIT_X]] +// CHECK: store i64 6, ptr %[[POINT2_INIT_Y]] +// CHECK: %[[POINT2_VALUE:[0-9]+]] = load %main.point, ptr %[[POINT2_TMP]] +// CHECK: store %main.point %[[POINT2_VALUE]], ptr %[[POINT2_DST]] +// CHECK: %[[POINTS_VALUE:[0-9]+]] = load [3 x %main.point], ptr %[[POINTS]] // CHECK: %[[POINT2:[0-9]+]] = getelementptr inbounds %main.point, ptr %[[POINTS]], i64 2 // CHECK: %[[SELECTED_POINT:[0-9]+]] = load %main.point, ptr %[[POINT2]] // CHECK: store %main.point %[[SELECTED_POINT]], ptr %[[POINT]] @@ -31,13 +35,15 @@ type S []int // Nested arrays select row 1 before indexing its two elements. // CHECK: %[[ROW:[0-9]+]] = alloca [2 x i64] // CHECK: %[[MATRIX:[0-9]+]] = alloca [2 x [2 x i64]] -// CHECK: %[[ROW1_INIT:[0-9]+]] = getelementptr inbounds [2 x i64], ptr %[[MATRIX]], i64 1 -// CHECK: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref" -// CHECK: %[[ROW1_ELEM0:[0-9]+]] = getelementptr inbounds i64, ptr %[[ROW1_INIT]], i64 0 -// CHECK: call void @"{{.*}}/runtime/internal/runtime.AssertNilDeref" -// CHECK: %[[ROW1_ELEM1:[0-9]+]] = getelementptr inbounds i64, ptr %[[ROW1_INIT]], i64 1 -// CHECK: store i64 3, ptr %[[ROW1_ELEM0]] -// CHECK: store i64 4, ptr %[[ROW1_ELEM1]] +// CHECK: %[[ROW1_DST:[0-9]+]] = getelementptr inbounds [2 x i64], ptr %[[MATRIX]], i64 1 +// CHECK: %[[ROW1_TMP:[0-9]+]] = alloca [2 x i64] +// CHECK: %[[ROW1_INIT_0:[0-9]+]] = getelementptr inbounds i64, ptr %[[ROW1_TMP]], i64 0 +// CHECK: %[[ROW1_INIT_1:[0-9]+]] = getelementptr inbounds i64, ptr %[[ROW1_TMP]], i64 1 +// CHECK: store i64 3, ptr %[[ROW1_INIT_0]] +// CHECK: store i64 4, ptr %[[ROW1_INIT_1]] +// CHECK: %[[ROW1_VALUE:[0-9]+]] = load [2 x i64], ptr %[[ROW1_TMP]] +// CHECK: store [2 x i64] %[[ROW1_VALUE]], ptr %[[ROW1_DST]] +// CHECK: %[[MATRIX_VALUE:[0-9]+]] = load [2 x [2 x i64]], ptr %[[MATRIX]] // CHECK: %[[ROW1:[0-9]+]] = getelementptr inbounds [2 x i64], ptr %[[MATRIX]], i64 1 // CHECK: %[[SELECTED_ROW:[0-9]+]] = load [2 x i64], ptr %[[ROW1]] // CHECK: store [2 x i64] %[[SELECTED_ROW]], ptr %[[ROW]] @@ -64,8 +70,13 @@ type S []int // Named pointer-to-array indexing and named-slice indexing use different // lowering. The slice predicate, length and data pointer must stay associated. // CHECK: %[[NAMED_ARRAY:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK: %[[NAMED_ELEM_INIT:[0-9]+]] = getelementptr inbounds i64, ptr %[[NAMED_ARRAY]], i64 1 -// CHECK: store i64 2, ptr %[[NAMED_ELEM_INIT]] +// CHECK: %[[NAMED_TMP:[0-9]+]] = alloca [2 x i64] +// CHECK: %[[NAMED_INIT_0:[0-9]+]] = getelementptr inbounds i64, ptr %[[NAMED_TMP]], i64 0 +// CHECK: %[[NAMED_INIT_1:[0-9]+]] = getelementptr inbounds i64, ptr %[[NAMED_TMP]], i64 1 +// CHECK: store i64 1, ptr %[[NAMED_INIT_0]] +// CHECK: store i64 2, ptr %[[NAMED_INIT_1]] +// CHECK: %[[NAMED_VALUE:[0-9]+]] = load [2 x i64], ptr %[[NAMED_TMP]] +// CHECK: store [2 x i64] %[[NAMED_VALUE]], ptr %[[NAMED_ARRAY]] // CHECK: %[[NAMED_ELEM:[0-9]+]] = getelementptr inbounds i64, ptr %[[NAMED_ARRAY]], i64 1 // CHECK: load i64, ptr %[[NAMED_ELEM]] // CHECK: %[[SLICE_DATA_RAW:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) diff --git a/cl/_testrt/qsort/in.go b/cl/_testrt/qsort/in.go index 27bc53faf2..fdfe9b48e0 100644 --- a/cl/_testrt/qsort/in.go +++ b/cl/_testrt/qsort/in.go @@ -26,44 +26,48 @@ func main() { // CHECK-LABEL: define void @main.main(){{.*}} { // CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: // CHECK-NEXT: %[[TMP0:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 40) -// CHECK-NEXT: %[[TMP1:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP0]], i64 0 -// CHECK-NEXT: %[[TMP2:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP0]], i64 1 -// CHECK-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP0]], i64 2 -// CHECK-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP0]], i64 3 -// CHECK-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP0]], i64 4 -// CHECK-NEXT: store i64 100, ptr %[[TMP1]], align 8 -// CHECK-NEXT: store i64 8, ptr %[[TMP2]], align 8 -// CHECK-NEXT: store i64 23, ptr %[[TMP3]], align 8 -// CHECK-NEXT: store i64 2, ptr %[[TMP4]], align 8 -// CHECK-NEXT: store i64 7, ptr %[[TMP5]], align 8 -// CHECK-NEXT: %[[TMP6:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP0]], i64 0 -// CHECK-NEXT: call void @qsort(ptr %[[TMP6]], i64 5, i64 8, ptr @"main.main$1") -// CHECK-NEXT: %[[TMP7:[0-9]+]] = load [5 x i64], ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP1:[0-9]+]] = alloca [5 x i64], align 8 +// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP1]], i8 0, i64 40, i1 false) +// CHECK-NEXT: %[[TMP2:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP1]], i64 0 +// CHECK-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP1]], i64 1 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP1]], i64 2 +// CHECK-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP1]], i64 3 +// CHECK-NEXT: %[[TMP6:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP1]], i64 4 +// CHECK-NEXT: store i64 100, ptr %[[TMP2]], align 8 +// CHECK-NEXT: store i64 8, ptr %[[TMP3]], align 8 +// CHECK-NEXT: store i64 23, ptr %[[TMP4]], align 8 +// CHECK-NEXT: store i64 2, ptr %[[TMP5]], align 8 +// CHECK-NEXT: store i64 7, ptr %[[TMP6]], align 8 +// CHECK-NEXT: %[[TMP7:[0-9]+]] = load [5 x i64], ptr %[[TMP1]], align 8 +// CHECK-NEXT: store [5 x i64] %[[TMP7]], ptr %[[TMP0]], align 8 +// CHECK-NEXT: %[[TMP8:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP0]], i64 0 +// CHECK-NEXT: call void @qsort(ptr %[[TMP8]], i64 5, i64 8, ptr @"main.main$1") +// CHECK-NEXT: %[[TMP9:[0-9]+]] = load [5 x i64], ptr %[[TMP0]], align 8 // CHECK-NEXT: br label %_llgo_[[BB1:[0-9]+]] // CHECK-EMPTY: // CHECK-NEXT: _llgo_[[BB1]]: -// CHECK-NEXT: %[[TMP8:[0-9]+]] = phi i64 [ -1, %_llgo_[[BB0]] ], [ %[[TMP9:[0-9]+]], %_llgo_[[BB5:[0-9]+]] ] -// CHECK-NEXT: %[[TMP9]] = add i64 %[[TMP8]], 1 -// CHECK-NEXT: %[[TMP10:[0-9]+]] = icmp slt i64 %[[TMP9]], 5 -// CHECK-NEXT: br i1 %[[TMP10]], label %_llgo_[[BB2:[0-9]+]], label %_llgo_[[BB3:[0-9]+]] +// CHECK-NEXT: %[[TMP10:[0-9]+]] = phi i64 [ -1, %_llgo_[[BB0]] ], [ %[[TMP11:[0-9]+]], %_llgo_[[BB5:[0-9]+]] ] +// CHECK-NEXT: %[[TMP11]] = add i64 %[[TMP10]], 1 +// CHECK-NEXT: %[[TMP12:[0-9]+]] = icmp slt i64 %[[TMP11]], 5 +// CHECK-NEXT: br i1 %[[TMP12]], label %_llgo_[[BB2:[0-9]+]], label %_llgo_[[BB3:[0-9]+]] // CHECK-EMPTY: // CHECK-NEXT: _llgo_[[BB2]]: -// CHECK-NEXT: %[[TMP11:[0-9]+]] = icmp slt i64 %[[TMP9]], 0 -// CHECK-NEXT: %[[TMP12:[0-9]+]] = icmp uge i64 %[[TMP9]], 5 -// CHECK-NEXT: %[[TMP13:[0-9]+]] = or i1 %[[TMP12]], %[[TMP11]] -// CHECK-NEXT: br i1 %[[TMP13]], label %_llgo_[[BB4:[0-9]+]], label %_llgo_[[BB5]] +// CHECK-NEXT: %[[TMP13:[0-9]+]] = icmp slt i64 %[[TMP11]], 0 +// CHECK-NEXT: %[[TMP14:[0-9]+]] = icmp uge i64 %[[TMP11]], 5 +// CHECK-NEXT: %[[TMP15:[0-9]+]] = or i1 %[[TMP14]], %[[TMP13]] +// CHECK-NEXT: br i1 %[[TMP15]], label %_llgo_[[BB4:[0-9]+]], label %_llgo_[[BB5]] // CHECK-EMPTY: // CHECK-NEXT: _llgo_[[BB3]]: // CHECK-NEXT: ret void // CHECK-EMPTY: // CHECK-NEXT: _llgo_[[BB4]]: -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicIndex"(i64 %[[TMP9]], i64 5) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PanicIndex"(i64 %[[TMP11]], i64 5) // CHECK-NEXT: br label %_llgo_[[BB4]] // CHECK-EMPTY: // CHECK-NEXT: _llgo_[[BB5]]: -// CHECK-NEXT: %[[TMP14:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP0]], i64 %[[TMP9]] -// CHECK-NEXT: %[[TMP15:[0-9]+]] = load i64, ptr %[[TMP14]], align 8 -// CHECK-NEXT: %[[TMP16:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB0]], i64 %[[TMP15]]) +// CHECK-NEXT: %[[TMP16:[0-9]+]] = getelementptr inbounds i64, ptr %[[TMP0]], i64 %[[TMP11]] +// CHECK-NEXT: %[[TMP17:[0-9]+]] = load i64, ptr %[[TMP16]], align 8 +// CHECK-NEXT: %[[TMP18:[0-9]+]] = call i32 (ptr, ...) @printf(ptr @[[GLOB0]], i64 %[[TMP17]]) // CHECK-NEXT: br label %_llgo_[[BB1]] // CHECK-NEXT: } diff --git a/cl/_testrt/tpmap/in.go b/cl/_testrt/tpmap/in.go index f0064e393f..9bae857cee 100644 --- a/cl/_testrt/tpmap/in.go +++ b/cl/_testrt/tpmap/in.go @@ -36,55 +36,71 @@ func main() { // CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP1]], i8 0, i64 48, i1 false) // CHECK-NEXT: %[[TMP2:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP1]], i32 0, i32 0 // CHECK-NEXT: %[[TMP3:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP1]], i32 0, i32 1 -// CHECK-NEXT: %[[TMP4:[0-9]+]] = getelementptr inbounds %main.T2, ptr %[[TMP3]], i32 0, i32 0 -// CHECK-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP1]], i32 0, i32 2 -// CHECK-NEXT: %[[TMP6:[0-9]+]] = getelementptr inbounds %"main.T3[any]", ptr %[[TMP5]], i32 0, i32 0 -// CHECK-NEXT: %[[TMP7:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP1]], i32 0, i32 3 -// CHECK-NEXT: %[[TMP8:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP1]], i32 0, i32 4 +// CHECK-NEXT: %[[TMP4:[0-9]+]] = alloca %main.T2, align 8 +// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP4]], i8 0, i64 8, i1 false) +// CHECK-NEXT: %[[TMP5:[0-9]+]] = getelementptr inbounds %main.T2, ptr %[[TMP4]], i32 0, i32 0 +// CHECK-NEXT: store i64 0, ptr %[[TMP5]], align 8 +// CHECK-NEXT: %[[TMP6:[0-9]+]] = load %main.T2, ptr %[[TMP4]], align 8 +// CHECK-NEXT: %[[TMP7:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP1]], i32 0, i32 2 +// CHECK-NEXT: %[[TMP8:[0-9]+]] = alloca %"main.T3[any]", align 8 +// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP8]], i8 0, i64 16, i1 false) +// CHECK-NEXT: %[[TMP9:[0-9]+]] = getelementptr inbounds %"main.T3[any]", ptr %[[TMP8]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP10:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// CHECK-NEXT: store i64 0, ptr %[[TMP10]], align 8 +// CHECK-NEXT: %[[TMP11:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %[[TMP10]], 1 +// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP11]], ptr %[[TMP9]], align 8 +// CHECK-NEXT: %[[TMP12:[0-9]+]] = load %"main.T3[any]", ptr %[[TMP8]], align 8 +// CHECK-NEXT: %[[TMP13:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP1]], i32 0, i32 3 +// CHECK-NEXT: %[[TMP14:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP1]], i32 0, i32 4 // CHECK-NEXT: store i64 0, ptr %[[TMP2]], align 8 -// CHECK-NEXT: store i64 0, ptr %[[TMP4]], align 8 -// CHECK-NEXT: %[[TMP9:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) -// CHECK-NEXT: store i64 0, ptr %[[TMP9]], align 8 -// CHECK-NEXT: %[[TMP10:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %[[TMP9]], 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP10]], ptr %[[TMP6]], align 8 -// CHECK-NEXT: store ptr null, ptr %[[TMP7]], align 8 -// CHECK-NEXT: store i64 0, ptr %[[TMP8]], align 8 -// CHECK-NEXT: %[[TMP11:[0-9]+]] = load %main.cacheKey, ptr %[[TMP1]], align 8 -// CHECK-NEXT: %[[TMP12:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: store %main.cacheKey %[[TMP11]], ptr %[[TMP12]], align 8 -// CHECK-NEXT: %[[TMP13:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_main.cacheKey]_llgo_string", ptr %[[TMP0]], ptr %[[TMP12]]) -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB29]], i64 5 }, ptr %[[TMP13]], align 8 -// CHECK-NEXT: %[[TMP14:[0-9]+]] = alloca %main.cacheKey, align 8 -// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP14]], i8 0, i64 48, i1 false) -// CHECK-NEXT: %[[TMP15:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP14]], i32 0, i32 0 -// CHECK-NEXT: %[[TMP16:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP14]], i32 0, i32 1 -// CHECK-NEXT: %[[TMP17:[0-9]+]] = getelementptr inbounds %main.T2, ptr %[[TMP16]], i32 0, i32 0 -// CHECK-NEXT: %[[TMP18:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP14]], i32 0, i32 2 -// CHECK-NEXT: %[[TMP19:[0-9]+]] = getelementptr inbounds %"main.T3[any]", ptr %[[TMP18]], i32 0, i32 0 -// CHECK-NEXT: %[[TMP20:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP14]], i32 0, i32 3 -// CHECK-NEXT: %[[TMP21:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP14]], i32 0, i32 4 -// CHECK-NEXT: store i64 0, ptr %[[TMP15]], align 8 -// CHECK-NEXT: store i64 0, ptr %[[TMP17]], align 8 -// CHECK-NEXT: %[[TMP22:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// CHECK-NEXT: store %main.T2 %[[TMP6]], ptr %[[TMP3]], align 8 +// CHECK-NEXT: store %"main.T3[any]" %[[TMP12]], ptr %[[TMP7]], align 8 +// CHECK-NEXT: store ptr null, ptr %[[TMP13]], align 8 +// CHECK-NEXT: store i64 0, ptr %[[TMP14]], align 8 +// CHECK-NEXT: %[[TMP15:[0-9]+]] = load %main.cacheKey, ptr %[[TMP1]], align 8 +// CHECK-NEXT: %[[TMP16:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) +// CHECK-NEXT: store %main.cacheKey %[[TMP15]], ptr %[[TMP16]], align 8 +// CHECK-NEXT: %[[TMP17:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.MapAssign"(ptr @"map[_llgo_main.cacheKey]_llgo_string", ptr %[[TMP0]], ptr %[[TMP16]]) +// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.String" { ptr @[[GLOB29]], i64 5 }, ptr %[[TMP17]], align 8 +// CHECK-NEXT: %[[TMP18:[0-9]+]] = alloca %main.cacheKey, align 8 +// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP18]], i8 0, i64 48, i1 false) +// CHECK-NEXT: %[[TMP19:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP18]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP20:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP18]], i32 0, i32 1 +// CHECK-NEXT: %[[TMP21:[0-9]+]] = alloca %main.T2, align 8 +// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP21]], i8 0, i64 8, i1 false) +// CHECK-NEXT: %[[TMP22:[0-9]+]] = getelementptr inbounds %main.T2, ptr %[[TMP21]], i32 0, i32 0 // CHECK-NEXT: store i64 0, ptr %[[TMP22]], align 8 -// CHECK-NEXT: %[[TMP23:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %[[TMP22]], 1 -// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP23]], ptr %[[TMP19]], align 8 -// CHECK-NEXT: store ptr null, ptr %[[TMP20]], align 8 -// CHECK-NEXT: store i64 0, ptr %[[TMP21]], align 8 -// CHECK-NEXT: %[[TMP24:[0-9]+]] = load %main.cacheKey, ptr %[[TMP14]], align 8 -// CHECK-NEXT: %[[TMP25:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) -// CHECK-NEXT: store %main.cacheKey %[[TMP24]], ptr %[[TMP25]], align 8 -// CHECK-NEXT: %[[TMP26:[0-9]+]] = call { ptr, i1 } @"{{.*}}/runtime/internal/runtime.MapAccess2"(ptr @"map[_llgo_main.cacheKey]_llgo_string", ptr %[[TMP0]], ptr %[[TMP25]]) -// CHECK-NEXT: %[[TMP27:[0-9]+]] = extractvalue { ptr, i1 } %[[TMP26]], 0 -// CHECK-NEXT: %[[TMP28:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP27]], align 8 -// CHECK-NEXT: %[[TMP29:[0-9]+]] = extractvalue { ptr, i1 } %[[TMP26]], 1 -// CHECK-NEXT: %[[TMP30:[0-9]+]] = insertvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } undef, %"{{.*}}/runtime/internal/runtime.String" %[[TMP28]], 0 -// CHECK-NEXT: %[[TMP31:[0-9]+]] = insertvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } %[[TMP30]], i1 %[[TMP29]], 1 -// CHECK-NEXT: %[[TMP32:[0-9]+]] = extractvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } %[[TMP31]], 0 -// CHECK-NEXT: %[[TMP33:[0-9]+]] = extractvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } %[[TMP31]], 1 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %[[TMP32]]) +// CHECK-NEXT: %[[TMP23:[0-9]+]] = load %main.T2, ptr %[[TMP21]], align 8 +// CHECK-NEXT: %[[TMP24:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP18]], i32 0, i32 2 +// CHECK-NEXT: %[[TMP25:[0-9]+]] = alloca %"main.T3[any]", align 8 +// CHECK-NEXT: call void @llvm.memset.p0.i64(ptr %[[TMP25]], i8 0, i64 16, i1 false) +// CHECK-NEXT: %[[TMP26:[0-9]+]] = getelementptr inbounds %"main.T3[any]", ptr %[[TMP25]], i32 0, i32 0 +// CHECK-NEXT: %[[TMP27:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 8) +// CHECK-NEXT: store i64 0, ptr %[[TMP27]], align 8 +// CHECK-NEXT: %[[TMP28:[0-9]+]] = insertvalue %"{{.*}}/runtime/internal/runtime.eface" { ptr @_llgo_int, ptr undef }, ptr %[[TMP27]], 1 +// CHECK-NEXT: store %"{{.*}}/runtime/internal/runtime.eface" %[[TMP28]], ptr %[[TMP26]], align 8 +// CHECK-NEXT: %[[TMP29:[0-9]+]] = load %"main.T3[any]", ptr %[[TMP25]], align 8 +// CHECK-NEXT: %[[TMP30:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP18]], i32 0, i32 3 +// CHECK-NEXT: %[[TMP31:[0-9]+]] = getelementptr inbounds %main.cacheKey, ptr %[[TMP18]], i32 0, i32 4 +// CHECK-NEXT: store i64 0, ptr %[[TMP19]], align 8 +// CHECK-NEXT: store %main.T2 %[[TMP23]], ptr %[[TMP20]], align 8 +// CHECK-NEXT: store %"main.T3[any]" %[[TMP29]], ptr %[[TMP24]], align 8 +// CHECK-NEXT: store ptr null, ptr %[[TMP30]], align 8 +// CHECK-NEXT: store i64 0, ptr %[[TMP31]], align 8 +// CHECK-NEXT: %[[TMP32:[0-9]+]] = load %main.cacheKey, ptr %[[TMP18]], align 8 +// CHECK-NEXT: %[[TMP33:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocU"(i64 48) +// CHECK-NEXT: store %main.cacheKey %[[TMP32]], ptr %[[TMP33]], align 8 +// CHECK-NEXT: %[[TMP34:[0-9]+]] = call { ptr, i1 } @"{{.*}}/runtime/internal/runtime.MapAccess2"(ptr @"map[_llgo_main.cacheKey]_llgo_string", ptr %[[TMP0]], ptr %[[TMP33]]) +// CHECK-NEXT: %[[TMP35:[0-9]+]] = extractvalue { ptr, i1 } %[[TMP34]], 0 +// CHECK-NEXT: %[[TMP36:[0-9]+]] = load %"{{.*}}/runtime/internal/runtime.String", ptr %[[TMP35]], align 8 +// CHECK-NEXT: %[[TMP37:[0-9]+]] = extractvalue { ptr, i1 } %[[TMP34]], 1 +// CHECK-NEXT: %[[TMP38:[0-9]+]] = insertvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } undef, %"{{.*}}/runtime/internal/runtime.String" %[[TMP36]], 0 +// CHECK-NEXT: %[[TMP39:[0-9]+]] = insertvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } %[[TMP38]], i1 %[[TMP37]], 1 +// CHECK-NEXT: %[[TMP40:[0-9]+]] = extractvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } %[[TMP39]], 0 +// CHECK-NEXT: %[[TMP41:[0-9]+]] = extractvalue { %"{{.*}}/runtime/internal/runtime.String", i1 } %[[TMP39]], 1 +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" %[[TMP40]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %[[TMP33]]) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintBool"(i1 %[[TMP41]]) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) // CHECK-NEXT: ret void // CHECK-NEXT: } diff --git a/cl/_testrt/tpunsafe/in.go b/cl/_testrt/tpunsafe/in.go index 5eff46a1b4..6f8ede2622 100644 --- a/cl/_testrt/tpunsafe/in.go +++ b/cl/_testrt/tpunsafe/in.go @@ -49,8 +49,10 @@ func (m *M[T]) check(align, offset1, offset2 uintptr) { // CHECK-LABEL: define void @main.main(){{.*}} { // CHECK-NEXT: _llgo_[[BB0:[0-9]+]]: // CHECK-NEXT: %[[TMP0:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 12) +// CHECK-NEXT: store %"main.M[bool]" zeroinitializer, ptr %[[TMP0]], align 4 // CHECK-NEXT: call void @"main.(*M[bool]).check"(ptr %[[TMP0]], i64 1, i64 8, i64 1) // CHECK-NEXT: %[[TMP1:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 32) +// CHECK-NEXT: store %"main.M[int64]" zeroinitializer, ptr %[[TMP1]], align 8 // CHECK-NEXT: call void @"main.(*M[int64]).check"(ptr %[[TMP1]], i64 8, i64 16, i64 8) // CHECK-NEXT: ret void // CHECK-NEXT: } diff --git a/cl/_testrt/unsafe/in.go b/cl/_testrt/unsafe/in.go index 30fe7514f9..cdf48763ee 100644 --- a/cl/_testrt/unsafe/in.go +++ b/cl/_testrt/unsafe/in.go @@ -40,10 +40,13 @@ type N struct { // unsafe.Slice validates pointer/length overflow, then constructs a slice whose // data and length are the values consumed by ordinary bounds checks. // CHECK: %[[ARRAY:[0-9]+]] = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK: %[[ELEM0:[0-9]+]] = getelementptr inbounds i64, ptr %[[ARRAY]], i64 0 -// CHECK: %[[ELEM1:[0-9]+]] = getelementptr inbounds i64, ptr %[[ARRAY]], i64 1 +// CHECK: %[[ARRAY_TMP:[0-9]+]] = alloca [2 x i64] +// CHECK: %[[ELEM0:[0-9]+]] = getelementptr inbounds i64, ptr %[[ARRAY_TMP]], i64 0 +// CHECK: %[[ELEM1:[0-9]+]] = getelementptr inbounds i64, ptr %[[ARRAY_TMP]], i64 1 // CHECK: store i64 1, ptr %[[ELEM0]] // CHECK: store i64 2, ptr %[[ELEM1]] +// CHECK: %[[ARRAY_VALUE:[0-9]+]] = load [2 x i64], ptr %[[ARRAY_TMP]] +// CHECK: store [2 x i64] %[[ARRAY_VALUE]], ptr %[[ARRAY]] // CHECK: %[[BASE:[0-9]+]] = getelementptr inbounds i64, ptr %[[ARRAY]], i64 0 // CHECK: %[[BASE_INT:[0-9]+]] = ptrtoint ptr %[[BASE]] to i64 // CHECK: %[[SLICE_END:[0-9]+]] = add i64 %[[BASE_INT]], 15 diff --git a/cl/compile_test.go b/cl/compile_test.go index 9ce3b085ba..c3e850652f 100644 --- a/cl/compile_test.go +++ b/cl/compile_test.go @@ -78,6 +78,7 @@ var embedTargetConfigs = []embedTargetConfig{ "./_testgo/cgomacro", // fast fail: build constraints exclude all Go files (cgo) "./_testgo/cgopython", // fast fail: build constraints exclude all Go files (cgo) "./_testgo/chan", // timeout: emulator did not auto-exit + "./_testgo/complitnil", // baremetal terminates on the nil-pointer panic before deferred recovery "./_testgo/cursor", // panic: internal/bytealg: selected .s files require plan9asm translation "./_testgo/defer4", // unexpected output: got "fatal error", expected "recover: panic message" "./_testgo/goexit", // llgo panic: unsatisfied import internal/runtime/sys @@ -132,6 +133,7 @@ var embedTargetConfigs = []embedTargetConfig{ "./_testgo/alias", // unexpected output "./_testgo/cgodefer", // panic: cannot build SSA for packages "./_testgo/cgopython", // panic: cannot build SSA for packages + "./_testgo/complitnil", // baremetal terminates on the nil-pointer panic before deferred recovery "./_testgo/cursor", // panic: internal/bytealg: selected .s files require plan9asm translation "./_testgo/defer4", // runtime output: fatal error "./_testgo/indexerr", // runtime output: fatal error diff --git a/cl/static_init.go b/cl/static_init.go index 29b5037d44..d60328bf38 100644 --- a/cl/static_init.go +++ b/cl/static_init.go @@ -210,6 +210,8 @@ func (p *context) collectStaticGlobalInits(pkg *ssa.Package) { // recording constant stores into out and tracking intermediate instructions for suppression. // terminal must be the exact load or full-slice value consumed only by terminalStore; // any other escaping use rejects the fold. The visited map guards against cyclic pointer graphs. +// A false result may leave partial entries in out and instrs; callers must discard the entire +// candidate on failure. func collectAllocStores(alloc *ssa.Alloc, terminal ssa.Value, terminalStore *ssa.Store, basePath []staticInitPathElem, out *[]staticInitStore, instrs *[]ssa.Instruction, visited map[*ssa.Alloc]bool) bool { if visited[alloc] { return false diff --git a/go.mod b/go.mod index 375979d3d3..7fe40b537c 100644 --- a/go.mod +++ b/go.mod @@ -6,7 +6,7 @@ require ( github.com/goplus/cobra v1.9.12 //xgo:class github.com/goplus/gogen v1.23.5 github.com/goplus/lib v0.3.1 - github.com/goplus/mod v0.21.2 + github.com/goplus/mod v0.22.0 github.com/mattn/go-tty v0.0.8 github.com/qiniu/x v1.18.3 github.com/xgo-dev/llgo/runtime v0.0.0-00010101000000-000000000000 @@ -14,15 +14,15 @@ require ( github.com/xgo-dev/plan9asm v0.3.5 go.bug.st/serial v1.6.4 go.yaml.in/yaml/v3 v3.0.5 - golang.org/x/mod v0.29.0 - golang.org/x/sys v0.37.0 - golang.org/x/tools v0.38.0 + golang.org/x/mod v0.40.0 + golang.org/x/sys v0.47.0 + golang.org/x/tools v0.49.0 ) require ( github.com/creack/goselect v0.1.2 // indirect github.com/mattn/go-isatty v0.0.20 // indirect - golang.org/x/sync v0.17.0 // indirect + golang.org/x/sync v0.22.0 // indirect ) replace github.com/xgo-dev/llgo/runtime => ./runtime diff --git a/go.sum b/go.sum index 712188da2c..f66c3df8c3 100644 --- a/go.sum +++ b/go.sum @@ -10,8 +10,8 @@ github.com/goplus/gogen v1.23.5 h1:76w3zmAHI+ECI7bPr0enUd0du9+t1IYyXmp43CbIpSs= github.com/goplus/gogen v1.23.5/go.mod h1:Y7ulYW3wonQ3d9er00b0uGFEV/IUZa6okWJZh892ACQ= github.com/goplus/lib v0.3.1 h1:Xws4DBVvgOMu58awqB972wtvTacDbk3nqcbHjdx9KSg= github.com/goplus/lib v0.3.1/go.mod h1:SgJv3oPqLLHCu0gcL46ejOP3x7/2ry2Jtxu7ta32kp0= -github.com/goplus/mod v0.21.2 h1:Oxp5qWv40G5gBu1qH3w/THYvfoYXpLBvrVKfsTgWS9o= -github.com/goplus/mod v0.21.2/go.mod h1:VTyNmzzePgy99A2VQnxIBfoG1x097xilag/t0F0zuTg= +github.com/goplus/mod v0.22.0 h1:knZCdR5m2Nr1/cU1XqG1lND4USG6mXxx/Ca272RYjQk= +github.com/goplus/mod v0.22.0/go.mod h1:APrczG2FtFcQelU4vTq9xw+GrVs4sPPKnRfGidWBlXY= github.com/mattn/go-isatty v0.0.20 h1:xfD0iDuEKnDkl03q4limB+vH+GxLEtL/jb4xVJSWWEY= github.com/mattn/go-isatty v0.0.20/go.mod h1:W+V8PltTTMOvKvAeJH7IuucS94S2C6jfK/D7dTCTo3Y= github.com/mattn/go-tty v0.0.8 h1:yxtc0Ye17/1ne/bjy993YUoyP8bJJFa9n5M9XTdwoZQ= @@ -30,14 +30,14 @@ go.bug.st/serial v1.6.4 h1:7FmqNPgVp3pu2Jz5PoPtbZ9jJO5gnEnZIvnI1lzve8A= go.bug.st/serial v1.6.4/go.mod h1:nofMJxTeNVny/m6+KaafC6vJGj3miwQZ6vW4BZUGJPI= go.yaml.in/yaml/v3 v3.0.5 h1:N6y/pJk8buWs9NY5ERU2HSMfm+IuD/OtfdAnq6kESPw= go.yaml.in/yaml/v3 v3.0.5/go.mod h1:HVTZu1O7/Vkt2N+BFy8Zza+lnLsABggaTM2ZpNIGuKg= -golang.org/x/mod v0.29.0 h1:HV8lRxZC4l2cr3Zq1LvtOsi/ThTgWnUk/y64QSs8GwA= -golang.org/x/mod v0.29.0/go.mod h1:NyhrlYXJ2H4eJiRy/WDBO6HMqZQ6q9nk4JzS3NuCK+w= -golang.org/x/sync v0.17.0 h1:l60nONMj9l5drqw6jlhIELNv9I0A4OFgRsG9k2oT9Ug= -golang.org/x/sync v0.17.0/go.mod h1:9KTHXmSnoGruLpwFjVSX0lNNA75CykiMECbovNTZqGI= +golang.org/x/mod v0.40.0 h1:hUv+3cXcdRHz08UmSiOob7sadHig73uo5bkXxQ/tvUs= +golang.org/x/mod v0.40.0/go.mod h1:0/weTWkPWGBikyTWAX3dkjVztMmBA5hM0DH6BElSupE= +golang.org/x/sync v0.22.0 h1:SZjpbeLmrCk4xhRSZFNZW5gFUeCeFgjekvI/+gfScek= +golang.org/x/sync v0.22.0/go.mod h1:9xrNwdLfx4jkKbNva9FpL6vEN7evnE43NNNJQ2LF3+0= golang.org/x/sys v0.6.0/go.mod h1:oPkhp1MJrh7nUepCBck5+mAzfO9JrbApNNgaTdGDITg= -golang.org/x/sys v0.37.0 h1:fdNQudmxPjkdUTPnLn5mdQv7Zwvbvpaxqs831goi9kQ= -golang.org/x/sys v0.37.0/go.mod h1:OgkHotnGiDImocRcuBABYBEXf8A9a87e/uXjp9XT3ks= -golang.org/x/tools v0.38.0 h1:Hx2Xv8hISq8Lm16jvBZ2VQf+RLmbd7wVUsALibYI/IQ= -golang.org/x/tools v0.38.0/go.mod h1:yEsQ/d/YK8cjh0L6rZlY8tgtlKiBNTL14pGDJPJpYQs= +golang.org/x/sys v0.47.0 h1:o7XGOvZQCADBQQ4Y7VNq2dRWQR7JmOUW8Kxx4ZsNgWs= +golang.org/x/sys v0.47.0/go.mod h1:4GL1E5IUh+htKOUEOaiffhrAeqysfVGipDYzABqnCmw= +golang.org/x/tools v0.49.0 h1:3NI7VXzL9+1WZD52Dx2ttoPwD5DWrFGpl9mFZDlmisI= +golang.org/x/tools v0.49.0/go.mod h1:SJNXV9DBKT0UbdttsQjbfJlAE/q+y36++zo3uL3N0Oo= gopkg.in/yaml.v3 v3.0.1 h1:fxVm/GzAzEWqLHuvctI91KS9hhNmmWOoWu0XTYJS7CA= gopkg.in/yaml.v3 v3.0.1/go.mod h1:K4uyk7z7BCEPqu6E+C64Yfv1cQ7kz7rIZviUmN+EgEM=