From 8c105d87c1e6546043b99d8c4e0d9e211a294ae2 Mon Sep 17 00:00:00 2001 From: xushiwei Date: Tue, 28 May 2024 23:45:32 +0800 Subject: [PATCH] runtime: newNamed; llgo/ssa: abiMethodOf --- cl/_testgo/errors/out.ll | 66 ++++++++++++++++-------- internal/runtime/llgo_autogen.lla | Bin 13142 -> 13557 bytes internal/runtime/z_face.go | 17 ++++++- internal/runtime/z_type.go | 24 +++++---- ssa/interface.go | 80 ++++++++++++++++++++++-------- 5 files changed, 134 insertions(+), 53 deletions(-) diff --git a/cl/_testgo/errors/out.ll b/cl/_testgo/errors/out.ll index 930efb98..40e32fde 100644 --- a/cl/_testgo/errors/out.ll +++ b/cl/_testgo/errors/out.ll @@ -15,18 +15,19 @@ source_filename = "main" @__llgo_argc = global ptr null @__llgo_argv = global ptr null @0 = private unnamed_addr constant [9 x i8] c"an error\00", align 1 +@1 = private unnamed_addr constant [9 x i8] c"Imethod:\00", align 1 @_llgo_main.errorString = global ptr null -@1 = private unnamed_addr constant [6 x i8] c"Error\00", align 1 +@2 = private unnamed_addr constant [6 x i8] c"Error\00", align 1 @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to" = linkonce global ptr null -@2 = private unnamed_addr constant [5 x i8] c"main\00", align 1 +@3 = private unnamed_addr constant [5 x i8] c"main\00", align 1 @"main.struct$QTufDJA9wEDzuzgkA-ZSrLqW-B6lWN8O25mTSglAoLQ" = global ptr null -@3 = private unnamed_addr constant [6 x i8] c"Error\00", align 1 +@4 = private unnamed_addr constant [6 x i8] c"Error\00", align 1 @"_llgo_func$8LHAAczeMU-_MsqDJ4-62jHfhzpiOiRnFkBoaL3mfxg" = linkonce global ptr null -@4 = private unnamed_addr constant [5 x i8] c"main\00", align 1 -@5 = private unnamed_addr constant [17 x i8] c"main.errorString\00", align 1 -@6 = private unnamed_addr constant [2 x i8] c"s\00", align 1 -@7 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 -@8 = private unnamed_addr constant [5 x i8] c"main\00", align 1 +@5 = private unnamed_addr constant [5 x i8] c"main\00", align 1 +@6 = private unnamed_addr constant [17 x i8] c"main.errorString\00", align 1 +@7 = private unnamed_addr constant [2 x i8] c"s\00", align 1 +@8 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 +@9 = private unnamed_addr constant [5 x i8] c"main\00", align 1 define %"github.com/goplus/llgo/internal/runtime.iface" @main.New(%"github.com/goplus/llgo/internal/runtime.String" %0) { _llgo_0: @@ -91,10 +92,27 @@ _llgo_0: %13 = getelementptr inbounds { ptr, ptr }, ptr %11, i32 0, i32 1 store ptr %10, ptr %13, align 8 %14 = load { ptr, ptr }, ptr %11, align 8 - %15 = extractvalue { ptr, ptr } %14, 1 - %16 = extractvalue { ptr, ptr } %14, 0 - %17 = call %"github.com/goplus/llgo/internal/runtime.String" %16(ptr %15) - call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %17) + %15 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %16 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %15, i32 0, i32 0 + store ptr @1, ptr %16, align 8 + %17 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %15, i32 0, i32 1 + store i64 8, ptr %17, align 4 + %18 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %15, align 8 + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %18) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr %7) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + %19 = extractvalue { ptr, ptr } %14, 0 + call void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr %19) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 10) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 0) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) + %20 = extractvalue { ptr, ptr } %14, 1 + %21 = extractvalue { ptr, ptr } %14, 0 + %22 = call %"github.com/goplus/llgo/internal/runtime.String" %21(ptr %20) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %22) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) ret i32 0 } @@ -111,6 +129,10 @@ declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8) declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String") +declare void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr) + +declare void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64) + define void @"main.init$abi"() { _llgo_0: call void @"main.init$abi2"() @@ -124,7 +146,7 @@ _llgo_0: _llgo_1: ; preds = %_llgo_0 %4 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %5 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %4, i32 0, i32 0 - store ptr @1, ptr %5, align 8 + store ptr @2, ptr %5, align 8 %6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %4, i32 0, i32 1 store i64 5, ptr %6, align 4 %7 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %4, align 8 @@ -148,7 +170,7 @@ _llgo_1: ; preds = %_llgo_0 %19 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %15, align 8 %20 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %21 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %20, i32 0, i32 0 - store ptr @2, ptr %21, align 8 + store ptr @3, ptr %21, align 8 %22 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %20, i32 0, i32 1 store i64 4, ptr %22, align 4 %23 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %20, align 8 @@ -172,7 +194,7 @@ _llgo_0: %0 = load ptr, ptr @"main.struct$QTufDJA9wEDzuzgkA-ZSrLqW-B6lWN8O25mTSglAoLQ", align 8 %1 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %2 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %1, i32 0, i32 0 - store ptr @3, ptr %2, align 8 + store ptr @4, ptr %2, align 8 %3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %1, i32 0, i32 1 store i64 5, ptr %3, align 4 %4 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %1, align 8 @@ -200,17 +222,17 @@ _llgo_0: %18 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %14, align 8 %19 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %20 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %19, i32 0, i32 0 - store ptr @4, ptr %20, align 8 + store ptr @5, ptr %20, align 8 %21 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %19, i32 0, i32 1 store i64 4, ptr %21, align 4 %22 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %19, align 8 %23 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %24 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %23, i32 0, i32 0 - store ptr @5, ptr %24, align 8 + store ptr @6, ptr %24, align 8 %25 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %23, i32 0, i32 1 store i64 16, ptr %25, align 4 %26 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %23, align 8 - %27 = call ptr @"github.com/goplus/llgo/internal/runtime.Named"(%"github.com/goplus/llgo/internal/runtime.String" %22, %"github.com/goplus/llgo/internal/runtime.String" %26, ptr %0, %"github.com/goplus/llgo/internal/runtime.Slice" %18) + %27 = call ptr @"github.com/goplus/llgo/internal/runtime.Named"(%"github.com/goplus/llgo/internal/runtime.String" %22, %"github.com/goplus/llgo/internal/runtime.String" %26, ptr %0, { ptr, i64, i64 } zeroinitializer, %"github.com/goplus/llgo/internal/runtime.Slice" %18) store ptr %27, ptr @_llgo_main.errorString, align 8 %28 = load ptr, ptr @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to", align 8 %29 = icmp eq ptr %28, null @@ -246,7 +268,7 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 ret void } -declare ptr @"github.com/goplus/llgo/internal/runtime.Named"(%"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.String", ptr, %"github.com/goplus/llgo/internal/runtime.Slice") +declare ptr @"github.com/goplus/llgo/internal/runtime.Named"(%"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.String", ptr, %"github.com/goplus/llgo/internal/runtime.Slice", %"github.com/goplus/llgo/internal/runtime.Slice") declare ptr @"github.com/goplus/llgo/internal/runtime.Func"(%"github.com/goplus/llgo/internal/runtime.Slice", %"github.com/goplus/llgo/internal/runtime.Slice", i1) @@ -256,21 +278,21 @@ define void @"main.init$abi3"() { _llgo_0: %0 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %0, i32 0, i32 0 - store ptr @6, ptr %1, align 8 + store ptr @7, ptr %1, align 8 %2 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %0, i32 0, i32 1 store i64 1, ptr %2, align 4 %3 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %0, align 8 %4 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) %5 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %5, i32 0, i32 0 - store ptr @7, ptr %6, align 8 + store ptr @8, ptr %6, align 8 %7 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %5, i32 0, i32 1 store i64 0, ptr %7, align 4 %8 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %5, align 8 %9 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %3, ptr %4, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %8, i1 false) %10 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %11 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %10, i32 0, i32 0 - store ptr @8, ptr %11, align 8 + store ptr @9, ptr %11, align 8 %12 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %10, i32 0, i32 1 store i64 4, ptr %12, align 4 %13 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %10, align 8 diff --git a/internal/runtime/llgo_autogen.lla b/internal/runtime/llgo_autogen.lla index d723b748bd1d2a1dd044d1eb4109eb00d213edf3..d7e201b37a690d88b62f0bab10b0d504cd11caaf 100644 GIT binary patch literal 13557 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 literal 13142 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 h=nLfkMPL43*o%rhB-H Named:", pkgPath, name, ret, ret.Uncommon()) return ret } @@ -216,6 +228,7 @@ func NewItab(inter *InterfaceType, typ *Type) *Itab { ret.hash = typ.Hash u := typ.Uncommon() + println("==> NewItab Uncommon:", typ, u) if u == nil { ret.fun[0] = 0 } else { @@ -228,6 +241,7 @@ func NewItab(inter *InterfaceType, typ *Type) *Itab { break } *c.Advance(data, i) = uintptr(fn) + println("==> NewItab:", ret, i, fn) } } return ret @@ -238,6 +252,7 @@ func findMethod(mthds []abi.Method, im abi.Imethod) abi.Text { for _, m := range mthds { mName := m.Name_ if mName >= imName { + println("==> findMethod:", mName, imName, m.Mtyp_, im.Typ_, m.Ifn_) if mName == imName && m.Mtyp_ == im.Typ_ { println("==> findMethod", mName, m.Ifn_) return m.Ifn_ diff --git a/internal/runtime/z_type.go b/internal/runtime/z_type.go index 08c11b03..8d6f8261 100644 --- a/internal/runtime/z_type.go +++ b/internal/runtime/z_type.go @@ -116,20 +116,25 @@ func Struct(pkgPath string, size uintptr, fields ...abi.StructField) *Type { func PointerTo(elem *Type) *Type { ret := elem.PtrToThis_ if ret == nil { - ptr := &abi.PtrType{ - Type: Type{ - Size_: unsafe.Sizeof(uintptr(0)), - Hash: uint32(abi.Pointer), // TODO(xsw): hash - Kind_: uint8(abi.Pointer), - }, - Elem: elem, - } - ret = &ptr.Type + ret = newPointer(elem) elem.PtrToThis_ = ret } return ret } +func newPointer(elem *Type) *Type { + ptr := &abi.PtrType{ + Type: Type{ + Size_: unsafe.Sizeof(uintptr(0)), + Hash: uint32(abi.Pointer), // TODO(xsw): hash + Kind_: uint8(abi.Pointer), + }, + Elem: elem, + } + return &ptr.Type +} + +// SliceOf returns the slice type with element elem. func SliceOf(elem *Type) *Type { ret := &abi.SliceType{ Type: Type{ @@ -142,6 +147,7 @@ func SliceOf(elem *Type) *Type { return &ret.Type } +// ArrayOf returns the array type with element elem and length. func ArrayOf(length uintptr, elem *Type) *Type { ret := &abi.ArrayType{ Type: Type{ diff --git a/ssa/interface.go b/ssa/interface.go index f89a3edc..95c2f385 100644 --- a/ssa/interface.go +++ b/ssa/interface.go @@ -94,22 +94,48 @@ func (b Builder) abiImethodOf(m *types.Func) Expr { prog := b.Prog name := b.Str(m.Name()) typ := b.abiType(m.Type()) + tname, _ := b.Pkg.abi.TypeName(m.Type()) + log.Println("==> abiImethodOf:", m.Name(), m.Type(), tname) + b.Println(b.Str("==> abiImethodOf:"), typ) return b.aggregateValue(prog.rtType("Imethod"), name.impl, typ.impl) } // Method{name string, typ *FuncType, ifn, tfn abi.Text} -func (b Builder) abiMethodOf(m *types.Func) Expr { +func (b Builder) abiMethodOf(m *types.Func /*, bg Background = InGo */) (mthd, ptrMthd Expr) { prog := b.Prog - mName := m.Name() + mPkg, mName := m.Pkg(), m.Name() mSig := m.Type().(*types.Signature) - fullName := FuncName(m.Pkg(), mName, mSig.Recv()) - name := b.Str(mName) - fn := b.Pkg.NewFunc(fullName, mSig, InGo) - sig := fn.raw.Type.(*types.Signature) - sig = types.NewSignatureType(nil, nil, nil, sig.Params(), sig.Results(), sig.Variadic()) - typ := b.abiType(sig) - // TODO(xsw): ifn, tfn - return b.aggregateValue(prog.rtType("Method"), name.impl, typ.impl, fn.impl, fn.impl) + + name := b.Str(mName).impl + abiSigGo := types.NewSignatureType(nil, nil, nil, mSig.Params(), mSig.Results(), mSig.Variadic()) + abiSig := prog.FuncDecl(abiSigGo, InGo).raw.Type + abiTyp := b.abiType(abiSig) + tname, _ := b.Pkg.abi.TypeName(abiSig) + log.Println("==> abiMethodOf:", mName, abiSigGo, tname) + b.Println(b.Str("==> abiMethodOf:"), abiTyp) + abiTypImpl := abiTyp.impl + + recv := mSig.Recv() + recvType := recv.Type() + if _, ok := recvType.(*types.Pointer); ok { + ptrMthd, _ = b.abiMthd(mPkg, mName, mSig, name, abiTypImpl, llvm.Value{}) + return + } + ptrRecv := types.NewVar(0, nil, "", types.NewPointer(recvType)) + ptrSig := types.NewSignatureType(ptrRecv, nil, nil, mSig.Params(), mSig.Results(), mSig.Variadic()) + ptrMthd, ifn := b.abiMthd(mPkg, mName, ptrSig, name, abiTypImpl, llvm.Value{}) + mthd, _ = b.abiMthd(mPkg, mName, mSig, name, abiTypImpl, ifn) + return +} + +func (b Builder) abiMthd(mPkg *types.Package, mName string, mSig *types.Signature, name, abiTyp, ifn llvm.Value) (ret Expr, tfn llvm.Value) { + fullName := FuncName(mPkg, mName, mSig.Recv()) + tfn = b.Pkg.NewFunc(fullName, mSig, InGo).impl // TODO(xsw): use rawType to speed up + if ifn.IsNil() { + ifn = tfn + } + ret = b.aggregateValue(b.Prog.rtType("Method"), name, abiTyp, ifn, tfn) + return } // func Interface(pkgPath string, methods []abi.Imethod) @@ -129,10 +155,9 @@ func (b Builder) abiInterfaceOf(t *types.Interface) Expr { return b.Call(fn, b.Str(pkgPath), methodSlice) } -// func Named(pkgPath, name string, underlying *Type, methods []abi.Method) +// func Named(pkgPath, name string, underlying *Type, methods, ptrMethods []abi.Method) func (b Builder) abiNamedOf(t *types.Named) Expr { - tunder := t.Underlying() - under := b.abiType(tunder) + under := b.abiType(t.Underlying()) path := abi.PathOf(t.Obj().Pkg()) name := NameOf(t) prog := b.Prog @@ -140,19 +165,30 @@ func (b Builder) abiNamedOf(t *types.Named) Expr { var fn = pkg.rtFunc("Named") var tSlice = lastParamType(prog, fn) - var methods Expr - if _, ok := tunder.(*types.Interface); ok { + var n = t.NumMethods() + var methods, ptrMethods Expr + if n == 0 { methods = prog.Zero(tSlice) + ptrMethods = methods } else { - n := t.NumMethods() - mths := make([]Expr, n) + var mthds []Expr + var ptrMthds = make([]Expr, 0, n) for i := 0; i < n; i++ { m := t.Method(i) - mths[i] = b.abiMethodOf(m) + mthd, ptrMthd := b.abiMethodOf(m) + if !mthd.IsNil() { + mthds = append(mthds, mthd) + } + ptrMthds = append(ptrMthds, ptrMthd) } - methods = b.SliceLit(tSlice, mths...) + if len(mthds) > 0 { + methods = b.SliceLit(tSlice, mthds...) + } else { + methods = prog.Zero(tSlice) + } + ptrMethods = b.SliceLit(tSlice, ptrMthds...) } - return b.Call(fn, b.Str(path), b.Str(name), under, methods) + return b.Call(fn, b.Str(path), b.Str(name), under, methods, ptrMethods) } func (b Builder) abiPointerOf(t *types.Pointer) Expr { @@ -288,7 +324,9 @@ func (b Builder) Imethod(intf Expr, method *types.Func) Expr { itab := Expr{b.faceItab(impl), prog.VoidPtrPtr()} pfn := b.Advance(itab, prog.IntVal(uint64(i+3), prog.Int())) fn := b.Load(pfn) - return b.aggregateValue(tclosure, fn.impl, b.faceData(impl)) + ret := b.aggregateValue(tclosure, fn.impl, b.faceData(impl)) + b.Println(b.Str("Imethod:"), itab, ret, prog.Val(ret.kind), prog.Val(i)) + return ret } // -----------------------------------------------------------------------------