This commit is contained in:
xushiwei
2024-05-04 07:21:07 +08:00
parent 809a400f57
commit 1cff02e4cc
5 changed files with 51 additions and 13 deletions

View File

@@ -18,6 +18,7 @@ package ssa
import (
"fmt"
"go/token"
"go/types"
"github.com/goplus/llvm"
@@ -94,7 +95,7 @@ type Type = *aType
// TODO(xsw):
// how to generate platform independent code?
func (p Program) SizeOf(typ Type, n ...int64) uint64 {
size := p.td.TypeStoreSize(typ.ll)
size := p.td.TypeAllocSize(typ.ll)
if len(n) != 0 {
size *= uint64(n[0])
}
@@ -120,7 +121,8 @@ func (p Program) Index(typ Type) Type {
func (p Program) Field(typ Type, i int) Type {
tunder := typ.t.Underlying()
return p.Type(tunder.(*types.Struct).Field(i).Type())
tfld := tunder.(*types.Struct).Field(i).Type()
return p.Type(tfld)
}
func (p Program) Type(typ types.Type) Type {
@@ -305,8 +307,6 @@ func (p Program) toLLVMTypes(t *types.Tuple, n int) (ret []llvm.Type) {
}
func (p Program) toLLVMFunc(sig *types.Signature, inC, isDecl bool) Type {
var kind valueKind
var ft llvm.Type
if isDecl || inC {
tParams := sig.Params()
n := tParams.Len()
@@ -317,6 +317,7 @@ func (p Program) toLLVMFunc(sig *types.Signature, inC, isDecl bool) Type {
params := p.toLLVMTypes(tParams, n)
out := sig.Results()
var ret llvm.Type
var kind valueKind
switch nret := out.Len(); nret {
case 0:
ret = p.tyVoid()
@@ -325,18 +326,20 @@ func (p Program) toLLVMFunc(sig *types.Signature, inC, isDecl bool) Type {
default:
ret = p.toLLVMTuple(out)
}
ft = llvm.FunctionType(ret, params, hasVArg)
ft := llvm.FunctionType(ret, params, hasVArg)
if isDecl {
kind = vkFuncDecl
} else {
ft = llvm.PointerType(ft, 0)
kind = vkFuncPtr
}
} else {
ft = p.rtClosure()
kind = vkClosure
return &aType{ft, sig, kind}
}
return &aType{ft, sig, kind}
flds := []*types.Var{
types.NewField(token.NoPos, nil, "f", (*CFuncPtr)(sig), false),
types.NewField(token.NoPos, nil, "data", types.Typ[types.UnsafePointer], false),
}
return &aType{p.rtClosure(), types.NewStruct(flds, nil), vkClosure}
}
func (p Program) retType(sig *types.Signature) Type {