From 022965b9c7fbb31ebf1d5fe1ce9f66d0668aedec Mon Sep 17 00:00:00 2001 From: visualfc Date: Wed, 15 May 2024 21:26:53 +0800 Subject: [PATCH] ssa: builtin print/println --- cl/_testrt/builtin/in.go | 54 +--- cl/_testrt/builtin/out.ll | 400 ++++++++++++++++++++---------- internal/runtime/llgo_autogen.lla | Bin 4183 -> 6451 bytes internal/runtime/print.go | 172 +++++++++++++ ssa/expr.go | 44 ++++ ssa/type.go | 9 +- 6 files changed, 507 insertions(+), 172 deletions(-) create mode 100644 internal/runtime/print.go diff --git a/cl/_testrt/builtin/in.go b/cl/_testrt/builtin/in.go index e5416b37..00857a49 100644 --- a/cl/_testrt/builtin/in.go +++ b/cl/_testrt/builtin/in.go @@ -1,7 +1,7 @@ package main import ( - "github.com/goplus/llgo/internal/runtime/c" + "unsafe" ) var a int64 = 1<<63 - 1 @@ -11,47 +11,19 @@ var n uint64 = 1<<64 - 1 func main() { var s = []int{1, 2, 3, 4} var a = [...]int{1, 2, 3, 4} + d := make([]byte, 4, 10) + println(s, len(s), cap(s)) + println(d, len(d), cap(d)) + println(len(a), cap(a), cap(&a), len(&a)) + println(len([]int{1, 2, 3, 4}), len([4]int{1, 2, 3, 4})) + println(len(s[1:]), cap(s[1:]), len(s[1:2]), cap(s[1:2]), len(s[1:2:2]), cap(s[1:2:2])) + println(len(a[1:]), cap(a[1:]), len(a[1:2]), cap(a[1:2]), len(a[1:2:2]), cap(a[1:2:2])) - out(len(s)) - out(len([]int{1, 2, 3, 4})) - out(len(a)) - out(len(&a)) - out(len([4]int{1, 2, 3, 4})) - - out(cap(s)) - out(cap(a)) - out(cap(&a)) - - out(len(s[1:])) - out(cap(s[1:])) - out(len(s[1:2])) - out(cap(s[1:2])) - out(len(s[1:2:2])) - out(cap(s[1:2:2])) - - out(len(a[1:])) - out(cap(a[1:])) - out(len(a[1:2])) - out(cap(a[1:2])) - out(len(a[1:2:2])) - out(cap(a[1:2:2])) - - string_len("hello") - string_len("hello"[1:]) - string_len("hello"[1:2]) - string_len("hello"[5:]) - - s = append(s, 5, 6, 7, 8) - out(len(s)) + println("hello", "hello"[1:], "hello"[1:2], len("hello"[5:])) + println(append(s, 5, 6, 7, 8)) data := []byte{'a', 'b', 'c'} data = append(data, "def"...) - out(len(data)) -} - -func string_len(s string) { - out(len(s)) -} - -func out(n int) { - c.Printf(c.Str("%d\n"), n) + println(data) + var i any = 100 + println(true, 100, -100, uint(100), int32(-100), 100.5, i, &i, uintptr(unsafe.Pointer(&i))) } diff --git a/cl/_testrt/builtin/out.ll b/cl/_testrt/builtin/out.ll index e446abe4..5cd53638 100644 --- a/cl/_testrt/builtin/out.ll +++ b/cl/_testrt/builtin/out.ll @@ -3,6 +3,7 @@ source_filename = "main" %"github.com/goplus/llgo/internal/runtime.Slice" = type { ptr, i64, i64 } %"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 } +%"github.com/goplus/llgo/internal/runtime.iface" = type { ptr, ptr } @main.a = global ptr null @main.b = global ptr null @@ -10,12 +11,50 @@ source_filename = "main" @main.n = global ptr null @__llgo_argc = global ptr null @__llgo_argv = global ptr null -@0 = private unnamed_addr constant [6 x i8] c"hello\00", align 1 -@1 = private unnamed_addr constant [6 x i8] c"hello\00", align 1 -@2 = private unnamed_addr constant [6 x i8] c"hello\00", align 1 -@3 = private unnamed_addr constant [6 x i8] c"hello\00", align 1 -@4 = private unnamed_addr constant [4 x i8] c"def\00", align 1 -@5 = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1 +@0 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@1 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@2 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 +@3 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@4 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@5 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 +@6 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@7 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@8 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@9 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 +@10 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@11 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 +@12 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@13 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@14 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@15 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@16 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@17 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 +@18 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@19 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@20 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@21 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@22 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@23 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 +@24 = private unnamed_addr constant [6 x i8] c"hello\00", align 1 +@25 = private unnamed_addr constant [6 x i8] c"hello\00", align 1 +@26 = private unnamed_addr constant [6 x i8] c"hello\00", align 1 +@27 = private unnamed_addr constant [6 x i8] c"hello\00", align 1 +@28 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@29 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@30 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@31 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 +@32 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 +@33 = private unnamed_addr constant [4 x i8] c"def\00", align 1 +@34 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 +@35 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@36 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@37 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@38 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@39 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@40 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@41 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@42 = private unnamed_addr constant [2 x i8] c" \00", align 1 +@43 = private unnamed_addr constant [2 x i8] c"\0A\00", align 1 define void @main.init() { _llgo_0: @@ -58,132 +97,219 @@ _llgo_0: store i64 2, ptr %10, align 4 store i64 3, ptr %11, align 4 store i64 4, ptr %12, align 4 - %13 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 1 - call void @main.out(i64 %13) - %14 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 32) - %15 = getelementptr inbounds i64, ptr %14, i64 0 - store i64 1, ptr %15, align 4 - %16 = getelementptr inbounds i64, ptr %14, i64 1 - store i64 2, ptr %16, align 4 - %17 = getelementptr inbounds i64, ptr %14, i64 2 - store i64 3, ptr %17, align 4 - %18 = getelementptr inbounds i64, ptr %14, i64 3 - store i64 4, ptr %18, align 4 - %19 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %14, i64 8, i64 4, i64 0, i64 4, i64 4) - %20 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %19, 1 - call void @main.out(i64 %20) - call void @main.out(i64 4) - call void @main.out(i64 4) - call void @main.out(i64 4) - %21 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 2 - call void @main.out(i64 %21) - call void @main.out(i64 4) - call void @main.out(i64 4) - %22 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 2 - %23 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 2 - %24 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 0 - %25 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %24, i64 8, i64 %22, i64 1, i64 %23, i64 %22) - %26 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %25, 1 - call void @main.out(i64 %26) - %27 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 2 - %28 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 2 - %29 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 0 - %30 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %29, i64 8, i64 %27, i64 1, i64 %28, i64 %27) - %31 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %30, 2 - call void @main.out(i64 %31) - %32 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 2 - %33 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 0 - %34 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %33, i64 8, i64 %32, i64 1, i64 2, i64 %32) + %13 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 10) + %14 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %13, i64 1, i64 10, i64 0, i64 4, i64 10) + %15 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 1 + %16 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 2 + call void @"github.com/goplus/llgo/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/internal/runtime.Slice" %7) + %17 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @0, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %17) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %15) + %18 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @1, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %18) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %16) + %19 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @2, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %19) + %20 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %14, 1 + %21 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %14, 2 + call void @"github.com/goplus/llgo/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/internal/runtime.Slice" %14) + %22 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @3, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %22) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %20) + %23 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @4, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %23) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %21) + %24 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @5, i64 1) + 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.PrintInt"(i64 4) + %25 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @6, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %25) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 4) + %26 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @7, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %26) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 4) + %27 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @8, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %27) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 4) + %28 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @9, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %28) + %29 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 32) + %30 = getelementptr inbounds i64, ptr %29, i64 0 + store i64 1, ptr %30, align 4 + %31 = getelementptr inbounds i64, ptr %29, i64 1 + store i64 2, ptr %31, align 4 + %32 = getelementptr inbounds i64, ptr %29, i64 2 + store i64 3, ptr %32, align 4 + %33 = getelementptr inbounds i64, ptr %29, i64 3 + store i64 4, ptr %33, align 4 + %34 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %29, i64 8, i64 4, i64 0, i64 4, i64 4) %35 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %34, 1 - call void @main.out(i64 %35) - %36 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 2 - %37 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 0 - %38 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %37, i64 8, i64 %36, i64 1, i64 2, i64 %36) - %39 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %38, 2 - call void @main.out(i64 %39) - %40 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 2 - %41 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 0 - %42 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %41, i64 8, i64 %40, i64 1, i64 2, i64 2) - %43 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %42, 1 - call void @main.out(i64 %43) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %35) + %36 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @10, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %36) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 4) + %37 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @11, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %37) + %38 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 2 + %39 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 2 + %40 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 0 + %41 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %40, i64 8, i64 %38, i64 1, i64 %39, i64 %38) + %42 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %41, 1 + %43 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 2 %44 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 2 %45 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 0 - %46 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %45, i64 8, i64 %44, i64 1, i64 2, i64 2) + %46 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %45, i64 8, i64 %43, i64 1, i64 %44, i64 %43) %47 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %46, 2 - call void @main.out(i64 %47) - %48 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 4, i64 4) - %49 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %48, 1 - call void @main.out(i64 %49) - %50 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 4, i64 4) - %51 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %50, 2 - call void @main.out(i64 %51) - %52 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 2, i64 4) - %53 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %52, 1 - call void @main.out(i64 %53) - %54 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 2, i64 4) + %48 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 2 + %49 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 0 + %50 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %49, i64 8, i64 %48, i64 1, i64 2, i64 %48) + %51 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %50, 1 + %52 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 2 + %53 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 0 + %54 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %53, i64 8, i64 %52, i64 1, i64 2, i64 %52) %55 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %54, 2 - call void @main.out(i64 %55) - %56 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 2, i64 2) - %57 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %56, 1 - call void @main.out(i64 %57) - %58 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 2, i64 2) - %59 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %58, 2 - call void @main.out(i64 %59) - %60 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @0, i64 5) - call void @main.string_len(%"github.com/goplus/llgo/internal/runtime.String" %60) - %61 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @1, i64 5) - %62 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %61, 1 - %63 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewStringSlice"(%"github.com/goplus/llgo/internal/runtime.String" %61, i64 1, i64 %62) - call void @main.string_len(%"github.com/goplus/llgo/internal/runtime.String" %63) - %64 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @2, i64 5) - %65 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewStringSlice"(%"github.com/goplus/llgo/internal/runtime.String" %64, i64 1, i64 2) - call void @main.string_len(%"github.com/goplus/llgo/internal/runtime.String" %65) - %66 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @3, i64 5) - %67 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %66, 1 - %68 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewStringSlice"(%"github.com/goplus/llgo/internal/runtime.String" %66, i64 5, i64 %67) - call void @main.string_len(%"github.com/goplus/llgo/internal/runtime.String" %68) - %69 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 32) - %70 = getelementptr inbounds i64, ptr %69, i64 0 - store i64 5, ptr %70, align 4 - %71 = getelementptr inbounds i64, ptr %69, i64 1 - store i64 6, ptr %71, align 4 - %72 = getelementptr inbounds i64, ptr %69, i64 2 - store i64 7, ptr %72, align 4 - %73 = getelementptr inbounds i64, ptr %69, i64 3 - store i64 8, ptr %73, align 4 - %74 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %69, i64 8, i64 4, i64 0, i64 4, i64 4) - %75 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %74, 0 - %76 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %74, 1 - %77 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.SliceAppend"(%"github.com/goplus/llgo/internal/runtime.Slice" %7, ptr %75, i64 %76, i64 8) - %78 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %77, 1 - call void @main.out(i64 %78) - %79 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 3) - %80 = getelementptr inbounds i8, ptr %79, i64 0 - store i8 97, ptr %80, align 1 - %81 = getelementptr inbounds i8, ptr %79, i64 1 - store i8 98, ptr %81, align 1 - %82 = getelementptr inbounds i8, ptr %79, i64 2 - store i8 99, ptr %82, align 1 - %83 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %79, i64 1, i64 3, i64 0, i64 3, i64 3) - %84 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @4, i64 3) - %85 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %84, 0 - %86 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %84, 1 - %87 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.SliceAppend"(%"github.com/goplus/llgo/internal/runtime.Slice" %83, ptr %85, i64 %86, i64 1) - %88 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %87, 1 - call void @main.out(i64 %88) - ret void -} - -define void @main.out(i64 %0) { -_llgo_0: - %1 = call i32 (ptr, ...) @printf(ptr @5, i64 %0) - ret void -} - -define void @main.string_len(%"github.com/goplus/llgo/internal/runtime.String" %0) { -_llgo_0: - %1 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %0, 1 - call void @main.out(i64 %1) + %56 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 2 + %57 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 0 + %58 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %57, i64 8, i64 %56, i64 1, i64 2, i64 2) + %59 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %58, 1 + %60 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 2 + %61 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %7, 0 + %62 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %61, i64 8, i64 %60, i64 1, i64 2, i64 2) + %63 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %62, 2 + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %42) + %64 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @12, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %64) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %47) + %65 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @13, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %65) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %51) + %66 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @14, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %66) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %55) + %67 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @15, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %67) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %59) + %68 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @16, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %68) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %63) + %69 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @17, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %69) + %70 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 4, i64 4) + %71 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %70, 1 + %72 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 4, i64 4) + %73 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %72, 2 + %74 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 2, i64 4) + %75 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %74, 1 + %76 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 2, i64 4) + %77 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %76, 2 + %78 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 2, i64 2) + %79 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %78, 1 + %80 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %8, i64 8, i64 4, i64 1, i64 2, i64 2) + %81 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %80, 2 + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %71) + %82 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @18, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %82) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %73) + %83 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @19, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %83) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %75) + %84 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @20, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %84) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %77) + %85 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @21, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %85) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %79) + %86 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @22, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %86) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %81) + %87 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @23, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %87) + %88 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @24, i64 5) + %89 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %88, 1 + %90 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewStringSlice"(%"github.com/goplus/llgo/internal/runtime.String" %88, i64 1, i64 %89) + %91 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @25, i64 5) + %92 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewStringSlice"(%"github.com/goplus/llgo/internal/runtime.String" %91, i64 1, i64 2) + %93 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @26, i64 5) + %94 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %93, 1 + %95 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewStringSlice"(%"github.com/goplus/llgo/internal/runtime.String" %93, i64 5, i64 %94) + %96 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %95, 1 + %97 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @27, i64 5) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %97) + %98 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @28, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %98) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %90) + %99 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @29, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %99) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %92) + %100 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @30, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %100) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 %96) + %101 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @31, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %101) + %102 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 32) + %103 = getelementptr inbounds i64, ptr %102, i64 0 + store i64 5, ptr %103, align 4 + %104 = getelementptr inbounds i64, ptr %102, i64 1 + store i64 6, ptr %104, align 4 + %105 = getelementptr inbounds i64, ptr %102, i64 2 + store i64 7, ptr %105, align 4 + %106 = getelementptr inbounds i64, ptr %102, i64 3 + store i64 8, ptr %106, align 4 + %107 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %102, i64 8, i64 4, i64 0, i64 4, i64 4) + %108 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %107, 0 + %109 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %107, 1 + %110 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.SliceAppend"(%"github.com/goplus/llgo/internal/runtime.Slice" %7, ptr %108, i64 %109, i64 8) + call void @"github.com/goplus/llgo/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/internal/runtime.Slice" %110) + %111 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @32, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %111) + %112 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 3) + %113 = getelementptr inbounds i8, ptr %112, i64 0 + store i8 97, ptr %113, align 1 + %114 = getelementptr inbounds i8, ptr %112, i64 1 + store i8 98, ptr %114, align 1 + %115 = getelementptr inbounds i8, ptr %112, i64 2 + store i8 99, ptr %115, align 1 + %116 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr %112, i64 1, i64 3, i64 0, i64 3, i64 3) + %117 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @33, i64 3) + %118 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %117, 0 + %119 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %117, 1 + %120 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.SliceAppend"(%"github.com/goplus/llgo/internal/runtime.Slice" %116, ptr %118, i64 %119, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/internal/runtime.Slice" %120) + %121 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @34, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %121) + %122 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 16) + %123 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) + %124 = call %"github.com/goplus/llgo/internal/runtime.iface" @"github.com/goplus/llgo/internal/runtime.MakeAnyInt"(ptr %123, i64 100) + store %"github.com/goplus/llgo/internal/runtime.iface" %124, ptr %122, align 8 + %125 = load %"github.com/goplus/llgo/internal/runtime.iface", ptr %122, align 8 + %126 = ptrtoint ptr %122 to i64 + call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 true) + %127 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @35, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %127) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 100) + %128 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @36, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %128) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 -100) + %129 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @37, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %129) + call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 100) + %130 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @38, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %130) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 -100) + %131 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @39, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %131) + call void @"github.com/goplus/llgo/internal/runtime.PrintFloat"(double 1.005000e+02) + %132 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @40, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %132) + call void @"github.com/goplus/llgo/internal/runtime.PrintIface"(%"github.com/goplus/llgo/internal/runtime.iface" %125) + %133 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @41, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %133) + call void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr %122) + %134 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @42, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %134) + call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %126) + %135 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr @43, i64 1) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %135) ret void } @@ -193,10 +319,28 @@ declare ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64) declare %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice3"(ptr, i64, i64, i64, i64, i64) +declare void @"github.com/goplus/llgo/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/internal/runtime.Slice") + +declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String") + declare %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewString"(ptr, i64) +declare void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64) + declare %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.NewStringSlice"(%"github.com/goplus/llgo/internal/runtime.String", i64, i64) declare %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.SliceAppend"(%"github.com/goplus/llgo/internal/runtime.Slice", ptr, i64, i64) -declare i32 @printf(ptr, ...) +declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64) + +declare %"github.com/goplus/llgo/internal/runtime.iface" @"github.com/goplus/llgo/internal/runtime.MakeAnyInt"(ptr, i64) + +declare void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1) + +declare void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64) + +declare void @"github.com/goplus/llgo/internal/runtime.PrintFloat"(double) + +declare void @"github.com/goplus/llgo/internal/runtime.PrintIface"(%"github.com/goplus/llgo/internal/runtime.iface") + +declare void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr) diff --git a/internal/runtime/llgo_autogen.lla b/internal/runtime/llgo_autogen.lla index fdd1ba93f59fb05fed21adb21a81e2cfbda62489..908e7b5823995df1ddbcc8cfd8fc08008a4f7e89 100644 GIT binary patch literal 6451 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 BPy7G? delta 4158 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 I4*&oF0EBDrw*UYD diff --git a/internal/runtime/print.go b/internal/runtime/print.go new file mode 100644 index 00000000..cc33fc4d --- /dev/null +++ b/internal/runtime/print.go @@ -0,0 +1,172 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package runtime + +import ( + "unsafe" + + "github.com/goplus/llgo/c" +) + +// The compiler knows that a print of a value of this type +// should use printhex instead of printuint (decimal). +func bytes(s string) (ret []byte) { + rp := (*Slice)(unsafe.Pointer(&ret)) + sp := (*String)(unsafe.Pointer(&s)) + rp.data = sp.data + rp.len = sp.len + rp.cap = sp.len + return +} + +func gwrite(b []byte) { + if len(b) == 0 { + return + } + for _, v := range b { + c.Fprintf(c.Stderr, c.Str("%c"), v) + } +} + +func PrintBool(v bool) { + if v { + PrintString("true") + } else { + PrintString("false") + } +} + +func PrintFloat(v float64) { + switch { + case v != v: + PrintString("NaN") + return + case v+v == v && v > 0: + PrintString("+Inf") + return + case v+v == v && v < 0: + PrintString("-Inf") + return + } + + const n = 7 // digits printed + var buf [n + 7]byte + buf[0] = '+' + e := 0 // exp + if v == 0 { + if 1/v < 0 { + buf[0] = '-' + } + } else { + if v < 0 { + v = -v + buf[0] = '-' + } + + // normalize + for v >= 10 { + e++ + v /= 10 + } + for v < 1 { + e-- + v *= 10 + } + + // round + h := 5.0 + for i := 0; i < n; i++ { + h /= 10 + } + v += h + if v >= 10 { + e++ + v /= 10 + } + } + + // format +d.dddd+edd + for i := 0; i < n; i++ { + s := int(v) + buf[i+2] = byte(s + '0') + v -= float64(s) + v *= 10 + } + buf[1] = buf[2] + buf[2] = '.' + + buf[n+2] = 'e' + buf[n+3] = '+' + if e < 0 { + e = -e + buf[n+3] = '-' + } + + buf[n+4] = byte(e/100) + '0' + buf[n+5] = byte(e/10)%10 + '0' + buf[n+6] = byte(e%10) + '0' + gwrite(buf[:]) +} + +// func PrintComplex(c complex128) { +// print("(", real(c), imag(c), "i)") +// } + +func PrintUint(v uint64) { + var buf [100]byte + i := len(buf) + for i--; i > 0; i-- { + buf[i] = byte(v%10 + '0') + if v < 10 { + break + } + v /= 10 + } + gwrite(buf[i:]) +} + +func PrintInt(v int64) { + if v < 0 { + PrintString("-") + v = -v + } + PrintUint(uint64(v)) +} + +func PrintHex(v uint64) { + const dig = "0123456789abcdef" + var buf [100]byte + i := len(buf) + for i--; i > 0; i-- { + buf[i] = dig[v%16] + if v < 16 && len(buf)-i >= 0 { + break + } + v /= 16 + } + i-- + buf[i] = 'x' + i-- + buf[i] = '0' + gwrite(buf[i:]) +} + +func PrintPointer(p unsafe.Pointer) { + PrintHex(uint64(uintptr(p))) +} + +func PrintString(s string) { + gwrite(bytes(s)) +} + +func PrintSlice(s Slice) { + sp := (*Slice)(unsafe.Pointer(&s)) + print("[", s.len, "/", s.cap, "]") + PrintPointer(sp.data) +} + +func PrintIface(i iface) { + print("(", i.tab, ",", i.data, ")") +} diff --git a/ssa/expr.go b/ssa/expr.go index a9d1d1ef..89d70c55 100644 --- a/ssa/expr.go +++ b/ssa/expr.go @@ -1386,6 +1386,50 @@ func (b Builder) BuiltinCall(fn string, args ...Expr) (ret Expr) { } } } + case "print", "println": + ln := fn == "println" + ret.Type = b.Prog.Void() + for i, arg := range args { + if ln && i > 0 { + b.InlineCall(b.Func.Pkg.rtFunc("PrintString"), b.Str(" ")) + } + var fn string + var typ types.Type + switch arg.kind { + case vkBool: + fn = "PrintBool" + case vkSigned: + fn = "PrintInt" + typ = types.Typ[types.Int64] + case vkUnsigned: + fn = "PrintUint" + typ = types.Typ[types.Uint64] + case vkFloat: + fn = "PrintFloat" + typ = types.Typ[types.Float64] + case vkSlice: + fn = "PrintSlice" + case vkPtr, vkFuncPtr, vkFuncDecl, vkClosure, vkPyVarRef, vkPyFuncRef: + fn = "PrintPointer" + typ = types.Typ[types.UnsafePointer] + case vkString: + fn = "PrintString" + case vkInterface: + fn = "PrintIface" + // case vkComplex: + // fn = "PrintComplex" + default: + panic(fmt.Errorf("illegal types for operand: print %v", arg.RawType())) + } + if typ != nil && typ != arg.raw.Type { + arg = b.Convert(b.Prog.Type(typ, InGo), arg) + } + b.InlineCall(b.Func.Pkg.rtFunc(fn), arg) + } + if ln { + b.InlineCall(b.Func.Pkg.rtFunc("PrintString"), b.Str("\n")) + } + return } panic("todo") } diff --git a/ssa/type.go b/ssa/type.go index 6814b07e..17f5bd07 100644 --- a/ssa/type.go +++ b/ssa/type.go @@ -47,6 +47,9 @@ const ( vkPyVarRef vkTuple vkSlice + vkArray + vkMap + vkInterface vkPhisExpr = -1 ) @@ -240,11 +243,11 @@ func (p Program) toType(raw types.Type) Type { elem := p.rawType(t.Elem()) return &aType{llvm.PointerType(elem.ll, 0), typ, vkPtr} case *types.Interface: - return &aType{p.rtIface(), typ, vkInvalid} + return &aType{p.rtIface(), typ, vkInterface} case *types.Slice: return &aType{p.rtSlice(), typ, vkSlice} case *types.Map: - return &aType{p.rtMap(), typ, vkInvalid} + return &aType{p.rtMap(), typ, vkMap} case *types.Struct: ll, kind := p.toLLVMStruct(t) return &aType{ll, typ, kind} @@ -254,7 +257,7 @@ func (p Program) toType(raw types.Type) Type { return &aType{p.toLLVMFuncPtr(t), typ, vkFuncPtr} case *types.Array: elem := p.rawType(t.Elem()) - return &aType{llvm.ArrayType(elem.ll, int(t.Len())), typ, vkInvalid} + return &aType{llvm.ArrayType(elem.ll, int(t.Len())), typ, vkArray} case *types.Chan: } panic(fmt.Sprintf("toLLVMType: todo - %T\n", typ))