From d4bf66936abe61f86c5ad42b92400842c11a8b2e Mon Sep 17 00:00:00 2001 From: Li Jie Date: Wed, 9 Apr 2025 10:14:46 +0800 Subject: [PATCH] specify setjmp/longjmp function names on wasm --- ssa/eh.go | 41 +++++++++++++++++++++++++++++++++++++++++ ssa/package.go | 2 ++ 2 files changed, 43 insertions(+) diff --git a/ssa/eh.go b/ssa/eh.go index 7bb3a568..a0c35c46 100644 --- a/ssa/eh.go +++ b/ssa/eh.go @@ -32,6 +32,29 @@ import ( type sigjmpbuf = C.sigjmp_buf +// func setjmp(env unsafe.Pointer) c.Int +func (p Program) tySetjmp() *types.Signature { + if p.setjmpTy == nil { + paramPtr := types.NewParam(token.NoPos, nil, "", p.VoidPtr().raw.Type) + paramCInt := types.NewParam(token.NoPos, nil, "", p.CInt().raw.Type) + params := types.NewTuple(paramPtr) + results := types.NewTuple(paramCInt) + p.setjmpTy = types.NewSignatureType(nil, nil, nil, params, results, false) + } + return p.setjmpTy +} + +// func longjmp(env unsafe.Pointer, retval c.Int) +func (p Program) tyLongjmp() *types.Signature { + if p.longjmpTy == nil { + paramPtr := types.NewParam(token.NoPos, nil, "", p.VoidPtr().raw.Type) + paramCInt := types.NewParam(token.NoPos, nil, "", p.CInt().raw.Type) + params := types.NewTuple(paramPtr, paramCInt) + p.longjmpTy = types.NewSignatureType(nil, nil, nil, params, nil, false) + } + return p.longjmpTy +} + // func(env unsafe.Pointer, savemask c.Int) c.Int func (p Program) tySigsetjmp() *types.Signature { if p.sigsetjmpTy == nil { @@ -63,6 +86,9 @@ func (b Builder) AllocaSigjmpBuf() Expr { } func (b Builder) Sigsetjmp(jb, savemask Expr) Expr { + if b.Prog.target.GOARCH == "wasm" { + return b.Setjmp(jb) + } fname := "sigsetjmp" if b.Prog.target.GOOS == "linux" { fname = "__sigsetjmp" @@ -72,11 +98,26 @@ func (b Builder) Sigsetjmp(jb, savemask Expr) Expr { } func (b Builder) Siglongjmp(jb, retval Expr) { + if b.Prog.target.GOARCH == "wasm" { + b.Longjmp(jb, retval) + return + } fn := b.Pkg.cFunc("siglongjmp", b.Prog.tySiglongjmp()) // TODO(xsw): mark as noreturn b.Call(fn, jb, retval) // b.Unreachable() } +func (b Builder) Setjmp(jb Expr) Expr { + fn := b.Pkg.cFunc("setjmp", b.Prog.tySetjmp()) + return b.Call(fn, jb) +} + +func (b Builder) Longjmp(jb, retval Expr) { + fn := b.Pkg.cFunc("longjmp", b.Prog.tyLongjmp()) + b.Call(fn, jb, retval) + // b.Unreachable() +} + // ----------------------------------------------------------------------------- const ( diff --git a/ssa/package.go b/ssa/package.go index cee0bbd3..981eebb6 100644 --- a/ssa/package.go +++ b/ssa/package.go @@ -194,6 +194,8 @@ type aProgram struct { setSpecTy *types.Signature routineTy *types.Signature destructTy *types.Signature + setjmpTy *types.Signature + longjmpTy *types.Signature sigsetjmpTy *types.Signature sigljmpTy *types.Signature