diff --git a/cl/_testgo/defer/out.ll b/cl/_testgo/defer/out.ll index d7649276..ebb35a1c 100644 --- a/cl/_testgo/defer/out.ll +++ b/cl/_testgo/defer/out.ll @@ -37,10 +37,6 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 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 = load ptr, ptr @__llgo_defer, align 8 %3 = call ptr @pthread_getspecific(ptr %2) %4 = alloca i8, i64 40, align 1 @@ -51,6 +47,10 @@ _llgo_0: %7 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Defer", ptr %4, i32 0, i32 2 store ptr %3, ptr %7, align 8 %8 = call i32 @pthread_setspecific(ptr %2, ptr %4) + 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() %9 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Defer", ptr %4, i32 0, i32 1 %10 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Defer", ptr %4, i32 0, i32 3 %11 = load i64, ptr %9, align 4 diff --git a/ssa/stmt_builder.go b/ssa/stmt_builder.go index 9f59e656..d77dfb2a 100644 --- a/ssa/stmt_builder.go +++ b/ssa/stmt_builder.go @@ -191,11 +191,12 @@ func (b Builder) deferKey() Expr { func (b Builder) getDefer() *aDefer { self := b.Func if self.defer_ == nil { - // TODO(xsw): move to funtion start + // TODO(xsw): if in pkg.init? // 0: proc func(uintptr) // 1: bits uintptr // 2: link *Defer // 3: rund int + b.SetBlockEx(b.blk, AtStart, false) prog := b.Prog key := b.deferKey() deferfn := prog.Null(prog.VoidPtr()) @@ -204,6 +205,7 @@ func (b Builder) getDefer() *aDefer { ptr := b.aggregateAlloca(prog.Defer(), deferfn.impl, zero.impl, link.impl) deferData := Expr{ptr, prog.DeferPtr()} b.pthreadSetspecific(key, deferData) + b.SetBlockEx(b.blk, AtEnd, false) self.defer_ = &aDefer{ key: key, data: deferData,