From 8169d8509ff6e59101cbf3554cf01ee2dba24e6c Mon Sep 17 00:00:00 2001 From: visualfc Date: Wed, 26 Jun 2024 20:30:00 +0800 Subject: [PATCH] cl/_testlibgo: bytes strings --- cl/_testlibgo/bytes/in.go | 15 ++++ cl/_testlibgo/bytes/out.ll | 111 ++++++++++++++++++++++++ cl/_testlibgo/strings/in.go | 20 +++++ cl/_testlibgo/strings/out.ll | 164 +++++++++++++++++++++++++++++++++++ cl/_testrt/builtin/out.ll | 4 +- ssa/datastruct.go | 1 - 6 files changed, 312 insertions(+), 3 deletions(-) create mode 100644 cl/_testlibgo/bytes/in.go create mode 100644 cl/_testlibgo/bytes/out.ll create mode 100644 cl/_testlibgo/strings/in.go create mode 100644 cl/_testlibgo/strings/out.ll diff --git a/cl/_testlibgo/bytes/in.go b/cl/_testlibgo/bytes/in.go new file mode 100644 index 00000000..5cf8f939 --- /dev/null +++ b/cl/_testlibgo/bytes/in.go @@ -0,0 +1,15 @@ +package main + +import ( + "bytes" +) + +func main() { + var b bytes.Buffer // A Buffer needs no initialization. + b.Write([]byte("Hello ")) + b.WriteString("World") + + println("buf", b.Bytes(), b.String()) + + println(bytes.EqualFold([]byte("Go"), []byte("go"))) +} diff --git a/cl/_testlibgo/bytes/out.ll b/cl/_testlibgo/bytes/out.ll new file mode 100644 index 00000000..f585a785 --- /dev/null +++ b/cl/_testlibgo/bytes/out.ll @@ -0,0 +1,111 @@ +; ModuleID = 'main' +source_filename = "main" + +%"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 } +%"github.com/goplus/llgo/internal/runtime.Slice" = type { ptr, i64, i64 } +%"github.com/goplus/llgo/internal/runtime.iface" = type { ptr, ptr } + +@"main.init$guard" = global i1 false, align 1 +@__llgo_argc = global i32 0, align 4 +@__llgo_argv = global ptr null, align 8 +@0 = private unnamed_addr constant [6 x i8] c"Hello ", align 1 +@1 = private unnamed_addr constant [5 x i8] c"World", align 1 +@2 = private unnamed_addr constant [3 x i8] c"buf", align 1 +@3 = private unnamed_addr constant [2 x i8] c"Go", align 1 +@4 = private unnamed_addr constant [2 x i8] c"go", align 1 + +define void @main.init() { +_llgo_0: + %0 = load i1, ptr @"main.init$guard", align 1 + br i1 %0, label %_llgo_2, label %_llgo_1 + +_llgo_1: ; preds = %_llgo_0 + store i1 true, ptr @"main.init$guard", align 1 + call void @bytes.init() + br label %_llgo_2 + +_llgo_2: ; preds = %_llgo_1, %_llgo_0 + ret void +} + +define i32 @main(i32 %0, ptr %1) { +_llgo_0: + store i32 %0, ptr @__llgo_argc, align 4 + store ptr %1, ptr @__llgo_argv, align 8 + call void @"github.com/goplus/llgo/internal/runtime.init"() + call void @main.init() + %2 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 40) + %3 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %3, i32 0, i32 0 + store ptr @0, ptr %4, align 8 + %5 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %3, i32 0, i32 1 + store i64 6, ptr %5, align 4 + %6 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %3, align 8 + %7 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.StringToBytes"(%"github.com/goplus/llgo/internal/runtime.String" %6) + %8 = call { i64, %"github.com/goplus/llgo/internal/runtime.iface" } @"bytes.(*Buffer).Write"(ptr %2, %"github.com/goplus/llgo/internal/runtime.Slice" %7) + %9 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %10 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %9, i32 0, i32 0 + store ptr @1, ptr %10, align 8 + %11 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %9, i32 0, i32 1 + store i64 5, ptr %11, align 4 + %12 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %9, align 8 + %13 = call { i64, %"github.com/goplus/llgo/internal/runtime.iface" } @"bytes.(*Buffer).WriteString"(ptr %2, %"github.com/goplus/llgo/internal/runtime.String" %12) + %14 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"bytes.(*Buffer).Bytes"(ptr %2) + %15 = call %"github.com/goplus/llgo/internal/runtime.String" @"bytes.(*Buffer).String"(ptr %2) + %16 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %17 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %16, i32 0, i32 0 + store ptr @2, ptr %17, align 8 + %18 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %16, i32 0, i32 1 + store i64 3, ptr %18, align 4 + %19 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %16, align 8 + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %19) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/internal/runtime.Slice" %14) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %15) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) + %20 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %21 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %20, i32 0, i32 0 + store ptr @3, ptr %21, align 8 + %22 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %20, i32 0, i32 1 + store i64 2, ptr %22, align 4 + %23 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %20, align 8 + %24 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.StringToBytes"(%"github.com/goplus/llgo/internal/runtime.String" %23) + %25 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %26 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %25, i32 0, i32 0 + store ptr @4, ptr %26, align 8 + %27 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %25, i32 0, i32 1 + store i64 2, ptr %27, align 4 + %28 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %25, align 8 + %29 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.StringToBytes"(%"github.com/goplus/llgo/internal/runtime.String" %28) + %30 = call i1 @bytes.EqualFold(%"github.com/goplus/llgo/internal/runtime.Slice" %24, %"github.com/goplus/llgo/internal/runtime.Slice" %29) + call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %30) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) + ret i32 0 +} + +declare void @bytes.init() + +declare void @"github.com/goplus/llgo/internal/runtime.init"() + +declare ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64) + +declare %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.StringToBytes"(%"github.com/goplus/llgo/internal/runtime.String") + +declare { i64, %"github.com/goplus/llgo/internal/runtime.iface" } @"bytes.(*Buffer).Write"(ptr, %"github.com/goplus/llgo/internal/runtime.Slice") + +declare { i64, %"github.com/goplus/llgo/internal/runtime.iface" } @"bytes.(*Buffer).WriteString"(ptr, %"github.com/goplus/llgo/internal/runtime.String") + +declare %"github.com/goplus/llgo/internal/runtime.Slice" @"bytes.(*Buffer).Bytes"(ptr) + +declare %"github.com/goplus/llgo/internal/runtime.String" @"bytes.(*Buffer).String"(ptr) + +declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String") + +declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8) + +declare void @"github.com/goplus/llgo/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/internal/runtime.Slice") + +declare i1 @bytes.EqualFold(%"github.com/goplus/llgo/internal/runtime.Slice", %"github.com/goplus/llgo/internal/runtime.Slice") + +declare void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1) diff --git a/cl/_testlibgo/strings/in.go b/cl/_testlibgo/strings/in.go new file mode 100644 index 00000000..4ce09a4a --- /dev/null +++ b/cl/_testlibgo/strings/in.go @@ -0,0 +1,20 @@ +package main + +import ( + "strings" + "unicode" +) + +func main() { + var b strings.Builder + b.Write([]byte("Hello ")) + b.WriteString("World") + + println("len:", b.Len(), "cap:", b.Cap(), "string:", b.String()) + + f := func(c rune) bool { + return unicode.Is(unicode.Han, c) + } + println(strings.IndexFunc("Hello, 世界", f)) + println(strings.IndexFunc("Hello, world", f)) +} diff --git a/cl/_testlibgo/strings/out.ll b/cl/_testlibgo/strings/out.ll new file mode 100644 index 00000000..ef8e08fb --- /dev/null +++ b/cl/_testlibgo/strings/out.ll @@ -0,0 +1,164 @@ +; ModuleID = 'main' +source_filename = "main" + +%"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 } +%"github.com/goplus/llgo/internal/runtime.Slice" = type { ptr, i64, i64 } +%"github.com/goplus/llgo/internal/runtime.iface" = type { ptr, ptr } + +@"main.init$guard" = global i1 false, align 1 +@__llgo_argc = global i32 0, align 4 +@__llgo_argv = global ptr null, align 8 +@0 = private unnamed_addr constant [6 x i8] c"Hello ", align 1 +@1 = private unnamed_addr constant [5 x i8] c"World", align 1 +@2 = private unnamed_addr constant [4 x i8] c"len:", align 1 +@3 = private unnamed_addr constant [4 x i8] c"cap:", align 1 +@4 = private unnamed_addr constant [7 x i8] c"string:", align 1 +@5 = private unnamed_addr constant [13 x i8] c"Hello, \E4\B8\96\E7\95\8C", align 1 +@6 = private unnamed_addr constant [12 x i8] c"Hello, world", align 1 +@unicode.Han = external global ptr, align 8 + +define void @main.init() { +_llgo_0: + %0 = load i1, ptr @"main.init$guard", align 1 + br i1 %0, label %_llgo_2, label %_llgo_1 + +_llgo_1: ; preds = %_llgo_0 + store i1 true, ptr @"main.init$guard", align 1 + call void @strings.init() + call void @unicode.init() + br label %_llgo_2 + +_llgo_2: ; preds = %_llgo_1, %_llgo_0 + ret void +} + +define i32 @main(i32 %0, ptr %1) { +_llgo_0: + store i32 %0, ptr @__llgo_argc, align 4 + store ptr %1, ptr @__llgo_argv, align 8 + call void @"github.com/goplus/llgo/internal/runtime.init"() + call void @main.init() + %2 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 32) + %3 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %3, i32 0, i32 0 + store ptr @0, ptr %4, align 8 + %5 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %3, i32 0, i32 1 + store i64 6, ptr %5, align 4 + %6 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %3, align 8 + %7 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.StringToBytes"(%"github.com/goplus/llgo/internal/runtime.String" %6) + %8 = call { i64, %"github.com/goplus/llgo/internal/runtime.iface" } @"strings.(*Builder).Write"(ptr %2, %"github.com/goplus/llgo/internal/runtime.Slice" %7) + %9 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %10 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %9, i32 0, i32 0 + store ptr @1, ptr %10, align 8 + %11 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %9, i32 0, i32 1 + store i64 5, ptr %11, align 4 + %12 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %9, align 8 + %13 = call { i64, %"github.com/goplus/llgo/internal/runtime.iface" } @"strings.(*Builder).WriteString"(ptr %2, %"github.com/goplus/llgo/internal/runtime.String" %12) + %14 = call i64 @"strings.(*Builder).Len"(ptr %2) + %15 = call i64 @"strings.(*Builder).Cap"(ptr %2) + %16 = call %"github.com/goplus/llgo/internal/runtime.String" @"strings.(*Builder).String"(ptr %2) + %17 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %18 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %17, i32 0, i32 0 + store ptr @2, ptr %18, align 8 + %19 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %17, i32 0, i32 1 + store i64 4, ptr %19, align 4 + %20 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %17, align 8 + %21 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %22 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %21, i32 0, i32 0 + store ptr @3, ptr %22, align 8 + %23 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %21, i32 0, i32 1 + store i64 4, ptr %23, align 4 + %24 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %21, align 8 + %25 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %26 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %25, i32 0, i32 0 + store ptr @4, ptr %26, align 8 + %27 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %25, i32 0, i32 1 + store i64 7, ptr %27, align 4 + %28 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %25, align 8 + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %20) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %14) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %24) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %15) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %28) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %16) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) + %29 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %30 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %29, i32 0, i32 0 + store ptr @5, ptr %30, align 8 + %31 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %29, i32 0, i32 1 + store i64 13, ptr %31, align 4 + %32 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %29, align 8 + %33 = alloca { ptr, ptr }, align 8 + %34 = getelementptr inbounds { ptr, ptr }, ptr %33, i32 0, i32 0 + store ptr @"__llgo_stub.main.main$1", ptr %34, align 8 + %35 = getelementptr inbounds { ptr, ptr }, ptr %33, i32 0, i32 1 + store ptr null, ptr %35, align 8 + %36 = load { ptr, ptr }, ptr %33, align 8 + %37 = call i64 @strings.IndexFunc(%"github.com/goplus/llgo/internal/runtime.String" %32, { ptr, ptr } %36) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %37) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) + %38 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %39 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %38, i32 0, i32 0 + store ptr @6, ptr %39, align 8 + %40 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %38, i32 0, i32 1 + store i64 12, ptr %40, align 4 + %41 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %38, align 8 + %42 = alloca { ptr, ptr }, align 8 + %43 = getelementptr inbounds { ptr, ptr }, ptr %42, i32 0, i32 0 + store ptr @"__llgo_stub.main.main$1", ptr %43, align 8 + %44 = getelementptr inbounds { ptr, ptr }, ptr %42, i32 0, i32 1 + store ptr null, ptr %44, align 8 + %45 = load { ptr, ptr }, ptr %42, align 8 + %46 = call i64 @strings.IndexFunc(%"github.com/goplus/llgo/internal/runtime.String" %41, { ptr, ptr } %45) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %46) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) + ret i32 0 +} + +define i1 @"main.main$1"(i32 %0) { +_llgo_0: + %1 = load ptr, ptr @unicode.Han, align 8 + %2 = call i1 @unicode.Is(ptr %1, i32 %0) + ret i1 %2 +} + +declare void @strings.init() + +declare void @unicode.init() + +declare void @"github.com/goplus/llgo/internal/runtime.init"() + +declare ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64) + +declare %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.StringToBytes"(%"github.com/goplus/llgo/internal/runtime.String") + +declare { i64, %"github.com/goplus/llgo/internal/runtime.iface" } @"strings.(*Builder).Write"(ptr, %"github.com/goplus/llgo/internal/runtime.Slice") + +declare { i64, %"github.com/goplus/llgo/internal/runtime.iface" } @"strings.(*Builder).WriteString"(ptr, %"github.com/goplus/llgo/internal/runtime.String") + +declare i64 @"strings.(*Builder).Len"(ptr) + +declare i64 @"strings.(*Builder).Cap"(ptr) + +declare %"github.com/goplus/llgo/internal/runtime.String" @"strings.(*Builder).String"(ptr) + +declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String") + +declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8) + +declare void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64) + +declare i64 @strings.IndexFunc(%"github.com/goplus/llgo/internal/runtime.String", { ptr, ptr }) + +define linkonce i1 @"__llgo_stub.main.main$1"(ptr %0, i32 %1) { +_llgo_0: + %2 = tail call i1 @"main.main$1"(i32 %1) + ret i1 %2 +} + +declare i1 @unicode.Is(ptr, i32) diff --git a/cl/_testrt/builtin/out.ll b/cl/_testrt/builtin/out.ll index 824c5cd1..e78ddf0d 100644 --- a/cl/_testrt/builtin/out.ll +++ b/cl/_testrt/builtin/out.ll @@ -161,12 +161,12 @@ _llgo_0: call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 4) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) %34 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %11, 2 - %35 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %11, 2 + %35 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %11, 1 %36 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %11, 0 %37 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %36, i64 8, i64 %34, i64 1, i64 %35, i64 %34) %38 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %37, 1 %39 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %11, 2 - %40 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %11, 2 + %40 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %11, 1 %41 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %11, 0 %42 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %41, i64 8, i64 %39, i64 1, i64 %40, i64 %39) %43 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %42, 2 diff --git a/ssa/datastruct.go b/ssa/datastruct.go index 7ec0e1ec..2f45c7b6 100644 --- a/ssa/datastruct.go +++ b/ssa/datastruct.go @@ -333,7 +333,6 @@ func (b Builder) Slice(x, low, high, max Expr) (ret Expr) { if debugInstr { log.Printf("Slice %v, %v, %v\n", x.impl, low.impl, high.impl) } - prog := b.Prog var nCap Expr var nEltSize Expr