From afd02b3d7827915892ca4735199e8aeff045922f Mon Sep 17 00:00:00 2001 From: xushiwei Date: Wed, 1 May 2024 20:05:28 +0800 Subject: [PATCH] cl: to support stdin/stdout/stderr --- cl/_testrt/fprintf/in.go | 9 +++++++++ cl/_testrt/fprintf/out.ll | 32 ++++++++++++++++++++++++++++++++ cl/compile_test.go | 2 +- internal/runtime/c/c.go | 13 +++++++++++++ 4 files changed, 55 insertions(+), 1 deletion(-) create mode 100644 cl/_testrt/fprintf/in.go create mode 100644 cl/_testrt/fprintf/out.ll diff --git a/cl/_testrt/fprintf/in.go b/cl/_testrt/fprintf/in.go new file mode 100644 index 00000000..5328026a --- /dev/null +++ b/cl/_testrt/fprintf/in.go @@ -0,0 +1,9 @@ +package main + +import ( + "github.com/goplus/llgo/internal/runtime/c" +) + +func main() { + c.Fprintf(c.Stderr, c.Str("Hello %d\n"), 100) +} diff --git a/cl/_testrt/fprintf/out.ll b/cl/_testrt/fprintf/out.ll new file mode 100644 index 00000000..6c2c224c --- /dev/null +++ b/cl/_testrt/fprintf/out.ll @@ -0,0 +1,32 @@ +; ModuleID = 'main' +source_filename = "main" + +@"main.init$guard" = global ptr null +@"github.com/goplus/llgo/internal/runtime/c.Stderr" = external global ptr +@0 = private unnamed_addr constant [10 x i8] c"Hello %d\0A\00", 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 + br label %_llgo_2 + +_llgo_2: ; preds = %_llgo_1, %_llgo_0 + ret void +} + +define void @main() { +_llgo_0: + call void @"github.com/goplus/llgo/internal/runtime.init"() + call void @main.init() + %0 = load ptr, ptr @"github.com/goplus/llgo/internal/runtime/c.Stderr", align 8 + %1 = call i32 (ptr, ptr, ...) @fprintf(ptr %0, ptr @0, i64 100) + ret void +} + +declare void @"github.com/goplus/llgo/internal/runtime.init"() + +declare i32 @fprintf(ptr, ptr, ...) diff --git a/cl/compile_test.go b/cl/compile_test.go index b9c3443f..de7abd2a 100644 --- a/cl/compile_test.go +++ b/cl/compile_test.go @@ -29,7 +29,7 @@ func testCompile(t *testing.T, src, expected string) { } func TestFromTestrt(t *testing.T) { - cltest.FromDir(t, "", "./_testrt", true) + cltest.FromDir(t, "fprintf", "./_testrt", true) } func TestFromTestdata(t *testing.T) { diff --git a/internal/runtime/c/c.go b/internal/runtime/c/c.go index 79763a1b..05bd8ec6 100644 --- a/internal/runtime/c/c.go +++ b/internal/runtime/c/c.go @@ -27,8 +27,18 @@ type ( Char = int8 Int = C.int Pointer = unsafe.Pointer + FilePtr = unsafe.Pointer ) +//go:linkname Stdin __stdinp +var Stdin FilePtr + +//go:linkname Stdout __stdoutp +var Stdout FilePtr + +//go:linkname Stderr __stderrp +var Stderr FilePtr + //go:linkname Str llgo.cstr func Str(string) *Char @@ -52,3 +62,6 @@ func Memcpy(dst, src Pointer, n uintptr) Pointer //go:linkname Printf C.printf func Printf(format *Char, __llgo_va_list ...any) Int + +//go:linkname Fprintf C.fprintf +func Fprintf(fp FilePtr, format *Char, __llgo_va_list ...any) Int