From 192b479f18ed1ee8e6f41de56baf22b35d7a5d8b Mon Sep 17 00:00:00 2001 From: xushiwei Date: Thu, 2 May 2024 23:14:12 +0800 Subject: [PATCH] cl: link go name --- cl/_testrt/linkname/in.go | 15 ++++++++++++++ cl/_testrt/linkname/out.ll | 38 +++++++++++++++++++++++++++++++++++ cl/internal/linktarget/foo.go | 9 +++++++++ cl/internal/linktarget/out.ll | 26 ++++++++++++++++++++++++ 4 files changed, 88 insertions(+) create mode 100644 cl/_testrt/linkname/in.go create mode 100644 cl/_testrt/linkname/out.ll create mode 100644 cl/internal/linktarget/foo.go create mode 100644 cl/internal/linktarget/out.ll diff --git a/cl/_testrt/linkname/in.go b/cl/_testrt/linkname/in.go new file mode 100644 index 00000000..8e38e101 --- /dev/null +++ b/cl/_testrt/linkname/in.go @@ -0,0 +1,15 @@ +package main + +import ( + _ "unsafe" + + "github.com/goplus/llgo/internal/runtime/c" +) + +//go:linkname print github.com/goplus/llgo/cl/internal/linktarget.F +func print(a, b, c, d *c.Char) + +func main() { + print(c.Str("a"), c.Str("b"), c.Str("c"), c.Str("d")) + print(c.Str("1"), c.Str("2"), c.Str("3"), c.Str("4")) +} diff --git a/cl/_testrt/linkname/out.ll b/cl/_testrt/linkname/out.ll new file mode 100644 index 00000000..4cc36046 --- /dev/null +++ b/cl/_testrt/linkname/out.ll @@ -0,0 +1,38 @@ +; ModuleID = 'main' +source_filename = "main" + +@"main.init$guard" = global ptr null +@0 = private unnamed_addr constant [2 x i8] c"a\00", align 1 +@1 = private unnamed_addr constant [2 x i8] c"b\00", align 1 +@2 = private unnamed_addr constant [2 x i8] c"c\00", align 1 +@3 = private unnamed_addr constant [2 x i8] c"d\00", align 1 +@4 = private unnamed_addr constant [2 x i8] c"1\00", align 1 +@5 = private unnamed_addr constant [2 x i8] c"2\00", align 1 +@6 = private unnamed_addr constant [2 x i8] c"3\00", align 1 +@7 = private unnamed_addr constant [2 x i8] c"4\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() + call void @"github.com/goplus/llgo/cl/internal/linktarget.F"(ptr @0, ptr @1, ptr @2, ptr @3) + call void @"github.com/goplus/llgo/cl/internal/linktarget.F"(ptr @4, ptr @5, ptr @6, ptr @7) + ret void +} + +declare void @"github.com/goplus/llgo/cl/internal/linktarget.F"(ptr, ptr, ptr, ptr) + +declare void @"github.com/goplus/llgo/internal/runtime.init"() diff --git a/cl/internal/linktarget/foo.go b/cl/internal/linktarget/foo.go new file mode 100644 index 00000000..b9f5abc3 --- /dev/null +++ b/cl/internal/linktarget/foo.go @@ -0,0 +1,9 @@ +package linktarget + +import ( + "github.com/goplus/llgo/internal/runtime/c" +) + +func F(a, b *c.Char) { + c.Printf(c.Str("a: %s, b: %s\n"), a, b) +} diff --git a/cl/internal/linktarget/out.ll b/cl/internal/linktarget/out.ll new file mode 100644 index 00000000..02f75a17 --- /dev/null +++ b/cl/internal/linktarget/out.ll @@ -0,0 +1,26 @@ +; ModuleID = 'github.com/goplus/llgo/cl/internal/linktarget' +source_filename = "github.com/goplus/llgo/cl/internal/linktarget" + +@"github.com/goplus/llgo/cl/internal/linktarget.init$guard" = global ptr null +@0 = private unnamed_addr constant [14 x i8] c"a: %s, b: %s\0A\00", align 1 + +define void @"github.com/goplus/llgo/cl/internal/linktarget.F"(ptr %0, ptr %1) { +_llgo_0: + %2 = call i32 (ptr, ...) @printf(ptr @0, ptr %0, ptr %1) + ret void +} + +define void @"github.com/goplus/llgo/cl/internal/linktarget.init"() { +_llgo_0: + %0 = load i1, ptr @"github.com/goplus/llgo/cl/internal/linktarget.init$guard", align 1 + br i1 %0, label %_llgo_2, label %_llgo_1 + +_llgo_1: ; preds = %_llgo_0 + store i1 true, ptr @"github.com/goplus/llgo/cl/internal/linktarget.init$guard", align 1 + br label %_llgo_2 + +_llgo_2: ; preds = %_llgo_1, %_llgo_0 + ret void +} + +declare i32 @printf(ptr, ...)