From a55ac22ea2ca4b3fc948814ab32431f2501ab790 Mon Sep 17 00:00:00 2001 From: Li Jie Date: Fri, 22 May 2026 14:01:09 +0800 Subject: [PATCH 1/4] fix bounds panic messages --- cl/_testdata/print/in.go | 20 ++-- cl/_testdata/utf8/in.go | 4 +- cl/_testgo/cursor/in.go | 14 +-- cl/_testgo/equal/in.go | 4 +- cl/_testgo/reader/in.go | 20 ++-- cl/_testgo/reflect/in.go | 22 ++-- cl/_testgo/reflectmk/in.go | 8 +- cl/_testgo/tpindex/in.go | 2 +- cl/_testgo/tprecur/in.go | 4 +- cl/_testgo/tptypes/in.go | 6 +- cl/_testlibc/allocacstrs/in.go | 2 +- cl/_testrt/abinamed/in.go | 10 +- cl/_testrt/builtin/in.go | 38 +++---- cl/_testrt/concat/in.go | 2 +- cl/_testrt/gblarray/in.go | 4 +- cl/_testrt/index/in.go | 2 +- cl/_testrt/intgen/in.go | 8 +- cl/_testrt/mapclosure/in.go | 2 +- cl/_testrt/qsort/in.go | 2 +- cl/_testrt/qsortfn/in.go | 20 ++-- cl/_testrt/sum/in.go | 2 +- cl/_testrt/unsafe/in.go | 4 +- runtime/internal/runtime/errors.go | 33 ++++++ runtime/internal/runtime/z_slice.go | 35 +++++++ runtime/internal/runtime/z_string.go | 17 +++- ssa/datastruct.go | 60 ++++++++++- test/go/bounds_panic_text_test.go | 144 +++++++++++++++++++++++++++ test/goroot/xfail.yaml | 38 ------- 28 files changed, 380 insertions(+), 147 deletions(-) create mode 100644 test/go/bounds_panic_text_test.go diff --git a/cl/_testdata/print/in.go b/cl/_testdata/print/in.go index d77c3aad7f..a6ea33227b 100644 --- a/cl/_testdata/print/in.go +++ b/cl/_testdata/print/in.go @@ -91,7 +91,7 @@ func bytes(s string) (ret []byte) { // CHECK-NEXT: %9 = icmp slt i64 %5, 0 // CHECK-NEXT: %10 = icmp uge i64 %5, %8 // CHECK-NEXT: %11 = or i1 %10, %9 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %11) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %11, {{.*}}) // CHECK-NEXT: %12 = getelementptr inbounds i8, ptr %7, i64 %5 // CHECK-NEXT: %13 = load i8, ptr %12, align 1 // CHECK-NEXT: %14 = call i32 (ptr, ...) @printf(ptr @0, i8 %13) @@ -983,7 +983,7 @@ func printbool(v bool) { // CHECK-NEXT: %47 = icmp slt i64 %44, 0 // CHECK-NEXT: %48 = icmp uge i64 %44, 14 // CHECK-NEXT: %49 = or i1 %48, %47 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %49) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %49, {{.*}}) // CHECK-NEXT: %50 = getelementptr inbounds i8, ptr %8, i64 %44 // CHECK-NEXT: store i8 %46, ptr %50, align 1 // CHECK-NEXT: %51 = sitofp i64 %43 to double @@ -1116,13 +1116,13 @@ func printfloat(v float64) { // CHECK-NEXT: _llgo_1: ; preds = %_llgo_3 // CHECK-NEXT: %2 = urem i64 %22, 16 // CHECK-NEXT: %3 = icmp uge i64 %2, 16 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %3) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %3, {{.*}}) // CHECK-NEXT: %4 = getelementptr inbounds i8, ptr @28, i64 %2 // CHECK-NEXT: %5 = load i8, ptr %4, align 1 // CHECK-NEXT: %6 = icmp slt i64 %23, 0 // CHECK-NEXT: %7 = icmp uge i64 %23, 100 // CHECK-NEXT: %8 = or i1 %7, %6 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %8) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %8, {{.*}}) // CHECK-NEXT: %9 = getelementptr inbounds i8, ptr %1, i64 %23 // CHECK-NEXT: store i8 %5, ptr %9, align 1 // CHECK-NEXT: %10 = icmp ult i64 %22, 16 @@ -1133,17 +1133,17 @@ func printfloat(v float64) { // CHECK-NEXT: %12 = icmp slt i64 %11, 0 // CHECK-NEXT: %13 = icmp uge i64 %11, 100 // CHECK-NEXT: %14 = or i1 %13, %12 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %14) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %14, {{.*}}) // CHECK-NEXT: %15 = getelementptr inbounds i8, ptr %1, i64 %11 // CHECK-NEXT: store i8 120, ptr %15, align 1 // CHECK-NEXT: %16 = sub i64 %11, 1 // CHECK-NEXT: %17 = icmp slt i64 %16, 0 // CHECK-NEXT: %18 = icmp uge i64 %16, 100 // CHECK-NEXT: %19 = or i1 %18, %17 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %19) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %19, {{.*}}) // CHECK-NEXT: %20 = getelementptr inbounds i8, ptr %1, i64 %16 // CHECK-NEXT: store i8 48, ptr %20, align 1 -// CHECK-NEXT: %21 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice3"(ptr %1, i64 1, i64 100, i64 %16, i64 100, i64 100) +// CHECK-NEXT: %21 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) // CHECK-NEXT: call void @"{{.*}}/cl/_testdata/print.gwrite"(%"{{.*}}/runtime/internal/runtime.Slice" %21) // CHECK-NEXT: ret void // CHECK-EMPTY: @@ -1222,7 +1222,7 @@ func printint(v int64) { // CHECK-NEXT: %7 = icmp slt i64 %3, 0 // CHECK-NEXT: %8 = icmp uge i64 %3, %6 // CHECK-NEXT: %9 = or i1 %8, %7 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %9) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %9, {{.*}}) // CHECK-NEXT: %10 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %5, i64 %3 // CHECK-NEXT: %11 = load %"{{.*}}/runtime/internal/runtime.eface", ptr %10, align 8 // CHECK-NEXT: %12 = icmp ne i64 %3, 0 @@ -1290,14 +1290,14 @@ func printstring(s string) { // CHECK-NEXT: %5 = icmp slt i64 %12, 0 // CHECK-NEXT: %6 = icmp uge i64 %12, 100 // CHECK-NEXT: %7 = or i1 %6, %5 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %7) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %7, {{.*}}) // CHECK-NEXT: %8 = getelementptr inbounds i8, ptr %1, i64 %12 // CHECK-NEXT: store i8 %4, ptr %8, align 1 // CHECK-NEXT: %9 = icmp ult i64 %11, 10 // CHECK-NEXT: br i1 %9, label %_llgo_2, label %_llgo_4 // CHECK-EMPTY: // CHECK-NEXT: _llgo_2: ; preds = %_llgo_1, %_llgo_3 -// CHECK-NEXT: %10 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice3"(ptr %1, i64 1, i64 100, i64 %12, i64 100, i64 100) +// CHECK-NEXT: %10 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) // CHECK-NEXT: call void @"{{.*}}/cl/_testdata/print.gwrite"(%"{{.*}}/runtime/internal/runtime.Slice" %10) // CHECK-NEXT: ret void // CHECK-EMPTY: diff --git a/cl/_testdata/utf8/in.go b/cl/_testdata/utf8/in.go index 84b2dae5f3..1773fc2e8f 100644 --- a/cl/_testdata/utf8/in.go +++ b/cl/_testdata/utf8/in.go @@ -11,7 +11,7 @@ import ( // CHECK-NEXT: %2 = icmp slt i64 %1, 0 // CHECK-NEXT: %3 = icmp uge i64 %1, 8 // CHECK-NEXT: %4 = or i1 %3, %2 -// CHECK-NEXT: call void @"{{.*}}.AssertIndexRange"(i1 %4) +// CHECK-NEXT: call void @"{{.*}}.CheckIndexRange"(i1 %4, {{.*}}) // CHECK-NEXT: %5 = getelementptr inbounds i8, ptr @"{{.*}}.array", i64 %1 // CHECK-NEXT: %6 = load i8, ptr %5, align 1 // CHECK-NEXT: ret i8 %6 @@ -37,7 +37,7 @@ var array = [...]uint8{ // CHECK-NEXT: br i1 %1, label %_llgo_2, label %_llgo_3 // CHECK-EMPTY: // CHECK-NEXT: _llgo_2: ; preds = %_llgo_1 -// CHECK-NEXT: %2 = call %"{{.*}}runtime/internal/runtime.String" @"{{.*}}runtime/internal/runtime.StringSlice"(%"{{.*}}runtime/internal/runtime.String" { ptr @0, i64 7 }, i64 %0, i64 7) +// CHECK-NEXT: %2 = call %"{{.*}}runtime/internal/runtime.String" @"{{.*}}runtime/internal/runtime.StringSlice2"({{.*}}) // CHECK-NEXT: %3 = call { i32, i64 } @"unicode/utf8.DecodeRuneInString"(%"{{.*}}runtime/internal/runtime.String" %2) // CHECK-NEXT: %4 = extractvalue { i32, i64 } %3, 0 // CHECK-NEXT: %5 = extractvalue { i32, i64 } %3, 1 diff --git a/cl/_testgo/cursor/in.go b/cl/_testgo/cursor/in.go index cd15d3f033..f4ec560593 100644 --- a/cl/_testgo/cursor/in.go +++ b/cl/_testgo/cursor/in.go @@ -134,7 +134,7 @@ func (c Cursor) Node() ast.Node { // CHECK-NEXT: %58 = icmp slt i64 %57, 0 // CHECK-NEXT: %59 = icmp uge i64 %57, %56 // CHECK-NEXT: %60 = or i1 %59, %58 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %60) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %60, {{.*}}) // CHECK-NEXT: %61 = getelementptr inbounds %"{{.*}}/cl/_testgo/cursor.event", ptr %55, i64 %57 // CHECK-NEXT: %62 = load %"{{.*}}/cl/_testgo/cursor.event", ptr %61, align 8 // CHECK-NEXT: store %"{{.*}}/cl/_testgo/cursor.event" %62, ptr %54, align 8 @@ -191,7 +191,7 @@ func (c Cursor) Node() ast.Node { // CHECK-NEXT: %91 = icmp slt i64 %90, 0 // CHECK-NEXT: %92 = icmp uge i64 %90, %89 // CHECK-NEXT: %93 = or i1 %92, %91 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %93) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %93, {{.*}}) // CHECK-NEXT: %94 = getelementptr inbounds %"{{.*}}/cl/_testgo/cursor.event", ptr %88, i64 %90 // CHECK-NEXT: %95 = getelementptr inbounds %"{{.*}}/cl/_testgo/cursor.event", ptr %94, i32 0, i32 1 // CHECK-NEXT: %96 = load i64, ptr %95, align 8 @@ -565,7 +565,7 @@ const ( // CHECK-NEXT: %14 = icmp slt i64 %13, 0 // CHECK-NEXT: %15 = icmp uge i64 %13, %12 // CHECK-NEXT: %16 = or i1 %15, %14 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %16) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %16, {{.*}}) // CHECK-NEXT: %17 = getelementptr inbounds %"{{.*}}/cl/_testgo/cursor.event", ptr %11, i64 %13 // CHECK-NEXT: %18 = getelementptr inbounds %"{{.*}}/cl/_testgo/cursor.event", ptr %17, i32 0, i32 0 // CHECK-NEXT: %19 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %18, align 8 @@ -620,7 +620,7 @@ const ( // CHECK-NEXT: %19 = icmp slt i64 %18, 0 // CHECK-NEXT: %20 = icmp uge i64 %18, %17 // CHECK-NEXT: %21 = or i1 %20, %19 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %21) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %21, {{.*}}) // CHECK-NEXT: %22 = getelementptr inbounds %"{{.*}}/cl/_testgo/cursor.event", ptr %16, i64 %18 // CHECK-NEXT: %23 = load %"{{.*}}/cl/_testgo/cursor.event", ptr %22, align 8 // CHECK-NEXT: store %"{{.*}}/cl/_testgo/cursor.event" %23, ptr %15, align 8 @@ -654,7 +654,7 @@ const ( // CHECK-NEXT: %39 = icmp slt i64 %38, 0 // CHECK-NEXT: %40 = icmp uge i64 %38, %37 // CHECK-NEXT: %41 = or i1 %40, %39 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %41) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %41, {{.*}}) // CHECK-NEXT: %42 = getelementptr inbounds %"{{.*}}/cl/_testgo/cursor.event", ptr %36, i64 %38 // CHECK-NEXT: %43 = getelementptr inbounds %"{{.*}}/cl/_testgo/cursor.event", ptr %42, i32 0, i32 1 // CHECK-NEXT: %44 = load i64, ptr %43, align 8 @@ -720,7 +720,7 @@ const ( // CHECK-NEXT: %23 = icmp slt i64 %22, 0 // CHECK-NEXT: %24 = icmp uge i64 %22, %21 // CHECK-NEXT: %25 = or i1 %24, %23 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %25) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %25, {{.*}}) // CHECK-NEXT: %26 = getelementptr inbounds %"{{.*}}/cl/_testgo/cursor.event", ptr %20, i64 %22 // CHECK-NEXT: %27 = getelementptr inbounds %"{{.*}}/cl/_testgo/cursor.event", ptr %26, i32 0, i32 2 // CHECK-NEXT: %28 = load i32, ptr %27, align 4 @@ -817,7 +817,7 @@ const ( // CHECK-NEXT: %10 = icmp slt i64 %6, 0 // CHECK-NEXT: %11 = icmp uge i64 %6, %9 // CHECK-NEXT: %12 = or i1 %11, %10 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %12) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %12, {{.*}}) // CHECK-NEXT: %13 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.iface", ptr %8, i64 %6 // CHECK-NEXT: %14 = load %"{{.*}}/runtime/internal/runtime.iface", ptr %13, align 8 // CHECK-NEXT: %15 = call i64 @"{{.*}}/cl/_testgo/cursor.typeOf"(%"{{.*}}/runtime/internal/runtime.iface" %14) diff --git a/cl/_testgo/equal/in.go b/cl/_testgo/equal/in.go index 3f3a970e7d..c4f08ee787 100644 --- a/cl/_testgo/equal/in.go +++ b/cl/_testgo/equal/in.go @@ -208,9 +208,9 @@ func init() { // CHECK-NEXT: %5 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %4, i64 3, 1 // CHECK-NEXT: %6 = insertvalue %"{{.*}}/runtime/internal/runtime.Slice" %5, i64 3, 2 // CHECK-NEXT: %7 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %8 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice3"(ptr %7, i64 8, i64 2, i64 0, i64 2, i64 2) +// CHECK-NEXT: %8 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) // CHECK-NEXT: %9 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 16) -// CHECK-NEXT: %10 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice3"(ptr %9, i64 8, i64 2, i64 0, i64 0, i64 2) +// CHECK-NEXT: %10 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) // CHECK-NEXT: call void @"{{.*}}/cl/_testgo/equal.assert"(i1 true) // CHECK-NEXT: %11 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %6, 0 // CHECK-NEXT: %12 = icmp ne ptr %11, null diff --git a/cl/_testgo/reader/in.go b/cl/_testgo/reader/in.go index 583895a8f0..79f39dc11b 100644 --- a/cl/_testgo/reader/in.go +++ b/cl/_testgo/reader/in.go @@ -202,7 +202,7 @@ func (c nopCloserWriterTo) WriteTo(w Writer) (n int64, err error) { // CHECK-LABEL: define { %"{{.*}}/runtime/internal/runtime.Slice", %"{{.*}}/runtime/internal/runtime.iface" } @"{{.*}}/cl/_testgo/reader.ReadAll"(%"{{.*}}/runtime/internal/runtime.iface" %0){{.*}} { // CHECK-NEXT: _llgo_0: // CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 512) -// CHECK-NEXT: %2 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice3"(ptr %1, i64 1, i64 512, i64 0, i64 0, i64 512) +// CHECK-NEXT: %2 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) // CHECK-NEXT: br label %_llgo_1 // CHECK-EMPTY: // CHECK-NEXT: _llgo_1: ; preds = %_llgo_6, %_llgo_3, %_llgo_0 @@ -211,7 +211,7 @@ func (c nopCloserWriterTo) WriteTo(w Writer) (n int64, err error) { // CHECK-NEXT: %5 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %3, 2 // CHECK-NEXT: %6 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %3, 2 // CHECK-NEXT: %7 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %3, 0 -// CHECK-NEXT: %8 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice3"(ptr %7, i64 1, i64 %6, i64 %4, i64 %5, i64 %6) +// CHECK-NEXT: %8 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) // CHECK-NEXT: %9 = call ptr @"{{.*}}/runtime/internal/runtime.IfacePtrData"(%"{{.*}}/runtime/internal/runtime.iface" %0) // CHECK-NEXT: %10 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %0, 0 // CHECK-NEXT: %11 = getelementptr ptr, ptr %10, i64 3 @@ -227,7 +227,7 @@ func (c nopCloserWriterTo) WriteTo(w Writer) (n int64, err error) { // CHECK-NEXT: %21 = add i64 %20, %18 // CHECK-NEXT: %22 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %3, 2 // CHECK-NEXT: %23 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %3, 0 -// CHECK-NEXT: %24 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice3"(ptr %23, i64 1, i64 %22, i64 0, i64 %21, i64 %22) +// CHECK-NEXT: %24 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) // CHECK-NEXT: %25 = call ptr @"{{.*}}/runtime/internal/runtime.IfaceType"(%"{{.*}}/runtime/internal/runtime.iface" %19) // CHECK-NEXT: %26 = extractvalue %"{{.*}}/runtime/internal/runtime.iface" %19, 1 // CHECK-NEXT: %27 = insertvalue %"{{.*}}/runtime/internal/runtime.eface" undef, ptr %25, 0 @@ -280,7 +280,7 @@ func (c nopCloserWriterTo) WriteTo(w Writer) (n int64, err error) { // CHECK-NEXT: %58 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %24, 1 // CHECK-NEXT: %59 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %57, 2 // CHECK-NEXT: %60 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %57, 0 -// CHECK-NEXT: %61 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice3"(ptr %60, i64 1, i64 %59, i64 0, i64 %58, i64 %59) +// CHECK-NEXT: %61 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) // CHECK-NEXT: br label %_llgo_1 // CHECK-NEXT: } @@ -774,7 +774,7 @@ func main() { // CHECK-NEXT: %13 = getelementptr inbounds %"{{.*}}/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 // CHECK-NEXT: %14 = load i64, ptr %13, align 8 // CHECK-NEXT: %15 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %12, 1 -// CHECK-NEXT: %16 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringSlice"(%"{{.*}}/runtime/internal/runtime.String" %12, i64 %14, i64 %15) +// CHECK-NEXT: %16 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringSlice2"({{.*}}) // CHECK-NEXT: %17 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %16, 0 // CHECK-NEXT: %18 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %16, 1 // CHECK-NEXT: %19 = call i64 @"{{.*}}/runtime/internal/runtime.SliceCopy"(%"{{.*}}/runtime/internal/runtime.Slice" %1, ptr %17, i64 %18, i64 1) @@ -814,7 +814,7 @@ func main() { // CHECK-NEXT: %12 = getelementptr inbounds %"{{.*}}/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 0 // CHECK-NEXT: %13 = load %"{{.*}}/runtime/internal/runtime.String", ptr %12, align 8 // CHECK-NEXT: %14 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %13, 1 -// CHECK-NEXT: %15 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringSlice"(%"{{.*}}/runtime/internal/runtime.String" %13, i64 %2, i64 %14) +// CHECK-NEXT: %15 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringSlice2"({{.*}}) // CHECK-NEXT: %16 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %15, 0 // CHECK-NEXT: %17 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %15, 1 // CHECK-NEXT: %18 = call i64 @"{{.*}}/runtime/internal/runtime.SliceCopy"(%"{{.*}}/runtime/internal/runtime.Slice" %1, ptr %16, i64 %17, i64 1) @@ -860,7 +860,7 @@ func main() { // CHECK-NEXT: %16 = icmp slt i64 %11, 0 // CHECK-NEXT: %17 = icmp uge i64 %11, %15 // CHECK-NEXT: %18 = or i1 %17, %16 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %18) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %18, {{.*}}) // CHECK-NEXT: %19 = getelementptr inbounds i8, ptr %14, i64 %11 // CHECK-NEXT: %20 = load i8, ptr %19, align 1 // CHECK-NEXT: %21 = getelementptr inbounds %"{{.*}}/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 @@ -904,7 +904,7 @@ func main() { // CHECK-NEXT: %19 = icmp slt i64 %14, 0 // CHECK-NEXT: %20 = icmp uge i64 %14, %18 // CHECK-NEXT: %21 = or i1 %20, %19 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %21) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %21, {{.*}}) // CHECK-NEXT: %22 = getelementptr inbounds i8, ptr %17, i64 %14 // CHECK-NEXT: %23 = load i8, ptr %22, align 1 // CHECK-NEXT: %24 = icmp ult i8 %23, -128 @@ -928,7 +928,7 @@ func main() { // CHECK-NEXT: %35 = getelementptr inbounds %"{{.*}}/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 // CHECK-NEXT: %36 = load i64, ptr %35, align 8 // CHECK-NEXT: %37 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %34, 1 -// CHECK-NEXT: %38 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringSlice"(%"{{.*}}/runtime/internal/runtime.String" %34, i64 %36, i64 %37) +// CHECK-NEXT: %38 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringSlice2"({{.*}}) // CHECK-NEXT: %39 = call { i32, i64 } @"unicode/utf8.DecodeRuneInString"(%"{{.*}}/runtime/internal/runtime.String" %38) // CHECK-NEXT: %40 = extractvalue { i32, i64 } %39, 0 // CHECK-NEXT: %41 = extractvalue { i32, i64 } %39, 1 @@ -1079,7 +1079,7 @@ func main() { // CHECK-NEXT: %11 = getelementptr inbounds %"{{.*}}/cl/_testgo/reader.stringReader", ptr %0, i32 0, i32 1 // CHECK-NEXT: %12 = load i64, ptr %11, align 8 // CHECK-NEXT: %13 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %10, 1 -// CHECK-NEXT: %14 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringSlice"(%"{{.*}}/runtime/internal/runtime.String" %10, i64 %12, i64 %13) +// CHECK-NEXT: %14 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringSlice2"({{.*}}) // CHECK-NEXT: %15 = call { i64, %"{{.*}}/runtime/internal/runtime.iface" } @"{{.*}}/cl/_testgo/reader.WriteString"(%"{{.*}}/runtime/internal/runtime.iface" %1, %"{{.*}}/runtime/internal/runtime.String" %14) // CHECK-NEXT: %16 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %15, 0 // CHECK-NEXT: %17 = extractvalue { i64, %"{{.*}}/runtime/internal/runtime.iface" } %15, 1 diff --git a/cl/_testgo/reflect/in.go b/cl/_testgo/reflect/in.go index eff7197ef8..485ba5a7ad 100644 --- a/cl/_testgo/reflect/in.go +++ b/cl/_testgo/reflect/in.go @@ -146,7 +146,7 @@ type T struct { // CHECK-NEXT: %27 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %26, 0 // CHECK-NEXT: %28 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %26, 1 // CHECK-NEXT: %29 = icmp uge i64 0, %28 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %29) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %29, {{.*}}) // CHECK-NEXT: %30 = getelementptr inbounds %reflect.Value, ptr %27, i64 0 // CHECK-NEXT: %31 = load %reflect.Value, ptr %30, align 8 // CHECK-NEXT: %32 = call i64 @reflect.Value.Int(%reflect.Value %31) @@ -236,7 +236,7 @@ type T struct { // CHECK-NEXT: %23 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %22, 0 // CHECK-NEXT: %24 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %22, 1 // CHECK-NEXT: %25 = icmp uge i64 0, %24 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %25) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %25, {{.*}}) // CHECK-NEXT: %26 = getelementptr inbounds %reflect.Value, ptr %23, i64 0 // CHECK-NEXT: %27 = load %reflect.Value, ptr %26, align 8 // CHECK-NEXT: %28 = call i64 @reflect.Value.Int(%reflect.Value %27) @@ -362,7 +362,7 @@ func callMethod() { // CHECK-NEXT: %31 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %30, 0 // CHECK-NEXT: %32 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %30, 1 // CHECK-NEXT: %33 = icmp uge i64 0, %32 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %33) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %33, {{.*}}) // CHECK-NEXT: %34 = getelementptr inbounds %reflect.Value, ptr %31, i64 0 // CHECK-NEXT: %35 = load %reflect.Value, ptr %34, align 8 // CHECK-NEXT: %36 = call i64 @reflect.Value.Int(%reflect.Value %35) @@ -400,7 +400,7 @@ func callMethod() { // CHECK-NEXT: %56 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %55, 0 // CHECK-NEXT: %57 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %55, 1 // CHECK-NEXT: %58 = icmp uge i64 0, %57 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %58) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %58, {{.*}}) // CHECK-NEXT: %59 = getelementptr inbounds %reflect.Value, ptr %56, i64 0 // CHECK-NEXT: %60 = load %reflect.Value, ptr %59, align 8 // CHECK-NEXT: %61 = call i64 @reflect.Value.Int(%reflect.Value %60) @@ -464,7 +464,7 @@ func callMethod() { // CHECK-NEXT: %25 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %24, 0 // CHECK-NEXT: %26 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %24, 1 // CHECK-NEXT: %27 = icmp uge i64 0, %26 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %27) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %27, {{.*}}) // CHECK-NEXT: %28 = getelementptr inbounds %reflect.Value, ptr %25, i64 0 // CHECK-NEXT: %29 = load %reflect.Value, ptr %28, align 8 // CHECK-NEXT: %30 = call i64 @reflect.Value.Int(%reflect.Value %29) @@ -502,7 +502,7 @@ func callMethod() { // CHECK-NEXT: %50 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %49, 0 // CHECK-NEXT: %51 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %49, 1 // CHECK-NEXT: %52 = icmp uge i64 0, %51 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %52) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %52, {{.*}}) // CHECK-NEXT: %53 = getelementptr inbounds %reflect.Value, ptr %50, i64 0 // CHECK-NEXT: %54 = load %reflect.Value, ptr %53, align 8 // CHECK-NEXT: %55 = call i64 @reflect.Value.Int(%reflect.Value %54) @@ -581,14 +581,14 @@ func callMethod() { // CHECK-NEXT: %32 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %31, 0 // CHECK-NEXT: %33 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %31, 1 // CHECK-NEXT: %34 = icmp uge i64 0, %33 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %34) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %34, {{.*}}) // CHECK-NEXT: %35 = getelementptr inbounds %reflect.Value, ptr %32, i64 0 // CHECK-NEXT: %36 = load %reflect.Value, ptr %35, align 8 // CHECK-NEXT: %37 = call i64 @reflect.Value.Int(%reflect.Value %36) // CHECK-NEXT: %38 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %31, 0 // CHECK-NEXT: %39 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %31, 1 // CHECK-NEXT: %40 = icmp uge i64 1, %39 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %40) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %40, {{.*}}) // CHECK-NEXT: %41 = getelementptr inbounds %reflect.Value, ptr %38, i64 1 // CHECK-NEXT: %42 = load %reflect.Value, ptr %41, align 8 // CHECK-NEXT: %43 = call i64 @reflect.Value.Int(%reflect.Value %42) @@ -649,14 +649,14 @@ func callMethod() { // CHECK-NEXT: %75 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %74, 0 // CHECK-NEXT: %76 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %74, 1 // CHECK-NEXT: %77 = icmp uge i64 0, %76 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %77) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %77, {{.*}}) // CHECK-NEXT: %78 = getelementptr inbounds %reflect.Value, ptr %75, i64 0 // CHECK-NEXT: %79 = load %reflect.Value, ptr %78, align 8 // CHECK-NEXT: %80 = call i64 @reflect.Value.Int(%reflect.Value %79) // CHECK-NEXT: %81 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %74, 0 // CHECK-NEXT: %82 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %74, 1 // CHECK-NEXT: %83 = icmp uge i64 1, %82 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %83) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %83, {{.*}}) // CHECK-NEXT: %84 = getelementptr inbounds %reflect.Value, ptr %81, i64 1 // CHECK-NEXT: %85 = load %reflect.Value, ptr %84, align 8 // CHECK-NEXT: %86 = call i64 @reflect.Value.Int(%reflect.Value %85) @@ -687,7 +687,7 @@ func callMethod() { // CHECK-NEXT: %17 = icmp slt i64 %13, 0 // CHECK-NEXT: %18 = icmp uge i64 %13, %16 // CHECK-NEXT: %19 = or i1 %18, %17 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %19) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %19, {{.*}}) // CHECK-NEXT: %20 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.eface", ptr %15, i64 %13 // CHECK-NEXT: %21 = load %"{{.*}}/runtime/internal/runtime.eface", ptr %20, align 8 // CHECK-NEXT: %22 = extractvalue %"{{.*}}/runtime/internal/runtime.eface" %21, 0 diff --git a/cl/_testgo/reflectmk/in.go b/cl/_testgo/reflectmk/in.go index 7cf9212c0d..733b804bf5 100644 --- a/cl/_testgo/reflectmk/in.go +++ b/cl/_testgo/reflectmk/in.go @@ -500,7 +500,7 @@ func methodByName(name string) { // CHECK-NEXT: %257 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %256, 0 // CHECK-NEXT: %258 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %256, 1 // CHECK-NEXT: %259 = icmp uge i64 0, %258 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %259) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %259, {{.*}}) // CHECK-NEXT: %260 = getelementptr inbounds %reflect.Value, ptr %257, i64 0 // CHECK-NEXT: %261 = load %reflect.Value, ptr %260, align 8 // CHECK-NEXT: %262 = call %"{{.*}}/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %261) @@ -528,7 +528,7 @@ func methodByName(name string) { // CHECK-NEXT: %273 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %272, 0 // CHECK-NEXT: %274 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %272, 1 // CHECK-NEXT: %275 = icmp uge i64 0, %274 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %275) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %275, {{.*}}) // CHECK-NEXT: %276 = getelementptr inbounds %reflect.Value, ptr %273, i64 0 // CHECK-NEXT: %277 = load %reflect.Value, ptr %276, align 8 // CHECK-NEXT: %278 = call %"{{.*}}/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %277) @@ -563,7 +563,7 @@ func methodByName(name string) { // CHECK-NEXT: %8 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 0 // CHECK-NEXT: %9 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 1 // CHECK-NEXT: %10 = icmp uge i64 0, %9 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %10) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %10, {{.*}}) // CHECK-NEXT: %11 = getelementptr inbounds %reflect.Value, ptr %8, i64 0 // CHECK-NEXT: %12 = load %reflect.Value, ptr %11, align 8 // CHECK-NEXT: %13 = call %"{{.*}}/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %12) @@ -596,7 +596,7 @@ func methodByName(name string) { // CHECK-NEXT: %8 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 0 // CHECK-NEXT: %9 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 1 // CHECK-NEXT: %10 = icmp uge i64 0, %9 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %10) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %10, {{.*}}) // CHECK-NEXT: %11 = getelementptr inbounds %reflect.Value, ptr %8, i64 0 // CHECK-NEXT: %12 = load %reflect.Value, ptr %11, align 8 // CHECK-NEXT: %13 = call %"{{.*}}/runtime/internal/runtime.String" @reflect.Value.String(%reflect.Value %12) diff --git a/cl/_testgo/tpindex/in.go b/cl/_testgo/tpindex/in.go index dbf1873629..0c23021c4c 100644 --- a/cl/_testgo/tpindex/in.go +++ b/cl/_testgo/tpindex/in.go @@ -38,7 +38,7 @@ func main() { // CHECK-NEXT: %8 = icmp slt i64 %4, 0 // CHECK-NEXT: %9 = icmp uge i64 %4, %7 // CHECK-NEXT: %10 = or i1 %9, %8 -// CHECK-NEXT: call void @"{{.*}}AssertIndexRange"(i1 %10) +// CHECK-NEXT: call void @"{{.*}}CheckIndexRange"(i1 %10, {{.*}}) // CHECK-NEXT: %11 = getelementptr inbounds i64, ptr %6, i64 %4 // CHECK-NEXT: %12 = load i64, ptr %11, align 8 // CHECK-NEXT: %13 = icmp eq i64 %1, %12 diff --git a/cl/_testgo/tprecur/in.go b/cl/_testgo/tprecur/in.go index 04ea2ae57c..86204f6351 100644 --- a/cl/_testgo/tprecur/in.go +++ b/cl/_testgo/tprecur/in.go @@ -112,7 +112,7 @@ func recur2[T Integer](n T) T { // CHECK-NEXT: %9 = icmp slt i64 %4, 0 // CHECK-NEXT: %10 = icmp uge i64 %4, %8 // CHECK-NEXT: %11 = or i1 %10, %9 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %11) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %11, {{.*}}) // CHECK-NEXT: %12 = getelementptr inbounds i64, ptr %7, i64 %4 // CHECK-NEXT: store i64 %6, ptr %12, align 8 // CHECK-NEXT: br label %_llgo_1 @@ -134,7 +134,7 @@ func recur2[T Integer](n T) T { // CHECK-NEXT: %20 = icmp slt i64 %16, 0 // CHECK-NEXT: %21 = icmp uge i64 %16, %19 // CHECK-NEXT: %22 = or i1 %21, %20 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %22) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %22, {{.*}}) // CHECK-NEXT: %23 = getelementptr inbounds i64, ptr %18, i64 %16 // CHECK-NEXT: %24 = load i64, ptr %23, align 8 // CHECK-NEXT: %25 = add i64 %14, %24 diff --git a/cl/_testgo/tptypes/in.go b/cl/_testgo/tptypes/in.go index 216da440f1..bea50799bf 100644 --- a/cl/_testgo/tptypes/in.go +++ b/cl/_testgo/tptypes/in.go @@ -139,7 +139,7 @@ type ( // CHECK-NEXT: %53 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %52, 0 // CHECK-NEXT: %54 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %52, 1 // CHECK-NEXT: %55 = icmp uge i64 0, %54 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %55) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %55, {{.*}}) // CHECK-NEXT: %56 = getelementptr inbounds i64, ptr %53, i64 0 // CHECK-NEXT: %57 = load i64, ptr %56, align 8 // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintSlice"(%"{{.*}}/runtime/internal/runtime.Slice" %50) @@ -153,7 +153,7 @@ type ( // CHECK-NEXT: %62 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %61, 0 // CHECK-NEXT: %63 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %61, 1 // CHECK-NEXT: %64 = icmp uge i64 0, %63 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %64) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %64, {{.*}}) // CHECK-NEXT: %65 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %62, i64 0 // CHECK-NEXT: %66 = load %"{{.*}}/runtime/internal/runtime.String", ptr %65, align 8 // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintSlice"(%"{{.*}}/runtime/internal/runtime.Slice" %59) @@ -167,7 +167,7 @@ type ( // CHECK-NEXT: %71 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %70, 0 // CHECK-NEXT: %72 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %70, 1 // CHECK-NEXT: %73 = icmp uge i64 0, %72 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %73) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %73, {{.*}}) // CHECK-NEXT: %74 = getelementptr inbounds i64, ptr %71, i64 0 // CHECK-NEXT: %75 = load i64, ptr %74, align 8 // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintSlice"(%"{{.*}}/runtime/internal/runtime.Slice" %68) diff --git a/cl/_testlibc/allocacstrs/in.go b/cl/_testlibc/allocacstrs/in.go index 93c77a71c1..8a03d43066 100644 --- a/cl/_testlibc/allocacstrs/in.go +++ b/cl/_testlibc/allocacstrs/in.go @@ -47,7 +47,7 @@ func main() { // CHECK-NEXT: %20 = icmp slt i64 %16, 0 // CHECK-NEXT: %21 = icmp uge i64 %16, %19 // CHECK-NEXT: %22 = or i1 %21, %20 - // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %22) + // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %22, {{.*}}) // CHECK-NEXT: %23 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %18, i64 %16 // CHECK-NEXT: %24 = load %"{{.*}}/runtime/internal/runtime.String", ptr %23, align 8 // CHECK-NEXT: %25 = getelementptr ptr, ptr %9, i64 %16 diff --git a/cl/_testrt/abinamed/in.go b/cl/_testrt/abinamed/in.go index c173a0a083..65ef375e70 100644 --- a/cl/_testrt/abinamed/in.go +++ b/cl/_testrt/abinamed/in.go @@ -47,7 +47,7 @@ import ( // CHECK-NEXT: %24 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %23, 0 // CHECK-NEXT: %25 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %23, 1 // CHECK-NEXT: %26 = icmp uge i64 0, %25 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %26) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %26, {{.*}}) // CHECK-NEXT: %27 = getelementptr inbounds %"{{.*}}/runtime/abi.StructField", ptr %24, i64 0 // CHECK-NEXT: %28 = load %"{{.*}}/runtime/abi.StructField", ptr %27, align 8 // CHECK-NEXT: store %"{{.*}}/runtime/abi.StructField" %28, ptr %18, align 8 @@ -94,7 +94,7 @@ import ( // CHECK-NEXT: %52 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %51, 0 // CHECK-NEXT: %53 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %51, 1 // CHECK-NEXT: %54 = icmp uge i64 1, %53 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %54) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %54, {{.*}}) // CHECK-NEXT: %55 = getelementptr inbounds %"{{.*}}/runtime/abi.StructField", ptr %52, i64 1 // CHECK-NEXT: %56 = load %"{{.*}}/runtime/abi.StructField", ptr %55, align 8 // CHECK-NEXT: store %"{{.*}}/runtime/abi.StructField" %56, ptr %46, align 8 @@ -141,7 +141,7 @@ import ( // CHECK-NEXT: %80 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %79, 0 // CHECK-NEXT: %81 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %79, 1 // CHECK-NEXT: %82 = icmp uge i64 2, %81 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %82) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %82, {{.*}}) // CHECK-NEXT: %83 = getelementptr inbounds %"{{.*}}/runtime/abi.StructField", ptr %80, i64 2 // CHECK-NEXT: %84 = load %"{{.*}}/runtime/abi.StructField", ptr %83, align 8 // CHECK-NEXT: store %"{{.*}}/runtime/abi.StructField" %84, ptr %74, align 8 @@ -155,7 +155,7 @@ import ( // CHECK-NEXT: %92 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %91, 0 // CHECK-NEXT: %93 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %91, 1 // CHECK-NEXT: %94 = icmp uge i64 0, %93 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %94) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %94, {{.*}}) // CHECK-NEXT: %95 = getelementptr inbounds %"{{.*}}/runtime/abi.StructField", ptr %92, i64 0 // CHECK-NEXT: %96 = getelementptr inbounds %"{{.*}}/runtime/abi.StructField", ptr %95, i32 0, i32 1 // CHECK-NEXT: %97 = load ptr, ptr %96, align 8 @@ -180,7 +180,7 @@ import ( // CHECK-NEXT: %107 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %106, 0 // CHECK-NEXT: %108 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %106, 1 // CHECK-NEXT: %109 = icmp uge i64 3, %108 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %109) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %109, {{.*}}) // CHECK-NEXT: %110 = getelementptr inbounds %"{{.*}}/runtime/abi.StructField", ptr %107, i64 3 // CHECK-NEXT: %111 = load %"{{.*}}/runtime/abi.StructField", ptr %110, align 8 // CHECK-NEXT: store %"{{.*}}/runtime/abi.StructField" %111, ptr %101, align 8 diff --git a/cl/_testrt/builtin/in.go b/cl/_testrt/builtin/in.go index a0afd8f419..5c7d563bad 100644 --- a/cl/_testrt/builtin/in.go +++ b/cl/_testrt/builtin/in.go @@ -118,7 +118,7 @@ func demo() { // CHECK-NEXT: store i64 3, ptr %11, align 8 // CHECK-NEXT: store i64 4, ptr %12, align 8 // CHECK-NEXT: %13 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 10) -// CHECK-NEXT: %14 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice3"(ptr %13, i64 1, i64 10, i64 0, i64 4, i64 10) +// CHECK-NEXT: %14 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) // CHECK-NEXT: %15 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 1 // CHECK-NEXT: %16 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 2 // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintSlice"(%"{{.*}}/runtime/internal/runtime.Slice" %7) @@ -163,28 +163,28 @@ func demo() { // CHECK-NEXT: %28 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 2 // CHECK-NEXT: %29 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 1 // CHECK-NEXT: %30 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 0 -// CHECK-NEXT: %31 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice3"(ptr %30, i64 8, i64 %28, i64 1, i64 %29, i64 %28) +// CHECK-NEXT: %31 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) // CHECK-NEXT: %32 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %31, 1 // CHECK-NEXT: %33 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 2 // CHECK-NEXT: %34 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 1 // CHECK-NEXT: %35 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 0 -// CHECK-NEXT: %36 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice3"(ptr %35, i64 8, i64 %33, i64 1, i64 %34, i64 %33) +// CHECK-NEXT: %36 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) // CHECK-NEXT: %37 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %36, 2 // CHECK-NEXT: %38 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 2 // CHECK-NEXT: %39 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 0 -// CHECK-NEXT: %40 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice3"(ptr %39, i64 8, i64 %38, i64 1, i64 2, i64 %38) +// CHECK-NEXT: %40 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) // CHECK-NEXT: %41 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %40, 1 // CHECK-NEXT: %42 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 2 // CHECK-NEXT: %43 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 0 -// CHECK-NEXT: %44 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice3"(ptr %43, i64 8, i64 %42, i64 1, i64 2, i64 %42) +// CHECK-NEXT: %44 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) // CHECK-NEXT: %45 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %44, 2 // CHECK-NEXT: %46 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 2 // CHECK-NEXT: %47 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 0 -// CHECK-NEXT: %48 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice3"(ptr %47, i64 8, i64 %46, i64 1, i64 2, i64 2) +// CHECK-NEXT: %48 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) // CHECK-NEXT: %49 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %48, 1 // CHECK-NEXT: %50 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 2 // CHECK-NEXT: %51 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %7, 0 -// CHECK-NEXT: %52 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice3"(ptr %51, i64 8, i64 %50, i64 1, i64 2, i64 2) +// CHECK-NEXT: %52 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) // CHECK-NEXT: %53 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %52, 2 // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %32) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) @@ -198,17 +198,17 @@ func demo() { // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %53) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %54 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 4, i64 4) +// CHECK-NEXT: %54 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) // CHECK-NEXT: %55 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %54, 1 -// CHECK-NEXT: %56 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 4, i64 4) +// CHECK-NEXT: %56 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) // CHECK-NEXT: %57 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %56, 2 -// CHECK-NEXT: %58 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 2, i64 4) +// CHECK-NEXT: %58 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) // CHECK-NEXT: %59 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %58, 1 -// CHECK-NEXT: %60 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 2, i64 4) +// CHECK-NEXT: %60 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) // CHECK-NEXT: %61 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %60, 2 -// CHECK-NEXT: %62 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 2, i64 2) +// CHECK-NEXT: %62 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) // CHECK-NEXT: %63 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %62, 1 -// CHECK-NEXT: %64 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 2, i64 2) +// CHECK-NEXT: %64 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) // CHECK-NEXT: %65 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %64, 2 // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %55) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) @@ -222,9 +222,9 @@ func demo() { // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %65) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %66 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringSlice"(%"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, i64 1, i64 5) -// CHECK-NEXT: %67 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringSlice"(%"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, i64 1, i64 2) -// CHECK-NEXT: %68 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringSlice"(%"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }, i64 5, i64 5) +// CHECK-NEXT: %66 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringSlice2"({{.*}}) +// CHECK-NEXT: %67 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringSlice2"({{.*}}) +// CHECK-NEXT: %68 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringSlice2"({{.*}}) // CHECK-NEXT: %69 = extractvalue %"{{.*}}/runtime/internal/runtime.String" %68, 1 // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintString"(%"{{.*}}/runtime/internal/runtime.String" { ptr @0, i64 5 }) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 32) @@ -331,7 +331,7 @@ func demo() { // CHECK-NEXT: %119 = zext i8 %116 to i64 // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintUint"(i64 %119) // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintByte"(i8 10) -// CHECK-NEXT: %120 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice3"(ptr %102, i64 1, i64 3, i64 1, i64 3, i64 3) +// CHECK-NEXT: %120 = call %"{{.*}}/runtime/internal/runtime.Slice" @"{{.*}}/runtime/internal/runtime.NewSlice{{.*}}"({{.*}}) // CHECK-NEXT: %121 = call i64 @"{{.*}}/runtime/internal/runtime.SliceCopy"(%"{{.*}}/runtime/internal/runtime.Slice" %120, ptr @3, i64 4, i64 1) // CHECK-NEXT: store i64 %121, ptr %103, align 8 // CHECK-NEXT: %122 = load i64, ptr %103, align 8 @@ -411,7 +411,7 @@ func demo() { // CHECK-NEXT: %152 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %148, 0 // CHECK-NEXT: %153 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %148, 1 // CHECK-NEXT: %154 = icmp uge i64 3, %153 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %154) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %154, {{.*}}) // CHECK-NEXT: %155 = getelementptr inbounds i8, ptr %152, i64 3 // CHECK-NEXT: %156 = load i8, ptr %155, align 1 // CHECK-NEXT: %157 = zext i8 %156 to i64 @@ -419,7 +419,7 @@ func demo() { // CHECK-NEXT: %159 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %149, 0 // CHECK-NEXT: %160 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %149, 1 // CHECK-NEXT: %161 = icmp uge i64 0, %160 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %161) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %161, {{.*}}) // CHECK-NEXT: %162 = getelementptr inbounds i32, ptr %159, i64 0 // CHECK-NEXT: %163 = load i32, ptr %162, align 4 // CHECK-NEXT: %164 = sext i32 %163 to i64 diff --git a/cl/_testrt/concat/in.go b/cl/_testrt/concat/in.go index fee2efa72b..6aa48b6ecd 100644 --- a/cl/_testrt/concat/in.go +++ b/cl/_testrt/concat/in.go @@ -19,7 +19,7 @@ package main // CHECK-NEXT: %8 = icmp slt i64 %4, 0 // CHECK-NEXT: %9 = icmp uge i64 %4, %7 // CHECK-NEXT: %10 = or i1 %9, %8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %10) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %10, {{.*}}) // CHECK-NEXT: %11 = getelementptr inbounds %"{{.*}}/runtime/internal/runtime.String", ptr %6, i64 %4 // CHECK-NEXT: %12 = load %"{{.*}}/runtime/internal/runtime.String", ptr %11, align 8 // CHECK-NEXT: %13 = call %"{{.*}}/runtime/internal/runtime.String" @"{{.*}}/runtime/internal/runtime.StringCat"(%"{{.*}}/runtime/internal/runtime.String" %2, %"{{.*}}/runtime/internal/runtime.String" %12) diff --git a/cl/_testrt/gblarray/in.go b/cl/_testrt/gblarray/in.go index 5d39f82588..e66cb80ce6 100644 --- a/cl/_testrt/gblarray/in.go +++ b/cl/_testrt/gblarray/in.go @@ -9,7 +9,7 @@ import ( // CHECK-LABEL: define ptr @"{{.*}}/cl/_testrt/gblarray.Basic"(i64 %0){{.*}} { // CHECK-NEXT: _llgo_0: // CHECK-NEXT: %1 = icmp uge i64 %0, 25 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %1) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %1, {{.*}}) // CHECK-NEXT: %2 = getelementptr inbounds ptr, ptr @"{{.*}}/cl/_testrt/gblarray.basicTypes", i64 %0 // CHECK-NEXT: %3 = load ptr, ptr %2, align 8 // CHECK-NEXT: ret ptr %3 @@ -23,7 +23,7 @@ func Basic(kind abi.Kind) *abi.Type { // CHECK-NEXT: %1 = call ptr @"{{.*}}/runtime/internal/runtime.AllocZ"(i64 72) // CHECK-NEXT: %2 = getelementptr inbounds %"{{.*}}/runtime/abi.Type", ptr %1, i32 0, i32 0 // CHECK-NEXT: %3 = icmp uge i64 %0, 25 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %3) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %3, {{.*}}) // CHECK-NEXT: %4 = getelementptr inbounds i64, ptr @"{{.*}}/cl/_testrt/gblarray.sizeBasicTypes", i64 %0 // CHECK-NEXT: %5 = load i64, ptr %4, align 8 // CHECK-NEXT: %6 = getelementptr inbounds %"{{.*}}/runtime/abi.Type", ptr %1, i32 0, i32 2 diff --git a/cl/_testrt/index/in.go b/cl/_testrt/index/in.go index a240fd0104..c1712e1e7d 100644 --- a/cl/_testrt/index/in.go +++ b/cl/_testrt/index/in.go @@ -123,7 +123,7 @@ type S []int // CHECK-NEXT: %61 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %60, 0 // CHECK-NEXT: %62 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %60, 1 // CHECK-NEXT: %63 = icmp uge i64 1, %62 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %63) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %63, {{.*}}) // CHECK-NEXT: %64 = getelementptr inbounds i64, ptr %61, i64 1 // CHECK-NEXT: %65 = load i64, ptr %64, align 8 // CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.PrintInt"(i64 %65) diff --git a/cl/_testrt/intgen/in.go b/cl/_testrt/intgen/in.go index 199e9a3f14..da4789c7af 100644 --- a/cl/_testrt/intgen/in.go +++ b/cl/_testrt/intgen/in.go @@ -26,7 +26,7 @@ import ( // CHECK-NEXT: %12 = icmp slt i64 %5, 0 // CHECK-NEXT: %13 = icmp uge i64 %5, %11 // CHECK-NEXT: %14 = or i1 %13, %12 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %14) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %14, {{.*}}) // CHECK-NEXT: %15 = getelementptr inbounds i32, ptr %10, i64 %5 // CHECK-NEXT: store i32 %9, ptr %15, align 4 // CHECK-NEXT: br label %_llgo_1 @@ -80,7 +80,7 @@ type generator struct { // CHECK-NEXT: %7 = icmp slt i64 %3, 0 // CHECK-NEXT: %8 = icmp uge i64 %3, %6 // CHECK-NEXT: %9 = or i1 %8, %7 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %9) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %9, {{.*}}) // CHECK-NEXT: %10 = getelementptr inbounds i32, ptr %5, i64 %3 // CHECK-NEXT: %11 = load i32, ptr %10, align 4 // CHECK-NEXT: %12 = call i32 (ptr, ...) @printf(ptr @0, i32 %11) @@ -109,7 +109,7 @@ type generator struct { // CHECK-NEXT: %24 = icmp slt i64 %20, 0 // CHECK-NEXT: %25 = icmp uge i64 %20, %23 // CHECK-NEXT: %26 = or i1 %25, %24 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %26) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %26, {{.*}}) // CHECK-NEXT: %27 = getelementptr inbounds i32, ptr %22, i64 %20 // CHECK-NEXT: %28 = load i32, ptr %27, align 4 // CHECK-NEXT: %29 = call i32 (ptr, ...) @printf(ptr @1, i32 %28) @@ -139,7 +139,7 @@ type generator struct { // CHECK-NEXT: %42 = icmp slt i64 %38, 0 // CHECK-NEXT: %43 = icmp uge i64 %38, %41 // CHECK-NEXT: %44 = or i1 %43, %42 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %44) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %44, {{.*}}) // CHECK-NEXT: %45 = getelementptr inbounds i32, ptr %40, i64 %38 // CHECK-NEXT: %46 = load i32, ptr %45, align 4 // CHECK-NEXT: %47 = call i32 (ptr, ...) @printf(ptr @2, i32 %46) diff --git a/cl/_testrt/mapclosure/in.go b/cl/_testrt/mapclosure/in.go index c1ee0354ee..2afe33499e 100644 --- a/cl/_testrt/mapclosure/in.go +++ b/cl/_testrt/mapclosure/in.go @@ -47,7 +47,7 @@ var ( // CHECK-NEXT: %7 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %6, 0 // CHECK-NEXT: %8 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %6, 1 // CHECK-NEXT: %9 = icmp uge i64 0, %8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %9) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %9, {{.*}}) // CHECK-NEXT: %10 = getelementptr inbounds { ptr, ptr }, ptr %7, i64 0 // CHECK-NEXT: %11 = load { ptr, ptr }, ptr %10, align 8 // CHECK-NEXT: %12 = call ptr @"{{.*}}/runtime/internal/runtime.NewItab"(ptr @"_llgo_iface$O6rEVxIuA5O1E0KWpQBCgGx26X5gYhJ_nnJnHVL8_7U", ptr @"*_llgo_github.com/goplus/llgo/cl/_testrt/mapclosure.typ") diff --git a/cl/_testrt/qsort/in.go b/cl/_testrt/qsort/in.go index 31ad5eba55..83a59112cf 100644 --- a/cl/_testrt/qsort/in.go +++ b/cl/_testrt/qsort/in.go @@ -38,7 +38,7 @@ func qsort(base c.Pointer, count, elem uintptr, compar func(a, b c.Pointer) c.In // CHECK-NEXT: %11 = icmp slt i64 %9, 0 // CHECK-NEXT: %12 = icmp uge i64 %9, 5 // CHECK-NEXT: %13 = or i1 %12, %11 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %13) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %13, {{.*}}) // CHECK-NEXT: %14 = getelementptr inbounds i64, ptr %0, i64 %9 // CHECK-NEXT: %15 = load i64, ptr %14, align 8 // CHECK-NEXT: %16 = call i32 (ptr, ...) @printf(ptr @0, i64 %15) diff --git a/cl/_testrt/qsortfn/in.go b/cl/_testrt/qsortfn/in.go index 4b5429b248..1563331cd8 100644 --- a/cl/_testrt/qsortfn/in.go +++ b/cl/_testrt/qsortfn/in.go @@ -64,7 +64,7 @@ func main() { // CHECK-NEXT: %12 = icmp slt i64 %10, 0 // CHECK-NEXT: %13 = icmp uge i64 %10, 5 // CHECK-NEXT: %14 = or i1 %13, %12 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %14) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %14, {{.*}}) // CHECK-NEXT: %15 = getelementptr inbounds i64, ptr %1, i64 %10 // CHECK-NEXT: %16 = load i64, ptr %15, align 8 // CHECK-NEXT: %17 = call i32 (ptr, ...) @printf(ptr @1, i64 %16) @@ -122,7 +122,7 @@ func sort1a() { // CHECK-NEXT: %12 = icmp slt i64 %10, 0 // CHECK-NEXT: %13 = icmp uge i64 %10, 5 // CHECK-NEXT: %14 = or i1 %13, %12 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %14) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %14, {{.*}}) // CHECK-NEXT: %15 = getelementptr inbounds i64, ptr %1, i64 %10 // CHECK-NEXT: %16 = load i64, ptr %15, align 8 // CHECK-NEXT: %17 = call i32 (ptr, ...) @printf(ptr @3, i64 %16) @@ -180,7 +180,7 @@ func sort1b() { // CHECK-NEXT: %12 = icmp slt i64 %10, 0 // CHECK-NEXT: %13 = icmp uge i64 %10, 5 // CHECK-NEXT: %14 = or i1 %13, %12 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %14) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %14, {{.*}}) // CHECK-NEXT: %15 = getelementptr inbounds i64, ptr %1, i64 %10 // CHECK-NEXT: %16 = load i64, ptr %15, align 8 // CHECK-NEXT: %17 = call i32 (ptr, ...) @printf(ptr @5, i64 %16) @@ -238,7 +238,7 @@ func sort2a() { // CHECK-NEXT: %12 = icmp slt i64 %10, 0 // CHECK-NEXT: %13 = icmp uge i64 %10, 5 // CHECK-NEXT: %14 = or i1 %13, %12 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %14) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %14, {{.*}}) // CHECK-NEXT: %15 = getelementptr inbounds i64, ptr %1, i64 %10 // CHECK-NEXT: %16 = load i64, ptr %15, align 8 // CHECK-NEXT: %17 = call i32 (ptr, ...) @printf(ptr @7, i64 %16) @@ -296,7 +296,7 @@ func sort2b() { // CHECK-NEXT: %12 = icmp slt i64 %10, 0 // CHECK-NEXT: %13 = icmp uge i64 %10, 5 // CHECK-NEXT: %14 = or i1 %13, %12 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %14) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %14, {{.*}}) // CHECK-NEXT: %15 = getelementptr inbounds i64, ptr %1, i64 %10 // CHECK-NEXT: %16 = load i64, ptr %15, align 8 // CHECK-NEXT: %17 = call i32 (ptr, ...) @printf(ptr @9, i64 %16) @@ -354,7 +354,7 @@ func sort3a() { // CHECK-NEXT: %12 = icmp slt i64 %10, 0 // CHECK-NEXT: %13 = icmp uge i64 %10, 5 // CHECK-NEXT: %14 = or i1 %13, %12 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %14) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %14, {{.*}}) // CHECK-NEXT: %15 = getelementptr inbounds i64, ptr %1, i64 %10 // CHECK-NEXT: %16 = load i64, ptr %15, align 8 // CHECK-NEXT: %17 = call i32 (ptr, ...) @printf(ptr @11, i64 %16) @@ -412,7 +412,7 @@ func sort3b() { // CHECK-NEXT: %12 = icmp slt i64 %10, 0 // CHECK-NEXT: %13 = icmp uge i64 %10, 5 // CHECK-NEXT: %14 = or i1 %13, %12 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %14) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %14, {{.*}}) // CHECK-NEXT: %15 = getelementptr inbounds i64, ptr %1, i64 %10 // CHECK-NEXT: %16 = load i64, ptr %15, align 8 // CHECK-NEXT: %17 = call i32 (ptr, ...) @printf(ptr @13, i64 %16) @@ -470,7 +470,7 @@ func sort4a() { // CHECK-NEXT: %12 = icmp slt i64 %10, 0 // CHECK-NEXT: %13 = icmp uge i64 %10, 5 // CHECK-NEXT: %14 = or i1 %13, %12 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %14) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %14, {{.*}}) // CHECK-NEXT: %15 = getelementptr inbounds i64, ptr %1, i64 %10 // CHECK-NEXT: %16 = load i64, ptr %15, align 8 // CHECK-NEXT: %17 = call i32 (ptr, ...) @printf(ptr @15, i64 %16) @@ -528,7 +528,7 @@ func sort4b() { // CHECK-NEXT: %12 = icmp slt i64 %10, 0 // CHECK-NEXT: %13 = icmp uge i64 %10, 5 // CHECK-NEXT: %14 = or i1 %13, %12 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %14) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %14, {{.*}}) // CHECK-NEXT: %15 = getelementptr inbounds i64, ptr %1, i64 %10 // CHECK-NEXT: %16 = load i64, ptr %15, align 8 // CHECK-NEXT: %17 = call i32 (ptr, ...) @printf(ptr @17, i64 %16) @@ -586,7 +586,7 @@ func sort5a() { // CHECK-NEXT: %12 = icmp slt i64 %10, 0 // CHECK-NEXT: %13 = icmp uge i64 %10, 5 // CHECK-NEXT: %14 = or i1 %13, %12 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %14) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %14, {{.*}}) // CHECK-NEXT: %15 = getelementptr inbounds i64, ptr %1, i64 %10 // CHECK-NEXT: %16 = load i64, ptr %15, align 8 // CHECK-NEXT: %17 = call i32 (ptr, ...) @printf(ptr @19, i64 %16) diff --git a/cl/_testrt/sum/in.go b/cl/_testrt/sum/in.go index 61000e17e9..8b89cc1313 100644 --- a/cl/_testrt/sum/in.go +++ b/cl/_testrt/sum/in.go @@ -45,7 +45,7 @@ func main() { // CHECK-NEXT: %8 = icmp slt i64 %4, 0 // CHECK-NEXT: %9 = icmp uge i64 %4, %7 // CHECK-NEXT: %10 = or i1 %9, %8 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %10) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %10, {{.*}}) // CHECK-NEXT: %11 = getelementptr inbounds i64, ptr %6, i64 %4 // CHECK-NEXT: %12 = load i64, ptr %11, align 8 // CHECK-NEXT: %13 = add i64 %2, %12 diff --git a/cl/_testrt/unsafe/in.go b/cl/_testrt/unsafe/in.go index 939574b06d..2154d8f359 100644 --- a/cl/_testrt/unsafe/in.go +++ b/cl/_testrt/unsafe/in.go @@ -158,7 +158,7 @@ type N struct { // CHECK-NEXT: %35 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %34, 0 // CHECK-NEXT: %36 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %34, 1 // CHECK-NEXT: %37 = icmp uge i64 0, %36 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %37) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %37, {{.*}}) // CHECK-NEXT: %38 = getelementptr inbounds i64, ptr %35, i64 0 // CHECK-NEXT: %39 = load i64, ptr %38, align 8 // CHECK-NEXT: %40 = icmp ne i64 %39, 1 @@ -191,7 +191,7 @@ type N struct { // CHECK-NEXT: %50 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %34, 0 // CHECK-NEXT: %51 = extractvalue %"{{.*}}/runtime/internal/runtime.Slice" %34, 1 // CHECK-NEXT: %52 = icmp uge i64 1, %51 -// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.AssertIndexRange"(i1 %52) +// CHECK-NEXT: call void @"{{.*}}/runtime/internal/runtime.CheckIndexRange"(i1 %52, {{.*}}) // CHECK-NEXT: %53 = getelementptr inbounds i64, ptr %50, i64 1 // CHECK-NEXT: %54 = load i64, ptr %53, align 8 // CHECK-NEXT: %55 = icmp ne i64 %54, 2 diff --git a/runtime/internal/runtime/errors.go b/runtime/internal/runtime/errors.go index 1516b7ad9d..604d7b7448 100644 --- a/runtime/internal/runtime/errors.go +++ b/runtime/internal/runtime/errors.go @@ -69,6 +69,39 @@ var boundsNegErrorFmts = [...]string{ func (e boundsError) RuntimeError() {} +func panicBounds(x int64, signed bool, y int, code boundsErrorCode) { + panic(boundsError{x: x, signed: signed, y: y, code: code}) +} + +func boundsOutOfRange(x int64, signed bool, y int, inclusive bool) bool { + if signed { + if x < 0 { + return true + } + if inclusive { + return x > int64(y) + } + return x >= int64(y) + } + if inclusive { + return uint64(x) > uint64(y) + } + return uint64(x) >= uint64(y) +} + +func boundsAbove(x int64, signed bool, y int64) bool { + if signed { + return x < 0 || x > y + } + return uint64(x) > uint64(y) +} + +func CheckIndexRange(b bool, x int64, signed bool, y int) { + if b { + panicBounds(x, signed, y, boundsIndex) + } +} + func appendIntStr(b []byte, v int64, signed bool) []byte { if signed && v < 0 { b = append(b, '-') diff --git a/runtime/internal/runtime/z_slice.go b/runtime/internal/runtime/z_slice.go index aceb405474..cb7b6aa273 100644 --- a/runtime/internal/runtime/z_slice.go +++ b/runtime/internal/runtime/z_slice.go @@ -33,6 +33,37 @@ type Slice struct { cap int } +func NewSlice2(base unsafe.Pointer, eltSize, cap int, i, j int64, iSigned, jSigned, upperIsLen bool) (s Slice) { + upperCode := boundsSliceAcap + if upperIsLen { + upperCode = boundsSliceAlen + } + if boundsOutOfRange(j, jSigned, cap, true) { + panicBounds(j, jSigned, cap, upperCode) + } + if boundsAbove(i, iSigned, j) { + panicBounds(i, iSigned, int(j), boundsSliceB) + } + return newSliceUnchecked(base, eltSize, int(i), int(j), cap) +} + +func NewSlice3Bounds(base unsafe.Pointer, eltSize, cap int, i, j, k int64, iSigned, jSigned, kSigned, upperIsLen bool) (s Slice) { + upperCode := boundsSlice3Acap + if upperIsLen { + upperCode = boundsSlice3Alen + } + if boundsOutOfRange(k, kSigned, cap, true) { + panicBounds(k, kSigned, cap, upperCode) + } + if boundsAbove(j, jSigned, k) { + panicBounds(j, jSigned, int(k), boundsSlice3B) + } + if boundsAbove(i, iSigned, j) { + panicBounds(i, iSigned, int(j), boundsSlice3C) + } + return newSliceUnchecked(base, eltSize, int(i), int(j), int(k)) +} + func NewSlice3(base unsafe.Pointer, eltSize, cap, i, j, k int) (s Slice) { if k < 0 || k > cap { panic(boundsError{x: int64(k), signed: true, y: cap, code: boundsSlice3Acap}) @@ -43,6 +74,10 @@ func NewSlice3(base unsafe.Pointer, eltSize, cap, i, j, k int) (s Slice) { if i < 0 || i > j { panic(boundsError{x: int64(i), signed: true, y: j, code: boundsSlice3C}) } + return newSliceUnchecked(base, eltSize, i, j, k) +} + +func newSliceUnchecked(base unsafe.Pointer, eltSize, i, j, k int) (s Slice) { s.len = j - i s.cap = k - i if k-i > 0 { diff --git a/runtime/internal/runtime/z_string.go b/runtime/internal/runtime/z_string.go index 088b5cd132..1de9cf9a1b 100644 --- a/runtime/internal/runtime/z_string.go +++ b/runtime/internal/runtime/z_string.go @@ -60,11 +60,20 @@ func CStrDup(s String) *int8 { } func StringSlice(base String, i, j int) String { - if i < 0 || j < i || j > base.len { - panic("string slice index out of bounds") + return StringSlice2(base, int64(i), int64(j), true, true) +} + +func StringSlice2(base String, i, j int64, iSigned, jSigned bool) String { + if boundsOutOfRange(j, jSigned, base.len, true) { + panicBounds(j, jSigned, base.len, boundsSliceAlen) + } + if boundsAbove(i, iSigned, j) { + panicBounds(i, iSigned, int(j), boundsSliceB) } - if i < base.len { - return String{c.Advance(base.data, i), j - i} + ii := int(i) + jj := int(j) + if ii < base.len { + return String{c.Advance(base.data, ii), jj - ii} } // Keep the source base for empty suffix slices to avoid advancing past // the underlying allocation while still preserving a stable non-nil base. diff --git a/ssa/datastruct.go b/ssa/datastruct.go index cb2ca42282..21fe7d4362 100644 --- a/ssa/datastruct.go +++ b/ssa/datastruct.go @@ -212,14 +212,25 @@ func checkRange(idx Expr, max Expr) (checkMin, checkMax bool) { return } +func (b Builder) boundsArg(idx Expr) (Expr, bool) { + signed := idx.kind == vkSigned + typ := b.Prog.Int64() + if idx.impl.Type() != typ.ll { + idx.impl = castInt(b, idx.impl, idx.Type, typ) + } + idx.Type = typ + return idx, signed +} + // check index >= 0 && index < max and size to uint func (b Builder) checkIndex(idx Expr, max Expr) Expr { prog := b.Prog // check range checkMin, checkMax := checkRange(idx, max) // fit size + signed := idx.kind == vkSigned var typ Type - if idx.kind == vkSigned { + if signed { typ = prog.Int() } else { typ = prog.Uint() @@ -247,7 +258,8 @@ func (b Builder) checkIndex(idx Expr, max Expr) Expr { } } if !check.IsNil() { - b.InlineCall(b.Pkg.rtFunc("AssertIndexRange"), check) + boundsIdx, _ := b.boundsArg(idx) + b.InlineCall(b.Pkg.rtFunc("CheckIndexRange"), check, boundsIdx, prog.BoolVal(signed), max) } return idx } @@ -314,15 +326,26 @@ func (b Builder) Slice(x, low, high, max Expr) (ret Expr) { var nEltSize Expr var base Expr var lowIsNil = low.IsNil() + var lowArg Expr + var highArg Expr + var maxArg Expr + var lowSigned = true + var highSigned = true + var maxSigned = true + var upperIsLen bool if lowIsNil { low = prog.IntVal(0, prog.Int()) + lowArg = prog.IntVal(0, prog.Int64()) } else { + lowArg, lowSigned = b.boundsArg(low) low = b.FitIntSize(low) } if !high.IsNil() { + highArg, highSigned = b.boundsArg(high) high = b.FitIntSize(high) } if !max.IsNil() { + maxArg, maxSigned = b.boundsArg(max) max = b.FitIntSize(max) } switch t := x.raw.Type.Underlying().(type) { @@ -332,15 +355,17 @@ func (b Builder) Slice(x, low, high, max Expr) (ret Expr) { } if high.IsNil() { high = b.StringLen(x) + highArg, highSigned = b.boundsArg(high) } ret.Type = x.Type - ret.impl = b.InlineCall(b.Pkg.rtFunc("StringSlice"), x, low, high).impl + ret.impl = b.InlineCall(b.Pkg.rtFunc("StringSlice2"), x, lowArg, highArg, prog.BoolVal(lowSigned), prog.BoolVal(highSigned)).impl return case *types.Slice: nEltSize = SizeOf(prog, prog.Index(x.Type)) nCap = b.SliceCap(x) if high.IsNil() { high = b.SliceLen(x) + highArg, highSigned = b.boundsArg(high) } ret.Type = x.Type base = b.SliceData(x) @@ -352,20 +377,45 @@ func (b Builder) Slice(x, low, high, max Expr) (ret Expr) { ret.Type = prog.Slice(elem) nEltSize = SizeOf(prog, elem) nCap = prog.IntVal(uint64(te.Len()), prog.Int()) + upperIsLen = true if high.IsNil() { if lowIsNil && max.IsNil() { ret.impl = b.unsafeSlice(x, nCap.impl, nCap.impl).impl return } high = nCap + highArg, highSigned = b.boundsArg(high) } base = x } } if max.IsNil() { - max = nCap + ret.impl = b.InlineCall( + b.Pkg.rtFunc("NewSlice2"), + base, + nEltSize, + nCap, + lowArg, + highArg, + prog.BoolVal(lowSigned), + prog.BoolVal(highSigned), + prog.BoolVal(upperIsLen), + ).impl + return } - ret.impl = b.InlineCall(b.Pkg.rtFunc("NewSlice3"), base, nEltSize, nCap, low, high, max).impl + ret.impl = b.InlineCall( + b.Pkg.rtFunc("NewSlice3Bounds"), + base, + nEltSize, + nCap, + lowArg, + highArg, + maxArg, + prog.BoolVal(lowSigned), + prog.BoolVal(highSigned), + prog.BoolVal(maxSigned), + prog.BoolVal(upperIsLen), + ).impl return } diff --git a/test/go/bounds_panic_text_test.go b/test/go/bounds_panic_text_test.go new file mode 100644 index 0000000000..429db98dad --- /dev/null +++ b/test/go/bounds_panic_text_test.go @@ -0,0 +1,144 @@ +/* + * Copyright (c) 2026 The XGo Authors (xgo.dev). All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package gotest + +import ( + "runtime" + "testing" +) + +func TestBoundsPanicText(t *testing.T) { + tests := []struct { + name string + want string + f func() + }{ + { + name: "signed negative index", + want: "runtime error: index out of range [-1]", + f: func() { + s := []int{1, 2, 3} + i := -1 + _ = s[i] + }, + }, + { + name: "signed index length", + want: "runtime error: index out of range [3] with length 3", + f: func() { + s := []int{1, 2, 3} + i := 3 + _ = s[i] + }, + }, + { + name: "unsigned index length", + want: "runtime error: index out of range [18446744073709551615] with length 3", + f: func() { + s := []int{1, 2, 3} + i := ^uint64(0) + _ = s[i] + }, + }, + { + name: "slice high capacity", + want: "runtime error: slice bounds out of range [:4] with capacity 3", + f: func() { + s := []int{1, 2, 3} + j := 4 + _ = s[:j] + }, + }, + { + name: "array high length", + want: "runtime error: slice bounds out of range [:4] with length 3", + f: func() { + a := [3]int{1, 2, 3} + j := 4 + _ = a[:j] + }, + }, + { + name: "string high length", + want: "runtime error: slice bounds out of range [:4] with length 3", + f: func() { + s := "123" + j := 4 + _ = s[:j] + }, + }, + { + name: "unsigned low above high", + want: "runtime error: slice bounds out of range [18446744073709551615:0]", + f: func() { + s := []int{1, 2, 3} + i := ^uint64(0) + _ = s[i:0] + }, + }, + { + name: "full slice max capacity", + want: "runtime error: slice bounds out of range [::4] with capacity 3", + f: func() { + s := []int{1, 2, 3} + k := 4 + _ = s[:0:k] + }, + }, + { + name: "full array max length", + want: "runtime error: slice bounds out of range [::4] with length 3", + f: func() { + a := [3]int{1, 2, 3} + k := 4 + _ = a[:0:k] + }, + }, + { + name: "full slice unsigned max", + want: "runtime error: slice bounds out of range [::18446744073709551615] with capacity 3", + f: func() { + s := []int{1, 2, 3} + k := ^uint64(0) + _ = s[:0:k] + }, + }, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + expectRuntimeBoundsPanic(t, tt.want, tt.f) + }) + } +} + +func expectRuntimeBoundsPanic(t *testing.T, want string, f func()) { + t.Helper() + defer func() { + err := recover() + if err == nil { + t.Fatalf("expected panic %q", want) + } + rerr, ok := err.(runtime.Error) + if !ok { + t.Fatalf("panic type = %T, want runtime.Error", err) + } + if got := rerr.Error(); got != want { + t.Fatalf("panic = %q, want %q", got, want) + } + }() + f() +} diff --git a/test/goroot/xfail.yaml b/test/goroot/xfail.yaml index a5a66d10b4..340ed5138a 100644 --- a/test/goroot/xfail.yaml +++ b/test/goroot/xfail.yaml @@ -2467,14 +2467,6 @@ xfails: directive: run case: fixedbugs/issue29735.go reason: latest main goroot run failure on darwin/arm64 - - platform: darwin/arm64 - directive: run - case: fixedbugs/issue30116.go - reason: latest main goroot run failure on darwin/arm64 - - platform: darwin/arm64 - directive: run - case: fixedbugs/issue30116u.go - reason: latest main goroot run failure on darwin/arm64 - platform: darwin/arm64 directive: run case: fixedbugs/issue31546.go @@ -2666,16 +2658,6 @@ xfails: directive: run case: fixedbugs/issue29735.go reason: go1.25 goroot run failure on linux/amd64 - - version: go1.25 - platform: linux/amd64 - directive: run - case: fixedbugs/issue30116.go - reason: go1.25 goroot run failure on linux/amd64 - - version: go1.25 - platform: linux/amd64 - directive: run - case: fixedbugs/issue30116u.go - reason: go1.25 goroot run failure on linux/amd64 - version: go1.25 platform: linux/amd64 directive: run @@ -2942,11 +2924,6 @@ xfails: directive: run case: fixedbugs/issue29504.go reason: go1.24 goroot run failure on linux/amd64 - - version: go1.24 - platform: linux/amd64 - directive: run - case: fixedbugs/issue30116.go - reason: go1.24 goroot run failure on linux/amd64 - version: go1.24 platform: linux/amd64 directive: run @@ -3107,11 +3084,6 @@ xfails: directive: run case: fixedbugs/issue29735.go reason: go1.24 goroot run failure on linux/amd64 - - version: go1.24 - platform: linux/amd64 - directive: run - case: fixedbugs/issue30116u.go - reason: go1.24 goroot run failure on linux/amd64 - version: go1.24 platform: linux/amd64 directive: run @@ -3357,11 +3329,6 @@ xfails: directive: run case: fixedbugs/issue29735.go reason: go1.26 goroot run failure on linux/amd64 - - version: go1.26 - platform: linux/amd64 - directive: run - case: fixedbugs/issue30116u.go - reason: go1.26 goroot run failure on linux/amd64 - version: go1.26 platform: linux/amd64 directive: run @@ -3502,11 +3469,6 @@ xfails: directive: run case: fixedbugs/issue29504.go reason: go1.26 goroot run failure on linux/amd64 - - version: go1.26 - platform: linux/amd64 - directive: run - case: fixedbugs/issue30116.go - reason: go1.26 goroot run failure on linux/amd64 - version: go1.26 platform: linux/amd64 directive: run From b072c4105c0cfe3da7e8557c7a29ac5e1c1b52f6 Mon Sep 17 00:00:00 2001 From: Li Jie Date: Sat, 23 May 2026 01:46:32 +0800 Subject: [PATCH 2/4] fix mapzero bounds panic expectation --- cl/_testlibgo/mapzero/expect.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cl/_testlibgo/mapzero/expect.txt b/cl/_testlibgo/mapzero/expect.txt index 8e803e58f2..b8de48b45d 100644 --- a/cl/_testlibgo/mapzero/expect.txt +++ b/cl/_testlibgo/mapzero/expect.txt @@ -1 +1 @@ -runtime error: index out of range +runtime error: index out of range [0] with length 0 From 525647b711e486ab39b72dbc29b4aa5aa46045c5 Mon Sep 17 00:00:00 2001 From: Li Jie Date: Sun, 24 May 2026 13:04:45 +0800 Subject: [PATCH 3/4] test: unxfail goroot index0 bounds case --- test/goroot/xfail.yaml | 8 -------- 1 file changed, 8 deletions(-) diff --git a/test/goroot/xfail.yaml b/test/goroot/xfail.yaml index 340ed5138a..c67a3af136 100644 --- a/test/goroot/xfail.yaml +++ b/test/goroot/xfail.yaml @@ -3721,10 +3721,6 @@ xfails: directive: run case: typeparam/typeswitch5.go reason: go1.25 goroot run failure on darwin/arm64 - - platform: darwin/arm64 - directive: runoutput - case: index0.go - reason: current main goroot runoutput failure on darwin/arm64 - platform: linux/amd64 directive: run case: chan/select3.go @@ -3943,7 +3939,3 @@ xfails: directive: run case: typeparam/typeswitch5.go reason: go1.25 goroot run failure on linux/amd64 - - platform: linux/amd64 - directive: runoutput - case: index0.go - reason: current main goroot runoutput failure on linux/amd64 From 2336c3bbf5d934d4bb20418cf38b69b60da90eb6 Mon Sep 17 00:00:00 2001 From: Li Jie Date: Sun, 24 May 2026 13:36:10 +0800 Subject: [PATCH 4/4] test: cover bounds load ordering --- test/go/bounds_load_order_test.go | 97 +++++++++++++++++++++++++++++++ test/goroot/xfail.yaml | 4 -- 2 files changed, 97 insertions(+), 4 deletions(-) create mode 100644 test/go/bounds_load_order_test.go diff --git a/test/go/bounds_load_order_test.go b/test/go/bounds_load_order_test.go new file mode 100644 index 0000000000..4462b1a20c --- /dev/null +++ b/test/go/bounds_load_order_test.go @@ -0,0 +1,97 @@ +//go:build linux || darwin + +/* + * Copyright (c) 2026 The XGo Authors (xgo.dev). All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package gotest + +import ( + "fmt" + "syscall" + "testing" +) + +var boundsLoadPageSize = syscall.Getpagesize() +var boundsLoadOne = 1 + +func TestBoundsCheckBeforeWiderByteLoad(t *testing.T) { + b, err := syscall.Mmap(-1, 0, 2*boundsLoadPageSize, syscall.PROT_READ|syscall.PROT_WRITE, syscall.MAP_ANON|syscall.MAP_PRIVATE) + if err != nil { + t.Fatal(err) + } + defer syscall.Munmap(b) + if err := syscall.Mprotect(b[boundsLoadPageSize:], syscall.PROT_NONE); err != nil { + t.Fatal(err) + } + x := b[boundsLoadPageSize-boundsLoadOne : boundsLoadPageSize] + + tests := []struct { + name string + f func([]byte) + }{ + {"uint16 constant indexes", func(x []byte) { _ = loadUint16Const(x) }}, + {"uint16 variable indexes", func(x []byte) { _ = loadUint16Index(x, 0) }}, + {"uint32 constant indexes", func(x []byte) { _ = loadUint32Const(x) }}, + {"uint32 variable indexes", func(x []byte) { _ = loadUint32Index(x, 0) }}, + {"uint64 constant indexes", func(x []byte) { _ = loadUint64Const(x) }}, + {"uint64 variable indexes", func(x []byte) { _ = loadUint64Index(x, 0) }}, + } + for _, tt := range tests { + t.Run(tt.name, func(t *testing.T) { + expectIndexOnePanic(t, func() { tt.f(x) }) + }) + } +} + +func expectIndexOnePanic(t *testing.T, f func()) { + t.Helper() + defer func() { + err := recover() + if err == nil { + t.Fatal("expected bounds panic") + } + if got, want := fmt.Sprint(err), "runtime error: index out of range [1] with length 1"; got != want { + t.Fatalf("panic = %q, want %q", got, want) + } + }() + f() +} + +func loadUint16Const(x []byte) uint16 { + return uint16(x[0]) | uint16(x[1])<<8 +} + +func loadUint16Index(x []byte, i int) uint16 { + return uint16(x[i]) | uint16(x[i+1])<<8 +} + +func loadUint32Const(x []byte) uint32 { + return uint32(x[0]) | uint32(x[1])<<8 | uint32(x[2])<<16 | uint32(x[3])<<24 +} + +func loadUint32Index(x []byte, i int) uint32 { + return uint32(x[i]) | uint32(x[i+1])<<8 | uint32(x[i+2])<<16 | uint32(x[i+3])<<24 +} + +func loadUint64Const(x []byte) uint64 { + return uint64(x[0]) | uint64(x[1])<<8 | uint64(x[2])<<16 | uint64(x[3])<<24 | + uint64(x[4])<<32 | uint64(x[5])<<40 | uint64(x[6])<<48 | uint64(x[7])<<56 +} + +func loadUint64Index(x []byte, i int) uint64 { + return uint64(x[i]) | uint64(x[i+1])<<8 | uint64(x[i+2])<<16 | uint64(x[i+3])<<24 | + uint64(x[i+4])<<32 | uint64(x[i+5])<<40 | uint64(x[i+6])<<48 | uint64(x[i+7])<<56 +} diff --git a/test/goroot/xfail.yaml b/test/goroot/xfail.yaml index c67a3af136..a6f7871919 100644 --- a/test/goroot/xfail.yaml +++ b/test/goroot/xfail.yaml @@ -3762,10 +3762,6 @@ xfails: directive: run case: fixedbugs/issue12133.go reason: current main goroot run failure on linux/amd64 - - platform: linux/amd64 - directive: run - case: fixedbugs/issue15002.go - reason: current main goroot run failure on linux/amd64 - platform: linux/amd64 directive: run case: fixedbugs/issue15175.go