From 914a0c60b0fe4e591c409d7f69c077db55ebd01d Mon Sep 17 00:00:00 2001 From: xushiwei Date: Sun, 26 May 2024 08:59:10 +0800 Subject: [PATCH 1/6] runtime: iface --- internal/abi/llgo_autogen.lla | Bin 5835 -> 6546 bytes internal/abi/type.go | 69 ++++++++++ internal/runtime/c/c.go | 4 +- internal/runtime/llgo_autogen.lla | Bin 10446 -> 0 bytes internal/runtime/runtime2.go | 44 ------- internal/runtime/z_face.go | 209 ++++++++++++++++++++++++++++++ internal/runtime/z_type.go | 106 ++------------- ssa/interface.go | 2 +- 8 files changed, 295 insertions(+), 139 deletions(-) delete mode 100644 internal/runtime/llgo_autogen.lla delete mode 100644 internal/runtime/runtime2.go create mode 100644 internal/runtime/z_face.go diff --git a/internal/abi/llgo_autogen.lla b/internal/abi/llgo_autogen.lla index 0d23b976a79850e7f469d1bac1af16222eca398f..6e0de50e42d471f15c1ff1490315bbfdc3a4a9b6 100644 GIT binary patch literal 6546 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 literal 5835 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 diff --git a/internal/abi/type.go b/internal/abi/type.go index b43621a9..a6a01d85 100644 --- a/internal/abi/type.go +++ b/internal/abi/type.go @@ -240,6 +240,11 @@ type Method struct { Tfn_ Text // fn used for normal method call } +// Exported reports whether the method is exported. +func (p *Method) Exported() bool { + return p.Name_.IsExported() +} + // UncommonType is present only for defined types or types with methods // (if T is a defined type, the uncommonTypes for T and *T have methods). // Using a pointer to this struct reduces the overall size required @@ -285,6 +290,70 @@ func (t *Type) Common() *Type { return t } +type structTypeUncommon struct { + StructType + u UncommonType +} + +// Uncommon returns a pointer to T's "uncommon" data if there is any, otherwise nil +func (t *Type) Uncommon() *UncommonType { + if t.TFlag&TFlagUncommon == 0 { + return nil + } + switch t.Kind() { + case Struct: + return &(*structTypeUncommon)(unsafe.Pointer(t)).u + case Pointer: + type u struct { + PtrType + u UncommonType + } + return &(*u)(unsafe.Pointer(t)).u + case Func: + type u struct { + FuncType + u UncommonType + } + return &(*u)(unsafe.Pointer(t)).u + case Slice: + type u struct { + SliceType + u UncommonType + } + return &(*u)(unsafe.Pointer(t)).u + case Array: + type u struct { + ArrayType + u UncommonType + } + return &(*u)(unsafe.Pointer(t)).u + case Chan: + type u struct { + ChanType + u UncommonType + } + return &(*u)(unsafe.Pointer(t)).u + case Map: + type u struct { + MapType + u UncommonType + } + return &(*u)(unsafe.Pointer(t)).u + case Interface: + type u struct { + InterfaceType + u UncommonType + } + return &(*u)(unsafe.Pointer(t)).u + default: + type u struct { + Type + u UncommonType + } + return &(*u)(unsafe.Pointer(t)).u + } +} + // Len returns the length of t if t is an array type, otherwise 0 func (t *Type) Len() int { if t.Kind() == Array { diff --git a/internal/runtime/c/c.go b/internal/runtime/c/c.go index eb502d92..3d200e36 100644 --- a/internal/runtime/c/c.go +++ b/internal/runtime/c/c.go @@ -42,8 +42,8 @@ var Stderr FilePtr //go:linkname Str llgo.cstr func Str(string) *Char -//go:linkname Advance llgo.advance -func Advance(ptr Pointer, offset int) Pointer +// llgo:link Advance llgo.advance +func Advance[PtrT any](ptr PtrT, offset int) PtrT { return ptr } //go:linkname Alloca llgo.alloca func Alloca(size uintptr) Pointer diff --git a/internal/runtime/llgo_autogen.lla b/internal/runtime/llgo_autogen.lla deleted file mode 100644 index e2f90b846916d15002039bdd162880539e78866f..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10446 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 l|GWEtkVDA-gB<=}xS@(XB-H 0 || pkgPath.Bytes != nil { + size += uncommonTypeHdrSize + uintptr(n)*methodSize + tflag |= abi.TFlagUncommon + } + ptr := AllocU(size) + + ret := (*Type)(ptr) + *ret = *underlying + ret.TFlag = tflag | abi.TFlagNamed + ret.Str_ = name + + xcount := 0 + for _, m := range methods { + if !m.Exported() { + break + } + xcount++ + } + + uncommon := (*abi.UncommonType)(c.Advance(ptr, int(typeHdrSize))) + *uncommon = abi.UncommonType{ + PkgPath_: pkgPath, + Mcount: uint16(n), + Xcount: uint16(xcount), + Moff: uint32(uncommonTypeHdrSize), + } + + data := (*abi.Method)(c.Advance(ptr, int(typeHdrSize+uncommonTypeHdrSize))) + copy(unsafe.Slice(data, n), methods) + return ret +} + +// Interface returns an interface type. +func Interface(pkgPath string, methods []abi.Imethod) *Type { + var npkg abi.Name + if len(pkgPath) > 0 { + npkg = abi.NewName(pkgPath, "", false, false) + } + ret := &abi.InterfaceType{ + Type: Type{ + Size_: unsafe.Sizeof(eface{}), + Hash: uint32(abi.Interface), // TODO(xsw): hash + Kind_: uint8(abi.Interface), + }, + PkgPath: npkg, + Methods: methods, + } + return &ret.Type +} + +// NewItab returns a new itab. +func NewItab(inter *InterfaceType, typ *Type) *Itab { + n := len(inter.Methods) + size := itabHdrSize + uintptr(n)*pointerSize + ptr := AllocU(size) + + ret := (*Itab)(ptr) + ret.inter = inter + ret._type = typ + ret.hash = typ.Hash + + u := typ.Uncommon() + if u == nil { + ret.fun[0] = 0 + } else { + data := (*uintptr)(c.Advance(ptr, int(itabHdrSize))) + mthds := methods(u, inter.PkgPath) + for i, m := range inter.Methods { + fn := findMethod(mthds, m) + if fn == nil { + ret.fun[0] = 0 + break + } + *c.Advance(data, i) = uintptr(fn) + } + } + return ret +} + +func findMethod(mthds []abi.Method, im abi.Imethod) abi.Text { + imName := im.Name_.Name() + for _, m := range mthds { + mName := m.Name_.Name() + if mName >= imName { + if mName == imName && m.Mtyp_ == im.Typ_ { + return m.Ifn_ + } + break + } + } + return nil +} + +func methods(u *abi.UncommonType, from abi.Name) []abi.Method { + if u.PkgPath_.Name() == from.Name() { + return u.Methods() + } + return u.ExportedMethods() +} + +// ----------------------------------------------------------------------------- diff --git a/internal/runtime/z_type.go b/internal/runtime/z_type.go index 403c37b0..dfe2a4d4 100644 --- a/internal/runtime/z_type.go +++ b/internal/runtime/z_type.go @@ -20,103 +20,25 @@ import ( "unsafe" "github.com/goplus/llgo/internal/abi" - "github.com/goplus/llgo/internal/runtime/c" -) - -type ( - Eface = eface - Iface = iface - Itab = itab ) type Kind = abi.Kind +type Name = abi.Name type Type = abi.Type -type FuncType = abi.FuncType -type InterfaceType = abi.InterfaceType - // ----------------------------------------------------------------------------- -// Func returns a function type. -func Func(in, out []*Type, variadic bool) *FuncType { - const ( - funcTypeHdrSize = unsafe.Sizeof(abi.FuncType{}) - pointerSize = unsafe.Sizeof(uintptr(0)) - ) - - n := len(in) + len(out) - ptr := AllocU(funcTypeHdrSize + uintptr(n)*pointerSize) - c.Memset(ptr, 0, funcTypeHdrSize) - - ret := (*abi.FuncType)(ptr) - ret.Size_ = pointerSize - ret.Hash = uint32(abi.Func) // TODO(xsw): hash - ret.Kind_ = uint8(abi.Func) - ret.InCount = uint16(len(in)) - ret.OutCount = uint16(len(out)) - if variadic { - ret.OutCount |= 1 << 15 - } - - data := (**Type)(c.Advance(ptr, int(funcTypeHdrSize))) - params := unsafe.Slice(data, n) - copy(params, in) - copy(params[len(in):], out) - return ret +// NewName creates a new name. +func NewName(name string, exported bool) Name { + return abi.NewName(name, "", exported, false) } -// Imethod returns an interface method. -func Imethod(name string, typ *FuncType, exported bool) abi.Imethod { - n := abi.NewName(name, "", exported, false) - return abi.Imethod{ - Name_: n, - Typ_: typ, - } -} - -// Method returns a method. -func Method(name string, typ *FuncType, fn abi.Text, exported bool) abi.Method { - n := abi.NewName(name, "", exported, false) - return abi.Method{ - Name_: n, - Mtyp_: typ, - Ifn_: fn, - Tfn_: fn, - } -} - -// ----------------------------------------------------------------------------- - -// Named returns a named type. -func Named(name string, typ *Type) *Type { - ret := *typ // TODO(xsw): named type - return &ret -} - -// Interface returns an interface type. -func Interface(pkgPath string) *Type { - // TODO(xsw): pkgPath - // npkg := abi.NewName(pkgPath, "", false, false) - ret := &abi.InterfaceType{ - Type: Type{ - Size_: unsafe.Sizeof(eface{}), - Hash: uint32(abi.Interface), // TODO(xsw): hash - Kind_: uint8(abi.Interface), - }, - //PkgPath: npkg, - Methods: nil, - } - return &ret.Type -} - -// NewItab returns a new itab. -func NewItab(inter *InterfaceType, typ *Type) *Itab { - return &itab{ - inter: inter, - _type: typ, - hash: typ.Hash, - //fun: nil, TODO(xsw) +// NewPkgName creates a package name. +func NewPkgName(pkgPath string) (ret Name) { + if len(pkgPath) > 0 { + ret = abi.NewName(pkgPath, "", false, false) } + return } // ----------------------------------------------------------------------------- @@ -190,21 +112,21 @@ func StructField(name string, typ *Type, off uintptr, tag string, exported, embe } // Struct returns a struct type. -func Struct(size uintptr, pkgPath string, fields ...abi.StructField) *Type { - // TODO(xsw): pkgPath - // npkg := abi.NewName(pkgPath, "", false, false) +func Struct(pkgPath Name, size uintptr, fields ...abi.StructField) *Type { ret := &abi.StructType{ Type: Type{ Size_: size, Hash: uint32(abi.Struct), // TODO(xsw): hash Kind_: uint8(abi.Struct), }, - // PkgPath: npkg, - Fields: fields, + PkgPath: pkgPath, + Fields: fields, } return &ret.Type } +// ----------------------------------------------------------------------------- + // Pointer returns a pointer type. func Pointer(elem *Type) *Type { ret := &abi.PtrType{ diff --git a/ssa/interface.go b/ssa/interface.go index 51d8ab37..6d33fc44 100644 --- a/ssa/interface.go +++ b/ssa/interface.go @@ -88,7 +88,7 @@ func (b Builder) abiStructOf(t *types.Struct) Expr { params := strucAbi.raw.Type.(*types.Signature).Params() tSlice := prog.rawType(params.At(params.Len() - 1).Type().(*types.Slice)) fldSlice := b.SliceLit(tSlice, flds...) - return b.Call(strucAbi, pkgPath, fldSlice) + return b.Call(pkgPath, strucAbi, fldSlice) } // func StructField(name string, typ *abi.Type, off uintptr, tag string, exported, embedded bool) abi.StructField From 91c9b4e1685c662cd433b475b9983a023e8ffdde Mon Sep 17 00:00:00 2001 From: xushiwei Date: Sun, 26 May 2024 09:34:43 +0800 Subject: [PATCH 2/6] llgo/ssa: pkgName --- internal/runtime/type.go | 4 +--- internal/runtime/z_face.go | 20 ++++++++------------ ssa/expr.go | 5 +++++ ssa/interface.go | 2 +- 4 files changed, 15 insertions(+), 16 deletions(-) diff --git a/internal/runtime/type.go b/internal/runtime/type.go index 36ce1a0f..8e8b4332 100644 --- a/internal/runtime/type.go +++ b/internal/runtime/type.go @@ -12,11 +12,9 @@ import ( type _type = abi.Type -type interfacetype = abi.InterfaceType - +/* type maptype = abi.MapType -/* type arraytype = abi.ArrayType type chantype = abi.ChanType diff --git a/internal/runtime/z_face.go b/internal/runtime/z_face.go index 28409f1e..01907b0a 100644 --- a/internal/runtime/z_face.go +++ b/internal/runtime/z_face.go @@ -21,6 +21,8 @@ type iface struct { data unsafe.Pointer } +type interfacetype = abi.InterfaceType + // layout of Itab known to compilers // allocated in non-garbage-collected memory // Needs to be in sync with @@ -126,12 +128,10 @@ func Named(pkgPath, name Name, underlying *Type, methods []abi.Method) *Type { } uncommon := (*abi.UncommonType)(c.Advance(ptr, int(typeHdrSize))) - *uncommon = abi.UncommonType{ - PkgPath_: pkgPath, - Mcount: uint16(n), - Xcount: uint16(xcount), - Moff: uint32(uncommonTypeHdrSize), - } + uncommon.PkgPath_ = pkgPath + uncommon.Mcount = uint16(n) + uncommon.Xcount = uint16(xcount) + uncommon.Moff = uint32(uncommonTypeHdrSize) data := (*abi.Method)(c.Advance(ptr, int(typeHdrSize+uncommonTypeHdrSize))) copy(unsafe.Slice(data, n), methods) @@ -139,18 +139,14 @@ func Named(pkgPath, name Name, underlying *Type, methods []abi.Method) *Type { } // Interface returns an interface type. -func Interface(pkgPath string, methods []abi.Imethod) *Type { - var npkg abi.Name - if len(pkgPath) > 0 { - npkg = abi.NewName(pkgPath, "", false, false) - } +func Interface(pkgPath Name, methods []abi.Imethod) *Type { ret := &abi.InterfaceType{ Type: Type{ Size_: unsafe.Sizeof(eface{}), Hash: uint32(abi.Interface), // TODO(xsw): hash Kind_: uint8(abi.Interface), }, - PkgPath: npkg, + PkgPath: pkgPath, Methods: methods, } return &ret.Type diff --git a/ssa/expr.go b/ssa/expr.go index 0258755c..9ff69d84 100644 --- a/ssa/expr.go +++ b/ssa/expr.go @@ -221,6 +221,11 @@ func (b Builder) Str(v string) (ret Expr) { return Expr{aggregateValue(b.impl, prog.rtString(), data, size), prog.String()} } +func (b Builder) pkgName(pkgPath string) Expr { + // TODO(xsw): use a global cache + return b.Call(b.Pkg.rtFunc("NewPkgName"), b.Str(pkgPath)) +} + // unsafeString(data *byte, size int) string func (b Builder) unsafeString(data, size llvm.Value) Expr { prog := b.Prog diff --git a/ssa/interface.go b/ssa/interface.go index 6d33fc44..b1ab1535 100644 --- a/ssa/interface.go +++ b/ssa/interface.go @@ -84,7 +84,7 @@ func (b Builder) abiStructOf(t *types.Struct) Expr { off := uintptr(prog.OffsetOf(typ, i)) flds[i] = b.structField(sfAbi, prog, f, off, t.Tag(i)) } - pkgPath := b.Str(pkg.Path()) + pkgPath := b.pkgName(pkg.Path()) params := strucAbi.raw.Type.(*types.Signature).Params() tSlice := prog.rawType(params.At(params.Len() - 1).Type().(*types.Slice)) fldSlice := b.SliceLit(tSlice, flds...) From 5cf6a30027d3e258fdedc29073a35481defb052f Mon Sep 17 00:00:00 2001 From: xushiwei Date: Sun, 26 May 2024 14:58:26 +0800 Subject: [PATCH 3/6] llgo/ssa: phi refactor --- cl/_testgo/abiname/in.go | 16 ++++ cl/_testgo/abiname/out.ll | 99 ++++++++++++++++++++ cl/compile.go | 6 +- internal/abi/llgo_autogen.lla | Bin 6546 -> 6546 bytes internal/runtime/llgo_autogen.lla | Bin 0 -> 12124 bytes ssa/cl_test.go | 2 +- ssa/expr.go | 144 ++++++++++++++++-------------- ssa/ssa_test.go | 3 - ssa/type.go | 1 - 9 files changed, 197 insertions(+), 74 deletions(-) create mode 100644 cl/_testgo/abiname/in.go create mode 100644 cl/_testgo/abiname/out.ll create mode 100644 internal/runtime/llgo_autogen.lla diff --git a/cl/_testgo/abiname/in.go b/cl/_testgo/abiname/in.go new file mode 100644 index 00000000..eea265b5 --- /dev/null +++ b/cl/_testgo/abiname/in.go @@ -0,0 +1,16 @@ +package main + +import "github.com/goplus/llgo/internal/abi" + +// NewPkgName creates a package name. +func NewPkgName(pkgPath string) (ret abi.Name) { + if len(pkgPath) > 0 { + ret = abi.NewName(pkgPath, "", false, false) + } + return +} + +func main() { + n := NewPkgName("pkgPath") + println(n.Name(), n.Tag(), n.IsExported(), n.IsEmbedded(), n.IsBlank()) +} diff --git a/cl/_testgo/abiname/out.ll b/cl/_testgo/abiname/out.ll new file mode 100644 index 00000000..bc029667 --- /dev/null +++ b/cl/_testgo/abiname/out.ll @@ -0,0 +1,99 @@ +; ModuleID = 'main' +source_filename = "main" + +%"github.com/goplus/llgo/internal/abi.Name" = type { ptr } +%"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 } + +@"main.init$guard" = global ptr null +@0 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 +@__llgo_argc = global ptr null +@__llgo_argv = global ptr null +@1 = private unnamed_addr constant [8 x i8] c"pkgPath\00", align 1 + +define %"github.com/goplus/llgo/internal/abi.Name" @main.NewPkgName(%"github.com/goplus/llgo/internal/runtime.String" %0) { +_llgo_0: + %1 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %0, 1 + %2 = icmp sgt i64 %1, 0 + br i1 %2, label %_llgo_1, label %_llgo_2 + +_llgo_1: ; preds = %_llgo_0 + %3 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %3, i32 0, i32 0 + store ptr @0, ptr %4, align 8 + %5 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %3, i32 0, i32 1 + store i64 0, ptr %5, align 4 + %6 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %3, align 8 + %7 = call %"github.com/goplus/llgo/internal/abi.Name" @"github.com/goplus/llgo/internal/abi.NewName"(%"github.com/goplus/llgo/internal/runtime.String" %0, %"github.com/goplus/llgo/internal/runtime.String" %6, i1 false, i1 false) + br label %_llgo_2 + +_llgo_2: ; preds = %_llgo_1, %_llgo_0 + %8 = phi ptr [ zeroinitializer, %_llgo_0 ], [ %7, %_llgo_1 ] + ret ptr %8 +} + +define void @main.init() { +_llgo_0: + %0 = load i1, ptr @"main.init$guard", align 1 + br i1 %0, label %_llgo_2, label %_llgo_1 + +_llgo_1: ; preds = %_llgo_0 + store i1 true, ptr @"main.init$guard", align 1 + call void @"github.com/goplus/llgo/internal/abi.init"() + br label %_llgo_2 + +_llgo_2: ; preds = %_llgo_1, %_llgo_0 + ret void +} + +define i32 @main(i32 %0, ptr %1) { +_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 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 0 + store ptr @1, ptr %3, align 8 + %4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 1 + store i64 7, ptr %4, align 4 + %5 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %2, align 8 + %6 = call %"github.com/goplus/llgo/internal/abi.Name" @main.NewPkgName(%"github.com/goplus/llgo/internal/runtime.String" %5) + %7 = call %"github.com/goplus/llgo/internal/runtime.String" @"(github.com/goplus/llgo/internal/abi.Name).Name"(%"github.com/goplus/llgo/internal/abi.Name" %6) + %8 = call %"github.com/goplus/llgo/internal/runtime.String" @"(github.com/goplus/llgo/internal/abi.Name).Tag"(%"github.com/goplus/llgo/internal/abi.Name" %6) + %9 = call i1 @"(github.com/goplus/llgo/internal/abi.Name).IsExported"(%"github.com/goplus/llgo/internal/abi.Name" %6) + %10 = call i1 @"(github.com/goplus/llgo/internal/abi.Name).IsEmbedded"(%"github.com/goplus/llgo/internal/abi.Name" %6) + %11 = call i1 @"(github.com/goplus/llgo/internal/abi.Name).IsBlank"(%"github.com/goplus/llgo/internal/abi.Name" %6) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %7) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %8) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %9) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %10) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %11) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) + ret i32 0 +} + +declare %"github.com/goplus/llgo/internal/abi.Name" @"github.com/goplus/llgo/internal/abi.NewName"(%"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.String", i1, i1) + +declare void @"github.com/goplus/llgo/internal/abi.init"() + +declare void @"github.com/goplus/llgo/internal/runtime.init"() + +declare %"github.com/goplus/llgo/internal/runtime.String" @"(github.com/goplus/llgo/internal/abi.Name).Name"(%"github.com/goplus/llgo/internal/abi.Name") + +declare %"github.com/goplus/llgo/internal/runtime.String" @"(github.com/goplus/llgo/internal/abi.Name).Tag"(%"github.com/goplus/llgo/internal/abi.Name") + +declare i1 @"(github.com/goplus/llgo/internal/abi.Name).IsExported"(%"github.com/goplus/llgo/internal/abi.Name") + +declare i1 @"(github.com/goplus/llgo/internal/abi.Name).IsEmbedded"(%"github.com/goplus/llgo/internal/abi.Name") + +declare i1 @"(github.com/goplus/llgo/internal/abi.Name).IsBlank"(%"github.com/goplus/llgo/internal/abi.Name") + +declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String") + +declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8) + +declare void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1) diff --git a/cl/compile.go b/cl/compile.go index 991c136e..608a09de 100644 --- a/cl/compile.go +++ b/cl/compile.go @@ -522,7 +522,7 @@ func (p *context) compilePhis(b llssa.Builder, block *ssa.BasicBlock) int { } for i := 0; i < n; i++ { iv := block.Instrs[i].(*ssa.Phi) - p.bvals[iv] = rets[i].Do(b) + p.bvals[iv] = rets[i] } return n } @@ -784,7 +784,7 @@ func (p *context) compileInstr(b llssa.Builder, instr ssa.Instruction) { val := p.compileValue(b, v.Value) b.MapUpdate(m, key, val) case *ssa.Panic: - arg := p.compileValue(b, v.X).Do(b) + arg := p.compileValue(b, v.X) b.Panic(arg) default: panic(fmt.Sprintf("compileInstr: unknown instr - %T\n", instr)) @@ -856,7 +856,7 @@ func (p *context) compileValues(b llssa.Builder, vals []ssa.Value, hasVArg int) n := len(vals) - hasVArg ret := make([]llssa.Expr, n) for i := 0; i < n; i++ { - ret[i] = p.compileValue(b, vals[i]).Do(b) + ret[i] = p.compileValue(b, vals[i]) } if hasVArg > 0 { ret = p.compileVArg(ret, b, vals[n]) diff --git a/internal/abi/llgo_autogen.lla b/internal/abi/llgo_autogen.lla index 6e0de50e42d471f15c1ff1490315bbfdc3a4a9b6..728e9013c16896b9ccc271fed5c09ccbf53ba072 100644 GIT binary patch delta 45 zcmbPaJjs|Rz?+#xgn@y9gF&Z!B99td$lai{(7PKgeoHXvlutI5G+_$4J2_iY9RLdP B4FdoG delta 45 zcmbPaJjs|Rz?+#xgn@y9gJFW}L>@J^_pL!`A6qwC{FY#v;5yk<(uC=K>*Q=nbpRpl B4lw`# diff --git a/internal/runtime/llgo_autogen.lla b/internal/runtime/llgo_autogen.lla new file mode 100644 index 0000000000000000000000000000000000000000..8bb2787b03ac6770f8fa5d0e706047807095e08c GIT binary patch literal 12124 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 CK*34? literal 0 HcmV?d00001 diff --git a/ssa/cl_test.go b/ssa/cl_test.go index 513944c1..0405b3f2 100644 --- a/ssa/cl_test.go +++ b/ssa/cl_test.go @@ -26,7 +26,7 @@ import ( ) func TestFromTestgo(t *testing.T) { - cltest.FromDir(t, "", "../cl/_testgo", false) + cltest.FromDir(t, "abiname", "../cl/_testgo", false) } func TestFromTestpy(t *testing.T) { diff --git a/ssa/expr.go b/ssa/expr.go index 9ff69d84..67009a18 100644 --- a/ssa/expr.go +++ b/ssa/expr.go @@ -41,16 +41,6 @@ func (v Expr) IsNil() bool { return v.Type == nil } -// Do evaluates the delay expression and returns the result. -func (v Expr) Do(b Builder) Expr { // TODO(xsw): can we remove this method? - switch vt := v.Type; vt.kind { - case vkPhisExpr: - e := vt.raw.Type.(*phisExprTy) - return b.aggregateValue(e.Type, e.phis...) - } - return v -} - // ----------------------------------------------------------------------------- type pyVarTy struct { @@ -73,26 +63,6 @@ func pyVarExpr(mod Expr, name string) Expr { // ----------------------------------------------------------------------------- -type phisExprTy struct { - phis []llvm.Value - Type -} - -func (p phisExprTy) Underlying() types.Type { - panic("don't call") -} - -func (p phisExprTy) String() string { - return "phisExpr" -} - -func phisExpr(t Type, phis []llvm.Value) Expr { - tphi := &aType{raw: rawType{&phisExprTy{phis, t}}, kind: vkPhisExpr} - return Expr{Type: tphi} -} - -// ----------------------------------------------------------------------------- - func (p Program) Zero(t Type) Expr { var ret llvm.Value switch u := t.raw.Type.Underlying().(type) { @@ -533,14 +503,6 @@ func llvmFields(vals []Expr, t *types.Struct, b Builder) (ret []llvm.Value) { return } -func llvmDelayValues(f func(i int) Expr, n int) []llvm.Value { - ret := make([]llvm.Value, n) - for i := 0; i < n; i++ { - ret[i] = f(i).impl - } - return ret -} - func llvmPredBlocks(preds []BasicBlock) []llvm.BasicBlock { ret := make([]llvm.BasicBlock, len(preds)) for i, v := range preds { @@ -549,36 +511,48 @@ func llvmPredBlocks(preds []BasicBlock) []llvm.BasicBlock { return ret } -// Phi represents a phi node. -type Phi struct { +type aPhi struct { Expr + phis []llvm.Value +} + +// Phi represents a phi node. +type Phi = *aPhi + +func (b Builder) newPhi(t Type, phis []llvm.Value) Phi { + ret := b.aggregateValue(t, phis...) + return &aPhi{ret, phis} } // AddIncoming adds incoming values to a phi node. func (p Phi) AddIncoming(b Builder, preds []BasicBlock, f func(i int) Expr) { bs := llvmPredBlocks(preds) - if p.kind != vkPhisExpr { // normal phi node - vs := llvmDelayValues(f, len(preds)) - p.impl.AddIncoming(vs, bs) - return - } - e := p.raw.Type.(*phisExprTy) - phis := e.phis - vals := make([][]llvm.Value, len(phis)) - for iblk, blk := range preds { - last := blk.last.LastInstruction() - b.impl.SetInsertPointBefore(last) - impl := b.impl - val := f(iblk).impl - for i := range phis { - if iblk == 0 { - vals[i] = make([]llvm.Value, len(preds)) + phis := p.phis + if phis != nil { + vals := make([][]llvm.Value, len(phis)) + for iblk, blk := range preds { + last := blk.last.LastInstruction() + b.impl.SetInsertPointBefore(last) + impl := b.impl + val := f(iblk).impl + for i := range phis { + if iblk == 0 { + vals[i] = make([]llvm.Value, len(preds)) + } + vals[i][iblk] = llvm.CreateExtractValue(impl, val, i) } - vals[i][iblk] = llvm.CreateExtractValue(impl, val, i) } - } - for i, phi := range phis { - phi.AddIncoming(vals[i], bs) + for i, phi := range phis { + phi.AddIncoming(vals[i], bs) + } + } else { + vals := make([]llvm.Value, len(preds)) + for iblk, blk := range preds { + last := blk.last.LastInstruction() + b.impl.SetInsertPointBefore(last) + vals[iblk] = f(iblk).impl + } + p.impl.AddIncoming(vals, bs) } } @@ -590,17 +564,55 @@ func (b Builder) Phi(t Type) Phi { kind := tund.Kind() switch kind { case types.String: - prog := b.Prog - phis := make([]llvm.Value, 2) - phis[0] = llvm.CreatePHI(impl, prog.tyVoidPtr()) - phis[1] = llvm.CreatePHI(impl, prog.tyInt()) - return Phi{phisExpr(t, phis)} + phis := createStringPhis(impl, make([]llvm.Value, 0, 2), b.Prog) + return b.newPhi(t, phis) } case *types.Struct: + phis := createStrucPhis(impl, nil, tund, b.Prog) + return b.newPhi(t, phis) + default: panic("todo") } phi := llvm.CreatePHI(impl, t.ll) - return Phi{Expr{phi, t}} + return &aPhi{Expr{phi, t}, nil} +} + +func createStringPhis(b llvm.Builder, phis []llvm.Value, prog Program) []llvm.Value { + phis = append(phis, llvm.CreatePHI(b, prog.tyVoidPtr())) + return append(phis, llvm.CreatePHI(b, prog.tyInt())) +} + +func createStrucPhis(b llvm.Builder, phis []llvm.Value, t *types.Struct, prog Program) []llvm.Value { + n := t.NumFields() + if phis == nil { + phis = make([]llvm.Value, 0, n) + } + for i := 0; i < n; i++ { + fld := t.Field(i) + switch tfld := fld.Type().Underlying().(type) { + case *types.Basic: + kind := tfld.Kind() + switch kind { + case types.String: + phis = createStringPhis(b, phis, prog) + default: + phis = createBasicPhi(b, phis, tfld, prog) + } + case *types.Pointer: + phis = createBasicPhi(b, phis, tfld, prog) + case *types.Struct: + phis = createStrucPhis(b, phis, tfld, prog) + default: + panic("todo") + } + } + return phis +} + +func createBasicPhi(b llvm.Builder, phis []llvm.Value, t types.Type, prog Program) []llvm.Value { + tll := prog.rawType(t).ll + phi := llvm.CreatePHI(b, tll) + return append(phis, phi) } // ----------------------------------------------------------------------------- diff --git a/ssa/ssa_test.go b/ssa/ssa_test.go index 3e23e756..b6123bd3 100644 --- a/ssa/ssa_test.go +++ b/ssa/ssa_test.go @@ -109,9 +109,7 @@ func TestCvtType(t *testing.T) { } func TestUserdefExpr(t *testing.T) { - b := &phisExprTy{} c := &pyVarTy{} - _ = b.String() _ = c.String() test := func(a types.Type) { defer func() { @@ -121,7 +119,6 @@ func TestUserdefExpr(t *testing.T) { }() a.Underlying() } - test(b) test(c) } diff --git a/ssa/type.go b/ssa/type.go index ece67e4c..2b1f3608 100644 --- a/ssa/type.go +++ b/ssa/type.go @@ -53,7 +53,6 @@ const ( vkEface vkIface vkStruct - vkPhisExpr = -1 ) // ----------------------------------------------------------------------------- From ddabfdca3d8525a74b1dc26c4c9258362ddb02be Mon Sep 17 00:00:00 2001 From: xushiwei Date: Sun, 26 May 2024 16:18:24 +0800 Subject: [PATCH 4/6] SetBlockEx: BeforeLast --- cl/_testgo/abiname/out.ll | 9 +- cl/_testgo/strucintf/out.ll | 249 +++++++++++++++++++++--------------- cl/_testrt/concat/out.ll | 20 +-- cl/compile.go | 3 +- ssa/cl_test.go | 2 +- ssa/expr.go | 13 +- ssa/interface.go | 10 +- ssa/package.go | 9 +- ssa/stmt_builder.go | 3 + 9 files changed, 181 insertions(+), 137 deletions(-) diff --git a/cl/_testgo/abiname/out.ll b/cl/_testgo/abiname/out.ll index bc029667..4330a755 100644 --- a/cl/_testgo/abiname/out.ll +++ b/cl/_testgo/abiname/out.ll @@ -24,11 +24,16 @@ _llgo_1: ; preds = %_llgo_0 store i64 0, ptr %5, align 4 %6 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %3, align 8 %7 = call %"github.com/goplus/llgo/internal/abi.Name" @"github.com/goplus/llgo/internal/abi.NewName"(%"github.com/goplus/llgo/internal/runtime.String" %0, %"github.com/goplus/llgo/internal/runtime.String" %6, i1 false, i1 false) + %8 = extractvalue %"github.com/goplus/llgo/internal/abi.Name" %7, 0 br label %_llgo_2 _llgo_2: ; preds = %_llgo_1, %_llgo_0 - %8 = phi ptr [ zeroinitializer, %_llgo_0 ], [ %7, %_llgo_1 ] - ret ptr %8 + %9 = phi ptr [ null, %_llgo_0 ], [ %8, %_llgo_1 ] + %10 = alloca %"github.com/goplus/llgo/internal/abi.Name", align 8 + %11 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Name", ptr %10, i32 0, i32 0 + store ptr %9, ptr %11, align 8 + %12 = load %"github.com/goplus/llgo/internal/abi.Name", ptr %10, align 8 + ret %"github.com/goplus/llgo/internal/abi.Name" %12 } define void @main.init() { diff --git a/cl/_testgo/strucintf/out.ll b/cl/_testgo/strucintf/out.ll index 07c3ac59..964328d1 100644 --- a/cl/_testgo/strucintf/out.ll +++ b/cl/_testgo/strucintf/out.ll @@ -158,85 +158,118 @@ _llgo_10: ; preds = %_llgo_0 %45 = getelementptr inbounds { { i64 }, i1 }, ptr %43, i32 0, i32 1 store i1 true, ptr %45, align 1 %46 = load { { i64 }, i1 }, ptr %43, align 4 + %47 = extractvalue { { i64 }, i1 } %46, 0 + %48 = extractvalue { { i64 }, i1 } %46, 1 br label %_llgo_12 _llgo_11: ; preds = %_llgo_0 - %47 = alloca { { i64 }, i1 }, align 8 - %48 = getelementptr inbounds { { i64 }, i1 }, ptr %47, i32 0, i32 0 - store { i64 } zeroinitializer, ptr %48, align 4 - %49 = getelementptr inbounds { { i64 }, i1 }, ptr %47, i32 0, i32 1 - store i1 false, ptr %49, align 1 - %50 = load { { i64 }, i1 }, ptr %47, align 4 + %49 = alloca { { i64 }, i1 }, align 8 + %50 = getelementptr inbounds { { i64 }, i1 }, ptr %49, i32 0, i32 0 + store { i64 } zeroinitializer, ptr %50, align 4 + %51 = getelementptr inbounds { { i64 }, i1 }, ptr %49, i32 0, i32 1 + store i1 false, ptr %51, align 1 + %52 = load { { i64 }, i1 }, ptr %49, align 4 + %53 = extractvalue { { i64 }, i1 } %52, 0 + %54 = extractvalue { { i64 }, i1 } %52, 1 br label %_llgo_12 _llgo_12: ; preds = %_llgo_11, %_llgo_10 - %51 = phi { { i64 }, i1 } [ %46, %_llgo_10 ], [ %50, %_llgo_11 ] - %52 = extractvalue { { i64 }, i1 } %51, 0 - store { i64 } %52, ptr %4, align 4 - %53 = extractvalue { { i64 }, i1 } %51, 1 - br i1 %53, label %_llgo_1, label %_llgo_3 + %55 = phi i64 [ %47, %_llgo_10 ], [ %53, %_llgo_11 ] + %56 = phi i1 [ %48, %_llgo_10 ], [ %54, %_llgo_11 ] + %57 = alloca { { i64 }, i1 }, align 8 + %58 = getelementptr inbounds { { i64 }, i1 }, ptr %57, i32 0, i32 0 + store i64 %55, ptr %58, align 4 + %59 = getelementptr inbounds { { i64 }, i1 }, ptr %57, i32 0, i32 1 + store i1 %56, ptr %59, align 1 + %60 = load { { i64 }, i1 }, ptr %57, align 4 + %61 = extractvalue { { i64 }, i1 } %60, 0 + store { i64 } %61, ptr %4, align 4 + %62 = extractvalue { { i64 }, i1 } %60, 1 + br i1 %62, label %_llgo_1, label %_llgo_3 _llgo_13: ; preds = %_llgo_2 - %54 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %10, 1 - %55 = ptrtoint ptr %54 to i64 - %56 = alloca { i64 }, align 8 - %57 = getelementptr inbounds { i64 }, ptr %56, i32 0, i32 0 - store i64 %55, ptr %57, align 4 - %58 = load { i64 }, ptr %56, align 4 - %59 = alloca { { i64 }, i1 }, align 8 - %60 = getelementptr inbounds { { i64 }, i1 }, ptr %59, i32 0, i32 0 - store { i64 } %58, ptr %60, align 4 - %61 = getelementptr inbounds { { i64 }, i1 }, ptr %59, i32 0, i32 1 - store i1 true, ptr %61, align 1 - %62 = load { { i64 }, i1 }, ptr %59, align 4 + %63 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %10, 1 + %64 = ptrtoint ptr %63 to i64 + %65 = alloca { i64 }, align 8 + %66 = getelementptr inbounds { i64 }, ptr %65, i32 0, i32 0 + store i64 %64, ptr %66, align 4 + %67 = load { i64 }, ptr %65, align 4 + %68 = alloca { { i64 }, i1 }, align 8 + %69 = getelementptr inbounds { { i64 }, i1 }, ptr %68, i32 0, i32 0 + store { i64 } %67, ptr %69, align 4 + %70 = getelementptr inbounds { { i64 }, i1 }, ptr %68, i32 0, i32 1 + store i1 true, ptr %70, align 1 + %71 = load { { i64 }, i1 }, ptr %68, align 4 + %72 = extractvalue { { i64 }, i1 } %71, 0 + %73 = extractvalue { { i64 }, i1 } %71, 1 br label %_llgo_15 _llgo_14: ; preds = %_llgo_2 - %63 = alloca { { i64 }, i1 }, align 8 - %64 = getelementptr inbounds { { i64 }, i1 }, ptr %63, i32 0, i32 0 - store { i64 } zeroinitializer, ptr %64, align 4 - %65 = getelementptr inbounds { { i64 }, i1 }, ptr %63, i32 0, i32 1 - store i1 false, ptr %65, align 1 - %66 = load { { i64 }, i1 }, ptr %63, align 4 + %74 = alloca { { i64 }, i1 }, align 8 + %75 = getelementptr inbounds { { i64 }, i1 }, ptr %74, i32 0, i32 0 + store { i64 } zeroinitializer, ptr %75, align 4 + %76 = getelementptr inbounds { { i64 }, i1 }, ptr %74, i32 0, i32 1 + store i1 false, ptr %76, align 1 + %77 = load { { i64 }, i1 }, ptr %74, align 4 + %78 = extractvalue { { i64 }, i1 } %77, 0 + %79 = extractvalue { { i64 }, i1 } %77, 1 br label %_llgo_15 _llgo_15: ; preds = %_llgo_14, %_llgo_13 - %67 = phi { { i64 }, i1 } [ %62, %_llgo_13 ], [ %66, %_llgo_14 ] - %68 = extractvalue { { i64 }, i1 } %67, 0 - store { i64 } %68, ptr %12, align 4 - %69 = extractvalue { { i64 }, i1 } %67, 1 - br i1 %69, label %_llgo_4, label %_llgo_6 + %80 = phi i64 [ %72, %_llgo_13 ], [ %78, %_llgo_14 ] + %81 = phi i1 [ %73, %_llgo_13 ], [ %79, %_llgo_14 ] + %82 = alloca { { i64 }, i1 }, align 8 + %83 = getelementptr inbounds { { i64 }, i1 }, ptr %82, i32 0, i32 0 + store i64 %80, ptr %83, align 4 + %84 = getelementptr inbounds { { i64 }, i1 }, ptr %82, i32 0, i32 1 + store i1 %81, ptr %84, align 1 + %85 = load { { i64 }, i1 }, ptr %82, align 4 + %86 = extractvalue { { i64 }, i1 } %85, 0 + store { i64 } %86, ptr %12, align 4 + %87 = extractvalue { { i64 }, i1 } %85, 1 + br i1 %87, label %_llgo_4, label %_llgo_6 _llgo_16: ; preds = %_llgo_5 - %70 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %24, 1 - %71 = ptrtoint ptr %70 to i64 - %72 = alloca { i64 }, align 8 - %73 = getelementptr inbounds { i64 }, ptr %72, i32 0, i32 0 - store i64 %71, ptr %73, align 4 - %74 = load { i64 }, ptr %72, align 4 - %75 = alloca { { i64 }, i1 }, align 8 - %76 = getelementptr inbounds { { i64 }, i1 }, ptr %75, i32 0, i32 0 - store { i64 } %74, ptr %76, align 4 - %77 = getelementptr inbounds { { i64 }, i1 }, ptr %75, i32 0, i32 1 - store i1 true, ptr %77, align 1 - %78 = load { { i64 }, i1 }, ptr %75, align 4 + %88 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %24, 1 + %89 = ptrtoint ptr %88 to i64 + %90 = alloca { i64 }, align 8 + %91 = getelementptr inbounds { i64 }, ptr %90, i32 0, i32 0 + store i64 %89, ptr %91, align 4 + %92 = load { i64 }, ptr %90, align 4 + %93 = alloca { { i64 }, i1 }, align 8 + %94 = getelementptr inbounds { { i64 }, i1 }, ptr %93, i32 0, i32 0 + store { i64 } %92, ptr %94, align 4 + %95 = getelementptr inbounds { { i64 }, i1 }, ptr %93, i32 0, i32 1 + store i1 true, ptr %95, align 1 + %96 = load { { i64 }, i1 }, ptr %93, align 4 + %97 = extractvalue { { i64 }, i1 } %96, 0 + %98 = extractvalue { { i64 }, i1 } %96, 1 br label %_llgo_18 _llgo_17: ; preds = %_llgo_5 - %79 = alloca { { i64 }, i1 }, align 8 - %80 = getelementptr inbounds { { i64 }, i1 }, ptr %79, i32 0, i32 0 - store { i64 } zeroinitializer, ptr %80, align 4 - %81 = getelementptr inbounds { { i64 }, i1 }, ptr %79, i32 0, i32 1 - store i1 false, ptr %81, align 1 - %82 = load { { i64 }, i1 }, ptr %79, align 4 + %99 = alloca { { i64 }, i1 }, align 8 + %100 = getelementptr inbounds { { i64 }, i1 }, ptr %99, i32 0, i32 0 + store { i64 } zeroinitializer, ptr %100, align 4 + %101 = getelementptr inbounds { { i64 }, i1 }, ptr %99, i32 0, i32 1 + store i1 false, ptr %101, align 1 + %102 = load { { i64 }, i1 }, ptr %99, align 4 + %103 = extractvalue { { i64 }, i1 } %102, 0 + %104 = extractvalue { { i64 }, i1 } %102, 1 br label %_llgo_18 _llgo_18: ; preds = %_llgo_17, %_llgo_16 - %83 = phi { { i64 }, i1 } [ %78, %_llgo_16 ], [ %82, %_llgo_17 ] - %84 = extractvalue { { i64 }, i1 } %83, 0 - store { i64 } %84, ptr %23, align 4 - %85 = extractvalue { { i64 }, i1 } %83, 1 - br i1 %85, label %_llgo_7, label %_llgo_9 + %105 = phi i64 [ %97, %_llgo_16 ], [ %103, %_llgo_17 ] + %106 = phi i1 [ %98, %_llgo_16 ], [ %104, %_llgo_17 ] + %107 = alloca { { i64 }, i1 }, align 8 + %108 = getelementptr inbounds { { i64 }, i1 }, ptr %107, i32 0, i32 0 + store i64 %105, ptr %108, align 4 + %109 = getelementptr inbounds { { i64 }, i1 }, ptr %107, i32 0, i32 1 + store i1 %106, ptr %109, align 1 + %110 = load { { i64 }, i1 }, ptr %107, align 4 + %111 = extractvalue { { i64 }, i1 } %110, 0 + store { i64 } %111, ptr %23, align 4 + %112 = extractvalue { { i64 }, i1 } %110, 1 + br i1 %112, label %_llgo_7, label %_llgo_9 } declare ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr, i64) @@ -277,67 +310,71 @@ _llgo_0: %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 - %14 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 24) - %15 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %14, i64 0 - store %"github.com/goplus/llgo/internal/abi.StructField" %9, ptr %15, align 8 - %16 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 - %17 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %16, i32 0, i32 0 - store ptr %14, ptr %17, align 8 - %18 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %16, i32 0, i32 1 - store i64 1, ptr %18, align 4 - %19 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %16, i32 0, i32 2 + %14 = call %"github.com/goplus/llgo/internal/abi.Name" @"github.com/goplus/llgo/internal/runtime.NewPkgName"(%"github.com/goplus/llgo/internal/runtime.String" %13) + %15 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 24) + %16 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %15, i64 0 + store %"github.com/goplus/llgo/internal/abi.StructField" %9, ptr %16, align 8 + %17 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %18 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %17, i32 0, i32 0 + store ptr %15, ptr %18, align 8 + %19 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %17, i32 0, i32 1 store i64 1, ptr %19, align 4 - %20 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %16, align 8 - %21 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %13, %"github.com/goplus/llgo/internal/runtime.Slice" %20) - store ptr %21, ptr @"main.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88", align 8 - %22 = load ptr, ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk", align 8 - %23 = icmp eq ptr %22, null - br i1 %23, label %_llgo_1, label %_llgo_2 + %20 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %17, i32 0, i32 2 + store i64 1, ptr %20, align 4 + %21 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %17, align 8 + %22 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/abi.Name" %14, i64 8, %"github.com/goplus/llgo/internal/runtime.Slice" %21) + store ptr %22, ptr @"main.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88", align 8 + %23 = load ptr, ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk", align 8 + %24 = icmp eq ptr %23, null + br i1 %24, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %24 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %25 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %24, i32 0, i32 0 - store ptr @6, ptr %25, align 8 - %26 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %24, i32 0, i32 1 - store i64 1, ptr %26, align 4 - %27 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %24, align 8 - %28 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) - %29 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %30 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %29, i32 0, i32 0 - store ptr @7, ptr %30, align 8 - %31 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %29, i32 0, i32 1 - store i64 0, ptr %31, align 4 - %32 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %29, align 8 - %33 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %27, ptr %28, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %32, i1 true, i1 false) - %34 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %35 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %34, i32 0, i32 0 - store ptr @8, ptr %35, align 8 - %36 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %34, i32 0, i32 1 - store i64 4, ptr %36, align 4 - %37 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %34, align 8 - %38 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 24) - %39 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %38, i64 0 - store %"github.com/goplus/llgo/internal/abi.StructField" %33, ptr %39, align 8 - %40 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 - %41 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %40, i32 0, i32 0 - store ptr %38, ptr %41, align 8 - %42 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %40, i32 0, i32 1 - store i64 1, ptr %42, align 4 - %43 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %40, i32 0, i32 2 - store i64 1, ptr %43, align 4 - %44 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %40, align 8 - %45 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %37, %"github.com/goplus/llgo/internal/runtime.Slice" %44) - store ptr %45, ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk", align 8 + %25 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %26 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %25, i32 0, i32 0 + store ptr @6, ptr %26, align 8 + %27 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %25, i32 0, i32 1 + store i64 1, ptr %27, align 4 + %28 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %25, align 8 + %29 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) + %30 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %31 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %30, i32 0, i32 0 + store ptr @7, ptr %31, align 8 + %32 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %30, i32 0, i32 1 + store i64 0, ptr %32, align 4 + %33 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %30, align 8 + %34 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %28, ptr %29, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %33, i1 true, i1 false) + %35 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %36 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %35, i32 0, i32 0 + store ptr @8, ptr %36, align 8 + %37 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %35, i32 0, i32 1 + store i64 4, ptr %37, align 4 + %38 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %35, align 8 + %39 = call %"github.com/goplus/llgo/internal/abi.Name" @"github.com/goplus/llgo/internal/runtime.NewPkgName"(%"github.com/goplus/llgo/internal/runtime.String" %38) + %40 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 24) + %41 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %40, i64 0 + store %"github.com/goplus/llgo/internal/abi.StructField" %34, ptr %41, align 8 + %42 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %43 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %42, i32 0, i32 0 + store ptr %40, ptr %43, align 8 + %44 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %42, i32 0, i32 1 + store i64 1, ptr %44, align 4 + %45 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %42, i32 0, i32 2 + store i64 1, ptr %45, align 4 + %46 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %42, align 8 + %47 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/abi.Name" %39, i64 8, %"github.com/goplus/llgo/internal/runtime.Slice" %46) + store ptr %47, ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk", align 8 br label %_llgo_2 _llgo_2: ; preds = %_llgo_1, %_llgo_0 ret void } -declare ptr @"github.com/goplus/llgo/internal/runtime.Struct"(i64, %"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.Slice") +declare ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/abi.Name", i64, %"github.com/goplus/llgo/internal/runtime.Slice") declare %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String", ptr, i64, %"github.com/goplus/llgo/internal/runtime.String", i1, i1) declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64) +declare %"github.com/goplus/llgo/internal/abi.Name" @"github.com/goplus/llgo/internal/runtime.NewPkgName"(%"github.com/goplus/llgo/internal/runtime.String") + declare ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64) diff --git a/cl/_testrt/concat/out.ll b/cl/_testrt/concat/out.ll index f850807f..7217f45f 100644 --- a/cl/_testrt/concat/out.ll +++ b/cl/_testrt/concat/out.ll @@ -32,14 +32,14 @@ _llgo_0: _llgo_1: ; preds = %_llgo_2, %_llgo_0 %8 = phi ptr [ %6, %_llgo_0 ], [ %22, %_llgo_2 ] %9 = phi i64 [ %7, %_llgo_0 ], [ %23, %_llgo_2 ] - %10 = phi i64 [ -1, %_llgo_0 ], [ %15, %_llgo_2 ] - %11 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %12 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %11, i32 0, i32 0 - store ptr %8, ptr %12, align 8 - %13 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %11, i32 0, i32 1 - store i64 %9, ptr %13, align 4 - %14 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %11, align 8 - %15 = add i64 %10, 1 + %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 + %12 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %10, i32 0, i32 1 + store i64 %9, ptr %12, align 4 + %13 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %10, align 8 + %14 = phi i64 [ -1, %_llgo_0 ], [ %15, %_llgo_2 ] + %15 = add i64 %14, 1 %16 = icmp slt i64 %15, %1 br i1 %16, label %_llgo_2, label %_llgo_3 @@ -49,13 +49,13 @@ _llgo_2: ; preds = %_llgo_1 %18 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %0, 0 %19 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %18, i64 %15 %20 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %19, align 8 - %21 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.StringCat"(%"github.com/goplus/llgo/internal/runtime.String" %14, %"github.com/goplus/llgo/internal/runtime.String" %20) + %21 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.StringCat"(%"github.com/goplus/llgo/internal/runtime.String" %13, %"github.com/goplus/llgo/internal/runtime.String" %20) %22 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %21, 0 %23 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %21, 1 br label %_llgo_1 _llgo_3: ; preds = %_llgo_1 - ret %"github.com/goplus/llgo/internal/runtime.String" %14 + ret %"github.com/goplus/llgo/internal/runtime.String" %13 } define %"github.com/goplus/llgo/internal/runtime.String" @main.info(%"github.com/goplus/llgo/internal/runtime.String" %0) { diff --git a/cl/compile.go b/cl/compile.go index 608a09de..7105730d 100644 --- a/cl/compile.go +++ b/cl/compile.go @@ -540,7 +540,8 @@ func (p *context) compilePhi(b llssa.Builder, v *ssa.Phi) (ret llssa.Expr) { bblks[i] = p.fn.Block(pred.Index) } edges := v.Edges - phi.AddIncoming(b, bblks, func(i int) llssa.Expr { + phi.AddIncoming(b, bblks, func(i int, blk llssa.BasicBlock) llssa.Expr { + b.SetBlockEx(blk, llssa.BeforeLast, false) return p.compileValue(b, edges[i]) }) }) diff --git a/ssa/cl_test.go b/ssa/cl_test.go index 0405b3f2..e65de0f7 100644 --- a/ssa/cl_test.go +++ b/ssa/cl_test.go @@ -26,7 +26,7 @@ import ( ) func TestFromTestgo(t *testing.T) { - cltest.FromDir(t, "abiname", "../cl/_testgo", false) + cltest.FromDir(t, "strucintf", "../cl/_testgo", false) } func TestFromTestpy(t *testing.T) { diff --git a/ssa/expr.go b/ssa/expr.go index 67009a18..ca48328e 100644 --- a/ssa/expr.go +++ b/ssa/expr.go @@ -525,16 +525,15 @@ func (b Builder) newPhi(t Type, phis []llvm.Value) Phi { } // AddIncoming adds incoming values to a phi node. -func (p Phi) AddIncoming(b Builder, preds []BasicBlock, f func(i int) Expr) { +func (p Phi) AddIncoming(b Builder, preds []BasicBlock, f func(i int, blk BasicBlock) Expr) { bs := llvmPredBlocks(preds) phis := p.phis if phis != nil { vals := make([][]llvm.Value, len(phis)) for iblk, blk := range preds { - last := blk.last.LastInstruction() - b.impl.SetInsertPointBefore(last) + val := f(iblk, blk).impl impl := b.impl - val := f(iblk).impl + b.SetBlockEx(blk, BeforeLast, false) for i := range phis { if iblk == 0 { vals[i] = make([]llvm.Value, len(preds)) @@ -548,9 +547,7 @@ func (p Phi) AddIncoming(b Builder, preds []BasicBlock, f func(i int) Expr) { } else { vals := make([]llvm.Value, len(preds)) for iblk, blk := range preds { - last := blk.last.LastInstruction() - b.impl.SetInsertPointBefore(last) - vals[iblk] = f(iblk).impl + vals[iblk] = f(iblk, blk).impl } p.impl.AddIncoming(vals, bs) } @@ -571,7 +568,7 @@ func (b Builder) Phi(t Type) Phi { phis := createStrucPhis(impl, nil, tund, b.Prog) return b.newPhi(t, phis) default: - panic("todo") + log.Panicf("todo: %T\n", tund) } phi := llvm.CreatePHI(impl, t.ll) return &aPhi{Expr{phi, t}, nil} diff --git a/ssa/interface.go b/ssa/interface.go index b1ab1535..696a782f 100644 --- a/ssa/interface.go +++ b/ssa/interface.go @@ -88,7 +88,8 @@ func (b Builder) abiStructOf(t *types.Struct) Expr { params := strucAbi.raw.Type.(*types.Signature).Params() tSlice := prog.rawType(params.At(params.Len() - 1).Type().(*types.Slice)) fldSlice := b.SliceLit(tSlice, flds...) - return b.Call(pkgPath, strucAbi, fldSlice) + size := prog.IntVal(prog.SizeOf(typ), prog.Uintptr()) + return b.Call(strucAbi, pkgPath, size, fldSlice) } // func StructField(name string, typ *abi.Type, off uintptr, tag string, exported, embedded bool) abi.StructField @@ -296,21 +297,20 @@ func (b Builder) TypeAssert(x Expr, assertedTyp Type, commaOk bool) Expr { eq := b.BinOp(token.EQL, tx, tabi) if commaOk { prog := b.Prog - t := prog.Tuple(assertedTyp, prog.Bool()) + t := prog.Struct(assertedTyp, prog.Bool()) blks := b.Func.MakeBlocks(3) b.If(eq, blks[0], blks[1]) b.SetBlockEx(blks[2], AtEnd, false) phi := b.Phi(t) - phi.AddIncoming(b, blks[:2], func(i int) Expr { + phi.AddIncoming(b, blks[:2], func(i int, blk BasicBlock) Expr { + b.SetBlockEx(blk, AtEnd, false) if i == 0 { - b.SetBlockEx(blks[0], AtEnd, false) val := b.valFromData(assertedTyp, b.faceData(x.impl)) valTrue := aggregateValue(b.impl, t.ll, val.impl, prog.BoolVal(true).impl) b.Jump(blks[2]) return Expr{valTrue, t} } - b.SetBlockEx(blks[1], AtEnd, false) zero := prog.Zero(assertedTyp) valFalse := aggregateValue(b.impl, t.ll, zero.impl, prog.BoolVal(false).impl) b.Jump(blks[2]) diff --git a/ssa/package.go b/ssa/package.go index 6eb26db1..5df247db 100644 --- a/ssa/package.go +++ b/ssa/package.go @@ -19,6 +19,7 @@ package ssa import ( "go/token" "go/types" + "strconv" "unsafe" "github.com/goplus/llgo/ssa/abi" @@ -296,13 +297,13 @@ func (p Program) NewPackage(name, pkgPath string) Package { return ret } -// Tuple returns a tuple type. -func (p Program) Tuple(typs ...Type) Type { +// Struct returns a struct type. +func (p Program) Struct(typs ...Type) Type { els := make([]*types.Var, len(typs)) for i, t := range typs { - els[i] = types.NewParam(token.NoPos, nil, "", t.raw.Type) + els[i] = types.NewParam(token.NoPos, nil, "_llgo_f"+strconv.Itoa(i), t.raw.Type) } - return p.rawType(types.NewTuple(els...)) + return p.rawType(types.NewStruct(els, nil)) } /* diff --git a/ssa/stmt_builder.go b/ssa/stmt_builder.go index 8e2507de..178d6f3e 100644 --- a/ssa/stmt_builder.go +++ b/ssa/stmt_builder.go @@ -80,6 +80,7 @@ type InsertPoint int const ( AtEnd InsertPoint = iota AtStart + BeforeLast afterInit ) @@ -93,6 +94,8 @@ func (b Builder) SetBlockEx(blk BasicBlock, pos InsertPoint, setBlk bool) Builde b.impl.SetInsertPointAtEnd(blk.last) case AtStart: b.impl.SetInsertPointBefore(blk.first.FirstInstruction()) + case BeforeLast: + b.impl.SetInsertPointBefore(blk.last.LastInstruction()) case afterInit: b.impl.SetInsertPointBefore(instrAfterInit(blk.first)) default: From eae94c5f23ad4289e31f54da23bfee04a2069f16 Mon Sep 17 00:00:00 2001 From: xushiwei Date: Sun, 26 May 2024 17:53:29 +0800 Subject: [PATCH 5/6] remove abi.Name --- cl/_testgo/abiname/in.go | 16 -- cl/_testgo/abiname/out.ll | 104 -------- cl/_testgo/strucintf/out.ll | 147 +++++------ cl/_testgo/struczero/in.go | 1 + cl/_testgo/struczero/out.ll | 401 +++++++++++------------------- cl/_testrt/concat/out.ll | 35 +-- internal/abi/llgo_autogen.lla | Bin 6546 -> 3353 bytes internal/abi/type.go | 44 +++- internal/runtime/llgo_autogen.lla | Bin 12124 -> 11825 bytes internal/runtime/z_face.go | 24 +- internal/runtime/z_type.go | 22 +- ssa/cl_test.go | 2 +- ssa/expr.go | 73 +++--- ssa/interface.go | 26 +- 14 files changed, 333 insertions(+), 562 deletions(-) delete mode 100644 cl/_testgo/abiname/in.go delete mode 100644 cl/_testgo/abiname/out.ll diff --git a/cl/_testgo/abiname/in.go b/cl/_testgo/abiname/in.go deleted file mode 100644 index eea265b5..00000000 --- a/cl/_testgo/abiname/in.go +++ /dev/null @@ -1,16 +0,0 @@ -package main - -import "github.com/goplus/llgo/internal/abi" - -// NewPkgName creates a package name. -func NewPkgName(pkgPath string) (ret abi.Name) { - if len(pkgPath) > 0 { - ret = abi.NewName(pkgPath, "", false, false) - } - return -} - -func main() { - n := NewPkgName("pkgPath") - println(n.Name(), n.Tag(), n.IsExported(), n.IsEmbedded(), n.IsBlank()) -} diff --git a/cl/_testgo/abiname/out.ll b/cl/_testgo/abiname/out.ll deleted file mode 100644 index 4330a755..00000000 --- a/cl/_testgo/abiname/out.ll +++ /dev/null @@ -1,104 +0,0 @@ -; ModuleID = 'main' -source_filename = "main" - -%"github.com/goplus/llgo/internal/abi.Name" = type { ptr } -%"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 } - -@"main.init$guard" = global ptr null -@0 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 -@__llgo_argc = global ptr null -@__llgo_argv = global ptr null -@1 = private unnamed_addr constant [8 x i8] c"pkgPath\00", align 1 - -define %"github.com/goplus/llgo/internal/abi.Name" @main.NewPkgName(%"github.com/goplus/llgo/internal/runtime.String" %0) { -_llgo_0: - %1 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %0, 1 - %2 = icmp sgt i64 %1, 0 - br i1 %2, label %_llgo_1, label %_llgo_2 - -_llgo_1: ; preds = %_llgo_0 - %3 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %3, i32 0, i32 0 - store ptr @0, ptr %4, align 8 - %5 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %3, i32 0, i32 1 - store i64 0, ptr %5, align 4 - %6 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %3, align 8 - %7 = call %"github.com/goplus/llgo/internal/abi.Name" @"github.com/goplus/llgo/internal/abi.NewName"(%"github.com/goplus/llgo/internal/runtime.String" %0, %"github.com/goplus/llgo/internal/runtime.String" %6, i1 false, i1 false) - %8 = extractvalue %"github.com/goplus/llgo/internal/abi.Name" %7, 0 - br label %_llgo_2 - -_llgo_2: ; preds = %_llgo_1, %_llgo_0 - %9 = phi ptr [ null, %_llgo_0 ], [ %8, %_llgo_1 ] - %10 = alloca %"github.com/goplus/llgo/internal/abi.Name", align 8 - %11 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Name", ptr %10, i32 0, i32 0 - store ptr %9, ptr %11, align 8 - %12 = load %"github.com/goplus/llgo/internal/abi.Name", ptr %10, align 8 - ret %"github.com/goplus/llgo/internal/abi.Name" %12 -} - -define void @main.init() { -_llgo_0: - %0 = load i1, ptr @"main.init$guard", align 1 - br i1 %0, label %_llgo_2, label %_llgo_1 - -_llgo_1: ; preds = %_llgo_0 - store i1 true, ptr @"main.init$guard", align 1 - call void @"github.com/goplus/llgo/internal/abi.init"() - br label %_llgo_2 - -_llgo_2: ; preds = %_llgo_1, %_llgo_0 - ret void -} - -define i32 @main(i32 %0, ptr %1) { -_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 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 0 - store ptr @1, ptr %3, align 8 - %4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 1 - store i64 7, ptr %4, align 4 - %5 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %2, align 8 - %6 = call %"github.com/goplus/llgo/internal/abi.Name" @main.NewPkgName(%"github.com/goplus/llgo/internal/runtime.String" %5) - %7 = call %"github.com/goplus/llgo/internal/runtime.String" @"(github.com/goplus/llgo/internal/abi.Name).Name"(%"github.com/goplus/llgo/internal/abi.Name" %6) - %8 = call %"github.com/goplus/llgo/internal/runtime.String" @"(github.com/goplus/llgo/internal/abi.Name).Tag"(%"github.com/goplus/llgo/internal/abi.Name" %6) - %9 = call i1 @"(github.com/goplus/llgo/internal/abi.Name).IsExported"(%"github.com/goplus/llgo/internal/abi.Name" %6) - %10 = call i1 @"(github.com/goplus/llgo/internal/abi.Name).IsEmbedded"(%"github.com/goplus/llgo/internal/abi.Name" %6) - %11 = call i1 @"(github.com/goplus/llgo/internal/abi.Name).IsBlank"(%"github.com/goplus/llgo/internal/abi.Name" %6) - call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %7) - call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %8) - call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %9) - call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %10) - call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %11) - call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) - ret i32 0 -} - -declare %"github.com/goplus/llgo/internal/abi.Name" @"github.com/goplus/llgo/internal/abi.NewName"(%"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.String", i1, i1) - -declare void @"github.com/goplus/llgo/internal/abi.init"() - -declare void @"github.com/goplus/llgo/internal/runtime.init"() - -declare %"github.com/goplus/llgo/internal/runtime.String" @"(github.com/goplus/llgo/internal/abi.Name).Name"(%"github.com/goplus/llgo/internal/abi.Name") - -declare %"github.com/goplus/llgo/internal/runtime.String" @"(github.com/goplus/llgo/internal/abi.Name).Tag"(%"github.com/goplus/llgo/internal/abi.Name") - -declare i1 @"(github.com/goplus/llgo/internal/abi.Name).IsExported"(%"github.com/goplus/llgo/internal/abi.Name") - -declare i1 @"(github.com/goplus/llgo/internal/abi.Name).IsEmbedded"(%"github.com/goplus/llgo/internal/abi.Name") - -declare i1 @"(github.com/goplus/llgo/internal/abi.Name).IsBlank"(%"github.com/goplus/llgo/internal/abi.Name") - -declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String") - -declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8) - -declare void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1) diff --git a/cl/_testgo/strucintf/out.ll b/cl/_testgo/strucintf/out.ll index 964328d1..e9932f44 100644 --- a/cl/_testgo/strucintf/out.ll +++ b/cl/_testgo/strucintf/out.ll @@ -158,118 +158,85 @@ _llgo_10: ; preds = %_llgo_0 %45 = getelementptr inbounds { { i64 }, i1 }, ptr %43, i32 0, i32 1 store i1 true, ptr %45, align 1 %46 = load { { i64 }, i1 }, ptr %43, align 4 - %47 = extractvalue { { i64 }, i1 } %46, 0 - %48 = extractvalue { { i64 }, i1 } %46, 1 br label %_llgo_12 _llgo_11: ; preds = %_llgo_0 - %49 = alloca { { i64 }, i1 }, align 8 - %50 = getelementptr inbounds { { i64 }, i1 }, ptr %49, i32 0, i32 0 - store { i64 } zeroinitializer, ptr %50, align 4 - %51 = getelementptr inbounds { { i64 }, i1 }, ptr %49, i32 0, i32 1 - store i1 false, ptr %51, align 1 - %52 = load { { i64 }, i1 }, ptr %49, align 4 - %53 = extractvalue { { i64 }, i1 } %52, 0 - %54 = extractvalue { { i64 }, i1 } %52, 1 + %47 = alloca { { i64 }, i1 }, align 8 + %48 = getelementptr inbounds { { i64 }, i1 }, ptr %47, i32 0, i32 0 + store { i64 } zeroinitializer, ptr %48, align 4 + %49 = getelementptr inbounds { { i64 }, i1 }, ptr %47, i32 0, i32 1 + store i1 false, ptr %49, align 1 + %50 = load { { i64 }, i1 }, ptr %47, align 4 br label %_llgo_12 _llgo_12: ; preds = %_llgo_11, %_llgo_10 - %55 = phi i64 [ %47, %_llgo_10 ], [ %53, %_llgo_11 ] - %56 = phi i1 [ %48, %_llgo_10 ], [ %54, %_llgo_11 ] - %57 = alloca { { i64 }, i1 }, align 8 - %58 = getelementptr inbounds { { i64 }, i1 }, ptr %57, i32 0, i32 0 - store i64 %55, ptr %58, align 4 - %59 = getelementptr inbounds { { i64 }, i1 }, ptr %57, i32 0, i32 1 - store i1 %56, ptr %59, align 1 - %60 = load { { i64 }, i1 }, ptr %57, align 4 - %61 = extractvalue { { i64 }, i1 } %60, 0 - store { i64 } %61, ptr %4, align 4 - %62 = extractvalue { { i64 }, i1 } %60, 1 - br i1 %62, label %_llgo_1, label %_llgo_3 + %51 = phi { { i64 }, i1 } [ %46, %_llgo_10 ], [ %50, %_llgo_11 ] + %52 = extractvalue { { i64 }, i1 } %51, 0 + store { i64 } %52, ptr %4, align 4 + %53 = extractvalue { { i64 }, i1 } %51, 1 + br i1 %53, label %_llgo_1, label %_llgo_3 _llgo_13: ; preds = %_llgo_2 - %63 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %10, 1 - %64 = ptrtoint ptr %63 to i64 - %65 = alloca { i64 }, align 8 - %66 = getelementptr inbounds { i64 }, ptr %65, i32 0, i32 0 - store i64 %64, ptr %66, align 4 - %67 = load { i64 }, ptr %65, align 4 - %68 = alloca { { i64 }, i1 }, align 8 - %69 = getelementptr inbounds { { i64 }, i1 }, ptr %68, i32 0, i32 0 - store { i64 } %67, ptr %69, align 4 - %70 = getelementptr inbounds { { i64 }, i1 }, ptr %68, i32 0, i32 1 - store i1 true, ptr %70, align 1 - %71 = load { { i64 }, i1 }, ptr %68, align 4 - %72 = extractvalue { { i64 }, i1 } %71, 0 - %73 = extractvalue { { i64 }, i1 } %71, 1 + %54 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %10, 1 + %55 = ptrtoint ptr %54 to i64 + %56 = alloca { i64 }, align 8 + %57 = getelementptr inbounds { i64 }, ptr %56, i32 0, i32 0 + store i64 %55, ptr %57, align 4 + %58 = load { i64 }, ptr %56, align 4 + %59 = alloca { { i64 }, i1 }, align 8 + %60 = getelementptr inbounds { { i64 }, i1 }, ptr %59, i32 0, i32 0 + store { i64 } %58, ptr %60, align 4 + %61 = getelementptr inbounds { { i64 }, i1 }, ptr %59, i32 0, i32 1 + store i1 true, ptr %61, align 1 + %62 = load { { i64 }, i1 }, ptr %59, align 4 br label %_llgo_15 _llgo_14: ; preds = %_llgo_2 - %74 = alloca { { i64 }, i1 }, align 8 - %75 = getelementptr inbounds { { i64 }, i1 }, ptr %74, i32 0, i32 0 - store { i64 } zeroinitializer, ptr %75, align 4 - %76 = getelementptr inbounds { { i64 }, i1 }, ptr %74, i32 0, i32 1 - store i1 false, ptr %76, align 1 - %77 = load { { i64 }, i1 }, ptr %74, align 4 - %78 = extractvalue { { i64 }, i1 } %77, 0 - %79 = extractvalue { { i64 }, i1 } %77, 1 + %63 = alloca { { i64 }, i1 }, align 8 + %64 = getelementptr inbounds { { i64 }, i1 }, ptr %63, i32 0, i32 0 + store { i64 } zeroinitializer, ptr %64, align 4 + %65 = getelementptr inbounds { { i64 }, i1 }, ptr %63, i32 0, i32 1 + store i1 false, ptr %65, align 1 + %66 = load { { i64 }, i1 }, ptr %63, align 4 br label %_llgo_15 _llgo_15: ; preds = %_llgo_14, %_llgo_13 - %80 = phi i64 [ %72, %_llgo_13 ], [ %78, %_llgo_14 ] - %81 = phi i1 [ %73, %_llgo_13 ], [ %79, %_llgo_14 ] - %82 = alloca { { i64 }, i1 }, align 8 - %83 = getelementptr inbounds { { i64 }, i1 }, ptr %82, i32 0, i32 0 - store i64 %80, ptr %83, align 4 - %84 = getelementptr inbounds { { i64 }, i1 }, ptr %82, i32 0, i32 1 - store i1 %81, ptr %84, align 1 - %85 = load { { i64 }, i1 }, ptr %82, align 4 - %86 = extractvalue { { i64 }, i1 } %85, 0 - store { i64 } %86, ptr %12, align 4 - %87 = extractvalue { { i64 }, i1 } %85, 1 - br i1 %87, label %_llgo_4, label %_llgo_6 + %67 = phi { { i64 }, i1 } [ %62, %_llgo_13 ], [ %66, %_llgo_14 ] + %68 = extractvalue { { i64 }, i1 } %67, 0 + store { i64 } %68, ptr %12, align 4 + %69 = extractvalue { { i64 }, i1 } %67, 1 + br i1 %69, label %_llgo_4, label %_llgo_6 _llgo_16: ; preds = %_llgo_5 - %88 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %24, 1 - %89 = ptrtoint ptr %88 to i64 - %90 = alloca { i64 }, align 8 - %91 = getelementptr inbounds { i64 }, ptr %90, i32 0, i32 0 - store i64 %89, ptr %91, align 4 - %92 = load { i64 }, ptr %90, align 4 - %93 = alloca { { i64 }, i1 }, align 8 - %94 = getelementptr inbounds { { i64 }, i1 }, ptr %93, i32 0, i32 0 - store { i64 } %92, ptr %94, align 4 - %95 = getelementptr inbounds { { i64 }, i1 }, ptr %93, i32 0, i32 1 - store i1 true, ptr %95, align 1 - %96 = load { { i64 }, i1 }, ptr %93, align 4 - %97 = extractvalue { { i64 }, i1 } %96, 0 - %98 = extractvalue { { i64 }, i1 } %96, 1 + %70 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %24, 1 + %71 = ptrtoint ptr %70 to i64 + %72 = alloca { i64 }, align 8 + %73 = getelementptr inbounds { i64 }, ptr %72, i32 0, i32 0 + store i64 %71, ptr %73, align 4 + %74 = load { i64 }, ptr %72, align 4 + %75 = alloca { { i64 }, i1 }, align 8 + %76 = getelementptr inbounds { { i64 }, i1 }, ptr %75, i32 0, i32 0 + store { i64 } %74, ptr %76, align 4 + %77 = getelementptr inbounds { { i64 }, i1 }, ptr %75, i32 0, i32 1 + store i1 true, ptr %77, align 1 + %78 = load { { i64 }, i1 }, ptr %75, align 4 br label %_llgo_18 _llgo_17: ; preds = %_llgo_5 - %99 = alloca { { i64 }, i1 }, align 8 - %100 = getelementptr inbounds { { i64 }, i1 }, ptr %99, i32 0, i32 0 - store { i64 } zeroinitializer, ptr %100, align 4 - %101 = getelementptr inbounds { { i64 }, i1 }, ptr %99, i32 0, i32 1 - store i1 false, ptr %101, align 1 - %102 = load { { i64 }, i1 }, ptr %99, align 4 - %103 = extractvalue { { i64 }, i1 } %102, 0 - %104 = extractvalue { { i64 }, i1 } %102, 1 + %79 = alloca { { i64 }, i1 }, align 8 + %80 = getelementptr inbounds { { i64 }, i1 }, ptr %79, i32 0, i32 0 + store { i64 } zeroinitializer, ptr %80, align 4 + %81 = getelementptr inbounds { { i64 }, i1 }, ptr %79, i32 0, i32 1 + store i1 false, ptr %81, align 1 + %82 = load { { i64 }, i1 }, ptr %79, align 4 br label %_llgo_18 _llgo_18: ; preds = %_llgo_17, %_llgo_16 - %105 = phi i64 [ %97, %_llgo_16 ], [ %103, %_llgo_17 ] - %106 = phi i1 [ %98, %_llgo_16 ], [ %104, %_llgo_17 ] - %107 = alloca { { i64 }, i1 }, align 8 - %108 = getelementptr inbounds { { i64 }, i1 }, ptr %107, i32 0, i32 0 - store i64 %105, ptr %108, align 4 - %109 = getelementptr inbounds { { i64 }, i1 }, ptr %107, i32 0, i32 1 - store i1 %106, ptr %109, align 1 - %110 = load { { i64 }, i1 }, ptr %107, align 4 - %111 = extractvalue { { i64 }, i1 } %110, 0 - store { i64 } %111, ptr %23, align 4 - %112 = extractvalue { { i64 }, i1 } %110, 1 - br i1 %112, label %_llgo_7, label %_llgo_9 + %83 = phi { { i64 }, i1 } [ %78, %_llgo_16 ], [ %82, %_llgo_17 ] + %84 = extractvalue { { i64 }, i1 } %83, 0 + store { i64 } %84, ptr %23, align 4 + %85 = extractvalue { { i64 }, i1 } %83, 1 + br i1 %85, label %_llgo_7, label %_llgo_9 } declare ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr, i64) diff --git a/cl/_testgo/struczero/in.go b/cl/_testgo/struczero/in.go index 589b75f2..ce583d11 100644 --- a/cl/_testgo/struczero/in.go +++ b/cl/_testgo/struczero/in.go @@ -20,6 +20,7 @@ func Bar(v any) (ret foo.Foo, ok bool) { func main() { ret, ok := Foo(nil) println(ret.pb, ret.f, "notOk:", !ok) + ret2, ok2 := Bar(foo.Foo{}) println(ret2.Pb(), ret2.F, ok2) } diff --git a/cl/_testgo/struczero/out.ll b/cl/_testgo/struczero/out.ll index 60b85986..a47925bb 100644 --- a/cl/_testgo/struczero/out.ll +++ b/cl/_testgo/struczero/out.ll @@ -1,103 +1,77 @@ ; ModuleID = 'main' source_filename = "main" -%"github.com/goplus/llgo/cl/internal/foo.Foo" = type { ptr, float } -%"github.com/goplus/llgo/internal/runtime.eface" = type { ptr, ptr } %main.bar = type { ptr, float } +%"github.com/goplus/llgo/internal/runtime.eface" = type { ptr, ptr } %"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 } -%"github.com/goplus/llgo/internal/abi.StructField" = type { %"github.com/goplus/llgo/internal/abi.Name", ptr, i64 } -%"github.com/goplus/llgo/internal/abi.Name" = type { ptr } +%"github.com/goplus/llgo/internal/abi.StructField" = type { %"github.com/goplus/llgo/internal/runtime.String", ptr, i64, %"github.com/goplus/llgo/internal/runtime.String", i1 } %"github.com/goplus/llgo/internal/runtime.Slice" = type { ptr, i64, i64 } @"main.init$guard" = global ptr null -@"github.com/goplus/llgo/cl/internal/foo.Foo" = linkonce global ptr null +@0 = private unnamed_addr constant [4 x i8] c"Foo\00", align 1 @main.bar = global ptr null +@1 = private unnamed_addr constant [9 x i8] c"Foo done\00", align 1 @__llgo_argc = global ptr null @__llgo_argv = global ptr null -@0 = private unnamed_addr constant [7 x i8] c"notOk:\00", align 1 -@1 = private unnamed_addr constant [3 x i8] c"pb\00", align 1 +@2 = private unnamed_addr constant [5 x i8] c"main\00", align 1 +@3 = private unnamed_addr constant [7 x i8] c"notOk:\00", align 1 +@4 = private unnamed_addr constant [3 x i8] c"pb\00", align 1 @"*_llgo_byte" = linkonce global ptr null -@2 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 -@3 = private unnamed_addr constant [2 x i8] c"F\00", align 1 -@4 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 -@5 = private unnamed_addr constant [5 x i8] c"main\00", align 1 -@6 = private unnamed_addr constant [43 x i8] c"github.com/goplus/llgo/cl/internal/foo.Foo\00", align 1 -@7 = private unnamed_addr constant [3 x i8] c"pb\00", align 1 -@8 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 -@9 = private unnamed_addr constant [2 x i8] c"f\00", align 1 -@10 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 -@11 = private unnamed_addr constant [5 x i8] c"main\00", align 1 -@12 = private unnamed_addr constant [9 x i8] c"main.bar\00", align 1 - -define { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } @main.Bar(%"github.com/goplus/llgo/internal/runtime.eface" %0) { -_llgo_0: - %1 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 0 - %2 = load ptr, ptr @"github.com/goplus/llgo/cl/internal/foo.Foo", align 8 - %3 = icmp eq ptr %1, %2 - br i1 %3, label %_llgo_1, label %_llgo_2 - -_llgo_1: ; preds = %_llgo_0 - %4 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 1 - %5 = load %"github.com/goplus/llgo/cl/internal/foo.Foo", ptr %4, align 8 - %6 = alloca { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, align 8 - %7 = getelementptr inbounds { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, ptr %6, i32 0, i32 0 - store %"github.com/goplus/llgo/cl/internal/foo.Foo" %5, ptr %7, align 8 - %8 = getelementptr inbounds { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, ptr %6, i32 0, i32 1 - store i1 true, ptr %8, align 1 - %9 = load { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, ptr %6, align 8 - br label %_llgo_3 - -_llgo_2: ; preds = %_llgo_0 - %10 = alloca { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, align 8 - %11 = getelementptr inbounds { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, ptr %10, i32 0, i32 0 - store { ptr, double } zeroinitializer, ptr %11, align 8 - %12 = getelementptr inbounds { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, ptr %10, i32 0, i32 1 - store i1 false, ptr %12, align 1 - %13 = load { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, ptr %10, align 8 - br label %_llgo_3 - -_llgo_3: ; preds = %_llgo_2, %_llgo_1 - %14 = phi { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } [ %9, %_llgo_1 ], [ %13, %_llgo_2 ] - %15 = extractvalue { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } %14, 0 - %16 = extractvalue { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } %14, 1 - %mrv = insertvalue { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } poison, %"github.com/goplus/llgo/cl/internal/foo.Foo" %15, 0 - %mrv1 = insertvalue { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } %mrv, i1 %16, 1 - ret { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } %mrv1 -} +@5 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 +@6 = private unnamed_addr constant [2 x i8] c"f\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 +@9 = private unnamed_addr constant [9 x i8] c"main.bar\00", align 1 define { %main.bar, i1 } @main.Foo(%"github.com/goplus/llgo/internal/runtime.eface" %0) { _llgo_0: - %1 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 0 - %2 = load ptr, ptr @main.bar, align 8 - %3 = icmp eq ptr %1, %2 - br i1 %3, label %_llgo_1, label %_llgo_2 + %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 @0, ptr %2, align 8 + %3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %1, i32 0, i32 1 + store i64 3, ptr %3, align 4 + %4 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %1, align 8 + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %4) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) + %5 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 0 + %6 = load ptr, ptr @main.bar, align 8 + %7 = icmp eq ptr %5, %6 + br i1 %7, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %4 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 1 - %5 = load %main.bar, ptr %4, align 8 - %6 = alloca { %main.bar, i1 }, align 8 - %7 = getelementptr inbounds { %main.bar, i1 }, ptr %6, i32 0, i32 0 - store %main.bar %5, ptr %7, align 8 - %8 = getelementptr inbounds { %main.bar, i1 }, ptr %6, i32 0, i32 1 - store i1 true, ptr %8, align 1 - %9 = load { %main.bar, i1 }, ptr %6, align 8 - br label %_llgo_3 - -_llgo_2: ; preds = %_llgo_0 + %8 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 1 + %9 = load %main.bar, ptr %8, align 8 %10 = alloca { %main.bar, i1 }, align 8 %11 = getelementptr inbounds { %main.bar, i1 }, ptr %10, i32 0, i32 0 - store { ptr, double } zeroinitializer, ptr %11, align 8 + store %main.bar %9, ptr %11, align 8 %12 = getelementptr inbounds { %main.bar, i1 }, ptr %10, i32 0, i32 1 - store i1 false, ptr %12, align 1 + store i1 true, ptr %12, align 1 %13 = load { %main.bar, i1 }, ptr %10, align 8 br label %_llgo_3 +_llgo_2: ; preds = %_llgo_0 + %14 = alloca { %main.bar, i1 }, align 8 + %15 = getelementptr inbounds { %main.bar, i1 }, ptr %14, i32 0, i32 0 + store { ptr, double } zeroinitializer, ptr %15, align 8 + %16 = getelementptr inbounds { %main.bar, i1 }, ptr %14, i32 0, i32 1 + store i1 false, ptr %16, align 1 + %17 = load { %main.bar, i1 }, ptr %14, align 8 + br label %_llgo_3 + _llgo_3: ; preds = %_llgo_2, %_llgo_1 - %14 = phi { %main.bar, i1 } [ %9, %_llgo_1 ], [ %13, %_llgo_2 ] - %15 = extractvalue { %main.bar, i1 } %14, 0 - %16 = extractvalue { %main.bar, i1 } %14, 1 - %mrv = insertvalue { %main.bar, i1 } poison, %main.bar %15, 0 - %mrv1 = insertvalue { %main.bar, i1 } %mrv, i1 %16, 1 + %18 = phi { %main.bar, i1 } [ %13, %_llgo_1 ], [ %17, %_llgo_2 ] + %19 = extractvalue { %main.bar, i1 } %18, 0 + %20 = extractvalue { %main.bar, i1 } %18, 1 + %21 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %22 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %21, i32 0, i32 0 + store ptr @1, ptr %22, align 8 + %23 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %21, i32 0, i32 1 + store i64 8, ptr %23, align 4 + %24 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %21, align 8 + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %24) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) + %mrv = insertvalue { %main.bar, i1 } poison, %main.bar %19, 0 + %mrv1 = insertvalue { %main.bar, i1 } %mrv, i1 %20, 1 ret { %main.bar, i1 } %mrv1 } @@ -108,7 +82,6 @@ _llgo_0: _llgo_1: ; preds = %_llgo_0 store i1 true, ptr @"main.init$guard", align 1 - call void @"github.com/goplus/llgo/cl/internal/foo.init"() call void @"main.init$abi"() br label %_llgo_2 @@ -122,62 +95,46 @@ _llgo_0: store ptr %1, ptr @__llgo_argv, align 8 call void @"github.com/goplus/llgo/internal/runtime.init"() call void @main.init() - %2 = alloca %main.bar, align 8 - %3 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %2, i64 16) - %4 = call { %main.bar, i1 } @main.Foo(%"github.com/goplus/llgo/internal/runtime.eface" zeroinitializer) - %5 = extractvalue { %main.bar, i1 } %4, 0 - store %main.bar %5, ptr %3, align 8 - %6 = extractvalue { %main.bar, i1 } %4, 1 - %7 = getelementptr inbounds %main.bar, ptr %3, i32 0, i32 0 - %8 = load ptr, ptr %7, align 8 - %9 = getelementptr inbounds %main.bar, ptr %3, i32 0, i32 1 - %10 = load float, ptr %9, align 4 - %11 = xor i1 %6, true - %12 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %13 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %12, i32 0, i32 0 - store ptr @0, ptr %13, align 8 - %14 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %12, i32 0, i32 1 - store i64 6, ptr %14, align 4 - %15 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %12, align 8 - call void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr %8) - call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - %16 = fpext float %10 to double - call void @"github.com/goplus/llgo/internal/runtime.PrintFloat"(double %16) - call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %15) - call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %11) + %2 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 0 + store ptr @2, ptr %3, align 8 + %4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 1 + store i64 4, ptr %4, align 4 + %5 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %2, align 8 + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %5) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) - %17 = alloca %"github.com/goplus/llgo/cl/internal/foo.Foo", align 8 - %18 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %17, i64 16) - %19 = load ptr, ptr @"github.com/goplus/llgo/cl/internal/foo.Foo", align 8 - %20 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) - store %"github.com/goplus/llgo/cl/internal/foo.Foo" zeroinitializer, ptr %20, align 8 - %21 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 - %22 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %21, i32 0, i32 0 - store ptr %19, ptr %22, align 8 - %23 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %21, i32 0, i32 1 - store ptr %20, ptr %23, align 8 - %24 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %21, align 8 - %25 = call { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } @main.Bar(%"github.com/goplus/llgo/internal/runtime.eface" %24) - %26 = extractvalue { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } %25, 0 - store %"github.com/goplus/llgo/cl/internal/foo.Foo" %26, ptr %18, align 8 - %27 = extractvalue { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } %25, 1 - %28 = load %"github.com/goplus/llgo/cl/internal/foo.Foo", ptr %18, align 8 - %29 = call ptr @"(github.com/goplus/llgo/cl/internal/foo.Foo).Pb"(%"github.com/goplus/llgo/cl/internal/foo.Foo" %28) - %30 = getelementptr inbounds %"github.com/goplus/llgo/cl/internal/foo.Foo", ptr %18, i32 0, i32 1 - %31 = load float, ptr %30, align 4 - call void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr %29) + %6 = alloca %main.bar, align 8 + %7 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %6, i64 16) + %8 = call { %main.bar, i1 } @main.Foo(%"github.com/goplus/llgo/internal/runtime.eface" zeroinitializer) + %9 = extractvalue { %main.bar, i1 } %8, 0 + store %main.bar %9, ptr %7, align 8 + %10 = extractvalue { %main.bar, i1 } %8, 1 + %11 = getelementptr inbounds %main.bar, ptr %7, i32 0, i32 0 + %12 = load ptr, ptr %11, align 8 + %13 = getelementptr inbounds %main.bar, ptr %7, i32 0, i32 1 + %14 = load float, ptr %13, align 4 + %15 = xor i1 %10, true + %16 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %17 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %16, i32 0, i32 0 + store ptr @3, ptr %17, align 8 + %18 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %16, i32 0, i32 1 + store i64 6, ptr %18, align 4 + %19 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %16, align 8 + call void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr %12) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - %32 = fpext float %31 to double - call void @"github.com/goplus/llgo/internal/runtime.PrintFloat"(double %32) + %20 = fpext float %14 to double + call void @"github.com/goplus/llgo/internal/runtime.PrintFloat"(double %20) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %27) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %19) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %15) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) ret i32 0 } -declare void @"github.com/goplus/llgo/cl/internal/foo.init"() +declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String") + +declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8) declare void @"github.com/goplus/llgo/internal/runtime.init"() @@ -185,147 +142,77 @@ declare ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr, i64) declare void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr) -declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8) - declare void @"github.com/goplus/llgo/internal/runtime.PrintFloat"(double) -declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String") - declare void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1) -declare ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64) - -declare ptr @"(github.com/goplus/llgo/cl/internal/foo.Foo).Pb"(%"github.com/goplus/llgo/cl/internal/foo.Foo") - define void @"main.init$abi"() { _llgo_0: - %0 = load ptr, ptr @"github.com/goplus/llgo/cl/internal/foo.Foo", align 8 - %1 = icmp eq ptr %0, null - br i1 %1, label %_llgo_1, label %_llgo_2 - -_llgo_1: ; preds = %_llgo_0 - %2 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 0 - store ptr @1, ptr %3, align 8 - %4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 1 - store i64 2, ptr %4, align 4 - %5 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %2, align 8 - %6 = load ptr, ptr @"*_llgo_byte", align 8 - %7 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %8 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %7, i32 0, i32 0 - store ptr @2, ptr %8, align 8 - %9 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %7, i32 0, i32 1 - store i64 0, ptr %9, align 4 - %10 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %7, align 8 - %11 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %5, ptr %6, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %10, i1 false, i1 false) - %12 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %13 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %12, i32 0, i32 0 - store ptr @3, ptr %13, align 8 - %14 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %12, i32 0, i32 1 - store i64 1, ptr %14, align 4 - %15 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %12, align 8 - %16 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 13) - %17 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %18 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %17, i32 0, i32 0 - store ptr @4, ptr %18, align 8 - %19 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %17, i32 0, i32 1 - store i64 0, ptr %19, align 4 - %20 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %17, align 8 - %21 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %15, ptr %16, i64 8, %"github.com/goplus/llgo/internal/runtime.String" %20, i1 true, i1 false) - %22 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %23 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %22, i32 0, i32 0 - store ptr @5, ptr %23, align 8 - %24 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %22, i32 0, i32 1 - store i64 4, ptr %24, align 4 - %25 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %22, align 8 - %26 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 48) - %27 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %26, i64 0 - store %"github.com/goplus/llgo/internal/abi.StructField" %11, ptr %27, align 8 - %28 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %26, i64 1 - store %"github.com/goplus/llgo/internal/abi.StructField" %21, ptr %28, align 8 - %29 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 - %30 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %29, i32 0, i32 0 - store ptr %26, ptr %30, align 8 - %31 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %29, i32 0, i32 1 - store i64 2, ptr %31, align 4 - %32 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %29, i32 0, i32 2 - store i64 2, ptr %32, align 4 - %33 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %29, align 8 - %34 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %25, %"github.com/goplus/llgo/internal/runtime.Slice" %33) - %35 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %36 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %35, i32 0, i32 0 - store ptr @6, ptr %36, align 8 - %37 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %35, i32 0, i32 1 - store i64 42, ptr %37, align 4 - %38 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %35, align 8 - %39 = call ptr @"github.com/goplus/llgo/internal/runtime.Named"(%"github.com/goplus/llgo/internal/runtime.String" %38, ptr %34) - store ptr %39, ptr @"github.com/goplus/llgo/cl/internal/foo.Foo", align 8 - br label %_llgo_2 - -_llgo_2: ; preds = %_llgo_1, %_llgo_0 - %40 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %41 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %40, i32 0, i32 0 - store ptr @7, ptr %41, align 8 - %42 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %40, i32 0, i32 1 - store i64 2, ptr %42, align 4 - %43 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %40, align 8 - %44 = load ptr, ptr @"*_llgo_byte", align 8 - %45 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %46 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %45, i32 0, i32 0 - store ptr @8, ptr %46, align 8 - %47 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %45, i32 0, i32 1 - store i64 0, ptr %47, align 4 - %48 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %45, align 8 - %49 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %43, ptr %44, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %48, i1 false, i1 false) - %50 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %51 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %50, i32 0, i32 0 - store ptr @9, ptr %51, align 8 - %52 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %50, i32 0, i32 1 - store i64 1, ptr %52, align 4 - %53 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %50, align 8 - %54 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 13) - %55 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %56 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %55, i32 0, i32 0 - store ptr @10, ptr %56, align 8 - %57 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %55, i32 0, i32 1 - store i64 0, ptr %57, align 4 - %58 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %55, align 8 - %59 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %53, ptr %54, i64 8, %"github.com/goplus/llgo/internal/runtime.String" %58, i1 false, i1 false) - %60 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %61 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %60, i32 0, i32 0 - store ptr @11, ptr %61, align 8 - %62 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %60, i32 0, i32 1 - store i64 4, ptr %62, align 4 - %63 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %60, align 8 - %64 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 48) - %65 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %64, i64 0 - store %"github.com/goplus/llgo/internal/abi.StructField" %49, ptr %65, align 8 - %66 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %64, i64 1 - store %"github.com/goplus/llgo/internal/abi.StructField" %59, ptr %66, align 8 - %67 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 - %68 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %67, i32 0, i32 0 - store ptr %64, ptr %68, align 8 - %69 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %67, i32 0, i32 1 - store i64 2, ptr %69, align 4 - %70 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %67, i32 0, i32 2 - store i64 2, ptr %70, align 4 - %71 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %67, align 8 - %72 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %63, %"github.com/goplus/llgo/internal/runtime.Slice" %71) - %73 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %74 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %73, i32 0, i32 0 - store ptr @12, ptr %74, align 8 - %75 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %73, i32 0, i32 1 - store i64 8, ptr %75, align 4 - %76 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %73, align 8 - %77 = call ptr @"github.com/goplus/llgo/internal/runtime.Named"(%"github.com/goplus/llgo/internal/runtime.String" %76, ptr %72) - store ptr %77, ptr @main.bar, align 8 + %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 @4, ptr %1, align 8 + %2 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %0, i32 0, i32 1 + store i64 2, ptr %2, align 4 + %3 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %0, align 8 + %4 = load ptr, ptr @"*_llgo_byte", align 8 + %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 @5, 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 @6, ptr %11, align 8 + %12 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %10, i32 0, i32 1 + store i64 1, ptr %12, align 4 + %13 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %10, align 8 + %14 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 13) + %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 @7, ptr %16, align 8 + %17 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %15, i32 0, i32 1 + store i64 0, ptr %17, align 4 + %18 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %15, align 8 + %19 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %13, ptr %14, i64 8, %"github.com/goplus/llgo/internal/runtime.String" %18, i1 false) + %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 @8, 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 + %24 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 112) + %25 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %24, i64 0 + store %"github.com/goplus/llgo/internal/abi.StructField" %9, ptr %25, align 8 + %26 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %24, i64 1 + store %"github.com/goplus/llgo/internal/abi.StructField" %19, ptr %26, align 8 + %27 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %28 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %27, i32 0, i32 0 + store ptr %24, ptr %28, align 8 + %29 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %27, i32 0, i32 1 + store i64 2, ptr %29, align 4 + %30 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %27, i32 0, i32 2 + store i64 2, ptr %30, align 4 + %31 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %27, align 8 + %32 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %23, i64 16, %"github.com/goplus/llgo/internal/runtime.Slice" %31) + %33 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %34 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %33, i32 0, i32 0 + store ptr @9, ptr %34, align 8 + %35 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %33, i32 0, i32 1 + store i64 8, ptr %35, align 4 + %36 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %33, align 8 + %37 = call ptr @"github.com/goplus/llgo/internal/runtime.Named"(%"github.com/goplus/llgo/internal/runtime.String" %36, ptr %32) + store ptr %37, ptr @main.bar, align 8 ret void } -declare ptr @"github.com/goplus/llgo/internal/runtime.Struct"(i64, %"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.Slice") +declare ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String", i64, %"github.com/goplus/llgo/internal/runtime.Slice") -declare %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String", ptr, i64, %"github.com/goplus/llgo/internal/runtime.String", i1, i1) +declare %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String", ptr, i64, %"github.com/goplus/llgo/internal/runtime.String", i1) declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64) -declare ptr @"github.com/goplus/llgo/internal/runtime.Named"(%"github.com/goplus/llgo/internal/runtime.String", ptr) +declare ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64) + +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") diff --git a/cl/_testrt/concat/out.ll b/cl/_testrt/concat/out.ll index 7217f45f..1ef2685d 100644 --- a/cl/_testrt/concat/out.ll +++ b/cl/_testrt/concat/out.ll @@ -25,37 +25,26 @@ _llgo_0: %4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 1 store i64 0, ptr %4, align 4 %5 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %2, align 8 - %6 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %5, 0 - %7 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %5, 1 br label %_llgo_1 _llgo_1: ; preds = %_llgo_2, %_llgo_0 - %8 = phi ptr [ %6, %_llgo_0 ], [ %22, %_llgo_2 ] - %9 = phi i64 [ %7, %_llgo_0 ], [ %23, %_llgo_2 ] - %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 - %12 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %10, i32 0, i32 1 - store i64 %9, ptr %12, align 4 - %13 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %10, align 8 - %14 = phi i64 [ -1, %_llgo_0 ], [ %15, %_llgo_2 ] - %15 = add i64 %14, 1 - %16 = icmp slt i64 %15, %1 - br i1 %16, label %_llgo_2, label %_llgo_3 + %6 = phi %"github.com/goplus/llgo/internal/runtime.String" [ %5, %_llgo_0 ], [ %14, %_llgo_2 ] + %7 = phi i64 [ -1, %_llgo_0 ], [ %8, %_llgo_2 ] + %8 = add i64 %7, 1 + %9 = icmp slt i64 %8, %1 + br i1 %9, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 - %17 = icmp slt i64 %15, 0 - call void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1 %17) - %18 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %0, 0 - %19 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %18, i64 %15 - %20 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %19, align 8 - %21 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.StringCat"(%"github.com/goplus/llgo/internal/runtime.String" %13, %"github.com/goplus/llgo/internal/runtime.String" %20) - %22 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %21, 0 - %23 = extractvalue %"github.com/goplus/llgo/internal/runtime.String" %21, 1 + %10 = icmp slt i64 %8, 0 + call void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1 %10) + %11 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %0, 0 + %12 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %11, i64 %8 + %13 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %12, align 8 + %14 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.StringCat"(%"github.com/goplus/llgo/internal/runtime.String" %6, %"github.com/goplus/llgo/internal/runtime.String" %13) br label %_llgo_1 _llgo_3: ; preds = %_llgo_1 - ret %"github.com/goplus/llgo/internal/runtime.String" %13 + ret %"github.com/goplus/llgo/internal/runtime.String" %6 } define %"github.com/goplus/llgo/internal/runtime.String" @main.info(%"github.com/goplus/llgo/internal/runtime.String" %0) { diff --git a/internal/abi/llgo_autogen.lla b/internal/abi/llgo_autogen.lla index 728e9013c16896b9ccc271fed5c09ccbf53ba072..2eb6053511a49bb313d97512712d91116676dc0d 100644 GIT binary patch literal 3353 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 diff --git a/internal/abi/type.go b/internal/abi/type.go index a6a01d85..8cf09096 100644 --- a/internal/abi/type.go +++ b/internal/abi/type.go @@ -20,6 +20,15 @@ import ( "unsafe" ) +// IsExported reports whether name starts with an upper-case letter. +func IsExported(name string) bool { + if len(name) > 0 { + c := name[0] + return 'A' <= c && c <= 'Z' + } + return false +} + // ----------------------------------------------------------------------------- // Type is the runtime representation of a Go type. @@ -46,8 +55,8 @@ type Type struct { // If the KindGCProg bit is set in kind, GCData is a GC program. // Otherwise it is a ptrmask bitmap. See mbitmap.go for details. GCData *byte - Str_ Name // string form - PtrToThis_ *Type // type for pointer to this type, may be nil + Str_ string // string form + PtrToThis_ *Type // type for pointer to this type, may be nil } // A Kind represents the specific kind of type that a Type represents. @@ -209,32 +218,41 @@ func (p *FuncType) Variadic() bool { } type StructField struct { - Name Name // name is always non-empty + Name_ string // name is always non-empty Typ *Type // type of field Offset uintptr // byte offset of field + + Tag_ string + Embedded_ bool } +// Embedded reports whether the field is embedded. func (f *StructField) Embedded() bool { - return f.Name.IsEmbedded() + return f.Embedded_ +} + +// Exported reports whether the field is exported. +func (f *StructField) Exported() bool { + return IsExported(f.Name_) } type StructType struct { Type - PkgPath Name - Fields []StructField + PkgPath_ string + Fields []StructField } type InterfaceType struct { Type - PkgPath Name // import path - Methods []Imethod // sorted by hash + PkgPath_ string // import path + Methods []Imethod // sorted by hash } type Text = unsafe.Pointer // TODO(xsw): to be confirmed // Method on non-interface type type Method struct { - Name_ Name // name of method + Name_ string // name of method Mtyp_ *FuncType // method type (without receiver) Ifn_ Text // fn used in interface call (one-word receiver) Tfn_ Text // fn used for normal method call @@ -242,7 +260,7 @@ type Method struct { // Exported reports whether the method is exported. func (p *Method) Exported() bool { - return p.Name_.IsExported() + return IsExported(p.Name_) } // UncommonType is present only for defined types or types with methods @@ -250,7 +268,7 @@ func (p *Method) Exported() bool { // Using a pointer to this struct reduces the overall size required // to describe a non-defined type with no methods. type UncommonType struct { - PkgPath_ Name // import path; empty for built-in types like int, string + PkgPath_ string // import path; empty for built-in types like int, string Mcount uint16 // number of methods Xcount uint16 // number of exported methods Moff uint32 // offset from this uncommontype to [mcount]Method @@ -272,7 +290,7 @@ func (t *UncommonType) ExportedMethods() []Method { // Imethod represents a method on an interface type type Imethod struct { - Name_ Name // name of method + Name_ string // name of method Typ_ *FuncType // .(*FuncType) underneath } @@ -438,6 +456,7 @@ func addChecked(p unsafe.Pointer, x uintptr, whySafe string) unsafe.Pointer { return unsafe.Pointer(uintptr(p) + x) } +/* // Name is an encoded type Name with optional extra data. // // The first byte is a bit field containing: @@ -588,5 +607,6 @@ func NewName(n, tag string, exported, embedded bool) Name { return Name{Bytes: &b[0]} } +*/ // ----------------------------------------------------------------------------- diff --git a/internal/runtime/llgo_autogen.lla b/internal/runtime/llgo_autogen.lla index 8bb2787b03ac6770f8fa5d0e706047807095e08c..6b78845551b7b49e62343c1d21c6b722bb3c9053 100644 GIT binary patch literal 11825 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 Q|App%b@V?l91QG#0rq0k1poj5 literal 12124 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 CK*34? diff --git a/internal/runtime/z_face.go b/internal/runtime/z_face.go index 01907b0a..c7611fd3 100644 --- a/internal/runtime/z_face.go +++ b/internal/runtime/z_face.go @@ -86,7 +86,7 @@ func Func(in, out []*Type, variadic bool) *FuncType { } // Imethod returns an interface method. -func Imethod(name Name, typ *FuncType) abi.Imethod { +func Imethod(name string, typ *FuncType) abi.Imethod { return abi.Imethod{ Name_: name, Typ_: typ, @@ -94,7 +94,7 @@ func Imethod(name Name, typ *FuncType) abi.Imethod { } // Method returns a method. -func Method(name Name, typ *FuncType, ifn, tfn abi.Text) abi.Method { +func Method(name string, typ *FuncType, ifn, tfn abi.Text) abi.Method { return abi.Method{ Name_: name, Mtyp_: typ, @@ -104,11 +104,11 @@ func Method(name Name, typ *FuncType, ifn, tfn abi.Text) abi.Method { } // Named returns a named type. -func Named(pkgPath, name Name, underlying *Type, methods []abi.Method) *Type { +func Named(pkgPath, name string, underlying *Type, methods []abi.Method) *Type { tflag := underlying.TFlag size := typeHdrSize n := len(methods) - if n > 0 || pkgPath.Bytes != nil { + if n > 0 || pkgPath != "" { size += uncommonTypeHdrSize + uintptr(n)*methodSize tflag |= abi.TFlagUncommon } @@ -139,15 +139,15 @@ func Named(pkgPath, name Name, underlying *Type, methods []abi.Method) *Type { } // Interface returns an interface type. -func Interface(pkgPath Name, methods []abi.Imethod) *Type { +func Interface(pkgPath string, methods []abi.Imethod) *Type { ret := &abi.InterfaceType{ Type: Type{ Size_: unsafe.Sizeof(eface{}), Hash: uint32(abi.Interface), // TODO(xsw): hash Kind_: uint8(abi.Interface), }, - PkgPath: pkgPath, - Methods: methods, + PkgPath_: pkgPath, + Methods: methods, } return &ret.Type } @@ -168,7 +168,7 @@ func NewItab(inter *InterfaceType, typ *Type) *Itab { ret.fun[0] = 0 } else { data := (*uintptr)(c.Advance(ptr, int(itabHdrSize))) - mthds := methods(u, inter.PkgPath) + mthds := methods(u, inter.PkgPath_) for i, m := range inter.Methods { fn := findMethod(mthds, m) if fn == nil { @@ -182,9 +182,9 @@ func NewItab(inter *InterfaceType, typ *Type) *Itab { } func findMethod(mthds []abi.Method, im abi.Imethod) abi.Text { - imName := im.Name_.Name() + imName := im.Name_ for _, m := range mthds { - mName := m.Name_.Name() + mName := m.Name_ if mName >= imName { if mName == imName && m.Mtyp_ == im.Typ_ { return m.Ifn_ @@ -195,8 +195,8 @@ func findMethod(mthds []abi.Method, im abi.Imethod) abi.Text { return nil } -func methods(u *abi.UncommonType, from abi.Name) []abi.Method { - if u.PkgPath_.Name() == from.Name() { +func methods(u *abi.UncommonType, from string) []abi.Method { + if u.PkgPath_ == from { return u.Methods() } return u.ExportedMethods() diff --git a/internal/runtime/z_type.go b/internal/runtime/z_type.go index dfe2a4d4..aa4431bb 100644 --- a/internal/runtime/z_type.go +++ b/internal/runtime/z_type.go @@ -23,11 +23,13 @@ import ( ) type Kind = abi.Kind -type Name = abi.Name type Type = abi.Type // ----------------------------------------------------------------------------- +/* +type Name = abi.Name + // NewName creates a new name. func NewName(name string, exported bool) Name { return abi.NewName(name, "", exported, false) @@ -40,6 +42,7 @@ func NewPkgName(pkgPath string) (ret Name) { } return } +*/ // ----------------------------------------------------------------------------- @@ -102,25 +105,26 @@ func basicType(kind abi.Kind) *Type { // ----------------------------------------------------------------------------- // StructField returns a struct field. -func StructField(name string, typ *Type, off uintptr, tag string, exported, embedded bool) abi.StructField { - n := abi.NewName(name, tag, exported, embedded) +func StructField(name string, typ *Type, off uintptr, tag string, embedded bool) abi.StructField { return abi.StructField{ - Name: n, - Typ: typ, - Offset: off, + Name_: name, + Typ: typ, + Offset: off, + Tag_: tag, + Embedded_: embedded, } } // Struct returns a struct type. -func Struct(pkgPath Name, size uintptr, fields ...abi.StructField) *Type { +func Struct(pkgPath string, size uintptr, fields ...abi.StructField) *Type { ret := &abi.StructType{ Type: Type{ Size_: size, Hash: uint32(abi.Struct), // TODO(xsw): hash Kind_: uint8(abi.Struct), }, - PkgPath: pkgPath, - Fields: fields, + PkgPath_: pkgPath, + Fields: fields, } return &ret.Type } diff --git a/ssa/cl_test.go b/ssa/cl_test.go index e65de0f7..513944c1 100644 --- a/ssa/cl_test.go +++ b/ssa/cl_test.go @@ -26,7 +26,7 @@ import ( ) func TestFromTestgo(t *testing.T) { - cltest.FromDir(t, "strucintf", "../cl/_testgo", false) + cltest.FromDir(t, "", "../cl/_testgo", false) } func TestFromTestpy(t *testing.T) { diff --git a/ssa/expr.go b/ssa/expr.go index ca48328e..5e7b50af 100644 --- a/ssa/expr.go +++ b/ssa/expr.go @@ -91,6 +91,8 @@ func (p Program) Zero(t Type) Expr { flds[i] = p.Zero(p.rawType(u.Field(i).Type())).impl } ret = llvm.ConstStruct(flds, false) + case *types.Slice: + ret = p.Zero(p.rtType("Slice")).impl default: log.Panicln("todo:", u) } @@ -193,7 +195,8 @@ func (b Builder) Str(v string) (ret Expr) { func (b Builder) pkgName(pkgPath string) Expr { // TODO(xsw): use a global cache - return b.Call(b.Pkg.rtFunc("NewPkgName"), b.Str(pkgPath)) + // return b.Call(b.Pkg.rtFunc("NewPkgName"), b.Str(pkgPath)) + return b.Str(pkgPath) } // unsafeString(data *byte, size int) string @@ -513,38 +516,42 @@ func llvmPredBlocks(preds []BasicBlock) []llvm.BasicBlock { type aPhi struct { Expr - phis []llvm.Value + // phis []llvm.Value } // Phi represents a phi node. type Phi = *aPhi +/* func (b Builder) newPhi(t Type, phis []llvm.Value) Phi { ret := b.aggregateValue(t, phis...) return &aPhi{ret, phis} } +*/ // AddIncoming adds incoming values to a phi node. func (p Phi) AddIncoming(b Builder, preds []BasicBlock, f func(i int, blk BasicBlock) Expr) { bs := llvmPredBlocks(preds) - phis := p.phis - if phis != nil { - vals := make([][]llvm.Value, len(phis)) - for iblk, blk := range preds { - val := f(iblk, blk).impl - impl := b.impl - b.SetBlockEx(blk, BeforeLast, false) - for i := range phis { - if iblk == 0 { - vals[i] = make([]llvm.Value, len(preds)) + /* + phis := p.phis + if phis != nil { + vals := make([][]llvm.Value, len(phis)) + for iblk, blk := range preds { + val := f(iblk, blk).impl + impl := b.impl + b.SetBlockEx(blk, BeforeLast, false) + for i := range phis { + if iblk == 0 { + vals[i] = make([]llvm.Value, len(preds)) + } + vals[i][iblk] = llvm.CreateExtractValue(impl, val, i) } - vals[i][iblk] = llvm.CreateExtractValue(impl, val, i) } - } - for i, phi := range phis { - phi.AddIncoming(vals[i], bs) - } - } else { + for i, phi := range phis { + phi.AddIncoming(vals[i], bs) + } + } else */ + { vals := make([]llvm.Value, len(preds)) for iblk, blk := range preds { vals[iblk] = f(iblk, blk).impl @@ -556,24 +563,27 @@ func (p Phi) AddIncoming(b Builder, preds []BasicBlock, f func(i int, blk BasicB // Phi returns a phi node. func (b Builder) Phi(t Type) Phi { impl := b.impl - switch tund := t.raw.Type.Underlying().(type) { - case *types.Basic: - kind := tund.Kind() - switch kind { - case types.String: - phis := createStringPhis(impl, make([]llvm.Value, 0, 2), b.Prog) + /* + switch tund := t.raw.Type.Underlying().(type) { + case *types.Basic: + kind := tund.Kind() + switch kind { + case types.String: + phis := createStringPhis(impl, make([]llvm.Value, 0, 2), b.Prog) + return b.newPhi(t, phis) + } + case *types.Struct: + phis := createStrucPhis(impl, nil, tund, b.Prog) return b.newPhi(t, phis) + default: + log.Panicf("todo: %T\n", tund) } - case *types.Struct: - phis := createStrucPhis(impl, nil, tund, b.Prog) - return b.newPhi(t, phis) - default: - log.Panicf("todo: %T\n", tund) - } + */ phi := llvm.CreatePHI(impl, t.ll) - return &aPhi{Expr{phi, t}, nil} + return &aPhi{Expr{phi, t}} //, nil} } +/* func createStringPhis(b llvm.Builder, phis []llvm.Value, prog Program) []llvm.Value { phis = append(phis, llvm.CreatePHI(b, prog.tyVoidPtr())) return append(phis, llvm.CreatePHI(b, prog.tyInt())) @@ -611,6 +621,7 @@ func createBasicPhi(b llvm.Builder, phis []llvm.Value, t types.Type, prog Progra phi := llvm.CreatePHI(b, tll) return append(phis, phi) } +*/ // ----------------------------------------------------------------------------- diff --git a/ssa/interface.go b/ssa/interface.go index 696a782f..217d231a 100644 --- a/ssa/interface.go +++ b/ssa/interface.go @@ -59,10 +59,19 @@ func (b Builder) abiTypeOf(t types.Type) Expr { panic("todo") } +// func Named(pkgPath, name string, underlying *Type, methods []abi.Method) func (b Builder) abiNamedOf(t *types.Named) Expr { under := b.abiTypeOf(t.Underlying()) name := NameOf(t) - return b.Call(b.Pkg.rtFunc("Named"), b.Str(name), under) + + prog := b.Prog + pkg := b.Pkg + pkgPath := b.pkgName(pkg.Path()) + fn := pkg.rtFunc("Named") + tSlice := lastParamType(prog, fn) + // TODO(xsw): methods + methods := prog.Zero(tSlice) + return b.Call(fn, pkgPath, b.Str(name), under, methods) } func (b Builder) abiPointerOf(t *types.Pointer) Expr { @@ -70,7 +79,7 @@ func (b Builder) abiPointerOf(t *types.Pointer) Expr { return b.Call(b.Pkg.rtFunc("Pointer"), elem) } -// func Struct(size uintptr, pkgPath string, fields []abi.StructField) *abi.Type +// func Struct(pkgPath string, size uintptr, fields []abi.StructField) func (b Builder) abiStructOf(t *types.Struct) Expr { pkg := b.Pkg prog := b.Prog @@ -85,20 +94,23 @@ func (b Builder) abiStructOf(t *types.Struct) Expr { flds[i] = b.structField(sfAbi, prog, f, off, t.Tag(i)) } pkgPath := b.pkgName(pkg.Path()) - params := strucAbi.raw.Type.(*types.Signature).Params() - tSlice := prog.rawType(params.At(params.Len() - 1).Type().(*types.Slice)) + tSlice := lastParamType(prog, strucAbi) fldSlice := b.SliceLit(tSlice, flds...) size := prog.IntVal(prog.SizeOf(typ), prog.Uintptr()) return b.Call(strucAbi, pkgPath, size, fldSlice) } -// func StructField(name string, typ *abi.Type, off uintptr, tag string, exported, embedded bool) abi.StructField +func lastParamType(prog Program, fn Expr) Type { + params := fn.raw.Type.(*types.Signature).Params() + return prog.rawType(params.At(params.Len() - 1).Type()) +} + +// func StructField(name string, typ *abi.Type, off uintptr, tag string, embedded bool) abi.StructField func (b Builder) structField(sfAbi Expr, prog Program, f *types.Var, offset uintptr, tag string) Expr { name := b.Str(f.Name()) typ := b.abiType(f.Type()) - exported := prog.Val(f.Exported()) embedded := prog.Val(f.Embedded()) - return b.Call(sfAbi, name, typ, prog.Val(offset), b.Str(tag), exported, embedded) + return b.Call(sfAbi, name, typ, prog.Val(offset), b.Str(tag), embedded) } // abiType returns the abi type of the specified type. From c9037858646704e22ed53abd132154e56bae1c86 Mon Sep 17 00:00:00 2001 From: xushiwei Date: Sun, 26 May 2024 17:55:16 +0800 Subject: [PATCH 6/6] gentests --- cl/_testgo/strucintf/out.ll | 109 +++++----- cl/_testgo/struczero/out.ll | 410 +++++++++++++++++++++++------------- cl/_testrt/gblarray/out.ll | 6 +- 3 files changed, 323 insertions(+), 202 deletions(-) diff --git a/cl/_testgo/strucintf/out.ll b/cl/_testgo/strucintf/out.ll index e9932f44..9e09848f 100644 --- a/cl/_testgo/strucintf/out.ll +++ b/cl/_testgo/strucintf/out.ll @@ -3,8 +3,7 @@ source_filename = "main" %"github.com/goplus/llgo/internal/runtime.eface" = type { ptr, ptr } %"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 } -%"github.com/goplus/llgo/internal/abi.StructField" = type { %"github.com/goplus/llgo/internal/abi.Name", ptr, i64 } -%"github.com/goplus/llgo/internal/abi.Name" = type { ptr } +%"github.com/goplus/llgo/internal/abi.StructField" = type { %"github.com/goplus/llgo/internal/runtime.String", ptr, i64, %"github.com/goplus/llgo/internal/runtime.String", i1 } %"github.com/goplus/llgo/internal/runtime.Slice" = type { ptr, i64, i64 } @"main.init$guard" = global ptr null @@ -270,78 +269,74 @@ _llgo_0: %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, i1 false) + %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 @5, 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 - %14 = call %"github.com/goplus/llgo/internal/abi.Name" @"github.com/goplus/llgo/internal/runtime.NewPkgName"(%"github.com/goplus/llgo/internal/runtime.String" %13) - %15 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 24) - %16 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %15, i64 0 - store %"github.com/goplus/llgo/internal/abi.StructField" %9, ptr %16, align 8 - %17 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 - %18 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %17, i32 0, i32 0 - store ptr %15, ptr %18, align 8 - %19 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %17, i32 0, i32 1 + %14 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 56) + %15 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %14, i64 0 + store %"github.com/goplus/llgo/internal/abi.StructField" %9, ptr %15, align 8 + %16 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %17 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %16, i32 0, i32 0 + store ptr %14, ptr %17, align 8 + %18 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %16, i32 0, i32 1 + store i64 1, ptr %18, align 4 + %19 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %16, i32 0, i32 2 store i64 1, ptr %19, align 4 - %20 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %17, i32 0, i32 2 - store i64 1, ptr %20, align 4 - %21 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %17, align 8 - %22 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/abi.Name" %14, i64 8, %"github.com/goplus/llgo/internal/runtime.Slice" %21) - store ptr %22, ptr @"main.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88", align 8 - %23 = load ptr, ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk", align 8 - %24 = icmp eq ptr %23, null - br i1 %24, label %_llgo_1, label %_llgo_2 + %20 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %16, align 8 + %21 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %13, i64 8, %"github.com/goplus/llgo/internal/runtime.Slice" %20) + store ptr %21, ptr @"main.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88", align 8 + %22 = load ptr, ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk", align 8 + %23 = icmp eq ptr %22, null + br i1 %23, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %25 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %26 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %25, i32 0, i32 0 - store ptr @6, ptr %26, align 8 - %27 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %25, i32 0, i32 1 - store i64 1, ptr %27, align 4 - %28 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %25, align 8 - %29 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) - %30 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %31 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %30, i32 0, i32 0 - store ptr @7, ptr %31, align 8 - %32 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %30, i32 0, i32 1 - store i64 0, ptr %32, align 4 - %33 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %30, align 8 - %34 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %28, ptr %29, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %33, i1 true, i1 false) - %35 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %36 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %35, i32 0, i32 0 - store ptr @8, ptr %36, align 8 - %37 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %35, i32 0, i32 1 - store i64 4, ptr %37, align 4 - %38 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %35, align 8 - %39 = call %"github.com/goplus/llgo/internal/abi.Name" @"github.com/goplus/llgo/internal/runtime.NewPkgName"(%"github.com/goplus/llgo/internal/runtime.String" %38) - %40 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 24) - %41 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %40, i64 0 - store %"github.com/goplus/llgo/internal/abi.StructField" %34, ptr %41, align 8 - %42 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 - %43 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %42, i32 0, i32 0 - store ptr %40, ptr %43, align 8 - %44 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %42, i32 0, i32 1 - store i64 1, ptr %44, align 4 - %45 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %42, i32 0, i32 2 - store i64 1, ptr %45, align 4 - %46 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %42, align 8 - %47 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/abi.Name" %39, i64 8, %"github.com/goplus/llgo/internal/runtime.Slice" %46) - store ptr %47, ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk", align 8 + %24 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %25 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %24, i32 0, i32 0 + store ptr @6, ptr %25, align 8 + %26 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %24, i32 0, i32 1 + store i64 1, ptr %26, align 4 + %27 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %24, align 8 + %28 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) + %29 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %30 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %29, i32 0, i32 0 + store ptr @7, ptr %30, align 8 + %31 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %29, i32 0, i32 1 + store i64 0, ptr %31, align 4 + %32 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %29, align 8 + %33 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %27, ptr %28, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %32, i1 false) + %34 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %35 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %34, i32 0, i32 0 + store ptr @8, ptr %35, align 8 + %36 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %34, i32 0, i32 1 + store i64 4, ptr %36, align 4 + %37 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %34, align 8 + %38 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 56) + %39 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %38, i64 0 + store %"github.com/goplus/llgo/internal/abi.StructField" %33, ptr %39, align 8 + %40 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %41 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %40, i32 0, i32 0 + store ptr %38, ptr %41, align 8 + %42 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %40, i32 0, i32 1 + store i64 1, ptr %42, align 4 + %43 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %40, i32 0, i32 2 + store i64 1, ptr %43, align 4 + %44 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %40, align 8 + %45 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %37, i64 8, %"github.com/goplus/llgo/internal/runtime.Slice" %44) + store ptr %45, ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk", align 8 br label %_llgo_2 _llgo_2: ; preds = %_llgo_1, %_llgo_0 ret void } -declare ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/abi.Name", i64, %"github.com/goplus/llgo/internal/runtime.Slice") +declare ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String", i64, %"github.com/goplus/llgo/internal/runtime.Slice") -declare %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String", ptr, i64, %"github.com/goplus/llgo/internal/runtime.String", i1, i1) +declare %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String", ptr, i64, %"github.com/goplus/llgo/internal/runtime.String", i1) declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64) -declare %"github.com/goplus/llgo/internal/abi.Name" @"github.com/goplus/llgo/internal/runtime.NewPkgName"(%"github.com/goplus/llgo/internal/runtime.String") - declare ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64) diff --git a/cl/_testgo/struczero/out.ll b/cl/_testgo/struczero/out.ll index a47925bb..8299781b 100644 --- a/cl/_testgo/struczero/out.ll +++ b/cl/_testgo/struczero/out.ll @@ -1,77 +1,104 @@ ; ModuleID = 'main' source_filename = "main" -%main.bar = type { ptr, float } +%"github.com/goplus/llgo/cl/internal/foo.Foo" = type { ptr, float } %"github.com/goplus/llgo/internal/runtime.eface" = type { ptr, ptr } +%main.bar = type { ptr, float } %"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 } %"github.com/goplus/llgo/internal/abi.StructField" = type { %"github.com/goplus/llgo/internal/runtime.String", ptr, i64, %"github.com/goplus/llgo/internal/runtime.String", i1 } %"github.com/goplus/llgo/internal/runtime.Slice" = type { ptr, i64, i64 } @"main.init$guard" = global ptr null -@0 = private unnamed_addr constant [4 x i8] c"Foo\00", align 1 +@"github.com/goplus/llgo/cl/internal/foo.Foo" = linkonce global ptr null @main.bar = global ptr null -@1 = private unnamed_addr constant [9 x i8] c"Foo done\00", align 1 @__llgo_argc = global ptr null @__llgo_argv = global ptr null -@2 = private unnamed_addr constant [5 x i8] c"main\00", align 1 -@3 = private unnamed_addr constant [7 x i8] c"notOk:\00", align 1 -@4 = private unnamed_addr constant [3 x i8] c"pb\00", align 1 +@0 = private unnamed_addr constant [7 x i8] c"notOk:\00", align 1 +@1 = private unnamed_addr constant [3 x i8] c"pb\00", align 1 @"*_llgo_byte" = linkonce global ptr null -@5 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 -@6 = private unnamed_addr constant [2 x i8] c"f\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 -@9 = private unnamed_addr constant [9 x i8] c"main.bar\00", align 1 +@2 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 +@3 = private unnamed_addr constant [2 x i8] c"F\00", align 1 +@4 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 +@5 = private unnamed_addr constant [5 x i8] c"main\00", align 1 +@6 = private unnamed_addr constant [5 x i8] c"main\00", align 1 +@7 = private unnamed_addr constant [43 x i8] c"github.com/goplus/llgo/cl/internal/foo.Foo\00", align 1 +@8 = private unnamed_addr constant [3 x i8] c"pb\00", align 1 +@9 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 +@10 = private unnamed_addr constant [2 x i8] c"f\00", align 1 +@11 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 +@12 = private unnamed_addr constant [5 x i8] c"main\00", align 1 +@13 = private unnamed_addr constant [5 x i8] c"main\00", align 1 +@14 = private unnamed_addr constant [9 x i8] c"main.bar\00", align 1 -define { %main.bar, i1 } @main.Foo(%"github.com/goplus/llgo/internal/runtime.eface" %0) { +define { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } @main.Bar(%"github.com/goplus/llgo/internal/runtime.eface" %0) { _llgo_0: - %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 @0, ptr %2, align 8 - %3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %1, i32 0, i32 1 - store i64 3, ptr %3, align 4 - %4 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %1, align 8 - call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %4) - call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) - %5 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 0 - %6 = load ptr, ptr @main.bar, align 8 - %7 = icmp eq ptr %5, %6 - br i1 %7, label %_llgo_1, label %_llgo_2 + %1 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 0 + %2 = load ptr, ptr @"github.com/goplus/llgo/cl/internal/foo.Foo", align 8 + %3 = icmp eq ptr %1, %2 + br i1 %3, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %8 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 1 - %9 = load %main.bar, ptr %8, align 8 - %10 = alloca { %main.bar, i1 }, align 8 - %11 = getelementptr inbounds { %main.bar, i1 }, ptr %10, i32 0, i32 0 - store %main.bar %9, ptr %11, align 8 - %12 = getelementptr inbounds { %main.bar, i1 }, ptr %10, i32 0, i32 1 - store i1 true, ptr %12, align 1 - %13 = load { %main.bar, i1 }, ptr %10, align 8 + %4 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 1 + %5 = load %"github.com/goplus/llgo/cl/internal/foo.Foo", ptr %4, align 8 + %6 = alloca { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, align 8 + %7 = getelementptr inbounds { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, ptr %6, i32 0, i32 0 + store %"github.com/goplus/llgo/cl/internal/foo.Foo" %5, ptr %7, align 8 + %8 = getelementptr inbounds { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, ptr %6, i32 0, i32 1 + store i1 true, ptr %8, align 1 + %9 = load { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, ptr %6, align 8 br label %_llgo_3 _llgo_2: ; preds = %_llgo_0 - %14 = alloca { %main.bar, i1 }, align 8 - %15 = getelementptr inbounds { %main.bar, i1 }, ptr %14, i32 0, i32 0 - store { ptr, double } zeroinitializer, ptr %15, align 8 - %16 = getelementptr inbounds { %main.bar, i1 }, ptr %14, i32 0, i32 1 - store i1 false, ptr %16, align 1 - %17 = load { %main.bar, i1 }, ptr %14, align 8 + %10 = alloca { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, align 8 + %11 = getelementptr inbounds { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, ptr %10, i32 0, i32 0 + store { ptr, double } zeroinitializer, ptr %11, align 8 + %12 = getelementptr inbounds { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, ptr %10, i32 0, i32 1 + store i1 false, ptr %12, align 1 + %13 = load { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 }, ptr %10, align 8 br label %_llgo_3 _llgo_3: ; preds = %_llgo_2, %_llgo_1 - %18 = phi { %main.bar, i1 } [ %13, %_llgo_1 ], [ %17, %_llgo_2 ] - %19 = extractvalue { %main.bar, i1 } %18, 0 - %20 = extractvalue { %main.bar, i1 } %18, 1 - %21 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %22 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %21, i32 0, i32 0 - store ptr @1, ptr %22, align 8 - %23 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %21, i32 0, i32 1 - store i64 8, ptr %23, align 4 - %24 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %21, align 8 - call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %24) - call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) - %mrv = insertvalue { %main.bar, i1 } poison, %main.bar %19, 0 - %mrv1 = insertvalue { %main.bar, i1 } %mrv, i1 %20, 1 + %14 = phi { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } [ %9, %_llgo_1 ], [ %13, %_llgo_2 ] + %15 = extractvalue { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } %14, 0 + %16 = extractvalue { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } %14, 1 + %mrv = insertvalue { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } poison, %"github.com/goplus/llgo/cl/internal/foo.Foo" %15, 0 + %mrv1 = insertvalue { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } %mrv, i1 %16, 1 + ret { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } %mrv1 +} + +define { %main.bar, i1 } @main.Foo(%"github.com/goplus/llgo/internal/runtime.eface" %0) { +_llgo_0: + %1 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 0 + %2 = load ptr, ptr @main.bar, align 8 + %3 = icmp eq ptr %1, %2 + br i1 %3, label %_llgo_1, label %_llgo_2 + +_llgo_1: ; preds = %_llgo_0 + %4 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 1 + %5 = load %main.bar, ptr %4, align 8 + %6 = alloca { %main.bar, i1 }, align 8 + %7 = getelementptr inbounds { %main.bar, i1 }, ptr %6, i32 0, i32 0 + store %main.bar %5, ptr %7, align 8 + %8 = getelementptr inbounds { %main.bar, i1 }, ptr %6, i32 0, i32 1 + store i1 true, ptr %8, align 1 + %9 = load { %main.bar, i1 }, ptr %6, align 8 + br label %_llgo_3 + +_llgo_2: ; preds = %_llgo_0 + %10 = alloca { %main.bar, i1 }, align 8 + %11 = getelementptr inbounds { %main.bar, i1 }, ptr %10, i32 0, i32 0 + store { ptr, double } zeroinitializer, ptr %11, align 8 + %12 = getelementptr inbounds { %main.bar, i1 }, ptr %10, i32 0, i32 1 + store i1 false, ptr %12, align 1 + %13 = load { %main.bar, i1 }, ptr %10, align 8 + br label %_llgo_3 + +_llgo_3: ; preds = %_llgo_2, %_llgo_1 + %14 = phi { %main.bar, i1 } [ %9, %_llgo_1 ], [ %13, %_llgo_2 ] + %15 = extractvalue { %main.bar, i1 } %14, 0 + %16 = extractvalue { %main.bar, i1 } %14, 1 + %mrv = insertvalue { %main.bar, i1 } poison, %main.bar %15, 0 + %mrv1 = insertvalue { %main.bar, i1 } %mrv, i1 %16, 1 ret { %main.bar, i1 } %mrv1 } @@ -82,6 +109,7 @@ _llgo_0: _llgo_1: ; preds = %_llgo_0 store i1 true, ptr @"main.init$guard", align 1 + call void @"github.com/goplus/llgo/cl/internal/foo.init"() call void @"main.init$abi"() br label %_llgo_2 @@ -95,46 +123,62 @@ _llgo_0: store ptr %1, ptr @__llgo_argv, align 8 call void @"github.com/goplus/llgo/internal/runtime.init"() call void @main.init() - %2 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 0 - store ptr @2, ptr %3, align 8 - %4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 1 - store i64 4, ptr %4, align 4 - %5 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %2, align 8 - call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %5) + %2 = alloca %main.bar, align 8 + %3 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %2, i64 16) + %4 = call { %main.bar, i1 } @main.Foo(%"github.com/goplus/llgo/internal/runtime.eface" zeroinitializer) + %5 = extractvalue { %main.bar, i1 } %4, 0 + store %main.bar %5, ptr %3, align 8 + %6 = extractvalue { %main.bar, i1 } %4, 1 + %7 = getelementptr inbounds %main.bar, ptr %3, i32 0, i32 0 + %8 = load ptr, ptr %7, align 8 + %9 = getelementptr inbounds %main.bar, ptr %3, i32 0, i32 1 + %10 = load float, ptr %9, align 4 + %11 = xor i1 %6, true + %12 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %13 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %12, i32 0, i32 0 + store ptr @0, ptr %13, align 8 + %14 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %12, i32 0, i32 1 + store i64 6, ptr %14, align 4 + %15 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %12, align 8 + call void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr %8) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + %16 = fpext float %10 to double + call void @"github.com/goplus/llgo/internal/runtime.PrintFloat"(double %16) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %15) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %11) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) - %6 = alloca %main.bar, align 8 - %7 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %6, i64 16) - %8 = call { %main.bar, i1 } @main.Foo(%"github.com/goplus/llgo/internal/runtime.eface" zeroinitializer) - %9 = extractvalue { %main.bar, i1 } %8, 0 - store %main.bar %9, ptr %7, align 8 - %10 = extractvalue { %main.bar, i1 } %8, 1 - %11 = getelementptr inbounds %main.bar, ptr %7, i32 0, i32 0 - %12 = load ptr, ptr %11, align 8 - %13 = getelementptr inbounds %main.bar, ptr %7, i32 0, i32 1 - %14 = load float, ptr %13, align 4 - %15 = xor i1 %10, true - %16 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %17 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %16, i32 0, i32 0 - store ptr @3, ptr %17, align 8 - %18 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %16, i32 0, i32 1 - store i64 6, ptr %18, align 4 - %19 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %16, align 8 - call void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr %12) + %17 = alloca %"github.com/goplus/llgo/cl/internal/foo.Foo", align 8 + %18 = call ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr %17, i64 16) + %19 = load ptr, ptr @"github.com/goplus/llgo/cl/internal/foo.Foo", align 8 + %20 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) + store %"github.com/goplus/llgo/cl/internal/foo.Foo" zeroinitializer, ptr %20, align 8 + %21 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 + %22 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %21, i32 0, i32 0 + store ptr %19, ptr %22, align 8 + %23 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %21, i32 0, i32 1 + store ptr %20, ptr %23, align 8 + %24 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %21, align 8 + %25 = call { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } @main.Bar(%"github.com/goplus/llgo/internal/runtime.eface" %24) + %26 = extractvalue { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } %25, 0 + store %"github.com/goplus/llgo/cl/internal/foo.Foo" %26, ptr %18, align 8 + %27 = extractvalue { %"github.com/goplus/llgo/cl/internal/foo.Foo", i1 } %25, 1 + %28 = load %"github.com/goplus/llgo/cl/internal/foo.Foo", ptr %18, align 8 + %29 = call ptr @"(github.com/goplus/llgo/cl/internal/foo.Foo).Pb"(%"github.com/goplus/llgo/cl/internal/foo.Foo" %28) + %30 = getelementptr inbounds %"github.com/goplus/llgo/cl/internal/foo.Foo", ptr %18, i32 0, i32 1 + %31 = load float, ptr %30, align 4 + call void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr %29) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - %20 = fpext float %14 to double - call void @"github.com/goplus/llgo/internal/runtime.PrintFloat"(double %20) + %32 = fpext float %31 to double + call void @"github.com/goplus/llgo/internal/runtime.PrintFloat"(double %32) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %19) - call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %15) + call void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1 %27) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) ret i32 0 } -declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String") - -declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8) +declare void @"github.com/goplus/llgo/cl/internal/foo.init"() declare void @"github.com/goplus/llgo/internal/runtime.init"() @@ -142,68 +186,152 @@ declare ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr, i64) declare void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr) +declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8) + declare void @"github.com/goplus/llgo/internal/runtime.PrintFloat"(double) +declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String") + declare void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1) +declare ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64) + +declare ptr @"(github.com/goplus/llgo/cl/internal/foo.Foo).Pb"(%"github.com/goplus/llgo/cl/internal/foo.Foo") + define void @"main.init$abi"() { _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 @4, ptr %1, align 8 - %2 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %0, i32 0, i32 1 - store i64 2, ptr %2, align 4 - %3 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %0, align 8 - %4 = load ptr, ptr @"*_llgo_byte", align 8 - %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 @5, 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 @6, ptr %11, align 8 - %12 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %10, i32 0, i32 1 - store i64 1, ptr %12, align 4 - %13 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %10, align 8 - %14 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 13) - %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 @7, ptr %16, align 8 - %17 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %15, i32 0, i32 1 - store i64 0, ptr %17, align 4 - %18 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %15, align 8 - %19 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %13, ptr %14, i64 8, %"github.com/goplus/llgo/internal/runtime.String" %18, i1 false) - %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 @8, 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 - %24 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 112) - %25 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %24, i64 0 - store %"github.com/goplus/llgo/internal/abi.StructField" %9, ptr %25, align 8 - %26 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %24, i64 1 - store %"github.com/goplus/llgo/internal/abi.StructField" %19, ptr %26, align 8 - %27 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 - %28 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %27, i32 0, i32 0 - store ptr %24, ptr %28, align 8 - %29 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %27, i32 0, i32 1 - store i64 2, ptr %29, align 4 - %30 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %27, i32 0, i32 2 - store i64 2, ptr %30, align 4 - %31 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %27, align 8 - %32 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %23, i64 16, %"github.com/goplus/llgo/internal/runtime.Slice" %31) - %33 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %34 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %33, i32 0, i32 0 - store ptr @9, ptr %34, align 8 - %35 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %33, i32 0, i32 1 - store i64 8, ptr %35, align 4 - %36 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %33, align 8 - %37 = call ptr @"github.com/goplus/llgo/internal/runtime.Named"(%"github.com/goplus/llgo/internal/runtime.String" %36, ptr %32) - store ptr %37, ptr @main.bar, align 8 + %0 = load ptr, ptr @"github.com/goplus/llgo/cl/internal/foo.Foo", align 8 + %1 = icmp eq ptr %0, null + br i1 %1, label %_llgo_1, label %_llgo_2 + +_llgo_1: ; preds = %_llgo_0 + %2 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 0 + store ptr @1, ptr %3, align 8 + %4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 1 + store i64 2, ptr %4, align 4 + %5 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %2, align 8 + %6 = load ptr, ptr @"*_llgo_byte", align 8 + %7 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %8 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %7, i32 0, i32 0 + store ptr @2, ptr %8, align 8 + %9 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %7, i32 0, i32 1 + store i64 0, ptr %9, align 4 + %10 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %7, align 8 + %11 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %5, ptr %6, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %10, i1 false) + %12 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %13 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %12, i32 0, i32 0 + store ptr @3, ptr %13, align 8 + %14 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %12, i32 0, i32 1 + store i64 1, ptr %14, align 4 + %15 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %12, align 8 + %16 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 13) + %17 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %18 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %17, i32 0, i32 0 + store ptr @4, ptr %18, align 8 + %19 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %17, i32 0, i32 1 + store i64 0, ptr %19, align 4 + %20 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %17, align 8 + %21 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %15, ptr %16, i64 8, %"github.com/goplus/llgo/internal/runtime.String" %20, i1 false) + %22 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %23 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %22, i32 0, i32 0 + store ptr @5, ptr %23, align 8 + %24 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %22, i32 0, i32 1 + store i64 4, ptr %24, align 4 + %25 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %22, align 8 + %26 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 112) + %27 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %26, i64 0 + store %"github.com/goplus/llgo/internal/abi.StructField" %11, ptr %27, align 8 + %28 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %26, i64 1 + store %"github.com/goplus/llgo/internal/abi.StructField" %21, ptr %28, align 8 + %29 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %30 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %29, i32 0, i32 0 + store ptr %26, ptr %30, align 8 + %31 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %29, i32 0, i32 1 + store i64 2, ptr %31, align 4 + %32 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %29, i32 0, i32 2 + store i64 2, ptr %32, align 4 + %33 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %29, align 8 + %34 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %25, i64 16, %"github.com/goplus/llgo/internal/runtime.Slice" %33) + %35 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %36 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %35, i32 0, i32 0 + store ptr @6, ptr %36, align 8 + %37 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %35, i32 0, i32 1 + store i64 4, ptr %37, align 4 + %38 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %35, align 8 + %39 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %40 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %39, i32 0, i32 0 + store ptr @7, ptr %40, align 8 + %41 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %39, i32 0, i32 1 + store i64 42, ptr %41, align 4 + %42 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %39, align 8 + %43 = call ptr @"github.com/goplus/llgo/internal/runtime.Named"(%"github.com/goplus/llgo/internal/runtime.String" %38, %"github.com/goplus/llgo/internal/runtime.String" %42, ptr %34, { ptr, i64, i64 } zeroinitializer) + store ptr %43, ptr @"github.com/goplus/llgo/cl/internal/foo.Foo", align 8 + br label %_llgo_2 + +_llgo_2: ; preds = %_llgo_1, %_llgo_0 + %44 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %45 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %44, i32 0, i32 0 + store ptr @8, ptr %45, align 8 + %46 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %44, i32 0, i32 1 + store i64 2, ptr %46, align 4 + %47 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %44, align 8 + %48 = load ptr, ptr @"*_llgo_byte", align 8 + %49 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %50 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %49, i32 0, i32 0 + store ptr @9, ptr %50, align 8 + %51 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %49, i32 0, i32 1 + store i64 0, ptr %51, align 4 + %52 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %49, align 8 + %53 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %47, ptr %48, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %52, i1 false) + %54 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %55 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %54, i32 0, i32 0 + store ptr @10, ptr %55, align 8 + %56 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %54, i32 0, i32 1 + store i64 1, ptr %56, align 4 + %57 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %54, align 8 + %58 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 13) + %59 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %60 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %59, i32 0, i32 0 + store ptr @11, ptr %60, align 8 + %61 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %59, i32 0, i32 1 + store i64 0, ptr %61, align 4 + %62 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %59, align 8 + %63 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %57, ptr %58, i64 8, %"github.com/goplus/llgo/internal/runtime.String" %62, i1 false) + %64 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %65 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %64, i32 0, i32 0 + store ptr @12, ptr %65, align 8 + %66 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %64, i32 0, i32 1 + store i64 4, ptr %66, align 4 + %67 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %64, align 8 + %68 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 112) + %69 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %68, i64 0 + store %"github.com/goplus/llgo/internal/abi.StructField" %53, ptr %69, align 8 + %70 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %68, i64 1 + store %"github.com/goplus/llgo/internal/abi.StructField" %63, ptr %70, align 8 + %71 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %72 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %71, i32 0, i32 0 + store ptr %68, ptr %72, align 8 + %73 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %71, i32 0, i32 1 + store i64 2, ptr %73, align 4 + %74 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %71, i32 0, i32 2 + store i64 2, ptr %74, align 4 + %75 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %71, align 8 + %76 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %67, i64 16, %"github.com/goplus/llgo/internal/runtime.Slice" %75) + %77 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %78 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %77, i32 0, i32 0 + store ptr @13, ptr %78, align 8 + %79 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %77, i32 0, i32 1 + store i64 4, ptr %79, align 4 + %80 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %77, align 8 + %81 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %82 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %81, i32 0, i32 0 + store ptr @14, ptr %82, align 8 + %83 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %81, i32 0, i32 1 + store i64 8, ptr %83, align 4 + %84 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %81, align 8 + %85 = call ptr @"github.com/goplus/llgo/internal/runtime.Named"(%"github.com/goplus/llgo/internal/runtime.String" %80, %"github.com/goplus/llgo/internal/runtime.String" %84, ptr %76, { ptr, i64, i64 } zeroinitializer) + store ptr %85, ptr @main.bar, align 8 ret void } @@ -213,6 +341,4 @@ declare %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/l declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64) -declare ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64) - 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") diff --git a/cl/_testrt/gblarray/out.ll b/cl/_testrt/gblarray/out.ll index 2fc333fb..45de88a6 100644 --- a/cl/_testrt/gblarray/out.ll +++ b/cl/_testrt/gblarray/out.ll @@ -1,8 +1,8 @@ ; ModuleID = 'main' source_filename = "main" -%"github.com/goplus/llgo/internal/abi.Type" = type { i64, i64, i32, i8, i8, i8, i8, { ptr, ptr }, ptr, %"github.com/goplus/llgo/internal/abi.Name", ptr } -%"github.com/goplus/llgo/internal/abi.Name" = type { ptr } +%"github.com/goplus/llgo/internal/abi.Type" = type { i64, i64, i32, i8, i8, i8, i8, { ptr, ptr }, ptr, %"github.com/goplus/llgo/internal/runtime.String", ptr } +%"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 } @main.basicTypes = global [25 x ptr] undef @"main.init$guard" = global ptr null @@ -20,7 +20,7 @@ _llgo_0: define ptr @main.basicType(i64 %0) { _llgo_0: - %1 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 64) + %1 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 72) %2 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Type", ptr %1, i32 0, i32 0 %3 = getelementptr inbounds i64, ptr @main.sizeBasicTypes, i64 %0 %4 = load i64, ptr %3, align 4