From 8c2946a41b6ad7bb2a3b23ad50c556e10daa59cb Mon Sep 17 00:00:00 2001 From: xushiwei Date: Tue, 28 May 2024 17:55:26 +0800 Subject: [PATCH 1/6] prog.PointerSize --- ssa/package.go | 4 +++- ssa/type.go | 2 +- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/ssa/package.go b/ssa/package.go index 38fa3ae5f..2beb25c2b 100644 --- a/ssa/package.go +++ b/ssa/package.go @@ -165,6 +165,8 @@ type aProgram struct { paramObjPtr_ *types.Var + ptrSize int + NeedRuntime bool NeedPyInit bool is32Bits bool @@ -194,7 +196,7 @@ func NewProgram(target *Target) Program { return &aProgram{ ctx: ctx, gocvt: newGoTypes(), target: target, td: td, is32Bits: is32Bits, - named: make(map[string]llvm.Type), + ptrSize: td.PointerSize(), named: make(map[string]llvm.Type), } } diff --git a/ssa/type.go b/ssa/type.go index 36bbc0893..6cab59781 100644 --- a/ssa/type.go +++ b/ssa/type.go @@ -178,7 +178,7 @@ func OffsetOf(prog Program, t Type, i int) Expr { */ func (p Program) PointerSize() int { - return p.td.PointerSize() + return p.ptrSize } func (p Program) Slice(typ Type) Type { From 8c105d87c1e6546043b99d8c4e0d9e211a294ae2 Mon Sep 17 00:00:00 2001 From: xushiwei Date: Tue, 28 May 2024 23:45:32 +0800 Subject: [PATCH 2/6] runtime: newNamed; llgo/ssa: abiMethodOf --- cl/_testgo/errors/out.ll | 66 ++++++++++++++++-------- internal/runtime/llgo_autogen.lla | Bin 13142 -> 13557 bytes internal/runtime/z_face.go | 17 ++++++- internal/runtime/z_type.go | 24 +++++---- ssa/interface.go | 80 ++++++++++++++++++++++-------- 5 files changed, 134 insertions(+), 53 deletions(-) diff --git a/cl/_testgo/errors/out.ll b/cl/_testgo/errors/out.ll index 930efb985..40e32fdef 100644 --- a/cl/_testgo/errors/out.ll +++ b/cl/_testgo/errors/out.ll @@ -15,18 +15,19 @@ source_filename = "main" @__llgo_argc = global ptr null @__llgo_argv = global ptr null @0 = private unnamed_addr constant [9 x i8] c"an error\00", align 1 +@1 = private unnamed_addr constant [9 x i8] c"Imethod:\00", align 1 @_llgo_main.errorString = global ptr null -@1 = private unnamed_addr constant [6 x i8] c"Error\00", align 1 +@2 = private unnamed_addr constant [6 x i8] c"Error\00", align 1 @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to" = linkonce global ptr null -@2 = private unnamed_addr constant [5 x i8] c"main\00", align 1 +@3 = private unnamed_addr constant [5 x i8] c"main\00", align 1 @"main.struct$QTufDJA9wEDzuzgkA-ZSrLqW-B6lWN8O25mTSglAoLQ" = global ptr null -@3 = private unnamed_addr constant [6 x i8] c"Error\00", align 1 +@4 = private unnamed_addr constant [6 x i8] c"Error\00", align 1 @"_llgo_func$8LHAAczeMU-_MsqDJ4-62jHfhzpiOiRnFkBoaL3mfxg" = linkonce global ptr null -@4 = private unnamed_addr constant [5 x i8] c"main\00", align 1 -@5 = private unnamed_addr constant [17 x i8] c"main.errorString\00", align 1 -@6 = private unnamed_addr constant [2 x i8] c"s\00", align 1 -@7 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 -@8 = private unnamed_addr constant [5 x i8] c"main\00", align 1 +@5 = private unnamed_addr constant [5 x i8] c"main\00", align 1 +@6 = private unnamed_addr constant [17 x i8] c"main.errorString\00", align 1 +@7 = private unnamed_addr constant [2 x i8] c"s\00", align 1 +@8 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 +@9 = private unnamed_addr constant [5 x i8] c"main\00", align 1 define %"github.com/goplus/llgo/internal/runtime.iface" @main.New(%"github.com/goplus/llgo/internal/runtime.String" %0) { _llgo_0: @@ -91,10 +92,27 @@ _llgo_0: %13 = getelementptr inbounds { ptr, ptr }, ptr %11, i32 0, i32 1 store ptr %10, ptr %13, align 8 %14 = load { ptr, ptr }, ptr %11, align 8 - %15 = extractvalue { ptr, ptr } %14, 1 - %16 = extractvalue { ptr, ptr } %14, 0 - %17 = call %"github.com/goplus/llgo/internal/runtime.String" %16(ptr %15) - call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %17) + %15 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %16 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %15, i32 0, i32 0 + store ptr @1, ptr %16, align 8 + %17 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %15, i32 0, i32 1 + store i64 8, ptr %17, align 4 + %18 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %15, align 8 + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %18) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr %7) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + %19 = extractvalue { ptr, ptr } %14, 0 + call void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr %19) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 10) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) + call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 0) + call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) + %20 = extractvalue { ptr, ptr } %14, 1 + %21 = extractvalue { ptr, ptr } %14, 0 + %22 = call %"github.com/goplus/llgo/internal/runtime.String" %21(ptr %20) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %22) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) ret i32 0 } @@ -111,6 +129,10 @@ declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8) declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String") +declare void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr) + +declare void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64) + define void @"main.init$abi"() { _llgo_0: call void @"main.init$abi2"() @@ -124,7 +146,7 @@ _llgo_0: _llgo_1: ; preds = %_llgo_0 %4 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %5 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %4, i32 0, i32 0 - store ptr @1, ptr %5, align 8 + store ptr @2, ptr %5, align 8 %6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %4, i32 0, i32 1 store i64 5, ptr %6, align 4 %7 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %4, align 8 @@ -148,7 +170,7 @@ _llgo_1: ; preds = %_llgo_0 %19 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %15, align 8 %20 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %21 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %20, i32 0, i32 0 - store ptr @2, ptr %21, align 8 + store ptr @3, ptr %21, align 8 %22 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %20, i32 0, i32 1 store i64 4, ptr %22, align 4 %23 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %20, align 8 @@ -172,7 +194,7 @@ _llgo_0: %0 = load ptr, ptr @"main.struct$QTufDJA9wEDzuzgkA-ZSrLqW-B6lWN8O25mTSglAoLQ", align 8 %1 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %2 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %1, i32 0, i32 0 - store ptr @3, ptr %2, align 8 + store ptr @4, ptr %2, align 8 %3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %1, i32 0, i32 1 store i64 5, ptr %3, align 4 %4 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %1, align 8 @@ -200,17 +222,17 @@ _llgo_0: %18 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %14, align 8 %19 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %20 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %19, i32 0, i32 0 - store ptr @4, ptr %20, align 8 + store ptr @5, ptr %20, align 8 %21 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %19, i32 0, i32 1 store i64 4, ptr %21, align 4 %22 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %19, align 8 %23 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %24 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %23, i32 0, i32 0 - store ptr @5, ptr %24, align 8 + store ptr @6, ptr %24, align 8 %25 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %23, i32 0, i32 1 store i64 16, ptr %25, align 4 %26 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %23, align 8 - %27 = call ptr @"github.com/goplus/llgo/internal/runtime.Named"(%"github.com/goplus/llgo/internal/runtime.String" %22, %"github.com/goplus/llgo/internal/runtime.String" %26, ptr %0, %"github.com/goplus/llgo/internal/runtime.Slice" %18) + %27 = call ptr @"github.com/goplus/llgo/internal/runtime.Named"(%"github.com/goplus/llgo/internal/runtime.String" %22, %"github.com/goplus/llgo/internal/runtime.String" %26, ptr %0, { ptr, i64, i64 } zeroinitializer, %"github.com/goplus/llgo/internal/runtime.Slice" %18) store ptr %27, ptr @_llgo_main.errorString, align 8 %28 = load ptr, ptr @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to", align 8 %29 = icmp eq ptr %28, null @@ -246,7 +268,7 @@ _llgo_2: ; preds = %_llgo_1, %_llgo_0 ret void } -declare ptr @"github.com/goplus/llgo/internal/runtime.Named"(%"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.String", ptr, %"github.com/goplus/llgo/internal/runtime.Slice") +declare ptr @"github.com/goplus/llgo/internal/runtime.Named"(%"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.String", ptr, %"github.com/goplus/llgo/internal/runtime.Slice", %"github.com/goplus/llgo/internal/runtime.Slice") declare ptr @"github.com/goplus/llgo/internal/runtime.Func"(%"github.com/goplus/llgo/internal/runtime.Slice", %"github.com/goplus/llgo/internal/runtime.Slice", i1) @@ -256,21 +278,21 @@ define void @"main.init$abi3"() { _llgo_0: %0 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %0, i32 0, i32 0 - store ptr @6, ptr %1, align 8 + store ptr @7, ptr %1, align 8 %2 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %0, i32 0, i32 1 store i64 1, ptr %2, align 4 %3 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %0, align 8 %4 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) %5 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %5, i32 0, i32 0 - store ptr @7, ptr %6, align 8 + store ptr @8, ptr %6, align 8 %7 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %5, i32 0, i32 1 store i64 0, ptr %7, align 4 %8 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %5, align 8 %9 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %3, ptr %4, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %8, i1 false) %10 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %11 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %10, i32 0, i32 0 - store ptr @8, ptr %11, align 8 + store ptr @9, ptr %11, align 8 %12 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %10, i32 0, i32 1 store i64 4, ptr %12, align 4 %13 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %10, align 8 diff --git a/internal/runtime/llgo_autogen.lla b/internal/runtime/llgo_autogen.lla index d723b748bd1d2a1dd044d1eb4109eb00d213edf3..d7e201b37a690d88b62f0bab10b0d504cd11caaf 100644 GIT binary patch literal 13557 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 literal 13142 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 h=nLfkMPL43*o%rhB-H Named:", pkgPath, name, ret, ret.Uncommon()) return ret } @@ -216,6 +228,7 @@ func NewItab(inter *InterfaceType, typ *Type) *Itab { ret.hash = typ.Hash u := typ.Uncommon() + println("==> NewItab Uncommon:", typ, u) if u == nil { ret.fun[0] = 0 } else { @@ -228,6 +241,7 @@ func NewItab(inter *InterfaceType, typ *Type) *Itab { break } *c.Advance(data, i) = uintptr(fn) + println("==> NewItab:", ret, i, fn) } } return ret @@ -238,6 +252,7 @@ func findMethod(mthds []abi.Method, im abi.Imethod) abi.Text { for _, m := range mthds { mName := m.Name_ if mName >= imName { + println("==> findMethod:", mName, imName, m.Mtyp_, im.Typ_, m.Ifn_) if mName == imName && m.Mtyp_ == im.Typ_ { println("==> findMethod", mName, m.Ifn_) return m.Ifn_ diff --git a/internal/runtime/z_type.go b/internal/runtime/z_type.go index 08c11b036..8d6f82615 100644 --- a/internal/runtime/z_type.go +++ b/internal/runtime/z_type.go @@ -116,20 +116,25 @@ func Struct(pkgPath string, size uintptr, fields ...abi.StructField) *Type { func PointerTo(elem *Type) *Type { ret := elem.PtrToThis_ if ret == nil { - ptr := &abi.PtrType{ - Type: Type{ - Size_: unsafe.Sizeof(uintptr(0)), - Hash: uint32(abi.Pointer), // TODO(xsw): hash - Kind_: uint8(abi.Pointer), - }, - Elem: elem, - } - ret = &ptr.Type + ret = newPointer(elem) elem.PtrToThis_ = ret } return ret } +func newPointer(elem *Type) *Type { + ptr := &abi.PtrType{ + Type: Type{ + Size_: unsafe.Sizeof(uintptr(0)), + Hash: uint32(abi.Pointer), // TODO(xsw): hash + Kind_: uint8(abi.Pointer), + }, + Elem: elem, + } + return &ptr.Type +} + +// SliceOf returns the slice type with element elem. func SliceOf(elem *Type) *Type { ret := &abi.SliceType{ Type: Type{ @@ -142,6 +147,7 @@ func SliceOf(elem *Type) *Type { return &ret.Type } +// ArrayOf returns the array type with element elem and length. func ArrayOf(length uintptr, elem *Type) *Type { ret := &abi.ArrayType{ Type: Type{ diff --git a/ssa/interface.go b/ssa/interface.go index f89a3edcc..95c2f3857 100644 --- a/ssa/interface.go +++ b/ssa/interface.go @@ -94,22 +94,48 @@ func (b Builder) abiImethodOf(m *types.Func) Expr { prog := b.Prog name := b.Str(m.Name()) typ := b.abiType(m.Type()) + tname, _ := b.Pkg.abi.TypeName(m.Type()) + log.Println("==> abiImethodOf:", m.Name(), m.Type(), tname) + b.Println(b.Str("==> abiImethodOf:"), typ) return b.aggregateValue(prog.rtType("Imethod"), name.impl, typ.impl) } // Method{name string, typ *FuncType, ifn, tfn abi.Text} -func (b Builder) abiMethodOf(m *types.Func) Expr { +func (b Builder) abiMethodOf(m *types.Func /*, bg Background = InGo */) (mthd, ptrMthd Expr) { prog := b.Prog - mName := m.Name() + mPkg, mName := m.Pkg(), m.Name() mSig := m.Type().(*types.Signature) - fullName := FuncName(m.Pkg(), mName, mSig.Recv()) - name := b.Str(mName) - fn := b.Pkg.NewFunc(fullName, mSig, InGo) - sig := fn.raw.Type.(*types.Signature) - sig = types.NewSignatureType(nil, nil, nil, sig.Params(), sig.Results(), sig.Variadic()) - typ := b.abiType(sig) - // TODO(xsw): ifn, tfn - return b.aggregateValue(prog.rtType("Method"), name.impl, typ.impl, fn.impl, fn.impl) + + name := b.Str(mName).impl + abiSigGo := types.NewSignatureType(nil, nil, nil, mSig.Params(), mSig.Results(), mSig.Variadic()) + abiSig := prog.FuncDecl(abiSigGo, InGo).raw.Type + abiTyp := b.abiType(abiSig) + tname, _ := b.Pkg.abi.TypeName(abiSig) + log.Println("==> abiMethodOf:", mName, abiSigGo, tname) + b.Println(b.Str("==> abiMethodOf:"), abiTyp) + abiTypImpl := abiTyp.impl + + recv := mSig.Recv() + recvType := recv.Type() + if _, ok := recvType.(*types.Pointer); ok { + ptrMthd, _ = b.abiMthd(mPkg, mName, mSig, name, abiTypImpl, llvm.Value{}) + return + } + ptrRecv := types.NewVar(0, nil, "", types.NewPointer(recvType)) + ptrSig := types.NewSignatureType(ptrRecv, nil, nil, mSig.Params(), mSig.Results(), mSig.Variadic()) + ptrMthd, ifn := b.abiMthd(mPkg, mName, ptrSig, name, abiTypImpl, llvm.Value{}) + mthd, _ = b.abiMthd(mPkg, mName, mSig, name, abiTypImpl, ifn) + return +} + +func (b Builder) abiMthd(mPkg *types.Package, mName string, mSig *types.Signature, name, abiTyp, ifn llvm.Value) (ret Expr, tfn llvm.Value) { + fullName := FuncName(mPkg, mName, mSig.Recv()) + tfn = b.Pkg.NewFunc(fullName, mSig, InGo).impl // TODO(xsw): use rawType to speed up + if ifn.IsNil() { + ifn = tfn + } + ret = b.aggregateValue(b.Prog.rtType("Method"), name, abiTyp, ifn, tfn) + return } // func Interface(pkgPath string, methods []abi.Imethod) @@ -129,10 +155,9 @@ func (b Builder) abiInterfaceOf(t *types.Interface) Expr { return b.Call(fn, b.Str(pkgPath), methodSlice) } -// func Named(pkgPath, name string, underlying *Type, methods []abi.Method) +// func Named(pkgPath, name string, underlying *Type, methods, ptrMethods []abi.Method) func (b Builder) abiNamedOf(t *types.Named) Expr { - tunder := t.Underlying() - under := b.abiType(tunder) + under := b.abiType(t.Underlying()) path := abi.PathOf(t.Obj().Pkg()) name := NameOf(t) prog := b.Prog @@ -140,19 +165,30 @@ func (b Builder) abiNamedOf(t *types.Named) Expr { var fn = pkg.rtFunc("Named") var tSlice = lastParamType(prog, fn) - var methods Expr - if _, ok := tunder.(*types.Interface); ok { + var n = t.NumMethods() + var methods, ptrMethods Expr + if n == 0 { methods = prog.Zero(tSlice) + ptrMethods = methods } else { - n := t.NumMethods() - mths := make([]Expr, n) + var mthds []Expr + var ptrMthds = make([]Expr, 0, n) for i := 0; i < n; i++ { m := t.Method(i) - mths[i] = b.abiMethodOf(m) + mthd, ptrMthd := b.abiMethodOf(m) + if !mthd.IsNil() { + mthds = append(mthds, mthd) + } + ptrMthds = append(ptrMthds, ptrMthd) + } + if len(mthds) > 0 { + methods = b.SliceLit(tSlice, mthds...) + } else { + methods = prog.Zero(tSlice) } - methods = b.SliceLit(tSlice, mths...) + ptrMethods = b.SliceLit(tSlice, ptrMthds...) } - return b.Call(fn, b.Str(path), b.Str(name), under, methods) + return b.Call(fn, b.Str(path), b.Str(name), under, methods, ptrMethods) } func (b Builder) abiPointerOf(t *types.Pointer) Expr { @@ -288,7 +324,9 @@ func (b Builder) Imethod(intf Expr, method *types.Func) Expr { itab := Expr{b.faceItab(impl), prog.VoidPtrPtr()} pfn := b.Advance(itab, prog.IntVal(uint64(i+3), prog.Int())) fn := b.Load(pfn) - return b.aggregateValue(tclosure, fn.impl, b.faceData(impl)) + ret := b.aggregateValue(tclosure, fn.impl, b.faceData(impl)) + b.Println(b.Str("Imethod:"), itab, ret, prog.Val(ret.kind), prog.Val(i)) + return ret } // ----------------------------------------------------------------------------- From e5f38a6fc101c8116e3f48b9b67447f6279b6827 Mon Sep 17 00:00:00 2001 From: xushiwei Date: Tue, 28 May 2024 23:58:37 +0800 Subject: [PATCH 3/6] abitype.go --- ssa/abitype.go | 281 +++++++++++++++++++++++++++++++++++++++++++++++ ssa/interface.go | 251 ------------------------------------------ 2 files changed, 281 insertions(+), 251 deletions(-) create mode 100644 ssa/abitype.go diff --git a/ssa/abitype.go b/ssa/abitype.go new file mode 100644 index 000000000..a2254b18f --- /dev/null +++ b/ssa/abitype.go @@ -0,0 +1,281 @@ +/* + * Copyright (c) 2024 The GoPlus Authors (goplus.org). All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package ssa + +import ( + "go/token" + "go/types" + "log" + "unsafe" + + "github.com/goplus/llgo/ssa/abi" + "github.com/goplus/llvm" +) + +// ----------------------------------------------------------------------------- + +// abiBasic returns the abi type of the specified basic kind. +func (b Builder) abiBasic(t *types.Basic) Expr { + /* + TODO(xsw): + return b.abiExtern(abi.BasicName(t)) + */ + kind := int(abi.BasicKind(t)) + return b.InlineCall(b.Pkg.rtFunc("Basic"), b.Prog.Val(kind)) +} + +/* +func (b Builder) abiExtern(name string) Expr { + g := b.Pkg.NewVarFrom(name, b.Prog.AbiTypePtrPtr()) + return b.Load(g.Expr) +} +*/ + +func (b Builder) abiTypeOf(t types.Type) Expr { + switch t := t.(type) { + case *types.Basic: + return b.abiBasic(t) + case *types.Pointer: + return b.abiPointerOf(t) + case *types.Struct: + return b.abiStructOf(t) + case *types.Named: + return b.abiNamedOf(t) + case *types.Interface: + return b.abiInterfaceOf(t) + case *types.Signature: + return b.abiFuncOf(t) + case *types.Slice: + return b.abiSliceOf(t) + case *types.Array: + return b.abiArrayOf(t) + } + panic("todo") +} + +func (b Builder) abiTupleOf(t *types.Tuple) Expr { + n := t.Len() + prog := b.Prog + tSlice := prog.Slice(prog.AbiTypePtr()) + tuple := make([]Expr, n) + for i := 0; i < n; i++ { + tuple[i] = b.abiType(t.At(i).Type()) + } + return b.SliceLit(tSlice, tuple...) +} + +// func Func(in, out []*Type, variadic bool) +func (b Builder) abiFuncOf(sig *types.Signature) Expr { + prog := b.Prog + pkg := b.Pkg + fn := pkg.rtFunc("Func") + params := b.abiTupleOf(sig.Params()) + results := b.abiTupleOf(sig.Results()) + variadic := prog.Val(sig.Variadic()) + return b.Call(fn, params, results, variadic) +} + +// Imethod{name string, typ *FuncType} +func (b Builder) abiImethodOf(m *types.Func) Expr { + prog := b.Prog + name := b.Str(m.Name()) + typ := b.abiType(m.Type()) + tname, _ := b.Pkg.abi.TypeName(m.Type()) + log.Println("==> abiImethodOf:", m.Name(), m.Type(), tname) + b.Println(b.Str("==> abiImethodOf:"), typ) + return b.aggregateValue(prog.rtType("Imethod"), name.impl, typ.impl) +} + +// Method{name string, typ *FuncType, ifn, tfn abi.Text} +func (b Builder) abiMethodOf(m *types.Func /*, bg Background = InGo */) (mthd, ptrMthd Expr) { + prog := b.Prog + mPkg, mName := m.Pkg(), m.Name() + mSig := m.Type().(*types.Signature) + + name := b.Str(mName).impl + abiSigGo := types.NewSignatureType(nil, nil, nil, mSig.Params(), mSig.Results(), mSig.Variadic()) + abiSig := prog.FuncDecl(abiSigGo, InGo).raw.Type + abiTyp := b.abiType(abiSig) + tname, _ := b.Pkg.abi.TypeName(abiSig) + log.Println("==> abiMethodOf:", mName, abiSigGo, tname) + b.Println(b.Str("==> abiMethodOf:"), abiTyp) + abiTypImpl := abiTyp.impl + + recv := mSig.Recv() + recvType := recv.Type() + if _, ok := recvType.(*types.Pointer); ok { + ptrMthd, _ = b.abiMthd(mPkg, mName, mSig, name, abiTypImpl, llvm.Value{}) + return + } + ptrRecv := types.NewVar(0, nil, "", types.NewPointer(recvType)) + ptrSig := types.NewSignatureType(ptrRecv, nil, nil, mSig.Params(), mSig.Results(), mSig.Variadic()) + ptrMthd, ifn := b.abiMthd(mPkg, mName, ptrSig, name, abiTypImpl, llvm.Value{}) + mthd, _ = b.abiMthd(mPkg, mName, mSig, name, abiTypImpl, ifn) + return +} + +func (b Builder) abiMthd(mPkg *types.Package, mName string, mSig *types.Signature, name, abiTyp, ifn llvm.Value) (ret Expr, tfn llvm.Value) { + fullName := FuncName(mPkg, mName, mSig.Recv()) + tfn = b.Pkg.NewFunc(fullName, mSig, InGo).impl // TODO(xsw): use rawType to speed up + if ifn.IsNil() { + ifn = tfn + } + ret = b.aggregateValue(b.Prog.rtType("Method"), name, abiTyp, ifn, tfn) + return +} + +// func Interface(pkgPath string, methods []abi.Imethod) +func (b Builder) abiInterfaceOf(t *types.Interface) Expr { + prog := b.Prog + n := t.NumMethods() + methods := make([]Expr, n) + for i := 0; i < n; i++ { + m := t.Method(i) + methods[i] = b.abiImethodOf(m) + } + pkg := b.Pkg + fn := pkg.rtFunc("Interface") + pkgPath := pkg.Path() + tSlice := lastParamType(prog, fn) + methodSlice := b.SliceLit(tSlice, methods...) + return b.Call(fn, b.Str(pkgPath), methodSlice) +} + +// func Named(pkgPath, name string, underlying *Type, methods, ptrMethods []abi.Method) +func (b Builder) abiNamedOf(t *types.Named) Expr { + under := b.abiType(t.Underlying()) + path := abi.PathOf(t.Obj().Pkg()) + name := NameOf(t) + prog := b.Prog + pkg := b.Pkg + + var fn = pkg.rtFunc("Named") + var tSlice = lastParamType(prog, fn) + var n = t.NumMethods() + var methods, ptrMethods Expr + if n == 0 { + methods = prog.Zero(tSlice) + ptrMethods = methods + } else { + var mthds []Expr + var ptrMthds = make([]Expr, 0, n) + for i := 0; i < n; i++ { + m := t.Method(i) + mthd, ptrMthd := b.abiMethodOf(m) + if !mthd.IsNil() { + mthds = append(mthds, mthd) + } + ptrMthds = append(ptrMthds, ptrMthd) + } + if len(mthds) > 0 { + methods = b.SliceLit(tSlice, mthds...) + } else { + methods = prog.Zero(tSlice) + } + ptrMethods = b.SliceLit(tSlice, ptrMthds...) + } + return b.Call(fn, b.Str(path), b.Str(name), under, methods, ptrMethods) +} + +func (b Builder) abiPointerOf(t *types.Pointer) Expr { + elem := b.abiType(t.Elem()) + return b.Call(b.Pkg.rtFunc("PointerTo"), elem) +} + +func (b Builder) abiSliceOf(t *types.Slice) Expr { + elem := b.abiTypeOf(t.Elem()) + return b.Call(b.Pkg.rtFunc("SliceOf"), elem) +} + +func (b Builder) abiArrayOf(t *types.Array) Expr { + elem := b.abiTypeOf(t.Elem()) + return b.Call(b.Pkg.rtFunc("ArrayOf"), b.Prog.IntVal(uint64(t.Len()), b.Prog.Uintptr()), elem) +} + +// func Struct(pkgPath string, size uintptr, fields []abi.StructField) +func (b Builder) abiStructOf(t *types.Struct) Expr { + pkg := b.Pkg + prog := b.Prog + n := t.NumFields() + flds := make([]Expr, n) + strucAbi := pkg.rtFunc("Struct") + sfAbi := pkg.rtFunc("StructField") + typ := prog.rawType(t) + for i := 0; i < n; i++ { + f := t.Field(i) + off := uintptr(prog.OffsetOf(typ, i)) + flds[i] = b.structField(sfAbi, prog, f, off, t.Tag(i)) + } + pkgPath := b.Str(pkg.Path()) + 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 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()) + embedded := prog.Val(f.Embedded()) + return b.Call(sfAbi, name, typ, prog.Val(offset), b.Str(tag), embedded) +} + +// abiType returns the abi type of the specified type. +func (b Builder) abiType(t types.Type) Expr { + switch tx := t.(type) { + case *types.Basic: + return b.abiBasic(tx) + } + pkg := b.Pkg + name, pub := pkg.abi.TypeName(t) + g := pkg.VarOf(name) + if g == nil { + prog := b.Prog + g = pkg.doNewVar(name, prog.AbiTypePtrPtr()) + g.Init(prog.Null(g.Type)) + if pub { + g.impl.SetLinkage(llvm.LinkOnceAnyLinkage) + } + pkg.abiini = append(pkg.abiini, func(param unsafe.Pointer) { + b := Builder(param) + expr := g.Expr + var blks []BasicBlock + if pub { + eq := b.BinOp(token.EQL, b.Load(expr), b.Prog.Null(expr.Type)) + blks = b.Func.MakeBlocks(2) + b.If(eq, blks[0], blks[1]) + b.SetBlockEx(blks[0], AtEnd, false) + } + tabi := b.abiTypeOf(t) + b.Store(expr, tabi) + if pub { + b.Jump(blks[1]) + b.SetBlockEx(blks[1], AtEnd, false) + b.blk.last = blks[1].last + } + }) + } + return b.Load(g.Expr) +} + +// ----------------------------------------------------------------------------- diff --git a/ssa/interface.go b/ssa/interface.go index 95c2f3857..f1ca724f2 100644 --- a/ssa/interface.go +++ b/ssa/interface.go @@ -20,7 +20,6 @@ import ( "go/token" "go/types" "log" - "unsafe" "github.com/goplus/llgo/ssa/abi" "github.com/goplus/llvm" @@ -28,256 +27,6 @@ import ( // ----------------------------------------------------------------------------- -// abiBasic returns the abi type of the specified basic kind. -func (b Builder) abiBasic(t *types.Basic) Expr { - /* - TODO(xsw): - return b.abiExtern(abi.BasicName(t)) - */ - kind := int(abi.BasicKind(t)) - return b.InlineCall(b.Pkg.rtFunc("Basic"), b.Prog.Val(kind)) -} - -/* -func (b Builder) abiExtern(name string) Expr { - g := b.Pkg.NewVarFrom(name, b.Prog.AbiTypePtrPtr()) - return b.Load(g.Expr) -} -*/ - -func (b Builder) abiTypeOf(t types.Type) Expr { - switch t := t.(type) { - case *types.Basic: - return b.abiBasic(t) - case *types.Pointer: - return b.abiPointerOf(t) - case *types.Struct: - return b.abiStructOf(t) - case *types.Named: - return b.abiNamedOf(t) - case *types.Interface: - return b.abiInterfaceOf(t) - case *types.Signature: - return b.abiFuncOf(t) - case *types.Slice: - return b.abiSliceOf(t) - case *types.Array: - return b.abiArrayOf(t) - } - panic("todo") -} - -func (b Builder) abiTupleOf(t *types.Tuple) Expr { - n := t.Len() - prog := b.Prog - tSlice := prog.Slice(prog.AbiTypePtr()) - tuple := make([]Expr, n) - for i := 0; i < n; i++ { - tuple[i] = b.abiType(t.At(i).Type()) - } - return b.SliceLit(tSlice, tuple...) -} - -// func Func(in, out []*Type, variadic bool) -func (b Builder) abiFuncOf(sig *types.Signature) Expr { - prog := b.Prog - pkg := b.Pkg - fn := pkg.rtFunc("Func") - params := b.abiTupleOf(sig.Params()) - results := b.abiTupleOf(sig.Results()) - variadic := prog.Val(sig.Variadic()) - return b.Call(fn, params, results, variadic) -} - -// Imethod{name string, typ *FuncType} -func (b Builder) abiImethodOf(m *types.Func) Expr { - prog := b.Prog - name := b.Str(m.Name()) - typ := b.abiType(m.Type()) - tname, _ := b.Pkg.abi.TypeName(m.Type()) - log.Println("==> abiImethodOf:", m.Name(), m.Type(), tname) - b.Println(b.Str("==> abiImethodOf:"), typ) - return b.aggregateValue(prog.rtType("Imethod"), name.impl, typ.impl) -} - -// Method{name string, typ *FuncType, ifn, tfn abi.Text} -func (b Builder) abiMethodOf(m *types.Func /*, bg Background = InGo */) (mthd, ptrMthd Expr) { - prog := b.Prog - mPkg, mName := m.Pkg(), m.Name() - mSig := m.Type().(*types.Signature) - - name := b.Str(mName).impl - abiSigGo := types.NewSignatureType(nil, nil, nil, mSig.Params(), mSig.Results(), mSig.Variadic()) - abiSig := prog.FuncDecl(abiSigGo, InGo).raw.Type - abiTyp := b.abiType(abiSig) - tname, _ := b.Pkg.abi.TypeName(abiSig) - log.Println("==> abiMethodOf:", mName, abiSigGo, tname) - b.Println(b.Str("==> abiMethodOf:"), abiTyp) - abiTypImpl := abiTyp.impl - - recv := mSig.Recv() - recvType := recv.Type() - if _, ok := recvType.(*types.Pointer); ok { - ptrMthd, _ = b.abiMthd(mPkg, mName, mSig, name, abiTypImpl, llvm.Value{}) - return - } - ptrRecv := types.NewVar(0, nil, "", types.NewPointer(recvType)) - ptrSig := types.NewSignatureType(ptrRecv, nil, nil, mSig.Params(), mSig.Results(), mSig.Variadic()) - ptrMthd, ifn := b.abiMthd(mPkg, mName, ptrSig, name, abiTypImpl, llvm.Value{}) - mthd, _ = b.abiMthd(mPkg, mName, mSig, name, abiTypImpl, ifn) - return -} - -func (b Builder) abiMthd(mPkg *types.Package, mName string, mSig *types.Signature, name, abiTyp, ifn llvm.Value) (ret Expr, tfn llvm.Value) { - fullName := FuncName(mPkg, mName, mSig.Recv()) - tfn = b.Pkg.NewFunc(fullName, mSig, InGo).impl // TODO(xsw): use rawType to speed up - if ifn.IsNil() { - ifn = tfn - } - ret = b.aggregateValue(b.Prog.rtType("Method"), name, abiTyp, ifn, tfn) - return -} - -// func Interface(pkgPath string, methods []abi.Imethod) -func (b Builder) abiInterfaceOf(t *types.Interface) Expr { - prog := b.Prog - n := t.NumMethods() - methods := make([]Expr, n) - for i := 0; i < n; i++ { - m := t.Method(i) - methods[i] = b.abiImethodOf(m) - } - pkg := b.Pkg - fn := pkg.rtFunc("Interface") - pkgPath := pkg.Path() - tSlice := lastParamType(prog, fn) - methodSlice := b.SliceLit(tSlice, methods...) - return b.Call(fn, b.Str(pkgPath), methodSlice) -} - -// func Named(pkgPath, name string, underlying *Type, methods, ptrMethods []abi.Method) -func (b Builder) abiNamedOf(t *types.Named) Expr { - under := b.abiType(t.Underlying()) - path := abi.PathOf(t.Obj().Pkg()) - name := NameOf(t) - prog := b.Prog - pkg := b.Pkg - - var fn = pkg.rtFunc("Named") - var tSlice = lastParamType(prog, fn) - var n = t.NumMethods() - var methods, ptrMethods Expr - if n == 0 { - methods = prog.Zero(tSlice) - ptrMethods = methods - } else { - var mthds []Expr - var ptrMthds = make([]Expr, 0, n) - for i := 0; i < n; i++ { - m := t.Method(i) - mthd, ptrMthd := b.abiMethodOf(m) - if !mthd.IsNil() { - mthds = append(mthds, mthd) - } - ptrMthds = append(ptrMthds, ptrMthd) - } - if len(mthds) > 0 { - methods = b.SliceLit(tSlice, mthds...) - } else { - methods = prog.Zero(tSlice) - } - ptrMethods = b.SliceLit(tSlice, ptrMthds...) - } - return b.Call(fn, b.Str(path), b.Str(name), under, methods, ptrMethods) -} - -func (b Builder) abiPointerOf(t *types.Pointer) Expr { - elem := b.abiType(t.Elem()) - return b.Call(b.Pkg.rtFunc("PointerTo"), elem) -} - -func (b Builder) abiSliceOf(t *types.Slice) Expr { - elem := b.abiTypeOf(t.Elem()) - return b.Call(b.Pkg.rtFunc("SliceOf"), elem) -} - -func (b Builder) abiArrayOf(t *types.Array) Expr { - elem := b.abiTypeOf(t.Elem()) - return b.Call(b.Pkg.rtFunc("ArrayOf"), b.Prog.IntVal(uint64(t.Len()), b.Prog.Uintptr()), elem) -} - -// func Struct(pkgPath string, size uintptr, fields []abi.StructField) -func (b Builder) abiStructOf(t *types.Struct) Expr { - pkg := b.Pkg - prog := b.Prog - n := t.NumFields() - flds := make([]Expr, n) - strucAbi := pkg.rtFunc("Struct") - sfAbi := pkg.rtFunc("StructField") - typ := prog.rawType(t) - for i := 0; i < n; i++ { - f := t.Field(i) - off := uintptr(prog.OffsetOf(typ, i)) - flds[i] = b.structField(sfAbi, prog, f, off, t.Tag(i)) - } - pkgPath := b.Str(pkg.Path()) - 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 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()) - embedded := prog.Val(f.Embedded()) - return b.Call(sfAbi, name, typ, prog.Val(offset), b.Str(tag), embedded) -} - -// abiType returns the abi type of the specified type. -func (b Builder) abiType(t types.Type) Expr { - switch tx := t.(type) { - case *types.Basic: - return b.abiBasic(tx) - } - pkg := b.Pkg - name, pub := pkg.abi.TypeName(t) - g := pkg.VarOf(name) - if g == nil { - prog := b.Prog - g = pkg.doNewVar(name, prog.AbiTypePtrPtr()) - g.Init(prog.Null(g.Type)) - if pub { - g.impl.SetLinkage(llvm.LinkOnceAnyLinkage) - } - pkg.abiini = append(pkg.abiini, func(param unsafe.Pointer) { - b := Builder(param) - expr := g.Expr - var blks []BasicBlock - if pub { - eq := b.BinOp(token.EQL, b.Load(expr), b.Prog.Null(expr.Type)) - blks = b.Func.MakeBlocks(2) - b.If(eq, blks[0], blks[1]) - b.SetBlockEx(blks[0], AtEnd, false) - } - tabi := b.abiTypeOf(t) - b.Store(expr, tabi) - if pub { - b.Jump(blks[1]) - b.SetBlockEx(blks[1], AtEnd, false) - b.blk.last = blks[1].last - } - }) - } - return b.Load(g.Expr) -} - // unsafeEface(t *abi.Type, data unsafe.Pointer) Eface func (b Builder) unsafeEface(t, data llvm.Value) llvm.Value { return aggregateValue(b.impl, b.Prog.rtEface(), t, data) From 3b2f01e974e505d279e9ebae90389d02e05fa97c Mon Sep 17 00:00:00 2001 From: xushiwei Date: Fri, 31 May 2024 07:35:22 +0800 Subject: [PATCH 4/6] abiTypes --- internal/abi/type.go | 40 +++-- internal/runtime/z_face.go | 110 ++++++-------- ssa/abi/abi.go | 42 +++-- ssa/abitype.go | 303 ++++++++++++++++++++++++------------- ssa/interface.go | 4 +- ssa/package.go | 40 +---- 6 files changed, 301 insertions(+), 238 deletions(-) diff --git a/internal/abi/type.go b/internal/abi/type.go index dc1d82571..2c8662385 100644 --- a/internal/abi/type.go +++ b/internal/abi/type.go @@ -134,6 +134,12 @@ const ( // TFlagRegularMemory means that equal and hash functions can treat // this type as a single region of t.size bytes. TFlagRegularMemory TFlag = 1 << 3 + + // TFlagVariadic means a funcType with variadic parameters + TFlagVariadic TFlag = 1 << 4 + + // TFlagUninited means this type is not fully initialized. + TFlagUninited TFlag = 1 << 7 ) // ----------------------------------------------------------------------------- @@ -186,35 +192,15 @@ type ChanType struct { } // funcType represents a function type. -// -// A *Type for each in and out parameter is stored in an array that -// directly follows the funcType (and possibly its uncommonType). So -// a function type with one method, one input, and one output is: -// -// struct { -// funcType -// uncommonType -// [2]*rtype // [0] is in, [1] is out -// } type FuncType struct { Type - InCount uint16 - OutCount uint16 // top bit is set if last input parameter is ... -} - -// In returns the number of input parameters of a function type. -func (p *FuncType) In() int { - return int(p.InCount) -} - -// Out returns the number of output results of a function type. -func (p *FuncType) Out() int { - return int(p.OutCount &^ (1 << 15)) + In []*Type + Out []*Type } // Variadic reports whether the function type is variadic. func (p *FuncType) Variadic() bool { - return p.OutCount&(1<<15) != 0 + return p.TFlag&TFlagVariadic != 0 } type StructField struct { @@ -304,6 +290,14 @@ func (t *Type) Align() int { return int(t.Align_) } func (t *Type) FieldAlign() int { return int(t.FieldAlign_) } +// Name returns the name of type t. +func (t *Type) Name() string { + if t.TFlag&TFlagExtraStar != 0 { + return "*" + t.Str_ + } + return t.Str_ +} + func (t *Type) Common() *Type { return t } diff --git a/internal/runtime/z_face.go b/internal/runtime/z_face.go index 4d1e374c7..ededb30b4 100644 --- a/internal/runtime/z_face.go +++ b/internal/runtime/z_face.go @@ -102,56 +102,50 @@ func hdrSizeOf(kind abi.Kind) uintptr { return typeHdrSize } -// Named returns a named type. -func Named(pkgPath, name string, underlying *Type, methods, ptrMethods []Method) *Type { - tflag := underlying.TFlag - if tflag&abi.TFlagUncommon != 0 { - panic("runtime: underlying type is already named") - } +// NewNamed returns an uninitialized named type. +func NewNamed(kind abi.Kind, methods, ptrMethods int) *Type { + ret := newUninitedNamed(kind, methods) + ret.PtrToThis_ = newUninitedNamed(abi.Pointer, ptrMethods) + return ret +} - kind := underlying.Kind() - n := len(methods) - if kind == abi.Interface { - if n > 0 { - panic("runtime: interface type cannot have methods") - } - ret := *underlying.InterfaceType() - ret.PkgPath_ = pkgPath - ret.Str_ = name - return &ret.Type - } +// InitNamed initializes an uninitialized named type. +func InitNamed(ret *Type, pkgPath, name string, underlying *Type, methods, ptrMethods []Method) { + ptr := ret.PtrToThis_ + doInitNamed(ret, pkgPath, name, underlying, methods) + doInitNamed(ptr, pkgPath, name, newPointer(ret), ptrMethods) + ret.PtrToThis_ = ptr + ptr.TFlag |= abi.TFlagExtraStar +} - ret := newNamed(pkgPath, name, underlying, methods) - ret.PtrToThis_ = newNamed(pkgPath, "*"+name, newPointer(ret), ptrMethods) +func newUninitedNamed(kind abi.Kind, methods int) *Type { + size := hdrSizeOf(kind) + uncommonTypeHdrSize + uintptr(methods)*methodSize + ret := (*Type)(AllocU(size)) + ret.Kind_ = uint8(kind) + ret.TFlag = abi.TFlagUninited return ret } -func newNamed(pkgPath, name string, underlying *Type, methods []Method) *Type { +func doInitNamed(ret *Type, pkgPath, name string, underlying *Type, methods []Method) { tflag := underlying.TFlag - kind := underlying.Kind() - n := len(methods) - - baseSize := hdrSizeOf(kind) - extraSize := uintptr(0) - if kind == abi.Func { - f := underlying.FuncType() - extraSize = uintptr(f.In()+f.Out()) * pointerSize + if tflag&abi.TFlagUncommon != 0 { + panic("runtime: underlying type is already named") } - size := baseSize + extraSize - if n > 0 || pkgPath != "" { - size += uncommonTypeHdrSize + uintptr(n)*methodSize - tflag |= abi.TFlagUncommon + kind := abi.Kind(ret.Kind_) + if ret.TFlag != abi.TFlagUninited || kind != underlying.Kind() { + panic("initNamed: unexpected named type") } - ptr := AllocU(size) + ptr := unsafe.Pointer(ret) + baseSize := hdrSizeOf(kind) c.Memcpy(ptr, unsafe.Pointer(underlying), baseSize) - ret := (*Type)(ptr) - ret.TFlag = tflag | abi.TFlagNamed + ret.TFlag = tflag | abi.TFlagNamed | abi.TFlagUncommon ret.Str_ = name - xcount := 0 + n := len(methods) + xcount := uint16(0) for _, m := range methods { if !m.Exported() { break @@ -161,54 +155,42 @@ func newNamed(pkgPath, name string, underlying *Type, methods []Method) *Type { uncommon := (*abi.UncommonType)(c.Advance(ptr, int(baseSize))) uncommon.PkgPath_ = pkgPath uncommon.Mcount = uint16(n) - uncommon.Xcount = uint16(xcount) - uncommon.Moff = uint32(uncommonTypeHdrSize + extraSize) + uncommon.Xcount = xcount + uncommon.Moff = uint32(uncommonTypeHdrSize) extraOff := int(baseSize + uncommonTypeHdrSize) - if extraSize > 0 { - src := c.Advance(unsafe.Pointer(underlying), int(baseSize)) - dest := c.Advance(unsafe.Pointer(ptr), extraOff) - c.Memcpy(dest, src, extraSize) - extraOff += int(extraSize) - } - data := (*abi.Method)(c.Advance(ptr, extraOff)) copy(unsafe.Slice(data, n), methods) - println("==> Named:", pkgPath, name, ret, ret.Uncommon()) - return ret + println("==> InitNamed:", pkgPath, name, ret, ret.Uncommon()) } // Func returns a function type. func Func(in, out []*Type, variadic bool) *FuncType { - 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)) + ret := &FuncType{ + Type: Type{ + Size_: unsafe.Sizeof(uintptr(0)), + Hash: uint32(abi.Func), // TODO(xsw): hash + Kind_: uint8(abi.Func), + }, + In: in, + Out: out, + } if variadic { - ret.OutCount |= 1 << 15 + ret.TFlag |= abi.TFlagVariadic } - - data := (**Type)(c.Advance(ptr, int(funcTypeHdrSize))) - params := unsafe.Slice(data, n) - copy(params, in) - copy(params[len(in):], out) return ret } // Interface returns an interface type. -func Interface(pkgPath string, methods []Imethod) *InterfaceType { +// Don't call NewNamed for named interface type. +func Interface(pkgPath, name string, methods []Imethod) *InterfaceType { ret := &abi.InterfaceType{ Type: Type{ Size_: unsafe.Sizeof(eface{}), Hash: uint32(abi.Interface), // TODO(xsw): hash Kind_: uint8(abi.Interface), + Str_: name, }, PkgPath_: pkgPath, Methods: methods, diff --git a/ssa/abi/abi.go b/ssa/abi/abi.go index 6d6fd74f9..4289d6bdc 100644 --- a/ssa/abi/abi.go +++ b/ssa/abi/abi.go @@ -40,19 +40,43 @@ func BasicKind(t *types.Basic) abi.Kind { return abi.Kind(kind) } +func UnderlyingKind(t types.Type) abi.Kind { + switch t := t.(type) { + case *types.Basic: + return BasicKind(t) + case *types.Pointer: + return abi.Pointer + case *types.Slice: + return abi.Slice + case *types.Signature: + return abi.Func + case *types.Interface: + return abi.Interface + case *types.Struct: + return abi.Struct + case *types.Map: + return abi.Map + case *types.Array: + return abi.Array + case *types.Chan: + return abi.Chan + } + panic("todo") +} + // ----------------------------------------------------------------------------- -type Kind int +type DataKind int const ( - Invalid Kind = iota - Indirect // allocate memory for the value - Pointer // store a pointer value directly in the interface value - Integer // store a integer value directly in the interface value - BitCast // store other value (need bitcast) directly in the interface value + Invalid DataKind = iota + Indirect // allocate memory for the value + Pointer // store a pointer value directly in the interface value + Integer // store a integer value directly in the interface value + BitCast // store other value (need bitcast) directly in the interface value ) -func KindOf(raw types.Type, lvl int, is32Bits bool) (Kind, types.Type, int) { +func DataKindOf(raw types.Type, lvl int, is32Bits bool) (DataKind, types.Type, int) { switch t := raw.Underlying().(type) { case *types.Basic: kind := t.Kind() @@ -76,12 +100,12 @@ func KindOf(raw types.Type, lvl int, is32Bits bool) (Kind, types.Type, int) { return Pointer, raw, lvl case *types.Struct: if t.NumFields() == 1 { - return KindOf(t.Field(0).Type(), lvl+1, is32Bits) + return DataKindOf(t.Field(0).Type(), lvl+1, is32Bits) } case *types.Interface, *types.Slice: case *types.Array: if t.Len() == 1 { - return KindOf(t.Elem(), lvl+1, is32Bits) + return DataKindOf(t.Elem(), lvl+1, is32Bits) } default: panic("unkown type") diff --git a/ssa/abitype.go b/ssa/abitype.go index a2254b18f..ab52e6d95 100644 --- a/ssa/abitype.go +++ b/ssa/abitype.go @@ -29,13 +29,15 @@ import ( // ----------------------------------------------------------------------------- // abiBasic returns the abi type of the specified basic kind. -func (b Builder) abiBasic(t *types.Basic) Expr { +func (b Builder) abiBasic(t *types.Basic) func() Expr { /* TODO(xsw): return b.abiExtern(abi.BasicName(t)) */ - kind := int(abi.BasicKind(t)) - return b.InlineCall(b.Pkg.rtFunc("Basic"), b.Prog.Val(kind)) + return func() Expr { + kind := int(abi.BasicKind(t)) + return b.InlineCall(b.Pkg.rtFunc("Basic"), b.Prog.Val(kind)) + } } /* @@ -45,7 +47,7 @@ func (b Builder) abiExtern(name string) Expr { } */ -func (b Builder) abiTypeOf(t types.Type) Expr { +func (b Builder) abiTypeOf(t types.Type) func() Expr { switch t := t.(type) { case *types.Basic: return b.abiBasic(t) @@ -56,7 +58,7 @@ func (b Builder) abiTypeOf(t types.Type) Expr { case *types.Named: return b.abiNamedOf(t) case *types.Interface: - return b.abiInterfaceOf(t) + return b.abiInterfaceOf("", t) case *types.Signature: return b.abiFuncOf(t) case *types.Slice: @@ -67,39 +69,55 @@ func (b Builder) abiTypeOf(t types.Type) Expr { panic("todo") } -func (b Builder) abiTupleOf(t *types.Tuple) Expr { +func (b Builder) abiTupleOf(t *types.Tuple) func() Expr { n := t.Len() - prog := b.Prog - tSlice := prog.Slice(prog.AbiTypePtr()) tuple := make([]Expr, n) for i := 0; i < n; i++ { tuple[i] = b.abiType(t.At(i).Type()) } - return b.SliceLit(tSlice, tuple...) + return func() Expr { + prog := b.Prog + tSlice := prog.Slice(prog.AbiTypePtr()) + return b.SliceLit(tSlice, tuple...) + } } // func Func(in, out []*Type, variadic bool) -func (b Builder) abiFuncOf(sig *types.Signature) Expr { - prog := b.Prog - pkg := b.Pkg - fn := pkg.rtFunc("Func") +func (b Builder) abiFuncOf(sig *types.Signature) func() Expr { params := b.abiTupleOf(sig.Params()) results := b.abiTupleOf(sig.Results()) - variadic := prog.Val(sig.Variadic()) - return b.Call(fn, params, results, variadic) + return func() Expr { + prog := b.Prog + pkg := b.Pkg + fn := pkg.rtFunc("Func") + variadic := prog.Val(sig.Variadic()) + return b.Call(fn, params(), results(), variadic) + } } // Imethod{name string, typ *FuncType} -func (b Builder) abiImethodOf(m *types.Func) Expr { +func (b Builder) abiImethodOf(m *types.Func, typ Expr) Expr { prog := b.Prog name := b.Str(m.Name()) - typ := b.abiType(m.Type()) tname, _ := b.Pkg.abi.TypeName(m.Type()) log.Println("==> abiImethodOf:", m.Name(), m.Type(), tname) b.Println(b.Str("==> abiImethodOf:"), typ) return b.aggregateValue(prog.rtType("Imethod"), name.impl, typ.impl) } +func (b Builder) abiMethods(t *types.Named) (ret int) { + n := t.NumMethods() + for i := 0; i < n; i++ { + m := t.Method(i) + mSig := m.Type().(*types.Signature) + recvType := mSig.Recv().Type() + if _, ok := recvType.(*types.Pointer); !ok { + ret++ + } + } + return +} + // Method{name string, typ *FuncType, ifn, tfn abi.Text} func (b Builder) abiMethodOf(m *types.Func /*, bg Background = InGo */) (mthd, ptrMthd Expr) { prog := b.Prog @@ -138,93 +156,133 @@ func (b Builder) abiMthd(mPkg *types.Package, mName string, mSig *types.Signatur return } -// func Interface(pkgPath string, methods []abi.Imethod) -func (b Builder) abiInterfaceOf(t *types.Interface) Expr { - prog := b.Prog +// func Interface(pkgPath, name string, methods []abi.Imethod) +func (b Builder) abiInterfaceOf(name string, t *types.Interface) func() Expr { n := t.NumMethods() - methods := make([]Expr, n) + typs := make([]Expr, n) for i := 0; i < n; i++ { m := t.Method(i) - methods[i] = b.abiImethodOf(m) + typs[i] = b.abiType(m.Type()) + } + return func() Expr { + prog := b.Prog + methods := make([]Expr, n) + for i := 0; i < n; i++ { + m := t.Method(i) + methods[i] = b.abiImethodOf(m, typs[i]) + } + pkg := b.Pkg + fn := pkg.rtFunc("Interface") + pkgPath := pkg.Path() + tSlice := lastParamType(prog, fn) + methodSlice := b.SliceLit(tSlice, methods...) + return b.Call(fn, b.Str(pkgPath), b.Str(name), methodSlice) } - pkg := b.Pkg - fn := pkg.rtFunc("Interface") - pkgPath := pkg.Path() - tSlice := lastParamType(prog, fn) - methodSlice := b.SliceLit(tSlice, methods...) - return b.Call(fn, b.Str(pkgPath), methodSlice) } -// func Named(pkgPath, name string, underlying *Type, methods, ptrMethods []abi.Method) -func (b Builder) abiNamedOf(t *types.Named) Expr { +// func NewNamed(kind abi.Kind, methods, ptrMethods int) +func (b Builder) abiNamedOf(t *types.Named) func() Expr { + return func() Expr { + pkg := b.Pkg + tunder := t.Underlying() + kind := int(abi.UnderlyingKind(tunder)) + numMethods := b.abiMethods(t) + numPtrMethods := t.NumMethods() + newNamed := pkg.rtFunc("NewNamed") + return b.Call(newNamed, b.Prog.Val(kind), b.Prog.Val(numMethods), b.Prog.Val(numPtrMethods)) + } +} + +// func InitNamed(ret *Type, pkgPath, name string, underlying *Type, methods, ptrMethods []Method) +func (b Builder) abiInitNamed(ret Expr, t *types.Named) func() Expr { under := b.abiType(t.Underlying()) - path := abi.PathOf(t.Obj().Pkg()) - name := NameOf(t) - prog := b.Prog - pkg := b.Pkg + return func() Expr { + pkg := b.Pkg + prog := b.Prog + path := abi.PathOf(t.Obj().Pkg()) + name := NameOf(t) - var fn = pkg.rtFunc("Named") - var tSlice = lastParamType(prog, fn) - var n = t.NumMethods() - var methods, ptrMethods Expr - if n == 0 { - methods = prog.Zero(tSlice) - ptrMethods = methods - } else { - var mthds []Expr - var ptrMthds = make([]Expr, 0, n) - for i := 0; i < n; i++ { - m := t.Method(i) - mthd, ptrMthd := b.abiMethodOf(m) - if !mthd.IsNil() { - mthds = append(mthds, mthd) - } - ptrMthds = append(ptrMthds, ptrMthd) - } - if len(mthds) > 0 { - methods = b.SliceLit(tSlice, mthds...) - } else { + var initNamed = pkg.rtFunc("InitNamed") + var tSlice = lastParamType(prog, initNamed) + var n = t.NumMethods() + var methods, ptrMethods Expr + if n == 0 { methods = prog.Zero(tSlice) + ptrMethods = methods + } else { + var mthds []Expr + var ptrMthds = make([]Expr, 0, n) + for i := 0; i < n; i++ { + m := t.Method(i) + mthd, ptrMthd := b.abiMethodOf(m) + if !mthd.IsNil() { + mthds = append(mthds, mthd) + } + ptrMthds = append(ptrMthds, ptrMthd) + } + if len(mthds) > 0 { + methods = b.SliceLit(tSlice, mthds...) + } else { + methods = prog.Zero(tSlice) + } + ptrMethods = b.SliceLit(tSlice, ptrMthds...) } - ptrMethods = b.SliceLit(tSlice, ptrMthds...) + return b.Call(initNamed, ret, b.Str(path), b.Str(name), under, methods, ptrMethods) } - return b.Call(fn, b.Str(path), b.Str(name), under, methods, ptrMethods) } -func (b Builder) abiPointerOf(t *types.Pointer) Expr { +func (b Builder) abiPointerOf(t *types.Pointer) func() Expr { elem := b.abiType(t.Elem()) - return b.Call(b.Pkg.rtFunc("PointerTo"), elem) + return func() Expr { + return b.Call(b.Pkg.rtFunc("PointerTo"), elem) + } } -func (b Builder) abiSliceOf(t *types.Slice) Expr { - elem := b.abiTypeOf(t.Elem()) - return b.Call(b.Pkg.rtFunc("SliceOf"), elem) +func (b Builder) abiSliceOf(t *types.Slice) func() Expr { + elem := b.abiType(t.Elem()) + return func() Expr { + return b.Call(b.Pkg.rtFunc("SliceOf"), elem) + } } -func (b Builder) abiArrayOf(t *types.Array) Expr { - elem := b.abiTypeOf(t.Elem()) - return b.Call(b.Pkg.rtFunc("ArrayOf"), b.Prog.IntVal(uint64(t.Len()), b.Prog.Uintptr()), elem) +func (b Builder) abiArrayOf(t *types.Array) func() Expr { + elem := b.abiType(t.Elem()) + return func() Expr { + n := b.Prog.IntVal(uint64(t.Len()), b.Prog.Uintptr()) + return b.Call(b.Pkg.rtFunc("ArrayOf"), n, elem) + } } +// func StructField(name string, typ *abi.Type, off uintptr, tag string, embedded bool) // func Struct(pkgPath string, size uintptr, fields []abi.StructField) -func (b Builder) abiStructOf(t *types.Struct) Expr { - pkg := b.Pkg - prog := b.Prog +func (b Builder) abiStructOf(t *types.Struct) func() Expr { n := t.NumFields() - flds := make([]Expr, n) - strucAbi := pkg.rtFunc("Struct") - sfAbi := pkg.rtFunc("StructField") - typ := prog.rawType(t) + typs := make([]Expr, n) for i := 0; i < n; i++ { f := t.Field(i) - off := uintptr(prog.OffsetOf(typ, i)) - flds[i] = b.structField(sfAbi, prog, f, off, t.Tag(i)) + typs[i] = b.abiType(f.Type()) + } + return func() Expr { + pkg := b.Pkg + prog := b.Prog + flds := make([]Expr, n) + strucAbi := pkg.rtFunc("Struct") + sfAbi := pkg.rtFunc("StructField") + tStruc := prog.rawType(t) + for i := 0; i < n; i++ { + f := t.Field(i) + off := uintptr(prog.OffsetOf(tStruc, i)) + name := b.Str(f.Name()) + tag := b.Str(t.Tag(i)) + embedded := prog.Val(f.Embedded()) + flds[i] = b.Call(sfAbi, name, typs[i], prog.Val(off), tag, embedded) + } + pkgPath := b.Str(pkg.Path()) + tSlice := lastParamType(prog, strucAbi) + fldSlice := b.SliceLit(tSlice, flds...) + size := prog.IntVal(prog.SizeOf(tStruc), prog.Uintptr()) + return b.Call(strucAbi, pkgPath, size, fldSlice) } - pkgPath := b.Str(pkg.Path()) - 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 lastParamType(prog Program, fn Expr) Type { @@ -232,20 +290,68 @@ func lastParamType(prog Program, fn Expr) Type { 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()) - embedded := prog.Val(f.Embedded()) - return b.Call(sfAbi, name, typ, prog.Val(offset), b.Str(tag), embedded) +// ----------------------------------------------------------------------------- + +type abiTypes struct { + iniabi unsafe.Pointer +} + +func (p Package) hasAbiInit() bool { + return p.iniabi != nil +} + +func (p Package) abiInit(b Builder) { + inib := Builder(p.iniabi) + inib.Return() + b.Call(inib.Func.Expr) +} + +func (p Package) abiBuilder() Builder { + if p.iniabi == nil { + sigAbiInit := types.NewSignatureType(nil, nil, nil, nil, nil, false) + fn := p.NewFunc(p.Path()+".init$abi", sigAbiInit, InC) + fnb := fn.MakeBody(1) + p.iniabi = unsafe.Pointer(fnb) + } + return Builder(p.iniabi) +} + +func (p Package) abiTypeInit(g Global, t types.Type, pub bool) { + b := p.abiBuilder() + tabi := b.abiTypeOf(t) + expr := g.Expr + var eq Expr + var blks []BasicBlock + if pub { + eq = b.BinOp(token.EQL, b.Load(expr), b.Prog.Null(expr.Type)) + blks = b.Func.MakeBlocks(2) + b.If(eq, blks[0], blks[1]) + b.SetBlockEx(blks[0], AtEnd, false) + } + b.Store(expr, tabi()) + if pub { + b.Jump(blks[1]) + b.SetBlockEx(blks[1], AtEnd, false) + b.blk.last = blks[1].last + } + if t, ok := t.(*types.Named); ok { + tabi = b.abiInitNamed(expr, t) + if pub { + blks = b.Func.MakeBlocks(2) + b.If(eq, blks[0], blks[1]) + b.SetBlockEx(blks[0], AtEnd, false) + } + tabi() + if pub { + b.Jump(blks[1]) + b.SetBlockEx(blks[1], AtEnd, false) + b.blk.last = blks[1].last + } + } } // abiType returns the abi type of the specified type. func (b Builder) abiType(t types.Type) Expr { - switch tx := t.(type) { - case *types.Basic: - return b.abiBasic(tx) - } pkg := b.Pkg name, pub := pkg.abi.TypeName(t) g := pkg.VarOf(name) @@ -256,24 +362,7 @@ func (b Builder) abiType(t types.Type) Expr { if pub { g.impl.SetLinkage(llvm.LinkOnceAnyLinkage) } - pkg.abiini = append(pkg.abiini, func(param unsafe.Pointer) { - b := Builder(param) - expr := g.Expr - var blks []BasicBlock - if pub { - eq := b.BinOp(token.EQL, b.Load(expr), b.Prog.Null(expr.Type)) - blks = b.Func.MakeBlocks(2) - b.If(eq, blks[0], blks[1]) - b.SetBlockEx(blks[0], AtEnd, false) - } - tabi := b.abiTypeOf(t) - b.Store(expr, tabi) - if pub { - b.Jump(blks[1]) - b.SetBlockEx(blks[1], AtEnd, false) - b.blk.last = blks[1].last - } - }) + pkg.abiTypeInit(g, t, pub) } return b.Load(g.Expr) } diff --git a/ssa/interface.go b/ssa/interface.go index f1ca724f2..5b97c78ff 100644 --- a/ssa/interface.go +++ b/ssa/interface.go @@ -102,7 +102,7 @@ func (b Builder) MakeInterface(tinter Type, x Expr) (ret Expr) { prog := b.Prog typ := x.Type tabi := b.abiType(typ.raw.Type) - kind, _, lvl := abi.KindOf(typ.raw.Type, 0, prog.is32Bits) + kind, _, lvl := abi.DataKindOf(typ.raw.Type, 0, prog.is32Bits) switch kind { case abi.Indirect: vptr := b.AllocU(typ) @@ -132,7 +132,7 @@ func (b Builder) MakeInterface(tinter Type, x Expr) (ret Expr) { func (b Builder) valFromData(typ Type, data llvm.Value) Expr { prog := b.Prog - kind, real, lvl := abi.KindOf(typ.raw.Type, 0, prog.is32Bits) + kind, real, lvl := abi.DataKindOf(typ.raw.Type, 0, prog.is32Bits) switch kind { case abi.Indirect: impl := b.impl diff --git a/ssa/package.go b/ssa/package.go index 2beb25c2b..cac873e64 100644 --- a/ssa/package.go +++ b/ssa/package.go @@ -20,7 +20,6 @@ import ( "go/token" "go/types" "strconv" - "unsafe" "github.com/goplus/llgo/ssa/abi" "github.com/goplus/llvm" @@ -510,15 +509,17 @@ func (p Program) Uint64() Type { // initializer) and "init#%d", the nth declared init function, // and unspecified other things too. type aPackage struct { - mod llvm.Module - abi abi.Builder - abiini []func(b unsafe.Pointer) // b Builder + mod llvm.Module + vars map[string]Global fns map[string]Function stubs map[string]Function pyobjs map[string]PyObjRef pymods map[string]Global Prog Program + + abi abi.Builder + abiTypes } type Package = *aPackage @@ -582,31 +583,12 @@ func (p Package) String() string { // AfterInit is called after the package is initialized (init all packages that depends on). func (p Package) AfterInit(b Builder, ret BasicBlock) { - doAbiInit := len(p.abiini) > 0 + doAbiInit := p.hasAbiInit() doPyLoadModSyms := p.pyHasModSyms() if doAbiInit || doPyLoadModSyms { b.SetBlockEx(ret, afterInit, false) if doAbiInit { - sigAbiInit := types.NewSignatureType(nil, nil, nil, nil, nil, false) - baseName := p.Path() + ".init$abi" - name := baseName - idx := 1 - fn := p.NewFunc(name, sigAbiInit, InC) - b.Call(fn.Expr) - for { - fnb := fn.MakeBody(1) - first := fnb.blk - p.callAbiInit(fnb) - fnb.Return() - if len(p.abiini) == 0 { - break - } - idx++ - name = baseName + strconv.Itoa(idx) - fn = p.NewFunc(name, sigAbiInit, InC) - fnb.SetBlockEx(first, AtStart, false) - fnb.Call(fn.Expr) - } + p.abiInit(b) } if doPyLoadModSyms { p.pyLoadModSyms(b) @@ -614,14 +596,6 @@ func (p Package) AfterInit(b Builder, ret BasicBlock) { } } -func (p Package) callAbiInit(fnb Builder) { - abiini := p.abiini - p.abiini = nil - for _, abiInit := range abiini { - abiInit(unsafe.Pointer(fnb)) - } -} - /* type CodeGenFileType = llvm.CodeGenFileType From 76c1800a53c87053068f7c7b69482c61b1dc6067 Mon Sep 17 00:00:00 2001 From: xushiwei Date: Fri, 31 May 2024 08:12:27 +0800 Subject: [PATCH 5/6] abiTypes: abiTypeInit fix --- cl/_testdata/print/out.ll | 247 +++++++++++--- cl/_testdata/vargs/out.ll | 25 +- cl/_testgo/eface/in.go | 5 +- cl/_testgo/eface/out.ll | 483 ++++++++++++++++---------- cl/_testgo/errors/out.ll | 442 +++++++++++------------- cl/_testgo/strucintf/out.ll | 201 +++++------ cl/_testgo/struczero/out.ll | 547 ++++++++++++++++-------------- cl/_testrt/any/out.ll | 48 ++- cl/_testrt/builtin/out.ll | 19 +- cl/_testrt/cast/out.ll | 43 ++- cl/_testrt/panic/out.ll | 19 +- internal/abi/llgo_autogen.lla | Bin 3353 -> 3560 bytes internal/runtime/llgo_autogen.lla | Bin 13557 -> 12615 bytes internal/runtime/z_face.go | 6 - ssa/abitype.go | 18 +- ssa/interface.go | 1 - 16 files changed, 1238 insertions(+), 866 deletions(-) diff --git a/cl/_testdata/print/out.ll b/cl/_testdata/print/out.ll index 44457e288..9f89186a3 100644 --- a/cl/_testdata/print/out.ll +++ b/cl/_testdata/print/out.ll @@ -13,9 +13,24 @@ source_filename = "main" @__llgo_argc = global ptr null @__llgo_argv = global ptr null @1 = private unnamed_addr constant [5 x i8] c"llgo\00", align 1 +@_llgo_float32 = linkonce global ptr null +@_llgo_float64 = linkonce global ptr null @2 = private unnamed_addr constant [11 x i8] c"check bool\00", align 1 +@_llgo_string = linkonce global ptr null +@_llgo_bool = linkonce global ptr null @3 = private unnamed_addr constant [9 x i8] c"check &^\00", align 1 +@_llgo_int32 = linkonce global ptr null +@_llgo_int8 = linkonce global ptr null +@_llgo_int16 = linkonce global ptr null +@_llgo_int64 = linkonce global ptr null +@_llgo_int = linkonce global ptr null +@_llgo_uint8 = linkonce global ptr null +@_llgo_uint16 = linkonce global ptr null +@_llgo_uint32 = linkonce global ptr null +@_llgo_uint64 = linkonce global ptr null +@_llgo_uintptr = linkonce global ptr null @4 = private unnamed_addr constant [5 x i8] c"llgo\00", align 1 +@_llgo_uint = linkonce global ptr null @5 = private unnamed_addr constant [5 x i8] c"true\00", align 1 @6 = private unnamed_addr constant [6 x i8] c"false\00", align 1 @7 = private unnamed_addr constant [4 x i8] c"NaN\00", align 1 @@ -70,6 +85,7 @@ _llgo_0: _llgo_1: ; preds = %_llgo_0 store i1 true, ptr @"main.init$guard", align 1 + call void @"main.init$abi"() store i64 0, ptr @main.minhexdigits, align 4 br label %_llgo_2 @@ -103,7 +119,7 @@ _llgo_0: call void @main.printnl() call void @main.prinfsub(double 1.001000e+02) call void @main.printnl() - %6 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 13) + %6 = load ptr, ptr @_llgo_float32, align 8 %7 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %8 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %7, i32 0, i32 0 store ptr %6, ptr %8, align 8 @@ -112,7 +128,7 @@ _llgo_0: %10 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %7, align 8 call void @main.printany(%"github.com/goplus/llgo/internal/runtime.eface" %10) call void @main.printnl() - %11 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 14) + %11 = load ptr, ptr @_llgo_float64, align 8 %12 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %13 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %12, i32 0, i32 0 store ptr %11, ptr %13, align 8 @@ -132,7 +148,7 @@ _llgo_1: ; preds = %_llgo_3 %20 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %18, i32 0, i32 1 store i64 10, ptr %20, align 4 %21 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %18, align 8 - %22 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) + %22 = load ptr, ptr @_llgo_string, align 8 %23 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) store %"github.com/goplus/llgo/internal/runtime.String" %21, ptr %23, align 8 %24 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 @@ -143,7 +159,7 @@ _llgo_1: ; preds = %_llgo_3 %27 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %24, align 8 store %"github.com/goplus/llgo/internal/runtime.eface" %27, ptr %17, align 8 %28 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %16, i64 1 - %29 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 1) + %29 = load ptr, ptr @_llgo_bool, align 8 %30 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %31 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %30, i32 0, i32 0 store ptr %29, ptr %31, align 8 @@ -171,7 +187,7 @@ _llgo_2: ; preds = %_llgo_3, %_llgo_1, %43 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %41, i32 0, i32 1 store i64 8, ptr %43, align 4 %44 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %41, align 8 - %45 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) + %45 = load ptr, ptr @_llgo_string, align 8 %46 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) store %"github.com/goplus/llgo/internal/runtime.String" %44, ptr %46, align 8 %47 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 @@ -182,7 +198,7 @@ _llgo_2: ; preds = %_llgo_3, %_llgo_1, %50 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %47, align 8 store %"github.com/goplus/llgo/internal/runtime.eface" %50, ptr %40, align 8 %51 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %39, i64 1 - %52 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 1) + %52 = load ptr, ptr @_llgo_bool, align 8 %53 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %54 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %53, i32 0, i32 0 store ptr %52, ptr %54, align 8 @@ -191,7 +207,7 @@ _llgo_2: ; preds = %_llgo_3, %_llgo_1, %56 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %53, align 8 store %"github.com/goplus/llgo/internal/runtime.eface" %56, ptr %51, align 8 %57 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %39, i64 2 - %58 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 1) + %58 = load ptr, ptr @_llgo_bool, align 8 %59 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %60 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %59, i32 0, i32 0 store ptr %58, ptr %60, align 8 @@ -210,7 +226,7 @@ _llgo_2: ; preds = %_llgo_3, %_llgo_1, call void @main.println(%"github.com/goplus/llgo/internal/runtime.Slice" %67) %68 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 256) %69 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %68, i64 0 - %70 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 1) + %70 = load ptr, ptr @_llgo_bool, align 8 %71 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %72 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %71, i32 0, i32 0 store ptr %70, ptr %72, align 8 @@ -219,7 +235,7 @@ _llgo_2: ; preds = %_llgo_3, %_llgo_1, %74 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %71, align 8 store %"github.com/goplus/llgo/internal/runtime.eface" %74, ptr %69, align 8 %75 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %68, i64 1 - %76 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 1) + %76 = load ptr, ptr @_llgo_bool, align 8 %77 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %78 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %77, i32 0, i32 0 store ptr %76, ptr %78, align 8 @@ -228,7 +244,7 @@ _llgo_2: ; preds = %_llgo_3, %_llgo_1, %80 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %77, align 8 store %"github.com/goplus/llgo/internal/runtime.eface" %80, ptr %75, align 8 %81 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %68, i64 2 - %82 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 5) + %82 = load ptr, ptr @_llgo_int32, align 8 %83 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %84 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %83, i32 0, i32 0 store ptr %82, ptr %84, align 8 @@ -237,7 +253,7 @@ _llgo_2: ; preds = %_llgo_3, %_llgo_1, %86 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %83, align 8 store %"github.com/goplus/llgo/internal/runtime.eface" %86, ptr %81, align 8 %87 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %68, i64 3 - %88 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 5) + %88 = load ptr, ptr @_llgo_int32, align 8 %89 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %90 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %89, i32 0, i32 0 store ptr %88, ptr %90, align 8 @@ -246,7 +262,7 @@ _llgo_2: ; preds = %_llgo_3, %_llgo_1, %92 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %89, align 8 store %"github.com/goplus/llgo/internal/runtime.eface" %92, ptr %87, align 8 %93 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %68, i64 4 - %94 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 5) + %94 = load ptr, ptr @_llgo_int32, align 8 %95 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %96 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %95, i32 0, i32 0 store ptr %94, ptr %96, align 8 @@ -255,7 +271,7 @@ _llgo_2: ; preds = %_llgo_3, %_llgo_1, %98 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %95, align 8 store %"github.com/goplus/llgo/internal/runtime.eface" %98, ptr %93, align 8 %99 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %68, i64 5 - %100 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 3) + %100 = load ptr, ptr @_llgo_int8, align 8 %101 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %102 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %101, i32 0, i32 0 store ptr %100, ptr %102, align 8 @@ -264,7 +280,7 @@ _llgo_2: ; preds = %_llgo_3, %_llgo_1, %104 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %101, align 8 store %"github.com/goplus/llgo/internal/runtime.eface" %104, ptr %99, align 8 %105 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %68, i64 6 - %106 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 4) + %106 = load ptr, ptr @_llgo_int16, align 8 %107 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %108 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %107, i32 0, i32 0 store ptr %106, ptr %108, align 8 @@ -273,7 +289,7 @@ _llgo_2: ; preds = %_llgo_3, %_llgo_1, %110 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %107, align 8 store %"github.com/goplus/llgo/internal/runtime.eface" %110, ptr %105, align 8 %111 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %68, i64 7 - %112 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 5) + %112 = load ptr, ptr @_llgo_int32, align 8 %113 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %114 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %113, i32 0, i32 0 store ptr %112, ptr %114, align 8 @@ -282,7 +298,7 @@ _llgo_2: ; preds = %_llgo_3, %_llgo_1, %116 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %113, align 8 store %"github.com/goplus/llgo/internal/runtime.eface" %116, ptr %111, align 8 %117 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %68, i64 8 - %118 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 6) + %118 = load ptr, ptr @_llgo_int64, align 8 %119 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %120 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %119, i32 0, i32 0 store ptr %118, ptr %120, align 8 @@ -291,7 +307,7 @@ _llgo_2: ; preds = %_llgo_3, %_llgo_1, %122 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %119, align 8 store %"github.com/goplus/llgo/internal/runtime.eface" %122, ptr %117, align 8 %123 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %68, i64 9 - %124 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) + %124 = load ptr, ptr @_llgo_int, align 8 %125 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %126 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %125, i32 0, i32 0 store ptr %124, ptr %126, align 8 @@ -300,7 +316,7 @@ _llgo_2: ; preds = %_llgo_3, %_llgo_1, %128 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %125, align 8 store %"github.com/goplus/llgo/internal/runtime.eface" %128, ptr %123, align 8 %129 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %68, i64 10 - %130 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 8) + %130 = load ptr, ptr @_llgo_uint8, align 8 %131 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %132 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %131, i32 0, i32 0 store ptr %130, ptr %132, align 8 @@ -309,7 +325,7 @@ _llgo_2: ; preds = %_llgo_3, %_llgo_1, %134 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %131, align 8 store %"github.com/goplus/llgo/internal/runtime.eface" %134, ptr %129, align 8 %135 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %68, i64 11 - %136 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 9) + %136 = load ptr, ptr @_llgo_uint16, align 8 %137 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %138 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %137, i32 0, i32 0 store ptr %136, ptr %138, align 8 @@ -318,7 +334,7 @@ _llgo_2: ; preds = %_llgo_3, %_llgo_1, %140 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %137, align 8 store %"github.com/goplus/llgo/internal/runtime.eface" %140, ptr %135, align 8 %141 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %68, i64 12 - %142 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 10) + %142 = load ptr, ptr @_llgo_uint32, align 8 %143 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %144 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %143, i32 0, i32 0 store ptr %142, ptr %144, align 8 @@ -327,7 +343,7 @@ _llgo_2: ; preds = %_llgo_3, %_llgo_1, %146 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %143, align 8 store %"github.com/goplus/llgo/internal/runtime.eface" %146, ptr %141, align 8 %147 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %68, i64 13 - %148 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 11) + %148 = load ptr, ptr @_llgo_uint64, align 8 %149 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %150 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %149, i32 0, i32 0 store ptr %148, ptr %150, align 8 @@ -336,7 +352,7 @@ _llgo_2: ; preds = %_llgo_3, %_llgo_1, %152 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %149, align 8 store %"github.com/goplus/llgo/internal/runtime.eface" %152, ptr %147, align 8 %153 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %68, i64 14 - %154 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 12) + %154 = load ptr, ptr @_llgo_uintptr, align 8 %155 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %156 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %155, i32 0, i32 0 store ptr %154, ptr %156, align 8 @@ -351,7 +367,7 @@ _llgo_2: ; preds = %_llgo_3, %_llgo_1, %162 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %160, i32 0, i32 1 store i64 4, ptr %162, align 4 %163 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %160, align 8 - %164 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) + %164 = load ptr, ptr @_llgo_string, align 8 %165 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) store %"github.com/goplus/llgo/internal/runtime.String" %163, ptr %165, align 8 %166 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 @@ -393,7 +409,7 @@ _llgo_0: define void @main.printany(%"github.com/goplus/llgo/internal/runtime.eface" %0) { _llgo_0: %1 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 0 - %2 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 1) + %2 = load ptr, ptr @_llgo_bool, align 8 %3 = icmp eq ptr %1, %2 br i1 %3, label %_llgo_31, label %_llgo_32 @@ -406,7 +422,7 @@ _llgo_2: ; preds = %_llgo_33 _llgo_3: ; preds = %_llgo_33 %4 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 0 - %5 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) + %5 = load ptr, ptr @_llgo_int, align 8 %6 = icmp eq ptr %4, %5 br i1 %6, label %_llgo_34, label %_llgo_35 @@ -416,7 +432,7 @@ _llgo_4: ; preds = %_llgo_36 _llgo_5: ; preds = %_llgo_36 %7 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 0 - %8 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 3) + %8 = load ptr, ptr @_llgo_int8, align 8 %9 = icmp eq ptr %7, %8 br i1 %9, label %_llgo_37, label %_llgo_38 @@ -427,7 +443,7 @@ _llgo_6: ; preds = %_llgo_39 _llgo_7: ; preds = %_llgo_39 %11 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 0 - %12 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 4) + %12 = load ptr, ptr @_llgo_int16, align 8 %13 = icmp eq ptr %11, %12 br i1 %13, label %_llgo_40, label %_llgo_41 @@ -438,7 +454,7 @@ _llgo_8: ; preds = %_llgo_42 _llgo_9: ; preds = %_llgo_42 %15 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 0 - %16 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 5) + %16 = load ptr, ptr @_llgo_int32, align 8 %17 = icmp eq ptr %15, %16 br i1 %17, label %_llgo_43, label %_llgo_44 @@ -449,7 +465,7 @@ _llgo_10: ; preds = %_llgo_45 _llgo_11: ; preds = %_llgo_45 %19 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 0 - %20 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 6) + %20 = load ptr, ptr @_llgo_int64, align 8 %21 = icmp eq ptr %19, %20 br i1 %21, label %_llgo_46, label %_llgo_47 @@ -459,7 +475,7 @@ _llgo_12: ; preds = %_llgo_48 _llgo_13: ; preds = %_llgo_48 %22 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 0 - %23 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 7) + %23 = load ptr, ptr @_llgo_uint, align 8 %24 = icmp eq ptr %22, %23 br i1 %24, label %_llgo_49, label %_llgo_50 @@ -469,7 +485,7 @@ _llgo_14: ; preds = %_llgo_51 _llgo_15: ; preds = %_llgo_51 %25 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 0 - %26 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 8) + %26 = load ptr, ptr @_llgo_uint8, align 8 %27 = icmp eq ptr %25, %26 br i1 %27, label %_llgo_52, label %_llgo_53 @@ -480,7 +496,7 @@ _llgo_16: ; preds = %_llgo_54 _llgo_17: ; preds = %_llgo_54 %29 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 0 - %30 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 9) + %30 = load ptr, ptr @_llgo_uint16, align 8 %31 = icmp eq ptr %29, %30 br i1 %31, label %_llgo_55, label %_llgo_56 @@ -491,7 +507,7 @@ _llgo_18: ; preds = %_llgo_57 _llgo_19: ; preds = %_llgo_57 %33 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 0 - %34 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 10) + %34 = load ptr, ptr @_llgo_uint32, align 8 %35 = icmp eq ptr %33, %34 br i1 %35, label %_llgo_58, label %_llgo_59 @@ -502,7 +518,7 @@ _llgo_20: ; preds = %_llgo_60 _llgo_21: ; preds = %_llgo_60 %37 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 0 - %38 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 11) + %38 = load ptr, ptr @_llgo_uint64, align 8 %39 = icmp eq ptr %37, %38 br i1 %39, label %_llgo_61, label %_llgo_62 @@ -512,7 +528,7 @@ _llgo_22: ; preds = %_llgo_63 _llgo_23: ; preds = %_llgo_63 %40 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 0 - %41 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 12) + %41 = load ptr, ptr @_llgo_uintptr, align 8 %42 = icmp eq ptr %40, %41 br i1 %42, label %_llgo_64, label %_llgo_65 @@ -522,7 +538,7 @@ _llgo_24: ; preds = %_llgo_66 _llgo_25: ; preds = %_llgo_66 %43 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 0 - %44 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 13) + %44 = load ptr, ptr @_llgo_float32, align 8 %45 = icmp eq ptr %43, %44 br i1 %45, label %_llgo_67, label %_llgo_68 @@ -533,7 +549,7 @@ _llgo_26: ; preds = %_llgo_69 _llgo_27: ; preds = %_llgo_69 %47 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 0 - %48 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 14) + %48 = load ptr, ptr @_llgo_float64, align 8 %49 = icmp eq ptr %47, %48 br i1 %49, label %_llgo_70, label %_llgo_71 @@ -543,7 +559,7 @@ _llgo_28: ; preds = %_llgo_72 _llgo_29: ; preds = %_llgo_72 %50 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 0 - %51 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) + %51 = load ptr, ptr @_llgo_string, align 8 %52 = icmp eq ptr %50, %51 br i1 %52, label %_llgo_73, label %_llgo_74 @@ -1396,6 +1412,161 @@ declare i32 @printf(ptr, ...) declare void @"github.com/goplus/llgo/internal/runtime.init"() +define void @"main.init$abi"() { +_llgo_0: + %0 = load ptr, ptr @_llgo_float32, align 8 + %1 = icmp eq ptr %0, null + br i1 %1, label %_llgo_1, label %_llgo_2 + +_llgo_1: ; preds = %_llgo_0 + %2 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 13) + store ptr %2, ptr @_llgo_float32, align 8 + br label %_llgo_2 + +_llgo_2: ; preds = %_llgo_1, %_llgo_0 + %3 = load ptr, ptr @_llgo_float64, align 8 + %4 = icmp eq ptr %3, null + br i1 %4, label %_llgo_3, label %_llgo_4 + +_llgo_3: ; preds = %_llgo_2 + %5 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 14) + store ptr %5, ptr @_llgo_float64, align 8 + br label %_llgo_4 + +_llgo_4: ; preds = %_llgo_3, %_llgo_2 + %6 = load ptr, ptr @_llgo_string, align 8 + %7 = icmp eq ptr %6, null + br i1 %7, label %_llgo_5, label %_llgo_6 + +_llgo_5: ; preds = %_llgo_4 + %8 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) + store ptr %8, ptr @_llgo_string, align 8 + br label %_llgo_6 + +_llgo_6: ; preds = %_llgo_5, %_llgo_4 + %9 = load ptr, ptr @_llgo_bool, align 8 + %10 = icmp eq ptr %9, null + br i1 %10, label %_llgo_7, label %_llgo_8 + +_llgo_7: ; preds = %_llgo_6 + %11 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 1) + store ptr %11, ptr @_llgo_bool, align 8 + br label %_llgo_8 + +_llgo_8: ; preds = %_llgo_7, %_llgo_6 + %12 = load ptr, ptr @_llgo_int32, align 8 + %13 = icmp eq ptr %12, null + br i1 %13, label %_llgo_9, label %_llgo_10 + +_llgo_9: ; preds = %_llgo_8 + %14 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 5) + store ptr %14, ptr @_llgo_int32, align 8 + br label %_llgo_10 + +_llgo_10: ; preds = %_llgo_9, %_llgo_8 + %15 = load ptr, ptr @_llgo_int8, align 8 + %16 = icmp eq ptr %15, null + br i1 %16, label %_llgo_11, label %_llgo_12 + +_llgo_11: ; preds = %_llgo_10 + %17 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 3) + store ptr %17, ptr @_llgo_int8, align 8 + br label %_llgo_12 + +_llgo_12: ; preds = %_llgo_11, %_llgo_10 + %18 = load ptr, ptr @_llgo_int16, align 8 + %19 = icmp eq ptr %18, null + br i1 %19, label %_llgo_13, label %_llgo_14 + +_llgo_13: ; preds = %_llgo_12 + %20 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 4) + store ptr %20, ptr @_llgo_int16, align 8 + br label %_llgo_14 + +_llgo_14: ; preds = %_llgo_13, %_llgo_12 + %21 = load ptr, ptr @_llgo_int64, align 8 + %22 = icmp eq ptr %21, null + br i1 %22, label %_llgo_15, label %_llgo_16 + +_llgo_15: ; preds = %_llgo_14 + %23 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 6) + store ptr %23, ptr @_llgo_int64, align 8 + br label %_llgo_16 + +_llgo_16: ; preds = %_llgo_15, %_llgo_14 + %24 = load ptr, ptr @_llgo_int, align 8 + %25 = icmp eq ptr %24, null + br i1 %25, label %_llgo_17, label %_llgo_18 + +_llgo_17: ; preds = %_llgo_16 + %26 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) + store ptr %26, ptr @_llgo_int, align 8 + br label %_llgo_18 + +_llgo_18: ; preds = %_llgo_17, %_llgo_16 + %27 = load ptr, ptr @_llgo_uint8, align 8 + %28 = icmp eq ptr %27, null + br i1 %28, label %_llgo_19, label %_llgo_20 + +_llgo_19: ; preds = %_llgo_18 + %29 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 8) + store ptr %29, ptr @_llgo_uint8, align 8 + br label %_llgo_20 + +_llgo_20: ; preds = %_llgo_19, %_llgo_18 + %30 = load ptr, ptr @_llgo_uint16, align 8 + %31 = icmp eq ptr %30, null + br i1 %31, label %_llgo_21, label %_llgo_22 + +_llgo_21: ; preds = %_llgo_20 + %32 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 9) + store ptr %32, ptr @_llgo_uint16, align 8 + br label %_llgo_22 + +_llgo_22: ; preds = %_llgo_21, %_llgo_20 + %33 = load ptr, ptr @_llgo_uint32, align 8 + %34 = icmp eq ptr %33, null + br i1 %34, label %_llgo_23, label %_llgo_24 + +_llgo_23: ; preds = %_llgo_22 + %35 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 10) + store ptr %35, ptr @_llgo_uint32, align 8 + br label %_llgo_24 + +_llgo_24: ; preds = %_llgo_23, %_llgo_22 + %36 = load ptr, ptr @_llgo_uint64, align 8 + %37 = icmp eq ptr %36, null + br i1 %37, label %_llgo_25, label %_llgo_26 + +_llgo_25: ; preds = %_llgo_24 + %38 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 11) + store ptr %38, ptr @_llgo_uint64, align 8 + br label %_llgo_26 + +_llgo_26: ; preds = %_llgo_25, %_llgo_24 + %39 = load ptr, ptr @_llgo_uintptr, align 8 + %40 = icmp eq ptr %39, null + br i1 %40, label %_llgo_27, label %_llgo_28 + +_llgo_27: ; preds = %_llgo_26 + %41 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 12) + store ptr %41, ptr @_llgo_uintptr, align 8 + br label %_llgo_28 + +_llgo_28: ; preds = %_llgo_27, %_llgo_26 + %42 = load ptr, ptr @_llgo_uint, align 8 + %43 = icmp eq ptr %42, null + br i1 %43, label %_llgo_29, label %_llgo_30 + +_llgo_29: ; preds = %_llgo_28 + %44 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 7) + store ptr %44, ptr @_llgo_uint, align 8 + br label %_llgo_30 + +_llgo_30: ; preds = %_llgo_29, %_llgo_28 + ret void +} + declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64) declare ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64) diff --git a/cl/_testdata/vargs/out.ll b/cl/_testdata/vargs/out.ll index 9d9d841e7..a687457b7 100644 --- a/cl/_testdata/vargs/out.ll +++ b/cl/_testdata/vargs/out.ll @@ -8,6 +8,7 @@ source_filename = "main" @"main.init$guard" = global ptr null @__llgo_argc = global ptr null @__llgo_argv = global ptr null +@_llgo_int = linkonce global ptr null @0 = private unnamed_addr constant [4 x i8] c"%d\0A\00", align 1 @1 = private unnamed_addr constant [22 x i8] c"type assertion failed\00", align 1 @@ -18,6 +19,7 @@ _llgo_0: _llgo_1: ; preds = %_llgo_0 store i1 true, ptr @"main.init$guard", align 1 + call void @"main.init$abi"() br label %_llgo_2 _llgo_2: ; preds = %_llgo_1, %_llgo_0 @@ -32,7 +34,7 @@ _llgo_0: call void @main.init() %2 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 48) %3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %2, i64 0 - %4 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) + %4 = load ptr, ptr @_llgo_int, align 8 %5 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %5, i32 0, i32 0 store ptr %4, ptr %6, align 8 @@ -41,7 +43,7 @@ _llgo_0: %8 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %5, align 8 store %"github.com/goplus/llgo/internal/runtime.eface" %8, ptr %3, align 8 %9 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %2, i64 1 - %10 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) + %10 = load ptr, ptr @_llgo_int, align 8 %11 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %12 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %11, i32 0, i32 0 store ptr %10, ptr %12, align 8 @@ -50,7 +52,7 @@ _llgo_0: %14 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %11, align 8 store %"github.com/goplus/llgo/internal/runtime.eface" %14, ptr %9, align 8 %15 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %2, i64 2 - %16 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) + %16 = load ptr, ptr @_llgo_int, align 8 %17 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %18 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %17, i32 0, i32 0 store ptr %16, ptr %18, align 8 @@ -88,7 +90,7 @@ _llgo_2: ; preds = %_llgo_1 %7 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %6, i64 %3 %8 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %7, align 8 %9 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %8, 0 - %10 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) + %10 = load ptr, ptr @_llgo_int, align 8 %11 = icmp eq ptr %9, %10 br i1 %11, label %_llgo_4, label %_llgo_5 @@ -116,6 +118,21 @@ declare void @"github.com/goplus/llgo/internal/runtime.init"() declare ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64) +define void @"main.init$abi"() { +_llgo_0: + %0 = load ptr, ptr @_llgo_int, align 8 + %1 = icmp eq ptr %0, null + br i1 %1, label %_llgo_1, label %_llgo_2 + +_llgo_1: ; preds = %_llgo_0 + %2 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) + store ptr %2, ptr @_llgo_int, align 8 + br label %_llgo_2 + +_llgo_2: ; preds = %_llgo_1, %_llgo_0 + ret void +} + declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64) declare void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1) diff --git a/cl/_testgo/eface/in.go b/cl/_testgo/eface/in.go index 4f13ae5be..8b04a217a 100644 --- a/cl/_testgo/eface/in.go +++ b/cl/_testgo/eface/in.go @@ -45,8 +45,5 @@ func dump(v any) { func dumpTyp(t *abi.Type, sep string) { print(sep) - println(t.Kind(), t.Size_, t.PtrBytes, t.Hash, t.TFlag, t.Align_, t.Str_, t.PtrToThis_) - if t.Elem() != nil { - dumpTyp(t.Elem(), sep+"\t") - } + println(t.Kind(), t.Size_, t.PtrBytes, t.Hash, t.TFlag, t.Align_) } diff --git a/cl/_testgo/eface/out.ll b/cl/_testgo/eface/out.ll index ff8f5bc4a..e65c1abbc 100644 --- a/cl/_testgo/eface/out.ll +++ b/cl/_testgo/eface/out.ll @@ -10,22 +10,36 @@ source_filename = "main" @"main.init$guard" = global ptr null @0 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 -@1 = private unnamed_addr constant [2 x i8] c"\09\00", align 1 @__llgo_argc = global ptr null @__llgo_argv = global ptr null +@_llgo_bool = linkonce global ptr null +@_llgo_int = linkonce global ptr null +@_llgo_int8 = linkonce global ptr null +@_llgo_int16 = linkonce global ptr null +@_llgo_int32 = linkonce global ptr null +@_llgo_int64 = linkonce global ptr null +@_llgo_uint = linkonce global ptr null +@_llgo_uint8 = linkonce global ptr null +@_llgo_uint16 = linkonce global ptr null +@_llgo_uint32 = linkonce global ptr null +@_llgo_uint64 = linkonce global ptr null +@_llgo_uintptr = linkonce global ptr null +@_llgo_float32 = linkonce global ptr null +@_llgo_float64 = linkonce global ptr null @"[10]_llgo_int" = linkonce global ptr null @"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac" = linkonce global ptr null @"*_llgo_int" = linkonce global ptr null @"[]_llgo_int" = linkonce global ptr null -@2 = private unnamed_addr constant [6 x i8] c"hello\00", align 1 +@1 = private unnamed_addr constant [6 x i8] c"hello\00", align 1 +@_llgo_string = linkonce global ptr null @"main.struct$RKbUG45GE4henGMAdmt0Rju0JptyR8NsX7IZLsOI0OM" = global ptr null -@3 = private unnamed_addr constant [2 x i8] c"x\00", align 1 -@4 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 -@5 = private unnamed_addr constant [2 x i8] c"y\00", align 1 -@6 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 -@7 = private unnamed_addr constant [2 x i8] c"z\00", align 1 -@8 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 -@9 = private unnamed_addr constant [5 x i8] c"main\00", align 1 +@2 = private unnamed_addr constant [2 x i8] c"x\00", align 1 +@3 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 +@4 = private unnamed_addr constant [2 x i8] c"y\00", align 1 +@5 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 +@6 = private unnamed_addr constant [2 x i8] c"z\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 define void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %0) { _llgo_0: @@ -57,46 +71,21 @@ _llgo_0: %10 = load i8, ptr %9, align 1 %11 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Type", ptr %0, i32 0, i32 4 %12 = load i8, ptr %11, align 1 - %13 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Type", ptr %0, i32 0, i32 9 - %14 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %13, align 8 - %15 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Type", ptr %0, i32 0, i32 10 - %16 = load ptr, ptr %15, align 8 call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %2) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %4) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %6) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - %17 = zext i32 %8 to i64 - call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %17) + %13 = zext i32 %8 to i64 + call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %13) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - %18 = zext i8 %10 to i64 - call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %18) + %14 = zext i8 %10 to i64 + call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %14) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - %19 = zext i8 %12 to i64 - call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %19) - 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" %14) - call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr %16) + %15 = zext i8 %12 to i64 + call void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64 %15) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) - %20 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).Elem"(ptr %0) - %21 = icmp ne ptr %20, null - br i1 %21, label %_llgo_1, label %_llgo_2 - -_llgo_1: ; preds = %_llgo_0 - %22 = call ptr @"(*github.com/goplus/llgo/internal/abi.Type).Elem"(ptr %0) - %23 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %24 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %23, i32 0, i32 0 - store ptr @1, ptr %24, align 8 - %25 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %23, i32 0, i32 1 - store i64 1, ptr %25, align 4 - %26 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %23, align 8 - %27 = call %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.StringCat"(%"github.com/goplus/llgo/internal/runtime.String" %1, %"github.com/goplus/llgo/internal/runtime.String" %26) - call void @main.dumpTyp(ptr %22, %"github.com/goplus/llgo/internal/runtime.String" %27) - br label %_llgo_2 - -_llgo_2: ; preds = %_llgo_1, %_llgo_0 ret void } @@ -121,7 +110,7 @@ _llgo_0: store ptr %1, ptr @__llgo_argv, align 8 call void @"github.com/goplus/llgo/internal/runtime.init"() call void @main.init() - %2 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 1) + %2 = load ptr, ptr @_llgo_bool, align 8 %3 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %3, i32 0, i32 0 store ptr %2, ptr %4, align 8 @@ -129,7 +118,7 @@ _llgo_0: store ptr inttoptr (i64 -1 to ptr), ptr %5, align 8 %6 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %3, align 8 call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %6) - %7 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) + %7 = load ptr, ptr @_llgo_int, align 8 %8 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %9 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %8, i32 0, i32 0 store ptr %7, ptr %9, align 8 @@ -137,7 +126,7 @@ _llgo_0: store ptr null, ptr %10, align 8 %11 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %8, align 8 call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %11) - %12 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 3) + %12 = load ptr, ptr @_llgo_int8, align 8 %13 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %14 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %13, i32 0, i32 0 store ptr %12, ptr %14, align 8 @@ -145,7 +134,7 @@ _llgo_0: store ptr null, ptr %15, align 8 %16 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %13, align 8 call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %16) - %17 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 4) + %17 = load ptr, ptr @_llgo_int16, align 8 %18 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %19 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %18, i32 0, i32 0 store ptr %17, ptr %19, align 8 @@ -153,7 +142,7 @@ _llgo_0: store ptr null, ptr %20, align 8 %21 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %18, align 8 call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %21) - %22 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 5) + %22 = load ptr, ptr @_llgo_int32, align 8 %23 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %24 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %23, i32 0, i32 0 store ptr %22, ptr %24, align 8 @@ -161,7 +150,7 @@ _llgo_0: store ptr null, ptr %25, align 8 %26 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %23, align 8 call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %26) - %27 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 6) + %27 = load ptr, ptr @_llgo_int64, align 8 %28 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %29 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %28, i32 0, i32 0 store ptr %27, ptr %29, align 8 @@ -169,7 +158,7 @@ _llgo_0: store ptr null, ptr %30, align 8 %31 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %28, align 8 call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %31) - %32 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 7) + %32 = load ptr, ptr @_llgo_uint, align 8 %33 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %34 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %33, i32 0, i32 0 store ptr %32, ptr %34, align 8 @@ -177,7 +166,7 @@ _llgo_0: store ptr null, ptr %35, align 8 %36 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %33, align 8 call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %36) - %37 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 8) + %37 = load ptr, ptr @_llgo_uint8, align 8 %38 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %39 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %38, i32 0, i32 0 store ptr %37, ptr %39, align 8 @@ -185,7 +174,7 @@ _llgo_0: store ptr null, ptr %40, align 8 %41 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %38, align 8 call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %41) - %42 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 9) + %42 = load ptr, ptr @_llgo_uint16, align 8 %43 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %44 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %43, i32 0, i32 0 store ptr %42, ptr %44, align 8 @@ -193,7 +182,7 @@ _llgo_0: store ptr null, ptr %45, align 8 %46 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %43, align 8 call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %46) - %47 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 10) + %47 = load ptr, ptr @_llgo_uint32, align 8 %48 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %49 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %48, i32 0, i32 0 store ptr %47, ptr %49, align 8 @@ -201,7 +190,7 @@ _llgo_0: store ptr null, ptr %50, align 8 %51 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %48, align 8 call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %51) - %52 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 11) + %52 = load ptr, ptr @_llgo_uint64, align 8 %53 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %54 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %53, i32 0, i32 0 store ptr %52, ptr %54, align 8 @@ -209,7 +198,7 @@ _llgo_0: store ptr null, ptr %55, align 8 %56 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %53, align 8 call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %56) - %57 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 12) + %57 = load ptr, ptr @_llgo_uintptr, align 8 %58 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %59 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %58, i32 0, i32 0 store ptr %57, ptr %59, align 8 @@ -217,7 +206,7 @@ _llgo_0: store ptr null, ptr %60, align 8 %61 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %58, align 8 call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %61) - %62 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 13) + %62 = load ptr, ptr @_llgo_float32, align 8 %63 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %64 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %63, i32 0, i32 0 store ptr %62, ptr %64, align 8 @@ -225,7 +214,7 @@ _llgo_0: store ptr null, ptr %65, align 8 %66 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %63, align 8 call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %66) - %67 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 14) + %67 = load ptr, ptr @_llgo_float64, align 8 %68 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %69 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %68, i32 0, i32 0 store ptr %67, ptr %69, align 8 @@ -280,11 +269,11 @@ _llgo_0: call void @main.dump(%"github.com/goplus/llgo/internal/runtime.eface" %99) %100 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %101 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %100, i32 0, i32 0 - store ptr @2, ptr %101, align 8 + store ptr @1, ptr %101, align 8 %102 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %100, i32 0, i32 1 store i64 5, ptr %102, align 4 %103 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %100, align 8 - %104 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) + %104 = load ptr, ptr @_llgo_string, align 8 %105 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) store %"github.com/goplus/llgo/internal/runtime.String" %103, ptr %105, align 8 %106 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 @@ -317,158 +306,302 @@ declare void @"github.com/goplus/llgo/internal/runtime.PrintUint"(i64) declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8) -declare void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr) - -declare ptr @"(*github.com/goplus/llgo/internal/abi.Type).Elem"(ptr) - -declare %"github.com/goplus/llgo/internal/runtime.String" @"github.com/goplus/llgo/internal/runtime.StringCat"(%"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.String") - declare void @"github.com/goplus/llgo/internal/abi.init"() declare void @"github.com/goplus/llgo/internal/runtime.init"() -declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64) - -declare ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64) - -define void @"main.main$1"() { -_llgo_0: - ret void -} - define void @"main.init$abi"() { _llgo_0: - %0 = load ptr, ptr @"[10]_llgo_int", align 8 + %0 = load ptr, ptr @_llgo_bool, align 8 %1 = icmp eq ptr %0, null br i1 %1, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %2 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) - %3 = call ptr @"github.com/goplus/llgo/internal/runtime.ArrayOf"(i64 10, ptr %2) - store ptr %3, ptr @"[10]_llgo_int", align 8 + %2 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 1) + store ptr %2, ptr @_llgo_bool, align 8 br label %_llgo_2 _llgo_2: ; preds = %_llgo_1, %_llgo_0 - %4 = load ptr, ptr @"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac", align 8 - %5 = icmp eq ptr %4, null - br i1 %5, label %_llgo_3, label %_llgo_4 + %3 = load ptr, ptr @_llgo_int, align 8 + %4 = icmp eq ptr %3, null + br i1 %4, label %_llgo_3, label %_llgo_4 _llgo_3: ; preds = %_llgo_2 - %6 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 0) - %7 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 - %8 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %7, i32 0, i32 0 - store ptr %6, ptr %8, align 8 - %9 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %7, i32 0, i32 1 - store i64 0, ptr %9, align 4 - %10 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %7, i32 0, i32 2 - store i64 0, ptr %10, align 4 - %11 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %7, align 8 - %12 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 0) - %13 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 - %14 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %13, i32 0, i32 0 - store ptr %12, ptr %14, align 8 - %15 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %13, i32 0, i32 1 - store i64 0, ptr %15, align 4 - %16 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %13, i32 0, i32 2 - store i64 0, ptr %16, align 4 - %17 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %13, align 8 - %18 = call ptr @"github.com/goplus/llgo/internal/runtime.Func"(%"github.com/goplus/llgo/internal/runtime.Slice" %11, %"github.com/goplus/llgo/internal/runtime.Slice" %17, i1 false) - store ptr %18, ptr @"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac", align 8 + %5 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) + store ptr %5, ptr @_llgo_int, align 8 br label %_llgo_4 _llgo_4: ; preds = %_llgo_3, %_llgo_2 - %19 = load ptr, ptr @"*_llgo_int", align 8 - %20 = icmp eq ptr %19, null - br i1 %20, label %_llgo_5, label %_llgo_6 + %6 = load ptr, ptr @_llgo_int8, align 8 + %7 = icmp eq ptr %6, null + br i1 %7, label %_llgo_5, label %_llgo_6 _llgo_5: ; preds = %_llgo_4 - %21 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) - %22 = call ptr @"github.com/goplus/llgo/internal/runtime.PointerTo"(ptr %21) - store ptr %22, ptr @"*_llgo_int", align 8 + %8 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 3) + store ptr %8, ptr @_llgo_int8, align 8 br label %_llgo_6 _llgo_6: ; preds = %_llgo_5, %_llgo_4 - %23 = load ptr, ptr @"[]_llgo_int", align 8 - %24 = icmp eq ptr %23, null - br i1 %24, label %_llgo_7, label %_llgo_8 + %9 = load ptr, ptr @_llgo_int16, align 8 + %10 = icmp eq ptr %9, null + br i1 %10, label %_llgo_7, label %_llgo_8 _llgo_7: ; preds = %_llgo_6 - %25 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) - %26 = call ptr @"github.com/goplus/llgo/internal/runtime.SliceOf"(ptr %25) - store ptr %26, ptr @"[]_llgo_int", align 8 + %11 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 4) + store ptr %11, ptr @_llgo_int16, align 8 br label %_llgo_8 _llgo_8: ; preds = %_llgo_7, %_llgo_6 - %27 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %28 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %27, i32 0, i32 0 - store ptr @3, ptr %28, align 8 - %29 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %27, i32 0, i32 1 - store i64 1, ptr %29, align 4 - %30 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %27, align 8 - %31 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 3) - %32 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %33 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %32, i32 0, i32 0 - store ptr @4, ptr %33, align 8 - %34 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %32, i32 0, i32 1 - store i64 0, ptr %34, align 4 - %35 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %32, align 8 - %36 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %30, ptr %31, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %35, i1 false) - %37 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %38 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %37, i32 0, i32 0 - store ptr @5, ptr %38, align 8 - %39 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %37, i32 0, i32 1 - store i64 1, ptr %39, align 4 - %40 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %37, align 8 - %41 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) - %42 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %43 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %42, i32 0, i32 0 - store ptr @6, ptr %43, align 8 - %44 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %42, i32 0, i32 1 - store i64 0, ptr %44, align 4 - %45 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %42, align 8 - %46 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %40, ptr %41, i64 8, %"github.com/goplus/llgo/internal/runtime.String" %45, i1 false) - %47 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %48 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %47, i32 0, i32 0 - store ptr @7, ptr %48, align 8 - %49 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %47, i32 0, i32 1 - store i64 1, ptr %49, align 4 - %50 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %47, align 8 - %51 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) - %52 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %53 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %52, i32 0, i32 0 - store ptr @8, ptr %53, align 8 - %54 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %52, i32 0, i32 1 - store i64 0, ptr %54, align 4 - %55 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %52, align 8 - %56 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %50, ptr %51, i64 16, %"github.com/goplus/llgo/internal/runtime.String" %55, i1 false) - %57 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %58 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %57, i32 0, i32 0 - store ptr @9, ptr %58, align 8 - %59 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %57, i32 0, i32 1 - store i64 4, ptr %59, align 4 - %60 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %57, align 8 - %61 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 168) - %62 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %61, i64 0 - store %"github.com/goplus/llgo/internal/abi.StructField" %36, ptr %62, align 8 - %63 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %61, i64 1 - store %"github.com/goplus/llgo/internal/abi.StructField" %46, ptr %63, align 8 - %64 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %61, i64 2 - store %"github.com/goplus/llgo/internal/abi.StructField" %56, ptr %64, align 8 - %65 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 - %66 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %65, i32 0, i32 0 - store ptr %61, ptr %66, align 8 - %67 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %65, i32 0, i32 1 - store i64 3, ptr %67, align 4 - %68 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %65, i32 0, i32 2 - store i64 3, ptr %68, align 4 - %69 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %65, align 8 - %70 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %60, i64 24, %"github.com/goplus/llgo/internal/runtime.Slice" %69) - store ptr %70, ptr @"main.struct$RKbUG45GE4henGMAdmt0Rju0JptyR8NsX7IZLsOI0OM", align 8 + %12 = load ptr, ptr @_llgo_int32, align 8 + %13 = icmp eq ptr %12, null + br i1 %13, label %_llgo_9, label %_llgo_10 + +_llgo_9: ; preds = %_llgo_8 + %14 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 5) + store ptr %14, ptr @_llgo_int32, align 8 + br label %_llgo_10 + +_llgo_10: ; preds = %_llgo_9, %_llgo_8 + %15 = load ptr, ptr @_llgo_int64, align 8 + %16 = icmp eq ptr %15, null + br i1 %16, label %_llgo_11, label %_llgo_12 + +_llgo_11: ; preds = %_llgo_10 + %17 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 6) + store ptr %17, ptr @_llgo_int64, align 8 + br label %_llgo_12 + +_llgo_12: ; preds = %_llgo_11, %_llgo_10 + %18 = load ptr, ptr @_llgo_uint, align 8 + %19 = icmp eq ptr %18, null + br i1 %19, label %_llgo_13, label %_llgo_14 + +_llgo_13: ; preds = %_llgo_12 + %20 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 7) + store ptr %20, ptr @_llgo_uint, align 8 + br label %_llgo_14 + +_llgo_14: ; preds = %_llgo_13, %_llgo_12 + %21 = load ptr, ptr @_llgo_uint8, align 8 + %22 = icmp eq ptr %21, null + br i1 %22, label %_llgo_15, label %_llgo_16 + +_llgo_15: ; preds = %_llgo_14 + %23 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 8) + store ptr %23, ptr @_llgo_uint8, align 8 + br label %_llgo_16 + +_llgo_16: ; preds = %_llgo_15, %_llgo_14 + %24 = load ptr, ptr @_llgo_uint16, align 8 + %25 = icmp eq ptr %24, null + br i1 %25, label %_llgo_17, label %_llgo_18 + +_llgo_17: ; preds = %_llgo_16 + %26 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 9) + store ptr %26, ptr @_llgo_uint16, align 8 + br label %_llgo_18 + +_llgo_18: ; preds = %_llgo_17, %_llgo_16 + %27 = load ptr, ptr @_llgo_uint32, align 8 + %28 = icmp eq ptr %27, null + br i1 %28, label %_llgo_19, label %_llgo_20 + +_llgo_19: ; preds = %_llgo_18 + %29 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 10) + store ptr %29, ptr @_llgo_uint32, align 8 + br label %_llgo_20 + +_llgo_20: ; preds = %_llgo_19, %_llgo_18 + %30 = load ptr, ptr @_llgo_uint64, align 8 + %31 = icmp eq ptr %30, null + br i1 %31, label %_llgo_21, label %_llgo_22 + +_llgo_21: ; preds = %_llgo_20 + %32 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 11) + store ptr %32, ptr @_llgo_uint64, align 8 + br label %_llgo_22 + +_llgo_22: ; preds = %_llgo_21, %_llgo_20 + %33 = load ptr, ptr @_llgo_uintptr, align 8 + %34 = icmp eq ptr %33, null + br i1 %34, label %_llgo_23, label %_llgo_24 + +_llgo_23: ; preds = %_llgo_22 + %35 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 12) + store ptr %35, ptr @_llgo_uintptr, align 8 + br label %_llgo_24 + +_llgo_24: ; preds = %_llgo_23, %_llgo_22 + %36 = load ptr, ptr @_llgo_float32, align 8 + %37 = icmp eq ptr %36, null + br i1 %37, label %_llgo_25, label %_llgo_26 + +_llgo_25: ; preds = %_llgo_24 + %38 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 13) + store ptr %38, ptr @_llgo_float32, align 8 + br label %_llgo_26 + +_llgo_26: ; preds = %_llgo_25, %_llgo_24 + %39 = load ptr, ptr @_llgo_float64, align 8 + %40 = icmp eq ptr %39, null + br i1 %40, label %_llgo_27, label %_llgo_28 + +_llgo_27: ; preds = %_llgo_26 + %41 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 14) + store ptr %41, ptr @_llgo_float64, align 8 + br label %_llgo_28 + +_llgo_28: ; preds = %_llgo_27, %_llgo_26 + %42 = load ptr, ptr @_llgo_int, align 8 + %43 = load ptr, ptr @"[10]_llgo_int", align 8 + %44 = icmp eq ptr %43, null + br i1 %44, label %_llgo_29, label %_llgo_30 + +_llgo_29: ; preds = %_llgo_28 + %45 = call ptr @"github.com/goplus/llgo/internal/runtime.ArrayOf"(i64 10, ptr %42) + store ptr %45, ptr @"[10]_llgo_int", align 8 + br label %_llgo_30 + +_llgo_30: ; preds = %_llgo_29, %_llgo_28 + %46 = load ptr, ptr @"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac", align 8 + %47 = icmp eq ptr %46, null + br i1 %47, label %_llgo_31, label %_llgo_32 + +_llgo_31: ; preds = %_llgo_30 + %48 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 0) + %49 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %50 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %49, i32 0, i32 0 + store ptr %48, ptr %50, align 8 + %51 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %49, i32 0, i32 1 + store i64 0, ptr %51, align 4 + %52 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %49, i32 0, i32 2 + store i64 0, ptr %52, align 4 + %53 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %49, align 8 + %54 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 0) + %55 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %56 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %55, i32 0, i32 0 + store ptr %54, ptr %56, align 8 + %57 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %55, i32 0, i32 1 + store i64 0, ptr %57, align 4 + %58 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %55, i32 0, i32 2 + store i64 0, ptr %58, align 4 + %59 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %55, align 8 + %60 = call ptr @"github.com/goplus/llgo/internal/runtime.Func"(%"github.com/goplus/llgo/internal/runtime.Slice" %53, %"github.com/goplus/llgo/internal/runtime.Slice" %59, i1 false) + store ptr %60, ptr @"_llgo_func$2_iS07vIlF2_rZqWB5eU0IvP_9HviM4MYZNkXZDvbac", align 8 + br label %_llgo_32 + +_llgo_32: ; preds = %_llgo_31, %_llgo_30 + %61 = load ptr, ptr @_llgo_int, align 8 + %62 = load ptr, ptr @"*_llgo_int", align 8 + %63 = icmp eq ptr %62, null + br i1 %63, label %_llgo_33, label %_llgo_34 + +_llgo_33: ; preds = %_llgo_32 + %64 = call ptr @"github.com/goplus/llgo/internal/runtime.PointerTo"(ptr %61) + store ptr %64, ptr @"*_llgo_int", align 8 + br label %_llgo_34 + +_llgo_34: ; preds = %_llgo_33, %_llgo_32 + %65 = load ptr, ptr @_llgo_int, align 8 + %66 = load ptr, ptr @"[]_llgo_int", align 8 + %67 = icmp eq ptr %66, null + br i1 %67, label %_llgo_35, label %_llgo_36 + +_llgo_35: ; preds = %_llgo_34 + %68 = call ptr @"github.com/goplus/llgo/internal/runtime.SliceOf"(ptr %65) + store ptr %68, ptr @"[]_llgo_int", align 8 + br label %_llgo_36 + +_llgo_36: ; preds = %_llgo_35, %_llgo_34 + %69 = load ptr, ptr @_llgo_string, align 8 + %70 = icmp eq ptr %69, null + br i1 %70, label %_llgo_37, label %_llgo_38 + +_llgo_37: ; preds = %_llgo_36 + %71 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) + store ptr %71, ptr @_llgo_string, align 8 + br label %_llgo_38 + +_llgo_38: ; preds = %_llgo_37, %_llgo_36 + %72 = load ptr, ptr @_llgo_int8, align 8 + %73 = load ptr, ptr @_llgo_int, align 8 + %74 = load ptr, ptr @_llgo_int, align 8 + %75 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %76 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %75, i32 0, i32 0 + store ptr @2, ptr %76, align 8 + %77 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %75, i32 0, i32 1 + store i64 1, ptr %77, align 4 + %78 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %75, align 8 + %79 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %80 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %79, i32 0, i32 0 + store ptr @3, ptr %80, align 8 + %81 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %79, i32 0, i32 1 + store i64 0, ptr %81, align 4 + %82 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %79, align 8 + %83 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %78, ptr %72, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %82, i1 false) + %84 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %85 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %84, i32 0, i32 0 + store ptr @4, ptr %85, align 8 + %86 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %84, i32 0, i32 1 + store i64 1, ptr %86, align 4 + %87 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %84, align 8 + %88 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %89 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %88, i32 0, i32 0 + store ptr @5, ptr %89, align 8 + %90 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %88, i32 0, i32 1 + store i64 0, ptr %90, align 4 + %91 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %88, align 8 + %92 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %87, ptr %73, i64 8, %"github.com/goplus/llgo/internal/runtime.String" %91, i1 false) + %93 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %94 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %93, i32 0, i32 0 + store ptr @6, ptr %94, align 8 + %95 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %93, i32 0, i32 1 + store i64 1, ptr %95, align 4 + %96 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %93, align 8 + %97 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %98 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %97, i32 0, i32 0 + store ptr @7, ptr %98, align 8 + %99 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %97, i32 0, i32 1 + store i64 0, ptr %99, align 4 + %100 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %97, align 8 + %101 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %96, ptr %74, i64 16, %"github.com/goplus/llgo/internal/runtime.String" %100, i1 false) + %102 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %103 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %102, i32 0, i32 0 + store ptr @8, ptr %103, align 8 + %104 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %102, i32 0, i32 1 + store i64 4, ptr %104, align 4 + %105 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %102, align 8 + %106 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 168) + %107 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %106, i64 0 + store %"github.com/goplus/llgo/internal/abi.StructField" %83, ptr %107, align 8 + %108 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %106, i64 1 + store %"github.com/goplus/llgo/internal/abi.StructField" %92, ptr %108, align 8 + %109 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %106, i64 2 + store %"github.com/goplus/llgo/internal/abi.StructField" %101, ptr %109, align 8 + %110 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %111 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %110, i32 0, i32 0 + store ptr %106, ptr %111, align 8 + %112 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %110, i32 0, i32 1 + store i64 3, ptr %112, align 4 + %113 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %110, i32 0, i32 2 + store i64 3, ptr %113, align 4 + %114 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %110, align 8 + %115 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %105, i64 24, %"github.com/goplus/llgo/internal/runtime.Slice" %114) + store ptr %115, ptr @"main.struct$RKbUG45GE4henGMAdmt0Rju0JptyR8NsX7IZLsOI0OM", align 8 ret void } +declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64) + declare ptr @"github.com/goplus/llgo/internal/runtime.ArrayOf"(i64, ptr) +declare ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64) + +define void @"main.main$1"() { +_llgo_0: + ret void +} + declare ptr @"github.com/goplus/llgo/internal/runtime.Func"(%"github.com/goplus/llgo/internal/runtime.Slice", %"github.com/goplus/llgo/internal/runtime.Slice", i1) declare ptr @"github.com/goplus/llgo/internal/runtime.PointerTo"(ptr) diff --git a/cl/_testgo/errors/out.ll b/cl/_testgo/errors/out.ll index 40e32fdef..f544af601 100644 --- a/cl/_testgo/errors/out.ll +++ b/cl/_testgo/errors/out.ll @@ -4,30 +4,30 @@ source_filename = "main" %"github.com/goplus/llgo/internal/runtime.iface" = type { ptr, ptr } %"github.com/goplus/llgo/internal/runtime.String" = type { ptr, i64 } %main.errorString = type { %"github.com/goplus/llgo/internal/runtime.String" } -%"github.com/goplus/llgo/internal/abi.Imethod" = type { %"github.com/goplus/llgo/internal/runtime.String", 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 } %"github.com/goplus/llgo/internal/abi.Method" = type { %"github.com/goplus/llgo/internal/runtime.String", ptr, ptr, 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/abi.Imethod" = type { %"github.com/goplus/llgo/internal/runtime.String", ptr } @"main.init$guard" = global ptr null @"*_llgo_main.errorString" = global ptr null -@"_llgo_iface$Fh8eUJ-Gw4e6TYuajcFIOSCuqSPKAt5nS4ow7xeGXEU" = linkonce global ptr null -@__llgo_argc = global ptr null -@__llgo_argv = global ptr null -@0 = private unnamed_addr constant [9 x i8] c"an error\00", align 1 -@1 = private unnamed_addr constant [9 x i8] c"Imethod:\00", align 1 @_llgo_main.errorString = global ptr null -@2 = private unnamed_addr constant [6 x i8] c"Error\00", align 1 -@"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to" = linkonce global ptr null -@3 = private unnamed_addr constant [5 x i8] c"main\00", align 1 @"main.struct$QTufDJA9wEDzuzgkA-ZSrLqW-B6lWN8O25mTSglAoLQ" = global ptr null -@4 = private unnamed_addr constant [6 x i8] c"Error\00", align 1 -@"_llgo_func$8LHAAczeMU-_MsqDJ4-62jHfhzpiOiRnFkBoaL3mfxg" = linkonce global ptr null -@5 = private unnamed_addr constant [5 x i8] c"main\00", align 1 -@6 = private unnamed_addr constant [17 x i8] c"main.errorString\00", align 1 -@7 = private unnamed_addr constant [2 x i8] c"s\00", align 1 +@_llgo_string = linkonce global ptr null +@0 = private unnamed_addr constant [2 x i8] c"s\00", align 1 +@1 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 +@2 = private unnamed_addr constant [5 x i8] c"main\00", align 1 +@3 = private unnamed_addr constant [6 x i8] c"Error\00", align 1 +@"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to" = linkonce global ptr null +@4 = private unnamed_addr constant [5 x i8] c"main\00", align 1 +@5 = private unnamed_addr constant [17 x i8] c"main.errorString\00", align 1 +@"_llgo_iface$Fh8eUJ-Gw4e6TYuajcFIOSCuqSPKAt5nS4ow7xeGXEU" = linkonce global ptr null +@6 = private unnamed_addr constant [6 x i8] c"Error\00", align 1 +@7 = private unnamed_addr constant [5 x i8] c"main\00", align 1 @8 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 -@9 = private unnamed_addr constant [5 x i8] c"main\00", align 1 +@__llgo_argc = global ptr null +@__llgo_argv = global ptr null +@9 = private unnamed_addr constant [9 x i8] c"an error\00", align 1 define %"github.com/goplus/llgo/internal/runtime.iface" @main.New(%"github.com/goplus/llgo/internal/runtime.String" %0) { _llgo_0: @@ -75,7 +75,7 @@ _llgo_0: 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 @0, ptr %3, align 8 + store ptr @9, ptr %3, align 8 %4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 1 store i64 8, ptr %4, align 4 %5 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %2, align 8 @@ -92,260 +92,212 @@ _llgo_0: %13 = getelementptr inbounds { ptr, ptr }, ptr %11, i32 0, i32 1 store ptr %10, ptr %13, align 8 %14 = load { ptr, ptr }, ptr %11, align 8 - %15 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %16 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %15, i32 0, i32 0 - store ptr @1, ptr %16, align 8 - %17 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %15, i32 0, i32 1 - store i64 8, ptr %17, align 4 - %18 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %15, align 8 - call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %18) - call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr %7) - call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - %19 = extractvalue { ptr, ptr } %14, 0 - call void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr %19) - call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 10) - call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 32) - call void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64 0) - call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) - %20 = extractvalue { ptr, ptr } %14, 1 - %21 = extractvalue { ptr, ptr } %14, 0 - %22 = call %"github.com/goplus/llgo/internal/runtime.String" %21(ptr %20) - call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %22) + %15 = extractvalue { ptr, ptr } %14, 1 + %16 = extractvalue { ptr, ptr } %14, 0 + %17 = call %"github.com/goplus/llgo/internal/runtime.String" %16(ptr %15) + call void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String" %17) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) ret i32 0 } declare ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64) -declare ptr @"github.com/goplus/llgo/internal/runtime.NewItab"(ptr, ptr) - -declare void @"github.com/goplus/llgo/internal/runtime.init"() - -declare void @"github.com/goplus/llgo/internal/runtime.PrintIface"(%"github.com/goplus/llgo/internal/runtime.iface") - -declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8) - -declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String") - -declare void @"github.com/goplus/llgo/internal/runtime.PrintPointer"(ptr) - -declare void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64) - define void @"main.init$abi"() { _llgo_0: - call void @"main.init$abi2"() - %0 = load ptr, ptr @_llgo_main.errorString, align 8 - %1 = call ptr @"github.com/goplus/llgo/internal/runtime.PointerTo"(ptr %0) - store ptr %1, ptr @"*_llgo_main.errorString", align 8 - %2 = load ptr, ptr @"_llgo_iface$Fh8eUJ-Gw4e6TYuajcFIOSCuqSPKAt5nS4ow7xeGXEU", align 8 - %3 = icmp eq ptr %2, null - br i1 %3, label %_llgo_1, label %_llgo_2 + %0 = call ptr @"github.com/goplus/llgo/internal/runtime.NewNamed"(i64 25, i64 0, i64 1) + store ptr %0, ptr @_llgo_main.errorString, align 8 + %1 = load ptr, ptr @_llgo_string, align 8 + %2 = icmp eq ptr %1, null + br i1 %2, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 - %4 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %5 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %4, i32 0, i32 0 - store ptr @2, ptr %5, align 8 - %6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %4, i32 0, i32 1 - store i64 5, ptr %6, align 4 - %7 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %4, align 8 - %8 = load ptr, ptr @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to", align 8 - %9 = alloca %"github.com/goplus/llgo/internal/abi.Imethod", align 8 - %10 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Imethod", ptr %9, i32 0, i32 0 - store %"github.com/goplus/llgo/internal/runtime.String" %7, ptr %10, align 8 - %11 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Imethod", ptr %9, i32 0, i32 1 - store ptr %8, ptr %11, align 8 - %12 = load %"github.com/goplus/llgo/internal/abi.Imethod", ptr %9, align 8 - %13 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 24) - %14 = getelementptr %"github.com/goplus/llgo/internal/abi.Imethod", ptr %13, i64 0 - store %"github.com/goplus/llgo/internal/abi.Imethod" %12, ptr %14, align 8 - %15 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 - %16 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %15, i32 0, i32 0 - store ptr %13, ptr %16, align 8 - %17 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %15, i32 0, i32 1 - store i64 1, ptr %17, align 4 - %18 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %15, i32 0, i32 2 - store i64 1, ptr %18, align 4 - %19 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %15, align 8 - %20 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %21 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %20, i32 0, i32 0 - store ptr @3, ptr %21, align 8 - %22 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %20, i32 0, i32 1 - store i64 4, ptr %22, align 4 - %23 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %20, align 8 - %24 = call ptr @"github.com/goplus/llgo/internal/runtime.Interface"(%"github.com/goplus/llgo/internal/runtime.String" %23, %"github.com/goplus/llgo/internal/runtime.Slice" %19) - store ptr %24, ptr @"_llgo_iface$Fh8eUJ-Gw4e6TYuajcFIOSCuqSPKAt5nS4ow7xeGXEU", align 8 + %3 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) + store ptr %3, ptr @_llgo_string, align 8 br label %_llgo_2 _llgo_2: ; preds = %_llgo_1, %_llgo_0 + %4 = load ptr, ptr @_llgo_string, 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 @0, ptr %6, align 8 + %7 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %5, i32 0, i32 1 + store i64 1, ptr %7, align 4 + %8 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %5, align 8 + %9 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %10 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %9, i32 0, i32 0 + store ptr @1, ptr %10, align 8 + %11 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %9, i32 0, i32 1 + store i64 0, ptr %11, align 4 + %12 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %9, align 8 + %13 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %8, ptr %4, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %12, i1 false) + %14 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %15 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %14, i32 0, i32 0 + store ptr @2, ptr %15, align 8 + %16 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %14, i32 0, i32 1 + store i64 4, ptr %16, align 4 + %17 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %14, align 8 + %18 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 56) + %19 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %18, i64 0 + store %"github.com/goplus/llgo/internal/abi.StructField" %13, ptr %19, align 8 + %20 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %21 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %20, i32 0, i32 0 + store ptr %18, ptr %21, align 8 + %22 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %20, i32 0, i32 1 + store i64 1, ptr %22, align 4 + %23 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %20, i32 0, i32 2 + store i64 1, ptr %23, align 4 + %24 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %20, align 8 + %25 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %17, i64 16, %"github.com/goplus/llgo/internal/runtime.Slice" %24) + store ptr %25, ptr @"main.struct$QTufDJA9wEDzuzgkA-ZSrLqW-B6lWN8O25mTSglAoLQ", align 8 + %26 = load ptr, ptr @"main.struct$QTufDJA9wEDzuzgkA-ZSrLqW-B6lWN8O25mTSglAoLQ", align 8 + %27 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %28 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %27, i32 0, i32 0 + store ptr @3, ptr %28, align 8 + %29 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %27, i32 0, i32 1 + store i64 5, ptr %29, align 4 + %30 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %27, align 8 + %31 = load ptr, ptr @_llgo_string, align 8 + %32 = load ptr, ptr @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to", align 8 + %33 = icmp eq ptr %32, null + br i1 %33, label %_llgo_3, label %_llgo_4 + +_llgo_3: ; preds = %_llgo_2 + %34 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 0) + %35 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %36 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %35, i32 0, i32 0 + store ptr %34, ptr %36, align 8 + %37 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %35, i32 0, i32 1 + store i64 0, ptr %37, align 4 + %38 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %35, i32 0, i32 2 + store i64 0, ptr %38, align 4 + %39 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %35, align 8 + %40 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 8) + %41 = getelementptr ptr, ptr %40, i64 0 + store ptr %31, 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.Func"(%"github.com/goplus/llgo/internal/runtime.Slice" %39, %"github.com/goplus/llgo/internal/runtime.Slice" %46, i1 false) + store ptr %47, ptr @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to", align 8 + br label %_llgo_4 + +_llgo_4: ; preds = %_llgo_3, %_llgo_2 + %48 = load ptr, ptr @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to", align 8 + %49 = alloca %"github.com/goplus/llgo/internal/abi.Method", align 8 + %50 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %49, i32 0, i32 0 + store %"github.com/goplus/llgo/internal/runtime.String" %30, ptr %50, align 8 + %51 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %49, i32 0, i32 1 + store ptr %48, ptr %51, align 8 + %52 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %49, i32 0, i32 2 + store ptr @"(*main.errorString).Error", ptr %52, align 8 + %53 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %49, i32 0, i32 3 + store ptr @"(*main.errorString).Error", ptr %53, align 8 + %54 = load %"github.com/goplus/llgo/internal/abi.Method", ptr %49, align 8 + %55 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 40) + %56 = getelementptr %"github.com/goplus/llgo/internal/abi.Method", ptr %55, i64 0 + store %"github.com/goplus/llgo/internal/abi.Method" %54, ptr %56, align 8 + %57 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %58 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %57, i32 0, i32 0 + store ptr %55, ptr %58, align 8 + %59 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %57, i32 0, i32 1 + store i64 1, ptr %59, align 4 + %60 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %57, i32 0, i32 2 + store i64 1, ptr %60, align 4 + %61 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %57, align 8 + %62 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %63 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %62, i32 0, i32 0 + store ptr @4, ptr %63, align 8 + %64 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %62, i32 0, i32 1 + store i64 4, ptr %64, align 4 + %65 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %62, align 8 + %66 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %67 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %66, i32 0, i32 0 + store ptr @5, ptr %67, align 8 + %68 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %66, i32 0, i32 1 + store i64 16, ptr %68, align 4 + %69 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %66, align 8 + call void @"github.com/goplus/llgo/internal/runtime.InitNamed"(ptr %0, %"github.com/goplus/llgo/internal/runtime.String" %65, %"github.com/goplus/llgo/internal/runtime.String" %69, ptr %26, { ptr, i64, i64 } zeroinitializer, %"github.com/goplus/llgo/internal/runtime.Slice" %61) + %70 = load ptr, ptr @_llgo_main.errorString, align 8 + %71 = call ptr @"github.com/goplus/llgo/internal/runtime.PointerTo"(ptr %70) + store ptr %71, ptr @"*_llgo_main.errorString", align 8 + %72 = load ptr, ptr @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to", align 8 + %73 = load ptr, ptr @"_llgo_iface$Fh8eUJ-Gw4e6TYuajcFIOSCuqSPKAt5nS4ow7xeGXEU", align 8 + %74 = icmp eq ptr %73, null + br i1 %74, label %_llgo_5, label %_llgo_6 + +_llgo_5: ; preds = %_llgo_4 + %75 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %76 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %75, i32 0, i32 0 + store ptr @6, ptr %76, align 8 + %77 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %75, i32 0, i32 1 + store i64 5, ptr %77, align 4 + %78 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %75, align 8 + %79 = alloca %"github.com/goplus/llgo/internal/abi.Imethod", align 8 + %80 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Imethod", ptr %79, i32 0, i32 0 + store %"github.com/goplus/llgo/internal/runtime.String" %78, ptr %80, align 8 + %81 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Imethod", ptr %79, i32 0, i32 1 + store ptr %72, ptr %81, align 8 + %82 = load %"github.com/goplus/llgo/internal/abi.Imethod", ptr %79, align 8 + %83 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 24) + %84 = getelementptr %"github.com/goplus/llgo/internal/abi.Imethod", ptr %83, i64 0 + store %"github.com/goplus/llgo/internal/abi.Imethod" %82, ptr %84, align 8 + %85 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %86 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %85, i32 0, i32 0 + store ptr %83, ptr %86, align 8 + %87 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %85, i32 0, i32 1 + store i64 1, ptr %87, align 4 + %88 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %85, i32 0, i32 2 + store i64 1, ptr %88, align 4 + %89 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %85, align 8 + %90 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %91 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %90, i32 0, i32 0 + store ptr @7, ptr %91, align 8 + %92 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %90, i32 0, i32 1 + store i64 4, ptr %92, align 4 + %93 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %90, align 8 + %94 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %95 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %94, i32 0, i32 0 + store ptr @8, ptr %95, align 8 + %96 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %94, i32 0, i32 1 + store i64 0, ptr %96, align 4 + %97 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %94, align 8 + %98 = call ptr @"github.com/goplus/llgo/internal/runtime.Interface"(%"github.com/goplus/llgo/internal/runtime.String" %93, %"github.com/goplus/llgo/internal/runtime.String" %97, %"github.com/goplus/llgo/internal/runtime.Slice" %89) + store ptr %98, ptr @"_llgo_iface$Fh8eUJ-Gw4e6TYuajcFIOSCuqSPKAt5nS4ow7xeGXEU", align 8 + br label %_llgo_6 + +_llgo_6: ; preds = %_llgo_5, %_llgo_4 ret void } -declare ptr @"github.com/goplus/llgo/internal/runtime.PointerTo"(ptr) - -declare ptr @"github.com/goplus/llgo/internal/runtime.Interface"(%"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.Slice") +declare ptr @"github.com/goplus/llgo/internal/runtime.NewNamed"(i64, i64, i64) -declare ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64) +declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64) -define void @"main.init$abi2"() { -_llgo_0: - call void @"main.init$abi3"() - %0 = load ptr, ptr @"main.struct$QTufDJA9wEDzuzgkA-ZSrLqW-B6lWN8O25mTSglAoLQ", align 8 - %1 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %2 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %1, i32 0, i32 0 - store ptr @4, ptr %2, align 8 - %3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %1, i32 0, i32 1 - store i64 5, ptr %3, align 4 - %4 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %1, align 8 - %5 = load ptr, ptr @"_llgo_func$8LHAAczeMU-_MsqDJ4-62jHfhzpiOiRnFkBoaL3mfxg", align 8 - %6 = alloca %"github.com/goplus/llgo/internal/abi.Method", align 8 - %7 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %6, i32 0, i32 0 - store %"github.com/goplus/llgo/internal/runtime.String" %4, ptr %7, align 8 - %8 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %6, i32 0, i32 1 - store ptr %5, ptr %8, align 8 - %9 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %6, i32 0, i32 2 - store ptr @"(*main.errorString).Error", ptr %9, align 8 - %10 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %6, i32 0, i32 3 - store ptr @"(*main.errorString).Error", ptr %10, align 8 - %11 = load %"github.com/goplus/llgo/internal/abi.Method", ptr %6, align 8 - %12 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 40) - %13 = getelementptr %"github.com/goplus/llgo/internal/abi.Method", ptr %12, i64 0 - store %"github.com/goplus/llgo/internal/abi.Method" %11, ptr %13, align 8 - %14 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 - %15 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %14, i32 0, i32 0 - store ptr %12, ptr %15, align 8 - %16 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %14, i32 0, i32 1 - store i64 1, ptr %16, align 4 - %17 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %14, i32 0, i32 2 - store i64 1, ptr %17, align 4 - %18 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %14, align 8 - %19 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %20 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %19, i32 0, i32 0 - store ptr @5, ptr %20, align 8 - %21 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %19, i32 0, i32 1 - store i64 4, ptr %21, align 4 - %22 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %19, align 8 - %23 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %24 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %23, i32 0, i32 0 - store ptr @6, ptr %24, align 8 - %25 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %23, i32 0, i32 1 - store i64 16, ptr %25, align 4 - %26 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %23, align 8 - %27 = call ptr @"github.com/goplus/llgo/internal/runtime.Named"(%"github.com/goplus/llgo/internal/runtime.String" %22, %"github.com/goplus/llgo/internal/runtime.String" %26, ptr %0, { ptr, i64, i64 } zeroinitializer, %"github.com/goplus/llgo/internal/runtime.Slice" %18) - store ptr %27, ptr @_llgo_main.errorString, align 8 - %28 = load ptr, ptr @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to", align 8 - %29 = icmp eq ptr %28, null - br i1 %29, label %_llgo_1, label %_llgo_2 +declare ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String", i64, %"github.com/goplus/llgo/internal/runtime.Slice") -_llgo_1: ; preds = %_llgo_0 - %30 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 0) - %31 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 - %32 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %31, i32 0, i32 0 - store ptr %30, ptr %32, align 8 - %33 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %31, i32 0, i32 1 - store i64 0, ptr %33, align 4 - %34 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %31, i32 0, i32 2 - store i64 0, ptr %34, align 4 - %35 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %31, align 8 - %36 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) - %37 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 8) - %38 = getelementptr ptr, ptr %37, i64 0 - store ptr %36, ptr %38, align 8 - %39 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 - %40 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %39, i32 0, i32 0 - store ptr %37, ptr %40, align 8 - %41 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %39, i32 0, i32 1 - store i64 1, ptr %41, align 4 - %42 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %39, i32 0, i32 2 - store i64 1, ptr %42, align 4 - %43 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %39, align 8 - %44 = call ptr @"github.com/goplus/llgo/internal/runtime.Func"(%"github.com/goplus/llgo/internal/runtime.Slice" %35, %"github.com/goplus/llgo/internal/runtime.Slice" %43, i1 false) - store ptr %44, ptr @"_llgo_func$zNDVRsWTIpUPKouNUS805RGX--IV9qVK8B31IZbg5to", align 8 - br label %_llgo_2 +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) -_llgo_2: ; preds = %_llgo_1, %_llgo_0 - ret void -} +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", %"github.com/goplus/llgo/internal/runtime.Slice") +declare void @"github.com/goplus/llgo/internal/runtime.InitNamed"(ptr, %"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.String", ptr, %"github.com/goplus/llgo/internal/runtime.Slice", %"github.com/goplus/llgo/internal/runtime.Slice") declare ptr @"github.com/goplus/llgo/internal/runtime.Func"(%"github.com/goplus/llgo/internal/runtime.Slice", %"github.com/goplus/llgo/internal/runtime.Slice", i1) -declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64) +declare ptr @"github.com/goplus/llgo/internal/runtime.PointerTo"(ptr) -define void @"main.init$abi3"() { -_llgo_0: - %0 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %0, i32 0, i32 0 - store ptr @7, ptr %1, align 8 - %2 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %0, i32 0, i32 1 - store i64 1, ptr %2, align 4 - %3 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %0, align 8 - %4 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) - %5 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %5, i32 0, i32 0 - store ptr @8, ptr %6, align 8 - %7 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %5, i32 0, i32 1 - store i64 0, ptr %7, align 4 - %8 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %5, align 8 - %9 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %3, ptr %4, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %8, i1 false) - %10 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %11 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %10, i32 0, i32 0 - store ptr @9, ptr %11, align 8 - %12 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %10, i32 0, i32 1 - store i64 4, ptr %12, align 4 - %13 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %10, align 8 - %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 = 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 16, %"github.com/goplus/llgo/internal/runtime.Slice" %20) - store ptr %21, ptr @"main.struct$QTufDJA9wEDzuzgkA-ZSrLqW-B6lWN8O25mTSglAoLQ", align 8 - %22 = load ptr, ptr @"_llgo_func$8LHAAczeMU-_MsqDJ4-62jHfhzpiOiRnFkBoaL3mfxg", align 8 - %23 = icmp eq ptr %22, null - br i1 %23, label %_llgo_1, label %_llgo_2 +declare ptr @"github.com/goplus/llgo/internal/runtime.Interface"(%"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.Slice") -_llgo_1: ; preds = %_llgo_0 - %24 = load ptr, ptr @"*_llgo_main.errorString", align 8 - %25 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 8) - %26 = getelementptr ptr, ptr %25, i64 0 - store ptr %24, 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 %25, ptr %28, align 8 - %29 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %27, i32 0, i32 1 - store i64 1, ptr %29, align 4 - %30 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %27, i32 0, i32 2 - store i64 1, 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.Basic"(i64 24) - %33 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 8) - %34 = getelementptr ptr, ptr %33, i64 0 - store ptr %32, ptr %34, align 8 - %35 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 - %36 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %35, i32 0, i32 0 - store ptr %33, ptr %36, align 8 - %37 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %35, i32 0, i32 1 - store i64 1, ptr %37, align 4 - %38 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %35, i32 0, i32 2 - store i64 1, ptr %38, align 4 - %39 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %35, align 8 - %40 = call ptr @"github.com/goplus/llgo/internal/runtime.Func"(%"github.com/goplus/llgo/internal/runtime.Slice" %31, %"github.com/goplus/llgo/internal/runtime.Slice" %39, i1 false) - store ptr %40, ptr @"_llgo_func$8LHAAczeMU-_MsqDJ4-62jHfhzpiOiRnFkBoaL3mfxg", align 8 - br label %_llgo_2 +declare ptr @"github.com/goplus/llgo/internal/runtime.NewItab"(ptr, ptr) -_llgo_2: ; preds = %_llgo_1, %_llgo_0 - ret void -} +declare void @"github.com/goplus/llgo/internal/runtime.init"() -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 void @"github.com/goplus/llgo/internal/runtime.PrintIface"(%"github.com/goplus/llgo/internal/runtime.iface") -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 void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8) + +declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String") diff --git a/cl/_testgo/strucintf/out.ll b/cl/_testgo/strucintf/out.ll index 9e09848fe..f23f046d5 100644 --- a/cl/_testgo/strucintf/out.ll +++ b/cl/_testgo/strucintf/out.ll @@ -8,18 +8,19 @@ source_filename = "main" @"main.init$guard" = global ptr null @"main.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88" = global ptr null +@_llgo_int = linkonce global ptr null +@0 = private unnamed_addr constant [2 x i8] c"v\00", align 1 +@1 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 +@2 = private unnamed_addr constant [5 x i8] c"main\00", align 1 @__llgo_argc = global ptr null @__llgo_argv = global ptr null @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk" = linkonce global ptr null -@0 = private unnamed_addr constant [12 x i8] c"Foo: not ok\00", align 1 -@1 = private unnamed_addr constant [12 x i8] c"Bar: not ok\00", align 1 -@2 = private unnamed_addr constant [10 x i8] c"F: not ok\00", align 1 -@3 = private unnamed_addr constant [2 x i8] c"v\00", align 1 +@3 = private unnamed_addr constant [2 x i8] c"V\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 [2 x i8] c"V\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 +@6 = private unnamed_addr constant [12 x i8] c"Foo: not ok\00", align 1 +@7 = private unnamed_addr constant [12 x i8] c"Bar: not ok\00", align 1 +@8 = private unnamed_addr constant [10 x i8] c"F: not ok\00", align 1 define %"github.com/goplus/llgo/internal/runtime.eface" @main.Foo() { _llgo_0: @@ -88,7 +89,7 @@ _llgo_2: ; preds = %_llgo_3, %_llgo_1 _llgo_3: ; preds = %_llgo_12 %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 @0, ptr %17, align 8 + store ptr @6, ptr %17, align 8 %18 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %16, i32 0, i32 1 store i64 11, ptr %18, align 4 %19 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %16, align 8 @@ -115,7 +116,7 @@ _llgo_5: ; preds = %_llgo_6, %_llgo_4 _llgo_6: ; preds = %_llgo_15 %28 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %29 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %28, i32 0, i32 0 - store ptr @1, ptr %29, align 8 + store ptr @7, ptr %29, align 8 %30 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %28, i32 0, i32 1 store i64 11, ptr %30, align 4 %31 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %28, align 8 @@ -136,7 +137,7 @@ _llgo_8: ; preds = %_llgo_9, %_llgo_7 _llgo_9: ; preds = %_llgo_18 %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 @2, ptr %35, align 8 + 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 9, ptr %36, align 4 %37 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %34, align 8 @@ -240,103 +241,113 @@ _llgo_18: ; preds = %_llgo_17, %_llgo_16 declare ptr @"github.com/goplus/llgo/internal/runtime.Zeroinit"(ptr, i64) -declare void @"github.com/goplus/llgo/cl/internal/foo.init"() - -declare void @"github.com/goplus/llgo/internal/runtime.init"() - -declare void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64) - -declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8) - -declare %"github.com/goplus/llgo/internal/runtime.eface" @"github.com/goplus/llgo/cl/internal/foo.Bar"() - -declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String") - -declare %"github.com/goplus/llgo/internal/runtime.eface" @"github.com/goplus/llgo/cl/internal/foo.F"() - 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 @3, ptr %1, align 8 - %2 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %0, i32 0, i32 1 - store i64 1, ptr %2, align 4 - %3 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %0, align 8 - %4 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) - %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 @4, 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 @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 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 = 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 + %0 = load ptr, ptr @_llgo_int, align 8 + %1 = icmp eq ptr %0, null + br i1 %1, 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 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 + %2 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) + store ptr %2, ptr @_llgo_int, align 8 br label %_llgo_2 _llgo_2: ; preds = %_llgo_1, %_llgo_0 + %3 = load ptr, ptr @_llgo_int, align 8 + %4 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %5 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %4, i32 0, i32 0 + store ptr @0, ptr %5, align 8 + %6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %4, i32 0, i32 1 + store i64 1, ptr %6, align 4 + %7 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %4, align 8 + %8 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %9 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %8, i32 0, i32 0 + store ptr @1, ptr %9, align 8 + %10 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %8, i32 0, i32 1 + store i64 0, ptr %10, align 4 + %11 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %8, align 8 + %12 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %7, ptr %3, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %11, i1 false) + %13 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %14 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %13, i32 0, i32 0 + store ptr @2, ptr %14, align 8 + %15 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %13, i32 0, i32 1 + store i64 4, ptr %15, align 4 + %16 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %13, align 8 + %17 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 56) + %18 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %17, i64 0 + store %"github.com/goplus/llgo/internal/abi.StructField" %12, ptr %18, align 8 + %19 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %20 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %19, i32 0, i32 0 + store ptr %17, ptr %20, align 8 + %21 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %19, i32 0, i32 1 + store i64 1, ptr %21, align 4 + %22 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %19, i32 0, i32 2 + store i64 1, ptr %22, align 4 + %23 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %19, align 8 + %24 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %16, i64 8, %"github.com/goplus/llgo/internal/runtime.Slice" %23) + store ptr %24, ptr @"main.struct$MYpsoM99ZwFY087IpUOkIw1zjBA_sgFXVodmn1m-G88", align 8 + %25 = load ptr, ptr @_llgo_int, align 8 + %26 = load ptr, ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk", align 8 + %27 = icmp eq ptr %26, null + br i1 %27, label %_llgo_3, label %_llgo_4 + +_llgo_3: ; preds = %_llgo_2 + %28 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %29 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %28, i32 0, i32 0 + store ptr @3, ptr %29, align 8 + %30 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %28, i32 0, i32 1 + store i64 1, ptr %30, align 4 + %31 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %28, align 8 + %32 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %33 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %32, i32 0, i32 0 + store ptr @4, ptr %33, align 8 + %34 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %32, i32 0, i32 1 + store i64 0, ptr %34, align 4 + %35 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %32, align 8 + %36 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %31, ptr %25, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %35, i1 false) + %37 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %38 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %37, i32 0, i32 0 + store ptr @5, ptr %38, align 8 + %39 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %37, i32 0, i32 1 + store i64 4, ptr %39, align 4 + %40 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %37, align 8 + %41 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 56) + %42 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %41, i64 0 + store %"github.com/goplus/llgo/internal/abi.StructField" %36, ptr %42, align 8 + %43 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %44 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %43, i32 0, i32 0 + store ptr %41, ptr %44, align 8 + %45 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %43, i32 0, i32 1 + store i64 1, ptr %45, align 4 + %46 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %43, i32 0, i32 2 + store i64 1, ptr %46, align 4 + %47 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %43, align 8 + %48 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %40, i64 8, %"github.com/goplus/llgo/internal/runtime.Slice" %47) + store ptr %48, ptr @"_llgo_struct$K-dZ9QotZfVPz2a0YdRa9vmZUuDXPTqZOlMShKEDJtk", align 8 + br label %_llgo_4 + +_llgo_4: ; preds = %_llgo_3, %_llgo_2 ret void } +declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64) + 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) -declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64) - declare ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64) + +declare void @"github.com/goplus/llgo/cl/internal/foo.init"() + +declare void @"github.com/goplus/llgo/internal/runtime.init"() + +declare void @"github.com/goplus/llgo/internal/runtime.PrintInt"(i64) + +declare void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8) + +declare %"github.com/goplus/llgo/internal/runtime.eface" @"github.com/goplus/llgo/cl/internal/foo.Bar"() + +declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com/goplus/llgo/internal/runtime.String") + +declare %"github.com/goplus/llgo/internal/runtime.eface" @"github.com/goplus/llgo/cl/internal/foo.F"() diff --git a/cl/_testgo/struczero/out.ll b/cl/_testgo/struczero/out.ll index 2de205dae..f0cd306ba 100644 --- a/cl/_testgo/struczero/out.ll +++ b/cl/_testgo/struczero/out.ll @@ -5,35 +5,37 @@ source_filename = "main" %"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.Method" = type { %"github.com/goplus/llgo/internal/runtime.String", ptr, ptr, ptr } -%"github.com/goplus/llgo/internal/runtime.Slice" = type { ptr, i64, 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 } +%"github.com/goplus/llgo/internal/abi.Method" = type { %"github.com/goplus/llgo/internal/runtime.String", ptr, ptr, ptr } @"main.init$guard" = global ptr null @"_llgo_github.com/goplus/llgo/cl/internal/foo.Foo" = linkonce global ptr null -@_llgo_main.bar = global ptr null -@__llgo_argc = global ptr null -@__llgo_argv = global ptr null -@0 = private unnamed_addr constant [7 x i8] c"notOk:\00", align 1 @"main.struct$qQwZyFy_4JRalRxVVsVD8R09X5t58tWjTrtJPtHbEjs" = global ptr null -@1 = private unnamed_addr constant [3 x i8] c"Pb\00", align 1 -@"_llgo_func$9WyRPk13jhLNuX5vkY3DFEfqvowhmGCLb2eJ8uGOVkM" = linkonce global ptr null -@2 = private unnamed_addr constant [39 x i8] c"github.com/goplus/llgo/cl/internal/foo\00", align 1 -@3 = private unnamed_addr constant [43 x i8] c"github.com/goplus/llgo/cl/internal/foo.Foo\00", align 1 -@"main.struct$Ci43nzKYkRLddRL_N4mkykxLXfJlqJGS5n04LKThPNo" = global ptr null -@4 = private unnamed_addr constant [5 x i8] c"main\00", align 1 -@5 = private unnamed_addr constant [9 x i8] c"main.bar\00", align 1 -@6 = private unnamed_addr constant [3 x i8] c"pb\00", align 1 @"*_llgo_byte" = linkonce global ptr null -@7 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 -@8 = private unnamed_addr constant [2 x i8] c"F\00", align 1 +@_llgo_byte = linkonce global ptr null +@_llgo_float32 = linkonce global ptr null +@0 = private unnamed_addr constant [3 x i8] c"pb\00", align 1 +@1 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 +@2 = private unnamed_addr constant [2 x i8] c"F\00", align 1 +@3 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 +@4 = private unnamed_addr constant [5 x i8] c"main\00", align 1 +@5 = private unnamed_addr constant [3 x i8] c"Pb\00", align 1 +@"_llgo_func$NfGSLZ1QiKRoFkKeqYSXE5hUU5bpeteSJKrbMNUzYRE" = linkonce global ptr null +@6 = private unnamed_addr constant [39 x i8] c"github.com/goplus/llgo/cl/internal/foo\00", align 1 +@7 = private unnamed_addr constant [43 x i8] c"github.com/goplus/llgo/cl/internal/foo.Foo\00", align 1 +@_llgo_main.bar = global ptr null +@"main.struct$Ci43nzKYkRLddRL_N4mkykxLXfJlqJGS5n04LKThPNo" = global ptr null +@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 [5 x i8] c"main\00", align 1 -@11 = private unnamed_addr constant [3 x i8] c"pb\00", align 1 -@12 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 -@13 = private unnamed_addr constant [2 x i8] c"f\00", align 1 -@14 = private unnamed_addr constant [1 x i8] zeroinitializer, align 1 -@15 = private unnamed_addr constant [5 x i8] c"main\00", 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 +@__llgo_argc = global ptr null +@__llgo_argv = global ptr null +@15 = private unnamed_addr constant [7 x i8] c"notOk:\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: @@ -141,7 +143,7 @@ _llgo_0: %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 + store ptr @15, 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 @@ -183,269 +185,298 @@ _llgo_0: ret i32 0 } -declare void @"github.com/goplus/llgo/cl/internal/foo.init"() - -declare void @"github.com/goplus/llgo/internal/runtime.init"() - -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: - call void @"main.init$abi2"() %0 = load ptr, ptr @"_llgo_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 = load ptr, ptr @"main.struct$qQwZyFy_4JRalRxVVsVD8R09X5t58tWjTrtJPtHbEjs", align 8 - %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 @1, ptr %4, align 8 - %5 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %3, i32 0, i32 1 - store i64 2, ptr %5, align 4 - %6 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %3, align 8 - %7 = load ptr, ptr @"_llgo_func$9WyRPk13jhLNuX5vkY3DFEfqvowhmGCLb2eJ8uGOVkM", align 8 - %8 = alloca %"github.com/goplus/llgo/internal/abi.Method", align 8 - %9 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %8, i32 0, i32 0 - store %"github.com/goplus/llgo/internal/runtime.String" %6, ptr %9, align 8 - %10 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %8, i32 0, i32 1 - store ptr %7, ptr %10, align 8 - %11 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %8, i32 0, i32 2 - store ptr @"(github.com/goplus/llgo/cl/internal/foo.Foo).Pb", ptr %11, align 8 - %12 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %8, i32 0, i32 3 - store ptr @"(github.com/goplus/llgo/cl/internal/foo.Foo).Pb", ptr %12, align 8 - %13 = load %"github.com/goplus/llgo/internal/abi.Method", ptr %8, align 8 - %14 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 40) - %15 = getelementptr %"github.com/goplus/llgo/internal/abi.Method", ptr %14, i64 0 - store %"github.com/goplus/llgo/internal/abi.Method" %13, 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 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %16, align 8 - %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 @2, ptr %22, align 8 - %23 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %21, i32 0, i32 1 - store i64 38, ptr %23, align 4 - %24 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %21, 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 @3, ptr %26, align 8 - %27 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %25, i32 0, i32 1 - store i64 42, 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.Named"(%"github.com/goplus/llgo/internal/runtime.String" %24, %"github.com/goplus/llgo/internal/runtime.String" %28, ptr %2, %"github.com/goplus/llgo/internal/runtime.Slice" %20) - store ptr %29, ptr @"_llgo_github.com/goplus/llgo/cl/internal/foo.Foo", align 8 + %2 = call ptr @"github.com/goplus/llgo/internal/runtime.NewNamed"(i64 25, i64 1, i64 1) + store ptr %2, ptr @"_llgo_github.com/goplus/llgo/cl/internal/foo.Foo", align 8 br label %_llgo_2 _llgo_2: ; preds = %_llgo_1, %_llgo_0 - %30 = load ptr, ptr @"main.struct$Ci43nzKYkRLddRL_N4mkykxLXfJlqJGS5n04LKThPNo", align 8 - %31 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 0) - %32 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 - %33 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %32, i32 0, i32 0 - store ptr %31, ptr %33, align 8 - %34 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %32, i32 0, i32 1 - store i64 0, ptr %34, align 4 - %35 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %32, i32 0, i32 2 - store i64 0, ptr %35, align 4 - %36 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %32, align 8 - %37 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %38 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %37, i32 0, i32 0 - store ptr @4, ptr %38, align 8 - %39 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %37, i32 0, i32 1 - store i64 4, ptr %39, align 4 - %40 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %37, align 8 - %41 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %42 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %41, i32 0, i32 0 - store ptr @5, ptr %42, align 8 - %43 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %41, i32 0, i32 1 - store i64 8, ptr %43, align 4 - %44 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %41, align 8 - %45 = call ptr @"github.com/goplus/llgo/internal/runtime.Named"(%"github.com/goplus/llgo/internal/runtime.String" %40, %"github.com/goplus/llgo/internal/runtime.String" %44, ptr %30, %"github.com/goplus/llgo/internal/runtime.Slice" %36) - store ptr %45, ptr @_llgo_main.bar, align 8 - ret void -} - -declare ptr @"github.com/goplus/llgo/internal/runtime.Named"(%"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.String", ptr, %"github.com/goplus/llgo/internal/runtime.Slice") - -define void @"main.init$abi2"() { -_llgo_0: - call void @"main.init$abi3"() - %0 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %1 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %0, i32 0, i32 0 - store ptr @6, ptr %1, align 8 - %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 @7, ptr %6, align 8 - %7 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %5, i32 0, i32 1 - store i64 0, ptr %7, align 4 - %8 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %5, align 8 - %9 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %3, ptr %4, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %8, i1 false) - %10 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %11 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %10, i32 0, i32 0 - store ptr @8, ptr %11, align 8 - %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) + %3 = load ptr, ptr @_llgo_byte, align 8 + %4 = icmp eq ptr %3, null + br i1 %4, label %_llgo_3, label %_llgo_4 + +_llgo_3: ; preds = %_llgo_2 + %5 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 8) + store ptr %5, ptr @_llgo_byte, align 8 + br label %_llgo_4 + +_llgo_4: ; preds = %_llgo_3, %_llgo_2 + %6 = load ptr, ptr @_llgo_byte, align 8 + %7 = load ptr, ptr @"*_llgo_byte", align 8 + %8 = icmp eq ptr %7, null + br i1 %8, label %_llgo_5, label %_llgo_6 + +_llgo_5: ; preds = %_llgo_4 + %9 = call ptr @"github.com/goplus/llgo/internal/runtime.PointerTo"(ptr %6) + store ptr %9, ptr @"*_llgo_byte", align 8 + br label %_llgo_6 + +_llgo_6: ; preds = %_llgo_5, %_llgo_4 + %10 = load ptr, ptr @"*_llgo_byte", align 8 + %11 = load ptr, ptr @_llgo_float32, align 8 + %12 = icmp eq ptr %11, null + br i1 %12, label %_llgo_7, label %_llgo_8 + +_llgo_7: ; preds = %_llgo_6 + %13 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 13) + store ptr %13, ptr @_llgo_float32, align 8 + br label %_llgo_8 + +_llgo_8: ; preds = %_llgo_7, %_llgo_6 + %14 = load ptr, ptr @_llgo_float32, align 8 %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 @9, ptr %16, align 8 + store ptr @0, 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 + store i64 2, 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 @10, 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) - store ptr %32, ptr @"main.struct$qQwZyFy_4JRalRxVVsVD8R09X5t58tWjTrtJPtHbEjs", align 8 - %33 = load ptr, ptr @"_llgo_func$9WyRPk13jhLNuX5vkY3DFEfqvowhmGCLb2eJ8uGOVkM", align 8 - %34 = icmp eq ptr %33, null - br i1 %34, label %_llgo_1, label %_llgo_2 - -_llgo_1: ; preds = %_llgo_0 - %35 = load ptr, ptr @"_llgo_github.com/goplus/llgo/cl/internal/foo.Foo", align 8 - %36 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 8) - %37 = getelementptr ptr, ptr %36, i64 0 - store ptr %35, ptr %37, align 8 - %38 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 - %39 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %38, i32 0, i32 0 - store ptr %36, ptr %39, align 8 - %40 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %38, i32 0, i32 1 - store i64 1, ptr %40, align 4 - %41 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %38, i32 0, i32 2 - store i64 1, ptr %41, align 4 - %42 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %38, align 8 - %43 = load ptr, ptr @"*_llgo_byte", align 8 - %44 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 8) - %45 = getelementptr ptr, ptr %44, i64 0 - store ptr %43, ptr %45, align 8 - %46 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 - %47 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %46, i32 0, i32 0 - store ptr %44, ptr %47, align 8 - %48 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %46, i32 0, i32 1 - store i64 1, ptr %48, align 4 - %49 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %46, i32 0, i32 2 - store i64 1, ptr %49, align 4 - %50 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %46, align 8 - %51 = call ptr @"github.com/goplus/llgo/internal/runtime.Func"(%"github.com/goplus/llgo/internal/runtime.Slice" %42, %"github.com/goplus/llgo/internal/runtime.Slice" %50, i1 false) - store ptr %51, ptr @"_llgo_func$9WyRPk13jhLNuX5vkY3DFEfqvowhmGCLb2eJ8uGOVkM", align 8 - br label %_llgo_2 - -_llgo_2: ; preds = %_llgo_1, %_llgo_0 - %52 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %53 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %52, i32 0, i32 0 - store ptr @11, ptr %53, align 8 - %54 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %52, i32 0, i32 1 - store i64 2, ptr %54, align 4 - %55 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %52, align 8 - %56 = load ptr, ptr @"*_llgo_byte", align 8 + %19 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %20 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %19, i32 0, i32 0 + store ptr @1, ptr %20, align 8 + %21 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %19, i32 0, i32 1 + store i64 0, ptr %21, align 4 + %22 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %19, align 8 + %23 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %18, ptr %10, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %22, i1 false) + %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 @2, 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 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %29 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %28, i32 0, i32 0 + store ptr @3, ptr %29, align 8 + %30 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %28, i32 0, i32 1 + store i64 0, ptr %30, align 4 + %31 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %28, align 8 + %32 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %27, ptr %14, i64 8, %"github.com/goplus/llgo/internal/runtime.String" %31, i1 false) + %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 @4, ptr %34, align 8 + %35 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %33, i32 0, i32 1 + store i64 4, 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.AllocU"(i64 112) + %38 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %37, i64 0 + store %"github.com/goplus/llgo/internal/abi.StructField" %23, ptr %38, align 8 + %39 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %37, i64 1 + store %"github.com/goplus/llgo/internal/abi.StructField" %32, 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 %37, ptr %41, align 8 + %42 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %40, i32 0, i32 1 + store i64 2, ptr %42, align 4 + %43 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %40, i32 0, i32 2 + store i64 2, 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" %36, i64 16, %"github.com/goplus/llgo/internal/runtime.Slice" %44) + store ptr %45, ptr @"main.struct$qQwZyFy_4JRalRxVVsVD8R09X5t58tWjTrtJPtHbEjs", align 8 + %46 = load ptr, ptr @"main.struct$qQwZyFy_4JRalRxVVsVD8R09X5t58tWjTrtJPtHbEjs", align 8 + br i1 %1, label %_llgo_9, label %_llgo_10 + +_llgo_9: ; preds = %_llgo_8 + %47 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %48 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %47, i32 0, i32 0 + store ptr @5, ptr %48, align 8 + %49 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %47, i32 0, i32 1 + store i64 2, ptr %49, align 4 + %50 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %47, align 8 + %51 = load ptr, ptr @"*_llgo_byte", align 8 + %52 = load ptr, ptr @"_llgo_func$NfGSLZ1QiKRoFkKeqYSXE5hUU5bpeteSJKrbMNUzYRE", align 8 + %53 = icmp eq ptr %52, null + br i1 %53, label %_llgo_11, label %_llgo_12 + +_llgo_10: ; preds = %_llgo_12, %_llgo_8 + %54 = call ptr @"github.com/goplus/llgo/internal/runtime.NewNamed"(i64 25, i64 0, i64 0) + store ptr %54, ptr @_llgo_main.bar, align 8 + %55 = load ptr, ptr @"*_llgo_byte", align 8 + %56 = load ptr, ptr @_llgo_float32, align 8 %57 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 %58 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %57, i32 0, i32 0 - store ptr @12, ptr %58, align 8 + store ptr @8, ptr %58, align 8 %59 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %57, i32 0, i32 1 - store i64 0, ptr %59, align 4 + store i64 2, ptr %59, align 4 %60 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %57, align 8 - %61 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %55, ptr %56, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %60, i1 false) - %62 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %63 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %62, i32 0, i32 0 - store ptr @13, ptr %63, align 8 - %64 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %62, i32 0, i32 1 - store i64 1, ptr %64, align 4 - %65 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %62, align 8 - %66 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 13) - %67 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %68 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %67, i32 0, i32 0 - store ptr @14, ptr %68, align 8 - %69 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %67, i32 0, i32 1 - store i64 0, ptr %69, align 4 - %70 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %67, align 8 - %71 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %65, ptr %66, i64 8, %"github.com/goplus/llgo/internal/runtime.String" %70, i1 false) - %72 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 - %73 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %72, i32 0, i32 0 - store ptr @15, ptr %73, align 8 - %74 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %72, i32 0, i32 1 - store i64 4, ptr %74, align 4 - %75 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %72, align 8 - %76 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 112) - %77 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %76, i64 0 - store %"github.com/goplus/llgo/internal/abi.StructField" %61, ptr %77, align 8 - %78 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %76, i64 1 - store %"github.com/goplus/llgo/internal/abi.StructField" %71, ptr %78, align 8 - %79 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 - %80 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %79, i32 0, i32 0 - store ptr %76, ptr %80, align 8 - %81 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %79, i32 0, i32 1 - store i64 2, ptr %81, align 4 - %82 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %79, i32 0, i32 2 - store i64 2, ptr %82, align 4 - %83 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %79, align 8 - %84 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %75, i64 16, %"github.com/goplus/llgo/internal/runtime.Slice" %83) - store ptr %84, ptr @"main.struct$Ci43nzKYkRLddRL_N4mkykxLXfJlqJGS5n04LKThPNo", align 8 + %61 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %62 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %61, i32 0, i32 0 + store ptr @9, ptr %62, align 8 + %63 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %61, i32 0, i32 1 + store i64 0, ptr %63, align 4 + %64 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %61, align 8 + %65 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %60, ptr %55, i64 0, %"github.com/goplus/llgo/internal/runtime.String" %64, i1 false) + %66 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %67 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %66, i32 0, i32 0 + store ptr @10, ptr %67, align 8 + %68 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %66, i32 0, i32 1 + store i64 1, ptr %68, align 4 + %69 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %66, align 8 + %70 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %71 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %70, i32 0, i32 0 + store ptr @11, ptr %71, align 8 + %72 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %70, i32 0, i32 1 + store i64 0, ptr %72, align 4 + %73 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %70, align 8 + %74 = call %"github.com/goplus/llgo/internal/abi.StructField" @"github.com/goplus/llgo/internal/runtime.StructField"(%"github.com/goplus/llgo/internal/runtime.String" %69, ptr %56, i64 8, %"github.com/goplus/llgo/internal/runtime.String" %73, i1 false) + %75 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %76 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %75, i32 0, i32 0 + store ptr @12, ptr %76, align 8 + %77 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %75, i32 0, i32 1 + store i64 4, ptr %77, align 4 + %78 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %75, align 8 + %79 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 112) + %80 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %79, i64 0 + store %"github.com/goplus/llgo/internal/abi.StructField" %65, ptr %80, align 8 + %81 = getelementptr %"github.com/goplus/llgo/internal/abi.StructField", ptr %79, i64 1 + store %"github.com/goplus/llgo/internal/abi.StructField" %74, ptr %81, align 8 + %82 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %83 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %82, i32 0, i32 0 + store ptr %79, ptr %83, align 8 + %84 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %82, i32 0, i32 1 + store i64 2, ptr %84, align 4 + %85 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %82, i32 0, i32 2 + store i64 2, ptr %85, align 4 + %86 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %82, align 8 + %87 = call ptr @"github.com/goplus/llgo/internal/runtime.Struct"(%"github.com/goplus/llgo/internal/runtime.String" %78, i64 16, %"github.com/goplus/llgo/internal/runtime.Slice" %86) + store ptr %87, ptr @"main.struct$Ci43nzKYkRLddRL_N4mkykxLXfJlqJGS5n04LKThPNo", align 8 + %88 = load ptr, ptr @"main.struct$Ci43nzKYkRLddRL_N4mkykxLXfJlqJGS5n04LKThPNo", align 8 + %89 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %90 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %89, i32 0, i32 0 + store ptr @13, ptr %90, align 8 + %91 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %89, i32 0, i32 1 + store i64 4, ptr %91, align 4 + %92 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %89, align 8 + %93 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %94 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %93, i32 0, i32 0 + store ptr @14, ptr %94, align 8 + %95 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %93, i32 0, i32 1 + store i64 8, ptr %95, align 4 + %96 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %93, align 8 + call void @"github.com/goplus/llgo/internal/runtime.InitNamed"(ptr %54, %"github.com/goplus/llgo/internal/runtime.String" %92, %"github.com/goplus/llgo/internal/runtime.String" %96, ptr %88, { ptr, i64, i64 } zeroinitializer, { ptr, i64, i64 } zeroinitializer) ret void + +_llgo_11: ; preds = %_llgo_9 + %97 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 0) + %98 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %99 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %98, i32 0, i32 0 + store ptr %97, ptr %99, align 8 + %100 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %98, i32 0, i32 1 + store i64 0, ptr %100, align 4 + %101 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %98, i32 0, i32 2 + store i64 0, ptr %101, align 4 + %102 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %98, align 8 + %103 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 8) + %104 = getelementptr ptr, ptr %103, i64 0 + store ptr %51, ptr %104, align 8 + %105 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %106 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %105, i32 0, i32 0 + store ptr %103, ptr %106, align 8 + %107 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %105, i32 0, i32 1 + store i64 1, ptr %107, align 4 + %108 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %105, i32 0, i32 2 + store i64 1, ptr %108, align 4 + %109 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %105, align 8 + %110 = call ptr @"github.com/goplus/llgo/internal/runtime.Func"(%"github.com/goplus/llgo/internal/runtime.Slice" %102, %"github.com/goplus/llgo/internal/runtime.Slice" %109, i1 false) + store ptr %110, ptr @"_llgo_func$NfGSLZ1QiKRoFkKeqYSXE5hUU5bpeteSJKrbMNUzYRE", align 8 + br label %_llgo_12 + +_llgo_12: ; preds = %_llgo_11, %_llgo_9 + %111 = load ptr, ptr @"_llgo_func$NfGSLZ1QiKRoFkKeqYSXE5hUU5bpeteSJKrbMNUzYRE", align 8 + %112 = alloca %"github.com/goplus/llgo/internal/abi.Method", align 8 + %113 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %112, i32 0, i32 0 + store %"github.com/goplus/llgo/internal/runtime.String" %50, ptr %113, align 8 + %114 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %112, i32 0, i32 1 + store ptr %111, ptr %114, align 8 + %115 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %112, i32 0, i32 2 + store ptr @"(*github.com/goplus/llgo/cl/internal/foo.Foo).Pb", ptr %115, align 8 + %116 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %112, i32 0, i32 3 + store ptr @"(*github.com/goplus/llgo/cl/internal/foo.Foo).Pb", ptr %116, align 8 + %117 = load %"github.com/goplus/llgo/internal/abi.Method", ptr %112, align 8 + %118 = alloca %"github.com/goplus/llgo/internal/abi.Method", align 8 + %119 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %118, i32 0, i32 0 + store %"github.com/goplus/llgo/internal/runtime.String" %50, ptr %119, align 8 + %120 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %118, i32 0, i32 1 + store ptr %111, ptr %120, align 8 + %121 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %118, i32 0, i32 2 + store ptr @"(*github.com/goplus/llgo/cl/internal/foo.Foo).Pb", ptr %121, align 8 + %122 = getelementptr inbounds %"github.com/goplus/llgo/internal/abi.Method", ptr %118, i32 0, i32 3 + store ptr @"(github.com/goplus/llgo/cl/internal/foo.Foo).Pb", ptr %122, align 8 + %123 = load %"github.com/goplus/llgo/internal/abi.Method", ptr %118, align 8 + %124 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 40) + %125 = getelementptr %"github.com/goplus/llgo/internal/abi.Method", ptr %124, i64 0 + store %"github.com/goplus/llgo/internal/abi.Method" %123, ptr %125, align 8 + %126 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %127 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %126, i32 0, i32 0 + store ptr %124, ptr %127, align 8 + %128 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %126, i32 0, i32 1 + store i64 1, ptr %128, align 4 + %129 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %126, i32 0, i32 2 + store i64 1, ptr %129, align 4 + %130 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %126, align 8 + %131 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 40) + %132 = getelementptr %"github.com/goplus/llgo/internal/abi.Method", ptr %131, i64 0 + store %"github.com/goplus/llgo/internal/abi.Method" %117, ptr %132, align 8 + %133 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %134 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %133, i32 0, i32 0 + store ptr %131, ptr %134, align 8 + %135 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %133, i32 0, i32 1 + store i64 1, ptr %135, align 4 + %136 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %133, i32 0, i32 2 + store i64 1, ptr %136, align 4 + %137 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %133, align 8 + %138 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %139 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %138, i32 0, i32 0 + store ptr @6, ptr %139, align 8 + %140 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %138, i32 0, i32 1 + store i64 38, ptr %140, align 4 + %141 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %138, align 8 + %142 = alloca %"github.com/goplus/llgo/internal/runtime.String", align 8 + %143 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %142, i32 0, i32 0 + store ptr @7, ptr %143, align 8 + %144 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %142, i32 0, i32 1 + store i64 42, ptr %144, align 4 + %145 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %142, align 8 + call void @"github.com/goplus/llgo/internal/runtime.InitNamed"(ptr %2, %"github.com/goplus/llgo/internal/runtime.String" %141, %"github.com/goplus/llgo/internal/runtime.String" %145, ptr %46, %"github.com/goplus/llgo/internal/runtime.Slice" %130, %"github.com/goplus/llgo/internal/runtime.Slice" %137) + br label %_llgo_10 } +declare ptr @"github.com/goplus/llgo/internal/runtime.NewNamed"(i64, i64, i64) + +declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64) + +declare ptr @"github.com/goplus/llgo/internal/runtime.PointerTo"(ptr) + 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) -declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64) +declare ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64) + +declare void @"github.com/goplus/llgo/internal/runtime.InitNamed"(ptr, %"github.com/goplus/llgo/internal/runtime.String", %"github.com/goplus/llgo/internal/runtime.String", ptr, %"github.com/goplus/llgo/internal/runtime.Slice", %"github.com/goplus/llgo/internal/runtime.Slice") declare ptr @"github.com/goplus/llgo/internal/runtime.Func"(%"github.com/goplus/llgo/internal/runtime.Slice", %"github.com/goplus/llgo/internal/runtime.Slice", i1) -define void @"main.init$abi3"() { -_llgo_0: - %0 = load ptr, ptr @"*_llgo_byte", align 8 - %1 = icmp eq ptr %0, null - br i1 %1, label %_llgo_1, label %_llgo_2 +declare ptr @"(*github.com/goplus/llgo/cl/internal/foo.Foo).Pb"(ptr) -_llgo_1: ; preds = %_llgo_0 - %2 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 8) - %3 = call ptr @"github.com/goplus/llgo/internal/runtime.PointerTo"(ptr %2) - store ptr %3, ptr @"*_llgo_byte", align 8 - br label %_llgo_2 +declare ptr @"(github.com/goplus/llgo/cl/internal/foo.Foo).Pb"(%"github.com/goplus/llgo/cl/internal/foo.Foo") -_llgo_2: ; preds = %_llgo_1, %_llgo_0 - ret void -} +declare void @"github.com/goplus/llgo/cl/internal/foo.init"() -declare ptr @"github.com/goplus/llgo/internal/runtime.PointerTo"(ptr) +declare void @"github.com/goplus/llgo/internal/runtime.init"() + +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) diff --git a/cl/_testrt/any/out.ll b/cl/_testrt/any/out.ll index 50a3b9db4..d2f59f3fb 100644 --- a/cl/_testrt/any/out.ll +++ b/cl/_testrt/any/out.ll @@ -6,7 +6,9 @@ source_filename = "main" @"main.init$guard" = global ptr null @"*_llgo_int8" = linkonce global ptr null +@_llgo_int8 = linkonce global ptr null @0 = private unnamed_addr constant [22 x i8] c"type assertion failed\00", align 1 +@_llgo_int = linkonce global ptr null @1 = private unnamed_addr constant [22 x i8] c"type assertion failed\00", align 1 @__llgo_argc = global ptr null @__llgo_argv = global ptr null @@ -38,7 +40,7 @@ _llgo_2: ; preds = %_llgo_0 define i64 @main.incVal(%"github.com/goplus/llgo/internal/runtime.eface" %0) { _llgo_0: %1 = extractvalue %"github.com/goplus/llgo/internal/runtime.eface" %0, 0 - %2 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) + %2 = load ptr, ptr @_llgo_int, align 8 %3 = icmp eq ptr %1, %2 br i1 %3, label %_llgo_1, label %_llgo_2 @@ -87,7 +89,7 @@ _llgo_0: store ptr @3, ptr %5, align 8 %6 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %3, align 8 %7 = call ptr @main.hi(%"github.com/goplus/llgo/internal/runtime.eface" %6) - %8 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) + %8 = load ptr, ptr @_llgo_int, align 8 %9 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %10 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %9, i32 0, i32 0 store ptr %8, ptr %10, align 8 @@ -99,28 +101,48 @@ _llgo_0: ret i32 0 } -declare void @"github.com/goplus/llgo/internal/runtime.TracePanic"(%"github.com/goplus/llgo/internal/runtime.eface") - -declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64) - -declare void @"github.com/goplus/llgo/internal/runtime.init"() - -declare i32 @printf(ptr, ...) - define void @"main.init$abi"() { _llgo_0: - %0 = load ptr, ptr @"*_llgo_int8", align 8 + %0 = load ptr, ptr @_llgo_int8, align 8 %1 = icmp eq ptr %0, null br i1 %1, label %_llgo_1, label %_llgo_2 _llgo_1: ; preds = %_llgo_0 %2 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 3) - %3 = call ptr @"github.com/goplus/llgo/internal/runtime.PointerTo"(ptr %2) - store ptr %3, ptr @"*_llgo_int8", align 8 + store ptr %2, ptr @_llgo_int8, align 8 br label %_llgo_2 _llgo_2: ; preds = %_llgo_1, %_llgo_0 + %3 = load ptr, ptr @_llgo_int8, align 8 + %4 = load ptr, ptr @"*_llgo_int8", align 8 + %5 = icmp eq ptr %4, null + br i1 %5, label %_llgo_3, label %_llgo_4 + +_llgo_3: ; preds = %_llgo_2 + %6 = call ptr @"github.com/goplus/llgo/internal/runtime.PointerTo"(ptr %3) + store ptr %6, ptr @"*_llgo_int8", align 8 + br label %_llgo_4 + +_llgo_4: ; preds = %_llgo_3, %_llgo_2 + %7 = load ptr, ptr @_llgo_int, align 8 + %8 = icmp eq ptr %7, null + br i1 %8, label %_llgo_5, label %_llgo_6 + +_llgo_5: ; preds = %_llgo_4 + %9 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) + store ptr %9, ptr @_llgo_int, align 8 + br label %_llgo_6 + +_llgo_6: ; preds = %_llgo_5, %_llgo_4 ret void } +declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64) + declare ptr @"github.com/goplus/llgo/internal/runtime.PointerTo"(ptr) + +declare void @"github.com/goplus/llgo/internal/runtime.TracePanic"(%"github.com/goplus/llgo/internal/runtime.eface") + +declare void @"github.com/goplus/llgo/internal/runtime.init"() + +declare i32 @printf(ptr, ...) diff --git a/cl/_testrt/builtin/out.ll b/cl/_testrt/builtin/out.ll index c0a05db6e..8045b41c2 100644 --- a/cl/_testrt/builtin/out.ll +++ b/cl/_testrt/builtin/out.ll @@ -16,6 +16,7 @@ source_filename = "main" @2 = private unnamed_addr constant [6 x i8] c"hello\00", align 1 @3 = private unnamed_addr constant [6 x i8] c"hello\00", align 1 @4 = private unnamed_addr constant [4 x i8] c"def\00", align 1 +@_llgo_int = linkonce global ptr null @5 = private unnamed_addr constant [5 x i8] c"ABCD\00", align 1 @6 = private unnamed_addr constant [8 x i8] c"\E4\B8\ADabcd\00", align 1 @7 = private unnamed_addr constant [8 x i8] c"\E4\B8\ADabcd\00", align 1 @@ -85,6 +86,7 @@ _llgo_0: _llgo_1: ; preds = %_llgo_0 store i1 true, ptr @"main.init$guard", align 1 + call void @"main.init$abi"() store i64 9223372036854775807, ptr @main.a, align 4 store i64 -9223372036854775808, ptr @main.b, align 4 store i64 -1, ptr @main.n, align 4 @@ -323,7 +325,7 @@ _llgo_0: call void @"github.com/goplus/llgo/internal/runtime.PrintSlice"(%"github.com/goplus/llgo/internal/runtime.Slice" %122) call void @"github.com/goplus/llgo/internal/runtime.PrintByte"(i8 10) %123 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 16) - %124 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) + %124 = load ptr, ptr @_llgo_int, align 8 %125 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 %126 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %125, i32 0, i32 0 store ptr %124, ptr %126, align 8 @@ -641,6 +643,21 @@ declare void @"github.com/goplus/llgo/internal/runtime.PrintString"(%"github.com declare %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.SliceAppend"(%"github.com/goplus/llgo/internal/runtime.Slice", ptr, i64, i64) +define void @"main.init$abi"() { +_llgo_0: + %0 = load ptr, ptr @_llgo_int, align 8 + %1 = icmp eq ptr %0, null + br i1 %1, label %_llgo_1, label %_llgo_2 + +_llgo_1: ; preds = %_llgo_0 + %2 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 2) + store ptr %2, ptr @_llgo_int, align 8 + br label %_llgo_2 + +_llgo_2: ; preds = %_llgo_1, %_llgo_0 + ret void +} + declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64) declare void @"github.com/goplus/llgo/internal/runtime.PrintBool"(i1) diff --git a/cl/_testrt/cast/out.ll b/cl/_testrt/cast/out.ll index 1f82dabd5..1f6b0f303 100644 --- a/cl/_testrt/cast/out.ll +++ b/cl/_testrt/cast/out.ll @@ -6,6 +6,7 @@ source_filename = "main" @"main.init$guard" = global ptr null @0 = private unnamed_addr constant [6 x i8] c"error\00", align 1 +@_llgo_string = linkonce global ptr null @1 = private unnamed_addr constant [6 x i8] c"error\00", align 1 @2 = private unnamed_addr constant [6 x i8] c"error\00", align 1 @3 = private unnamed_addr constant [6 x i8] c"error\00", align 1 @@ -34,7 +35,7 @@ _llgo_1: ; preds = %_llgo_0 %6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %4, i32 0, i32 1 store i64 5, ptr %6, align 4 %7 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %4, align 8 - %8 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) + %8 = load ptr, ptr @_llgo_string, align 8 %9 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) store %"github.com/goplus/llgo/internal/runtime.String" %7, ptr %9, align 8 %10 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 @@ -63,7 +64,7 @@ _llgo_1: ; preds = %_llgo_0 %6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %4, i32 0, i32 1 store i64 5, ptr %6, align 4 %7 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %4, align 8 - %8 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) + %8 = load ptr, ptr @_llgo_string, align 8 %9 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) store %"github.com/goplus/llgo/internal/runtime.String" %7, ptr %9, align 8 %10 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 @@ -92,7 +93,7 @@ _llgo_1: ; preds = %_llgo_0 %6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %4, i32 0, i32 1 store i64 5, ptr %6, align 4 %7 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %4, align 8 - %8 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) + %8 = load ptr, ptr @_llgo_string, align 8 %9 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) store %"github.com/goplus/llgo/internal/runtime.String" %7, ptr %9, align 8 %10 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 @@ -121,7 +122,7 @@ _llgo_1: ; preds = %_llgo_0 %6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %4, i32 0, i32 1 store i64 5, ptr %6, align 4 %7 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %4, align 8 - %8 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) + %8 = load ptr, ptr @_llgo_string, align 8 %9 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) store %"github.com/goplus/llgo/internal/runtime.String" %7, ptr %9, align 8 %10 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 @@ -150,7 +151,7 @@ _llgo_1: ; preds = %_llgo_0 %6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %4, i32 0, i32 1 store i64 5, ptr %6, align 4 %7 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %4, align 8 - %8 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) + %8 = load ptr, ptr @_llgo_string, align 8 %9 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) store %"github.com/goplus/llgo/internal/runtime.String" %7, ptr %9, align 8 %10 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 @@ -179,7 +180,7 @@ _llgo_1: ; preds = %_llgo_0 %6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %4, i32 0, i32 1 store i64 5, ptr %6, align 4 %7 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %4, align 8 - %8 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) + %8 = load ptr, ptr @_llgo_string, align 8 %9 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) store %"github.com/goplus/llgo/internal/runtime.String" %7, ptr %9, align 8 %10 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 @@ -208,7 +209,7 @@ _llgo_1: ; preds = %_llgo_0 %6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %4, i32 0, i32 1 store i64 5, ptr %6, align 4 %7 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %4, align 8 - %8 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) + %8 = load ptr, ptr @_llgo_string, align 8 %9 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) store %"github.com/goplus/llgo/internal/runtime.String" %7, ptr %9, align 8 %10 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 @@ -237,7 +238,7 @@ _llgo_1: ; preds = %_llgo_0 %6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %4, i32 0, i32 1 store i64 5, ptr %6, align 4 %7 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %4, align 8 - %8 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) + %8 = load ptr, ptr @_llgo_string, align 8 %9 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) store %"github.com/goplus/llgo/internal/runtime.String" %7, ptr %9, align 8 %10 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 @@ -266,7 +267,7 @@ _llgo_1: ; preds = %_llgo_0 %6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %4, i32 0, i32 1 store i64 5, ptr %6, align 4 %7 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %4, align 8 - %8 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) + %8 = load ptr, ptr @_llgo_string, align 8 %9 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) store %"github.com/goplus/llgo/internal/runtime.String" %7, ptr %9, align 8 %10 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 @@ -295,7 +296,7 @@ _llgo_1: ; preds = %_llgo_0 %6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %4, i32 0, i32 1 store i64 5, ptr %6, align 4 %7 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %4, align 8 - %8 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) + %8 = load ptr, ptr @_llgo_string, align 8 %9 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) store %"github.com/goplus/llgo/internal/runtime.String" %7, ptr %9, align 8 %10 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 @@ -324,7 +325,7 @@ _llgo_1: ; preds = %_llgo_0 %6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %4, i32 0, i32 1 store i64 5, ptr %6, align 4 %7 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %4, align 8 - %8 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) + %8 = load ptr, ptr @_llgo_string, align 8 %9 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) store %"github.com/goplus/llgo/internal/runtime.String" %7, ptr %9, align 8 %10 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 @@ -353,7 +354,7 @@ _llgo_1: ; preds = %_llgo_0 %6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %4, i32 0, i32 1 store i64 5, ptr %6, align 4 %7 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %4, align 8 - %8 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) + %8 = load ptr, ptr @_llgo_string, align 8 %9 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) store %"github.com/goplus/llgo/internal/runtime.String" %7, ptr %9, align 8 %10 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 @@ -377,7 +378,7 @@ _llgo_3: ; preds = %_llgo_2 %18 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %16, i32 0, i32 1 store i64 5, ptr %18, align 4 %19 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %16, align 8 - %20 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) + %20 = load ptr, ptr @_llgo_string, align 8 %21 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) store %"github.com/goplus/llgo/internal/runtime.String" %19, ptr %21, align 8 %22 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 @@ -400,6 +401,7 @@ _llgo_0: _llgo_1: ; preds = %_llgo_0 store i1 true, ptr @"main.init$guard", align 1 + call void @"main.init$abi"() br label %_llgo_2 _llgo_2: ; preds = %_llgo_1, %_llgo_0 @@ -470,6 +472,21 @@ _llgo_0: ret i32 0 } +define void @"main.init$abi"() { +_llgo_0: + %0 = load ptr, ptr @_llgo_string, align 8 + %1 = icmp eq ptr %0, null + br i1 %1, label %_llgo_1, label %_llgo_2 + +_llgo_1: ; preds = %_llgo_0 + %2 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) + store ptr %2, ptr @_llgo_string, align 8 + br label %_llgo_2 + +_llgo_2: ; preds = %_llgo_1, %_llgo_0 + ret void +} + declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64) declare ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64) diff --git a/cl/_testrt/panic/out.ll b/cl/_testrt/panic/out.ll index 362b3bb2b..4bac30165 100644 --- a/cl/_testrt/panic/out.ll +++ b/cl/_testrt/panic/out.ll @@ -8,6 +8,7 @@ source_filename = "main" @__llgo_argc = global ptr null @__llgo_argv = global ptr null @0 = private unnamed_addr constant [14 x i8] c"panic message\00", align 1 +@_llgo_string = linkonce global ptr null define void @main.init() { _llgo_0: @@ -16,6 +17,7 @@ _llgo_0: _llgo_1: ; preds = %_llgo_0 store i1 true, ptr @"main.init$guard", align 1 + call void @"main.init$abi"() br label %_llgo_2 _llgo_2: ; preds = %_llgo_1, %_llgo_0 @@ -34,7 +36,7 @@ _llgo_0: %4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.String", ptr %2, i32 0, i32 1 store i64 13, ptr %4, align 4 %5 = load %"github.com/goplus/llgo/internal/runtime.String", ptr %2, align 8 - %6 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) + %6 = load ptr, ptr @_llgo_string, align 8 %7 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 16) store %"github.com/goplus/llgo/internal/runtime.String" %5, ptr %7, align 8 %8 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 @@ -49,6 +51,21 @@ _llgo_0: declare void @"github.com/goplus/llgo/internal/runtime.init"() +define void @"main.init$abi"() { +_llgo_0: + %0 = load ptr, ptr @_llgo_string, align 8 + %1 = icmp eq ptr %0, null + br i1 %1, label %_llgo_1, label %_llgo_2 + +_llgo_1: ; preds = %_llgo_0 + %2 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 24) + store ptr %2, ptr @_llgo_string, align 8 + br label %_llgo_2 + +_llgo_2: ; preds = %_llgo_1, %_llgo_0 + ret void +} + declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64) declare ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64) diff --git a/internal/abi/llgo_autogen.lla b/internal/abi/llgo_autogen.lla index f5f43eca19dfe0c520e46c1e0a118cf7a3f26de6..35581290bff118b40261309655d30041f4847711 100644 GIT binary patch literal 3560 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 Z?0-Sb3QR-$?>fcbc<{GI{q-CG@Lz-qxTydD literal 3353 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 UbipM5juYLO$&D|+0U!Y2KQ1OqlmGw# diff --git a/internal/runtime/llgo_autogen.lla b/internal/runtime/llgo_autogen.lla index d7e201b37a690d88b62f0bab10b0d504cd11caaf..841d6f08bacb98eaa90f1a32eb682df17550c676 100644 GIT binary patch literal 12615 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 Ui2oc1{@2w1%{%{a2_T^V0j(Qr5dZ)H literal 13557 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 diff --git a/internal/runtime/z_face.go b/internal/runtime/z_face.go index ededb30b4..14243461c 100644 --- a/internal/runtime/z_face.go +++ b/internal/runtime/z_face.go @@ -161,8 +161,6 @@ func doInitNamed(ret *Type, pkgPath, name string, underlying *Type, methods []Me extraOff := int(baseSize + uncommonTypeHdrSize) data := (*abi.Method)(c.Advance(ptr, extraOff)) copy(unsafe.Slice(data, n), methods) - - println("==> InitNamed:", pkgPath, name, ret, ret.Uncommon()) } // Func returns a function type. @@ -210,7 +208,6 @@ func NewItab(inter *InterfaceType, typ *Type) *Itab { ret.hash = typ.Hash u := typ.Uncommon() - println("==> NewItab Uncommon:", typ, u) if u == nil { ret.fun[0] = 0 } else { @@ -223,7 +220,6 @@ func NewItab(inter *InterfaceType, typ *Type) *Itab { break } *c.Advance(data, i) = uintptr(fn) - println("==> NewItab:", ret, i, fn) } } return ret @@ -234,9 +230,7 @@ func findMethod(mthds []abi.Method, im abi.Imethod) abi.Text { for _, m := range mthds { mName := m.Name_ if mName >= imName { - println("==> findMethod:", mName, imName, m.Mtyp_, im.Typ_, m.Ifn_) if mName == imName && m.Mtyp_ == im.Typ_ { - println("==> findMethod", mName, m.Ifn_) return m.Ifn_ } break diff --git a/ssa/abitype.go b/ssa/abitype.go index ab52e6d95..a0deac813 100644 --- a/ssa/abitype.go +++ b/ssa/abitype.go @@ -19,7 +19,6 @@ package ssa import ( "go/token" "go/types" - "log" "unsafe" "github.com/goplus/llgo/ssa/abi" @@ -96,12 +95,9 @@ func (b Builder) abiFuncOf(sig *types.Signature) func() Expr { } // Imethod{name string, typ *FuncType} -func (b Builder) abiImethodOf(m *types.Func, typ Expr) Expr { +func (b Builder) abiImethodOf(mName string, typ Expr) Expr { prog := b.Prog - name := b.Str(m.Name()) - tname, _ := b.Pkg.abi.TypeName(m.Type()) - log.Println("==> abiImethodOf:", m.Name(), m.Type(), tname) - b.Println(b.Str("==> abiImethodOf:"), typ) + name := b.Str(mName) return b.aggregateValue(prog.rtType("Imethod"), name.impl, typ.impl) } @@ -128,9 +124,6 @@ func (b Builder) abiMethodOf(m *types.Func /*, bg Background = InGo */) (mthd, p abiSigGo := types.NewSignatureType(nil, nil, nil, mSig.Params(), mSig.Results(), mSig.Variadic()) abiSig := prog.FuncDecl(abiSigGo, InGo).raw.Type abiTyp := b.abiType(abiSig) - tname, _ := b.Pkg.abi.TypeName(abiSig) - log.Println("==> abiMethodOf:", mName, abiSigGo, tname) - b.Println(b.Str("==> abiMethodOf:"), abiTyp) abiTypImpl := abiTyp.impl recv := mSig.Recv() @@ -169,7 +162,7 @@ func (b Builder) abiInterfaceOf(name string, t *types.Interface) func() Expr { methods := make([]Expr, n) for i := 0; i < n; i++ { m := t.Method(i) - methods[i] = b.abiImethodOf(m, typs[i]) + methods[i] = b.abiImethodOf(m.Name(), typs[i]) } pkg := b.Pkg fn := pkg.rtFunc("Interface") @@ -328,14 +321,15 @@ func (p Package) abiTypeInit(g Global, t types.Type, pub bool) { b.If(eq, blks[0], blks[1]) b.SetBlockEx(blks[0], AtEnd, false) } - b.Store(expr, tabi()) + vexpr := tabi() + b.Store(expr, vexpr) if pub { b.Jump(blks[1]) b.SetBlockEx(blks[1], AtEnd, false) b.blk.last = blks[1].last } if t, ok := t.(*types.Named); ok { - tabi = b.abiInitNamed(expr, t) + tabi = b.abiInitNamed(vexpr, t) if pub { blks = b.Func.MakeBlocks(2) b.If(eq, blks[0], blks[1]) diff --git a/ssa/interface.go b/ssa/interface.go index 5b97c78ff..b2d7065b6 100644 --- a/ssa/interface.go +++ b/ssa/interface.go @@ -74,7 +74,6 @@ func (b Builder) Imethod(intf Expr, method *types.Func) Expr { pfn := b.Advance(itab, prog.IntVal(uint64(i+3), prog.Int())) fn := b.Load(pfn) ret := b.aggregateValue(tclosure, fn.impl, b.faceData(impl)) - b.Println(b.Str("Imethod:"), itab, ret, prog.Val(ret.kind), prog.Val(i)) return ret } From 6fb48023f2641d2be78c59460572c2d1782c6566 Mon Sep 17 00:00:00 2001 From: xushiwei Date: Fri, 31 May 2024 08:16:28 +0800 Subject: [PATCH 6/6] TestMakeInterface --- ssa/cl_test.go | 32 -------------------------------- 1 file changed, 32 deletions(-) diff --git a/ssa/cl_test.go b/ssa/cl_test.go index 513944c16..209c3bb4f 100644 --- a/ssa/cl_test.go +++ b/ssa/cl_test.go @@ -57,38 +57,6 @@ func TestMakeInterface(t *testing.T) { b.MakeInterface(prog.Any(), prog.IntVal(100, prog.Int64())) b.MakeInterface(prog.Any(), prog.FloatVal(100, prog.Float64())) b.Return() - ssatest.Assert(t, pkg, `; ModuleID = 'foo' -source_filename = "foo" - -%"github.com/goplus/llgo/internal/runtime.eface" = type { ptr, ptr } - -define void @main() { -_llgo_0: - %0 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 6) - %1 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 8) - store i64 100, ptr %1, align 4 - %2 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 - %3 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %2, i32 0, i32 0 - store ptr %0, ptr %3, align 8 - %4 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %2, i32 0, i32 1 - store ptr %1, ptr %4, align 8 - %5 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %2, align 8 - %6 = call ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64 14) - %7 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64 8) - store double 1.000000e+02, ptr %7, align 8 - %8 = alloca %"github.com/goplus/llgo/internal/runtime.eface", align 8 - %9 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %8, i32 0, i32 0 - store ptr %6, ptr %9, align 8 - %10 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.eface", ptr %8, i32 0, i32 1 - store ptr %7, ptr %10, align 8 - %11 = load %"github.com/goplus/llgo/internal/runtime.eface", ptr %8, align 8 - ret void -} - -declare ptr @"github.com/goplus/llgo/internal/runtime.Basic"(i64) - -declare ptr @"github.com/goplus/llgo/internal/runtime.AllocU"(i64) -`) } /*