From 1c1da6433a348eb3ab93f0e4c2bef78d44dab5e1 Mon Sep 17 00:00:00 2001 From: xushiwei Date: Tue, 28 May 2024 07:47:07 +0800 Subject: [PATCH] runtime: rm NewSlice (use b.unsafeSlice); llgo/ssa: Println --- cl/_testrt/intgen/out.ll | 39 ++++--- internal/runtime/llgo_autogen.lla | Bin 13023 -> 13137 bytes internal/runtime/z_face.go | 23 +++- internal/runtime/z_print.go | 18 +++- internal/runtime/z_slice.go | 5 - ssa/datastruct.go | 100 +++++++++-------- ssa/expr.go | 174 ++++++++++++++---------------- ssa/interface.go | 3 +- ssa/stmt_builder.go | 42 +++++--- 9 files changed, 224 insertions(+), 180 deletions(-) diff --git a/cl/_testrt/intgen/out.ll b/cl/_testrt/intgen/out.ll index 1fe32d61..d0bca80a 100644 --- a/cl/_testrt/intgen/out.ll +++ b/cl/_testrt/intgen/out.ll @@ -15,29 +15,36 @@ define %"github.com/goplus/llgo/internal/runtime.Slice" @main.genInts(i64 %0, { _llgo_0: %2 = mul i64 %0, 4 %3 = call ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64 %2) - %4 = call %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice"(ptr %3, i64 %0, i64 %0) - %5 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %4, 1 + %4 = alloca %"github.com/goplus/llgo/internal/runtime.Slice", align 8 + %5 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %4, i32 0, i32 0 + store ptr %3, ptr %5, align 8 + %6 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %4, i32 0, i32 1 + store i64 %0, ptr %6, align 4 + %7 = getelementptr inbounds %"github.com/goplus/llgo/internal/runtime.Slice", ptr %4, i32 0, i32 2 + store i64 %0, ptr %7, align 4 + %8 = load %"github.com/goplus/llgo/internal/runtime.Slice", ptr %4, align 8 + %9 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %8, 1 br label %_llgo_1 _llgo_1: ; preds = %_llgo_2, %_llgo_0 - %6 = phi i64 [ -1, %_llgo_0 ], [ %7, %_llgo_2 ] - %7 = add i64 %6, 1 - %8 = icmp slt i64 %7, %5 - br i1 %8, label %_llgo_2, label %_llgo_3 + %10 = phi i64 [ -1, %_llgo_0 ], [ %11, %_llgo_2 ] + %11 = add i64 %10, 1 + %12 = icmp slt i64 %11, %9 + br i1 %12, label %_llgo_2, label %_llgo_3 _llgo_2: ; preds = %_llgo_1 - %9 = extractvalue { ptr, ptr } %1, 1 - %10 = extractvalue { ptr, ptr } %1, 0 - %11 = call i32 %10(ptr %9) - %12 = icmp slt i64 %7, 0 - call void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1 %12) - %13 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %4, 0 - %14 = getelementptr inbounds i32, ptr %13, i64 %7 - store i32 %11, ptr %14, align 4 + %13 = extractvalue { ptr, ptr } %1, 1 + %14 = extractvalue { ptr, ptr } %1, 0 + %15 = call i32 %14(ptr %13) + %16 = icmp slt i64 %11, 0 + call void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1 %16) + %17 = extractvalue %"github.com/goplus/llgo/internal/runtime.Slice" %8, 0 + %18 = getelementptr inbounds i32, ptr %17, i64 %11 + store i32 %15, ptr %18, align 4 br label %_llgo_1 _llgo_3: ; preds = %_llgo_1 - ret %"github.com/goplus/llgo/internal/runtime.Slice" %4 + ret %"github.com/goplus/llgo/internal/runtime.Slice" %8 } define i32 @"(*main.generator).next"(ptr %0) { @@ -165,8 +172,6 @@ _llgo_9: ; preds = %_llgo_7 declare ptr @"github.com/goplus/llgo/internal/runtime.AllocZ"(i64) -declare %"github.com/goplus/llgo/internal/runtime.Slice" @"github.com/goplus/llgo/internal/runtime.NewSlice"(ptr, i64, i64) - declare void @"github.com/goplus/llgo/internal/runtime.AssertIndexRange"(i1) declare void @"github.com/goplus/llgo/internal/runtime.init"() diff --git a/internal/runtime/llgo_autogen.lla b/internal/runtime/llgo_autogen.lla index 5c05c17cb4e294aa06ea03f9350b22c2bc60c152..5a32a2dcec228851006e91d880595e89eed7f7aa 100644 GIT binary patch delta 13062 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 UGAIM68da0IG9U)#G5`Po05`@TtpET3 delta 12950 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

mztF(}JT?JCZ7?bm)nad- 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 MGav?ZG5`Po0N|keUH||9 diff --git a/internal/runtime/z_face.go b/internal/runtime/z_face.go index 149c06c6..eccb2039 100644 --- a/internal/runtime/z_face.go +++ b/internal/runtime/z_face.go @@ -1,6 +1,18 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. +/* + * 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 runtime @@ -91,7 +103,7 @@ func hdrSizeOf(kind abi.Kind) uintptr { } // Named returns a named type. -func Named(pkgPath, name string, underlying *Type, methods []abi.Method) *Type { +func Named(pkgPath, name string, underlying *Type, methods []Method) *Type { tflag := underlying.TFlag if tflag&abi.TFlagUncommon != 0 { panic("runtime: underlying type is already named") @@ -179,7 +191,7 @@ func Func(in, out []*Type, variadic bool) *FuncType { } // Interface returns an interface type. -func Interface(pkgPath string, methods []abi.Imethod) *InterfaceType { +func Interface(pkgPath string, methods []Imethod) *InterfaceType { ret := &abi.InterfaceType{ Type: Type{ Size_: unsafe.Sizeof(eface{}), @@ -227,6 +239,7 @@ func findMethod(mthds []abi.Method, im abi.Imethod) abi.Text { mName := m.Name_ if mName >= imName { if mName == imName && m.Mtyp_ == im.Typ_ { + println("==> findMethod", mName, m.Ifn_) return m.Ifn_ } break diff --git a/internal/runtime/z_print.go b/internal/runtime/z_print.go index 8edbbb69..65a5a9a4 100644 --- a/internal/runtime/z_print.go +++ b/internal/runtime/z_print.go @@ -1,6 +1,18 @@ -// Copyright 2009 The Go Authors. All rights reserved. -// Use of this source code is governed by a BSD-style -// license that can be found in the LICENSE file. +/* + * 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 runtime diff --git a/internal/runtime/z_slice.go b/internal/runtime/z_slice.go index 78789e34..f4711e47 100644 --- a/internal/runtime/z_slice.go +++ b/internal/runtime/z_slice.go @@ -31,11 +31,6 @@ type Slice struct { cap int } -// NewSlice creates a new slice. -func NewSlice(data unsafe.Pointer, len, cap int) Slice { - return Slice{data, len, cap} -} - func NewSlice3(base unsafe.Pointer, eltSize, cap, i, j, k int) (s Slice) { if i < 0 || j < i || k < j || k > cap { panic("slice index out of bounds") diff --git a/ssa/datastruct.go b/ssa/datastruct.go index 420ec0a0..037238c1 100644 --- a/ssa/datastruct.go +++ b/ssa/datastruct.go @@ -18,7 +18,6 @@ package ssa import ( "fmt" - "go/token" "go/types" "log" @@ -198,26 +197,6 @@ func (b Builder) Index(x, idx Expr, addr func(Expr) Expr) Expr { return b.Load(buf) } -// The Lookup instruction yields element Index of collection map X. -// Index is the appropriate key type. -// -// If CommaOk, the result is a 2-tuple of the value above and a -// boolean indicating the result of a map membership test for the key. -// The components of the tuple are accessed using Extract. -// -// Example printed form: -// -// t2 = t0[t1] -// t5 = t3[t4],ok -func (b Builder) Lookup(x, key Expr, commaOk bool) (ret Expr) { - if debugInstr { - log.Printf("Lookup %v, %v, %v\n", x.impl, key.impl, commaOk) - } - // TODO(xsw) - // panic("todo") - return -} - // The Slice instruction yields a slice of an existing string, slice // or *array X between optional integer bounds Low and High. // @@ -297,6 +276,35 @@ func (b Builder) SliceLit(t Type, elts ...Expr) Expr { return b.unsafeSlice(ptr, size, size) } +// The MakeSlice instruction yields a slice of length Len backed by a +// newly allocated array of length Cap. +// +// Both Len and Cap must be non-nil Values of integer type. +// +// (Alloc(types.Array) followed by Slice will not suffice because +// Alloc can only create arrays of constant length.) +// +// Type() returns a (possibly named) *types.Slice. +// +// Example printed form: +// +// t1 = make []string 1:int t0 +// t1 = make StringSlice 1:int t0 +func (b Builder) MakeSlice(t Type, len, cap Expr) (ret Expr) { + if debugInstr { + log.Printf("MakeSlice %v, %v, %v\n", t.RawType(), len.impl, cap.impl) + } + prog := b.Prog + if cap.IsNil() { + cap = len + } + telem := prog.Index(t) + ptr := b.ArrayAlloc(telem, cap) + ret.impl = b.unsafeSlice(ptr, len.impl, cap.impl).impl + ret.Type = t + return +} + // ----------------------------------------------------------------------------- // The MakeMap instruction creates a new hash-table-based map object @@ -318,35 +326,41 @@ func (b Builder) MakeMap(t Type, nReserve Expr) (ret Expr) { return } -// The MakeSlice instruction yields a slice of length Len backed by a -// newly allocated array of length Cap. +// The Lookup instruction yields element Index of collection map X. +// Index is the appropriate key type. // -// Both Len and Cap must be non-nil Values of integer type. -// -// (Alloc(types.Array) followed by Slice will not suffice because -// Alloc can only create arrays of constant length.) -// -// Type() returns a (possibly named) *types.Slice. +// If CommaOk, the result is a 2-tuple of the value above and a +// boolean indicating the result of a map membership test for the key. +// The components of the tuple are accessed using Extract. // // Example printed form: // -// t1 = make []string 1:int t0 -// t1 = make StringSlice 1:int t0 -func (b Builder) MakeSlice(t Type, len, cap Expr) (ret Expr) { +// t2 = t0[t1] +// t5 = t3[t4],ok +func (b Builder) Lookup(x, key Expr, commaOk bool) (ret Expr) { if debugInstr { - log.Printf("MakeSlice %v, %v, %v\n", t.RawType(), len.impl, cap.impl) + log.Printf("Lookup %v, %v, %v\n", x.impl, key.impl, commaOk) } - pkg := b.Pkg - prog := b.Prog - if cap.IsNil() { - cap = len - } - elemSize := SizeOf(prog, prog.Index(t)) - size := b.BinOp(token.MUL, cap, elemSize) - ptr := b.InlineCall(pkg.rtFunc("AllocZ"), size) - ret.impl = b.InlineCall(pkg.rtFunc("NewSlice"), ptr, len, cap).impl - ret.Type = t + // TODO(xsw) + // panic("todo") return } +// The MapUpdate instruction updates the association of Map[Key] to +// Value. +// +// Pos() returns the ast.KeyValueExpr.Colon or ast.IndexExpr.Lbrack, +// if explicit in the source. +// +// Example printed form: +// +// t0[t1] = t2 +func (b Builder) MapUpdate(m, k, v Expr) { + if debugInstr { + log.Printf("MapUpdate %v[%v] = %v\n", m.impl, k.impl, v.impl) + } + // TODO(xsw) + // panic("todo") +} + // ----------------------------------------------------------------------------- diff --git a/ssa/expr.go b/ssa/expr.go index bdaa64df..1a6836cd 100644 --- a/ssa/expr.go +++ b/ssa/expr.go @@ -500,37 +500,6 @@ func llvmFields(vals []Expr, t *types.Struct, b Builder) (ret []llvm.Value) { return } -func llvmPredBlocks(preds []BasicBlock) []llvm.BasicBlock { - ret := make([]llvm.BasicBlock, len(preds)) - for i, v := range preds { - ret[i] = v.last - } - return ret -} - -// ----------------------------------------------------------------------------- - -// Phi represents a phi node. -type Phi struct { - Expr -} - -// AddIncoming adds incoming values to a phi node. -func (p Phi) AddIncoming(b Builder, preds []BasicBlock, f func(i int, blk BasicBlock) Expr) { - bs := llvmPredBlocks(preds) - vals := make([]llvm.Value, len(preds)) - for iblk, blk := range preds { - vals[iblk] = f(iblk, blk).impl - } - p.impl.AddIncoming(vals, bs) -} - -// Phi returns a phi node. -func (b Builder) Phi(t Type) Phi { - phi := llvm.CreatePHI(b.impl, t.ll) - return Phi{Expr{phi, t}} -} - // ----------------------------------------------------------------------------- // Advance returns the pointer ptr advanced by offset. @@ -660,9 +629,6 @@ func (b Builder) Alloc(elem Type, heap bool) (ret Expr) { // AllocU allocates uninitialized space for n*sizeof(elem) bytes. func (b Builder) AllocU(elem Type, n ...int64) (ret Expr) { - if debugInstr { - log.Printf("AllocU %v, %v\n", elem.raw.Type, n) - } prog := b.Prog size := SizeOf(prog, elem, n...) ret = b.InlineCall(b.Pkg.rtFunc("AllocU"), size) @@ -670,6 +636,11 @@ func (b Builder) AllocU(elem Type, n ...int64) (ret Expr) { return } +// AllocZ allocates zero initialized space for n bytes. +func (b Builder) AllocZ(n Expr) (ret Expr) { + return b.InlineCall(b.Pkg.rtFunc("AllocZ"), n) +} + // Alloca allocates uninitialized space for n bytes. func (b Builder) Alloca(n Expr) (ret Expr) { if debugInstr { @@ -682,6 +653,17 @@ func (b Builder) Alloca(n Expr) (ret Expr) { return } +// AllocaCStr allocates space for copy it from a Go string. +func (b Builder) AllocaCStr(gostr Expr) (ret Expr) { + if debugInstr { + log.Printf("AllocaCStr %v\n", gostr.impl) + } + n := b.StringLen(gostr) + n1 := b.BinOp(token.ADD, n, b.Prog.Val(1)) + cstr := b.Alloca(n1) + return b.InlineCall(b.Pkg.rtFunc("CStrCopy"), cstr, gostr) +} + /* // ArrayAlloca reserves space for an array of n elements of type telem. func (b Builder) ArrayAlloca(telem Type, n Expr) (ret Expr) { @@ -694,15 +676,14 @@ func (b Builder) ArrayAlloca(telem Type, n Expr) (ret Expr) { } */ -// AllocaCStr allocates space for copy it from a Go string. -func (b Builder) AllocaCStr(gostr Expr) (ret Expr) { - if debugInstr { - log.Printf("AllocaCStr %v\n", gostr.impl) - } - n := b.StringLen(gostr) - n1 := b.BinOp(token.ADD, n, b.Prog.Val(1)) - cstr := b.Alloca(n1) - return b.InlineCall(b.Pkg.rtFunc("CStrCopy"), cstr, gostr) +// ArrayAlloc allocates zero initialized space for an array of n elements of type telem. +func (b Builder) ArrayAlloc(telem Type, n Expr) (ret Expr) { + prog := b.Prog + elemSize := SizeOf(prog, telem) + size := b.BinOp(token.MUL, n, elemSize) + ret.impl = b.AllocZ(size).impl + ret.Type = prog.Pointer(telem) + return } // ----------------------------------------------------------------------------- @@ -1047,55 +1028,7 @@ func (b Builder) BuiltinCall(fn string, args ...Expr) (ret Expr) { } } case "print", "println": - ln := fn == "println" - prog := b.Prog - ret.Type = prog.Void() - for i, arg := range args { - if ln && i > 0 { - b.InlineCall(b.Pkg.rtFunc("PrintByte"), prog.IntVal(' ', prog.Byte())) - } - var fn string - typ := arg.Type - switch arg.kind { - case vkBool: - fn = "PrintBool" - case vkSigned: - fn = "PrintInt" - typ = prog.Int64() - case vkUnsigned: - fn = "PrintUint" - typ = prog.Uint64() - case vkFloat: - fn = "PrintFloat" - typ = prog.Float64() - case vkSlice: - fn = "PrintSlice" - case vkClosure: - arg = b.Field(arg, 0) - fallthrough - case vkPtr, vkFuncPtr, vkFuncDecl: - fn = "PrintPointer" - typ = prog.VoidPtr() - case vkString: - fn = "PrintString" - case vkEface: - fn = "PrintEface" - case vkIface: - fn = "PrintIface" - // case vkComplex: - // fn = "PrintComplex" - default: - panic(fmt.Errorf("illegal types for operand: print %v", arg.RawType())) - } - if typ != arg.Type { - arg = b.Convert(typ, arg) - } - b.InlineCall(b.Pkg.rtFunc(fn), arg) - } - if ln { - b.InlineCall(b.Pkg.rtFunc("PrintByte"), prog.IntVal('\n', prog.Byte())) - } - return + return b.PrintEx(fn == "println", args...) case "copy": if len(args) == 2 { dst := args[0] @@ -1120,4 +1053,61 @@ func (b Builder) BuiltinCall(fn string, args ...Expr) (ret Expr) { panic("todo: " + fn) } +// Println prints the arguments to stderr, followed by a newline. +func (b Builder) Println(args ...Expr) (ret Expr) { + return b.PrintEx(true, args...) +} + +// PrintEx prints the arguments to stderr. +func (b Builder) PrintEx(ln bool, args ...Expr) (ret Expr) { + prog := b.Prog + ret.Type = prog.Void() + for i, arg := range args { + if ln && i > 0 { + b.InlineCall(b.Pkg.rtFunc("PrintByte"), prog.IntVal(' ', prog.Byte())) + } + var fn string + typ := arg.Type + switch arg.kind { + case vkBool: + fn = "PrintBool" + case vkSigned: + fn = "PrintInt" + typ = prog.Int64() + case vkUnsigned: + fn = "PrintUint" + typ = prog.Uint64() + case vkFloat: + fn = "PrintFloat" + typ = prog.Float64() + case vkSlice: + fn = "PrintSlice" + case vkClosure: + arg = b.Field(arg, 0) + fallthrough + case vkPtr, vkFuncPtr, vkFuncDecl: + fn = "PrintPointer" + typ = prog.VoidPtr() + case vkString: + fn = "PrintString" + case vkEface: + fn = "PrintEface" + case vkIface: + fn = "PrintIface" + // case vkComplex: + // fn = "PrintComplex" + default: + panic(fmt.Errorf("illegal types for operand: print %v", arg.RawType())) + } + if typ != arg.Type { + arg = b.Convert(typ, arg) + } + b.InlineCall(b.Pkg.rtFunc(fn), arg) + } + if ln { + b.InlineCall(b.Pkg.rtFunc("PrintByte"), prog.IntVal('\n', prog.Byte())) + } + return +} + // ----------------------------------------------------------------------------- diff --git a/ssa/interface.go b/ssa/interface.go index 06b50bb3..f89a3edc 100644 --- a/ssa/interface.go +++ b/ssa/interface.go @@ -287,7 +287,8 @@ func (b Builder) Imethod(intf Expr, method *types.Func) Expr { impl := intf.impl itab := Expr{b.faceItab(impl), prog.VoidPtrPtr()} pfn := b.Advance(itab, prog.IntVal(uint64(i+3), prog.Int())) - return b.aggregateValue(tclosure, b.Load(pfn).impl, b.faceData(impl)) + fn := b.Load(pfn) + return b.aggregateValue(tclosure, fn.impl, b.faceData(impl)) } // ----------------------------------------------------------------------------- diff --git a/ssa/stmt_builder.go b/ssa/stmt_builder.go index 178d6f3e..92fcd37f 100644 --- a/ssa/stmt_builder.go +++ b/ssa/stmt_builder.go @@ -206,21 +206,35 @@ func (b Builder) If(cond Expr, thenb, elseb BasicBlock) { b.impl.CreateCondBr(cond.impl, thenb.first, elseb.first) } -// The MapUpdate instruction updates the association of Map[Key] to -// Value. -// -// Pos() returns the ast.KeyValueExpr.Colon or ast.IndexExpr.Lbrack, -// if explicit in the source. -// -// Example printed form: -// -// t0[t1] = t2 -func (b Builder) MapUpdate(m, k, v Expr) { - if debugInstr { - log.Printf("MapUpdate %v[%v] = %v\n", m.impl, k.impl, v.impl) +// ----------------------------------------------------------------------------- + +// Phi represents a phi node. +type Phi struct { + Expr +} + +// AddIncoming adds incoming values to a phi node. +func (p Phi) AddIncoming(b Builder, preds []BasicBlock, f func(i int, blk BasicBlock) Expr) { + bs := llvmPredBlocks(preds) + vals := make([]llvm.Value, len(preds)) + for iblk, blk := range preds { + vals[iblk] = f(iblk, blk).impl } - // TODO(xsw) - // panic("todo") + p.impl.AddIncoming(vals, bs) +} + +func llvmPredBlocks(preds []BasicBlock) []llvm.BasicBlock { + ret := make([]llvm.BasicBlock, len(preds)) + for i, v := range preds { + ret[i] = v.last + } + return ret +} + +// Phi returns a phi node. +func (b Builder) Phi(t Type) Phi { + phi := llvm.CreatePHI(b.impl, t.ll) + return Phi{Expr{phi, t}} } // -----------------------------------------------------------------------------