compiler: build separation runtime with clite

This commit is contained in:
Li Jie
2025-01-07 22:16:31 +08:00
parent 1172e5bdce
commit 6170973b48
316 changed files with 71331 additions and 178 deletions

View File

@@ -0,0 +1,92 @@
package ffi
import (
"unsafe"
c "github.com/goplus/llgo/runtime/internal/clite"
"github.com/goplus/llgo/runtime/internal/clite/ffi"
)
type Type = ffi.Type
type Signature = ffi.Cif
type Error int
func (s Error) Error() string {
switch s {
case ffi.OK:
return "ok"
case ffi.BAD_TYPEDEF:
return "bad type def"
case ffi.BAD_ABI:
return "bad ABI"
case ffi.BAD_ARGTYPE:
return "bad argument type"
}
return "invalid status"
}
func NewSignature(ret *Type, args ...*Type) (*Signature, error) {
var cif Signature
var atype **Type
if len(args) > 0 {
atype = &args[0]
}
status := ffi.PrepCif(&cif, ffi.DefaultAbi, c.Uint(len(args)), ret, atype)
if status == 0 {
return &cif, nil
}
return nil, Error(status)
}
func NewSignatureVar(ret *Type, fixed int, args ...*Type) (*Signature, error) {
var cif Signature
var atype **Type
if len(args) > 0 {
atype = &args[0]
}
status := ffi.PrepCifVar(&cif, ffi.DefaultAbi, c.Uint(fixed), c.Uint(len(args)), ret, atype)
if status == ffi.OK {
return &cif, nil
}
return nil, Error(status)
}
func Call(cif *Signature, fn unsafe.Pointer, ret unsafe.Pointer, args ...unsafe.Pointer) {
var avalues *unsafe.Pointer
if len(args) > 0 {
avalues = &args[0]
}
ffi.Call(cif, fn, ret, avalues)
}
type Closure struct {
ptr unsafe.Pointer
Fn unsafe.Pointer
}
func NewClosure() *Closure {
c := &Closure{}
c.ptr = ffi.ClosureAlloc(&c.Fn)
return c
}
func (c *Closure) Free() {
if c != nil && c.ptr != nil {
ffi.ClosureFree(c.ptr)
c.ptr = nil
}
}
func (c *Closure) Bind(cif *Signature, fn ffi.ClosureFunc, userdata unsafe.Pointer) error {
status := ffi.PreClosureLoc(c.ptr, cif, fn, userdata, c.Fn)
if status == ffi.OK {
return nil
}
return Error(status)
}
func Index(args *unsafe.Pointer, i uintptr) unsafe.Pointer {
return ffi.Index(args, i)
}

View File

@@ -0,0 +1,124 @@
package ffi
import (
"unsafe"
c "github.com/goplus/llgo/runtime/internal/clite"
"github.com/goplus/llgo/runtime/internal/clite/ffi"
)
type BasicKind int
const (
Void BasicKind = iota // type is invalid
// predeclared types
Bool
Int
Int8
Int16
Int32
Int64
Uint
Uint8
Uint16
Uint32
Uint64
Uintptr
Float32
Float64
Complex64
Complex128
String
UnsafePointer
Interface
Slice
// aliases
Byte = Uint8
Rune = Int32
)
const (
_64bit = 1 << (^uintptr(0) >> 63) / 2
_Int = _64bit*ffi.Sint64 + (1-_64bit)*ffi.Sint32
_Uint = _64bit*ffi.Uint64 + (1-_64bit)*ffi.Uint32
_sizei = unsafe.Sizeof(0)
_aligni = uint16(unsafe.Alignof(0))
_sizeci = unsafe.Sizeof(c.Int(0))
_alignci = uint16(unsafe.Alignof(c.Int(0)))
_sizes = unsafe.Sizeof("")
_aligns = uint16(unsafe.Alignof(""))
)
var (
TypeVoid = &Type{1, 1, ffi.Void, nil}
TypeBool = &Type{1, 1, ffi.Uint8, nil}
TypeInt8 = &Type{1, 1, ffi.Sint8, nil}
TypeInt16 = &Type{2, 2, ffi.Sint16, nil}
TypeInt32 = &Type{4, 4, ffi.Sint32, nil}
TypeInt64 = &Type{8, 8, ffi.Sint64, nil}
TypeUint8 = &Type{1, 1, ffi.Uint8, nil}
TypeUint16 = &Type{2, 2, ffi.Uint16, nil}
TypeUint32 = &Type{4, 4, ffi.Uint32, nil}
TypeUint64 = &Type{8, 8, ffi.Uint64, nil}
TypeFloat32 = &Type{4, 4, ffi.Float, nil}
TypeFloat64 = &Type{8, 8, ffi.Double, nil}
TypeComplex64 = &Type{8, 4, ffi.Complex, &[]*Type{TypeFloat32, nil}[0]}
TypeComplex128 = &Type{16, 8, ffi.Complex, &[]*Type{TypeFloat64, nil}[0]}
TypeInt = &Type{_sizei, _aligni, _Int, nil}
TypeUint = &Type{_sizei, _aligni, _Uint, nil}
TypeUintptr = &Type{_sizei, _aligni, _Uint, nil}
TypePointer = &Type{_sizei, _aligni, ffi.Pointer, nil}
TypeString = StructOf(TypePointer, TypeInt)
TypeInterface = StructOf(TypePointer, TypePointer)
TypeSlice = StructOf(TypePointer, TypeInt, TypeInt)
)
var Typ = []*Type{
Void: TypeVoid,
Bool: TypeBool,
Int: TypeInt,
Int8: TypeInt8,
Int16: TypeInt16,
Int32: TypeInt32,
Int64: TypeInt64,
Uint: TypeUint,
Uint8: TypeUint8,
Uint16: TypeUint16,
Uint32: TypeUint32,
Uint64: TypeUint64,
Uintptr: TypeUintptr,
Float32: TypeFloat32,
Float64: TypeFloat64,
Complex64: TypeComplex64,
Complex128: TypeComplex128,
String: TypeString,
UnsafePointer: TypePointer,
Interface: TypeInterface,
Slice: TypeSlice,
}
func ArrayOf(elem *Type, N int) *Type {
fs := make([]*Type, N+1)
for i := 0; i < N; i++ {
fs[i] = elem
}
return &Type{
0,
0,
ffi.Struct,
&fs[0],
}
}
func StructOf(fields ...*Type) *Type {
fs := make([]*Type, len(fields)+1)
copy(fs, fields)
return &Type{
0,
0,
ffi.Struct,
&fs[0],
}
}