_testgo: goroutine

This commit is contained in:
xushiwei
2024-06-01 16:04:35 +08:00
parent e5802853c0
commit 51f3ac2376
5 changed files with 40 additions and 37 deletions

View File

@@ -2,10 +2,10 @@ package main
func main() { func main() {
done := false done := false
go func() { go func(s string) {
println("Hello, World!") println(s)
done = true done = true
}() }("Hello, goroutine")
for !done { for !done {
print(".") print(".")
} }

View File

@@ -6,8 +6,8 @@ source_filename = "main"
@"main.init$guard" = global ptr null @"main.init$guard" = global ptr null
@__llgo_argc = global ptr null @__llgo_argc = global ptr null
@__llgo_argv = global ptr null @__llgo_argv = global ptr null
@0 = private unnamed_addr constant [2 x i8] c".\00", align 1 @0 = private unnamed_addr constant [17 x i8] c"Hello, goroutine\00", align 1
@1 = private unnamed_addr constant [14 x i8] c"Hello, World!\00", align 1 @1 = private unnamed_addr constant [2 x i8] c".\00", align 1
define void @main.init() { define void @main.init() {
_llgo_0: _llgo_0:
@@ -39,48 +39,50 @@ _llgo_0:
%7 = getelementptr inbounds { ptr, ptr }, ptr %5, i32 0, i32 1 %7 = getelementptr inbounds { ptr, ptr }, ptr %5, i32 0, i32 1
store ptr %3, ptr %7, align 8 store ptr %3, ptr %7, align 8
%8 = load { ptr, ptr }, ptr %5, align 8 %8 = load { ptr, ptr }, ptr %5, align 8
%9 = call ptr @malloc(i64 16) %9 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%10 = getelementptr inbounds { { ptr, ptr } }, ptr %9, i32 0, i32 0 %10 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %9, i32 0, i32 0
store { ptr, ptr } %8, ptr %10, align 8 store ptr @0, ptr %10, align 8
%11 = alloca i8, i64 8, align 1 %11 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %9, i32 0, i32 1
%12 = call i32 @pthread_create(ptr %11, ptr null, ptr @"main._llgo_routine$1", ptr %9) store i64 16, ptr %11, align 4
%12 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %9, align 8
%13 = call ptr @malloc(i64 32)
%14 = getelementptr inbounds { { ptr, ptr }, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %13, i32 0, i32 0
store { ptr, ptr } %8, ptr %14, align 8
%15 = getelementptr inbounds { { ptr, ptr }, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %13, i32 0, i32 1
store %"github.com/goplus/llgo/internal/runtime.String" %12, ptr %15, align 8
%16 = alloca i8, i64 8, align 1
%17 = call i32 @pthread_create(ptr %16, ptr null, ptr @"main._llgo_routine$1", ptr %13)
br label %_llgo_3 br label %_llgo_3
_llgo_1: ; preds = %_llgo_3 _llgo_1: ; preds = %_llgo_3
%13 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %18 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8
%14 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %13, i32 0, i32 0 %19 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %18, i32 0, i32 0
store ptr @0, ptr %14, align 8 store ptr @1, ptr %19, align 8
%15 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %13, i32 0, i32 1 %20 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %18, i32 0, i32 1
store i64 1, ptr %15, align 4 store i64 1, ptr %20, align 4
%16 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %13, align 8 %21 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %18, align 8
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.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %21)
br label %_llgo_3 br label %_llgo_3
_llgo_2: ; preds = %_llgo_3 _llgo_2: ; preds = %_llgo_3
ret i32 0 ret i32 0
_llgo_3: ; preds = %_llgo_1, %_llgo_0 _llgo_3: ; preds = %_llgo_1, %_llgo_0
%17 = load i1, ptr %2, align 1 %22 = load i1, ptr %2, align 1
br i1 %17, label %_llgo_2, label %_llgo_1 br i1 %22, label %_llgo_2, label %_llgo_1
} }
declare void @"github.com/goplus/llgo/internal/runtime.init"() declare void @"github.com/goplus/llgo/internal/runtime.init"()
declare ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64) declare ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64)
define void @"main.main$1"(ptr %0) { define void @"main.main$1"(ptr %0, %"github.com/goplus/llgo/internal/runtime.String" %1) {
_llgo_0: _llgo_0:
%1 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %1)
%2 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %1, i32 0, i32 0
store ptr @1, ptr %2, align 8
%3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %1, i32 0, i32 1
store i64 13, ptr %3, align 4
%4 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %1, align 8
call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %4)
call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10)
%5 = load { ptr }, ptr %0, align 8 %2 = load { ptr }, ptr %0, align 8
%6 = extractvalue { ptr } %5, 0 %3 = extractvalue { ptr } %2, 0
store i1 true, ptr %6, align 1 store i1 true, ptr %3, align 1
ret void ret void
} }
@@ -90,12 +92,13 @@ declare ptr @malloc(i64)
define ptr @"main._llgo_routine$1"(ptr %0) { define ptr @"main._llgo_routine$1"(ptr %0) {
_llgo_0: _llgo_0:
%1 = load { { ptr, ptr } }, ptr %0, align 8 %1 = load { { ptr, ptr }, %"github.com/goplus/llgo/internal/runtime.String" }, ptr %0, align 8
%2 = extractvalue { { ptr, ptr } } %1, 0 %2 = extractvalue { { ptr, ptr }, %"github.com/goplus/llgo/internal/runtime.String" } %1, 0
%3 = extractvalue { ptr, ptr } %2, 1 %3 = extractvalue { { ptr, ptr }, %"github.com/goplus/llgo/internal/runtime.String" } %1, 1
%4 = extractvalue { ptr, ptr } %2, 0 %4 = extractvalue { ptr, ptr } %2, 1
call void %4(ptr %3) %5 = extractvalue { ptr, ptr } %2, 0
call void @free({ { ptr, ptr } } %1) call void %5(ptr %4, %"github.com/goplus/llgo/internal/runtime.String" %3)
call void @free(ptr %0)
ret ptr null ret ptr null
} }

Binary file not shown.

Binary file not shown.

View File

@@ -106,7 +106,7 @@ func (p Package) routine(t Type, n int) Expr {
args[i] = b.getField(data, i+1) args[i] = b.getField(data, i+1)
} }
b.Call(fn, args...) b.Call(fn, args...)
b.free(data) b.free(param)
b.Return(prog.Null(prog.VoidPtr())) b.Return(prog.Null(prog.VoidPtr()))
return routine.Expr return routine.Expr
} }