Merge pull request #264 from xushiwei/q
llgo/ssa getDefer fix: move to function start
This commit is contained in:
@@ -37,10 +37,6 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0
|
|||||||
|
|
||||||
define i32 @main(i32 %0, ptr %1) {
|
define i32 @main(i32 %0, ptr %1) {
|
||||||
_llgo_0:
|
_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
|
%2 = load ptr, ptr @__llgo_defer, align 8
|
||||||
%3 = call ptr @pthread_getspecific(ptr %2)
|
%3 = call ptr @pthread_getspecific(ptr %2)
|
||||||
%4 = alloca i8, i64 40, align 1
|
%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
|
%7 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Defer", ptr %4, i32 0, i32 2
|
||||||
store ptr %3, ptr %7, align 8
|
store ptr %3, ptr %7, align 8
|
||||||
%8 = call i32 @pthread_setspecific(ptr %2, ptr %4)
|
%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
|
%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
|
%10 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Defer", ptr %4, i32 0, i32 3
|
||||||
%11 = load i64, ptr %9, align 4
|
%11 = load i64, ptr %9, align 4
|
||||||
|
|||||||
@@ -191,11 +191,12 @@ func (b Builder) deferKey() Expr {
|
|||||||
func (b Builder) getDefer() *aDefer {
|
func (b Builder) getDefer() *aDefer {
|
||||||
self := b.Func
|
self := b.Func
|
||||||
if self.defer_ == nil {
|
if self.defer_ == nil {
|
||||||
// TODO(xsw): move to funtion start
|
// TODO(xsw): if in pkg.init?
|
||||||
// 0: proc func(uintptr)
|
// 0: proc func(uintptr)
|
||||||
// 1: bits uintptr
|
// 1: bits uintptr
|
||||||
// 2: link *Defer
|
// 2: link *Defer
|
||||||
// 3: rund int
|
// 3: rund int
|
||||||
|
b.SetBlockEx(b.blk, AtStart, false)
|
||||||
prog := b.Prog
|
prog := b.Prog
|
||||||
key := b.deferKey()
|
key := b.deferKey()
|
||||||
deferfn := prog.Null(prog.VoidPtr())
|
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)
|
ptr := b.aggregateAlloca(prog.Defer(), deferfn.impl, zero.impl, link.impl)
|
||||||
deferData := Expr{ptr, prog.DeferPtr()}
|
deferData := Expr{ptr, prog.DeferPtr()}
|
||||||
b.pthreadSetspecific(key, deferData)
|
b.pthreadSetspecific(key, deferData)
|
||||||
|
b.SetBlockEx(b.blk, AtEnd, false)
|
||||||
self.defer_ = &aDefer{
|
self.defer_ = &aDefer{
|
||||||
key: key,
|
key: key,
|
||||||
data: deferData,
|
data: deferData,
|
||||||
|
|||||||
Reference in New Issue
Block a user