From 3e7bfbb45cf682e0693d24df51a67c278b1604fb Mon Sep 17 00:00:00 2001 From: xushiwei Date: Wed, 15 May 2024 15:42:58 +0800 Subject: [PATCH] llgo instr: pyList --- cl/_testpy/matrix/out.ll | 121 +++++++++++++++++++++++++++++++++++++++ cl/compile.go | 13 +---- cl/compile_test.go | 2 +- py/list.go | 2 +- ssa/expr.go | 2 - 5 files changed, 126 insertions(+), 14 deletions(-) diff --git a/cl/_testpy/matrix/out.ll b/cl/_testpy/matrix/out.ll index e69de29b..956009c4 100644 --- a/cl/_testpy/matrix/out.ll +++ b/cl/_testpy/matrix/out.ll @@ -0,0 +1,121 @@ +; ModuleID = 'main' +source_filename = "main" + +@"main.init$guard" = global ptr null +@__llgo_argc = global ptr null +@__llgo_argv = global ptr null +@__llgo_py.numpy.add = linkonce global ptr null +@0 = private unnamed_addr constant [8 x i8] c"a = %s\0A\00", align 1 +@1 = private unnamed_addr constant [8 x i8] c"a = %s\0A\00", align 1 +@2 = private unnamed_addr constant [10 x i8] c"a+b = %s\0A\00", align 1 +@__llgo_py.numpy = external global ptr +@3 = private unnamed_addr constant [4 x i8] c"add\00", align 1 + +define void @main.init() { +_llgo_0: + %0 = load i1, ptr @"main.init$guard", align 1 + br i1 %0, label %_llgo_2, label %_llgo_1 + +_llgo_1: ; preds = %_llgo_0 + store i1 true, ptr @"main.init$guard", align 1 + call void @"github.com/goplus/llgo/py/numpy.init"() + %1 = load ptr, ptr @__llgo_py.numpy, align 8 + call void (ptr, ...) @llgoLoadPyModSyms(ptr %1, ptr @3, ptr @__llgo_py.numpy.add, ptr null) + br label %_llgo_2 + +_llgo_2: ; preds = %_llgo_1, %_llgo_0 + ret void +} + +define void @main(i32 %0, ptr %1) { +_llgo_0: + call void @Py_Initialize() + store i32 %0, ptr @__llgo_argc, align 4 + store ptr %1, ptr @__llgo_argv, align 8 + call void @"github.com/goplus/llgo/internal/runtime.init"() + call void @main.init() + %2 = call ptr @PyList_New(i64 3) + %3 = call ptr @PyFloat_FromDouble(double 1.000000e+00) + %4 = call i32 @PyList_SetItem(ptr %2, i64 0, ptr %3) + %5 = call ptr @PyFloat_FromDouble(double 2.000000e+00) + %6 = call i32 @PyList_SetItem(ptr %2, i64 1, ptr %5) + %7 = call ptr @PyFloat_FromDouble(double 3.000000e+00) + %8 = call i32 @PyList_SetItem(ptr %2, i64 2, ptr %7) + %9 = call ptr @PyList_New(i64 3) + %10 = call ptr @PyFloat_FromDouble(double 4.000000e+00) + %11 = call i32 @PyList_SetItem(ptr %9, i64 0, ptr %10) + %12 = call ptr @PyFloat_FromDouble(double 5.000000e+00) + %13 = call i32 @PyList_SetItem(ptr %9, i64 1, ptr %12) + %14 = call ptr @PyFloat_FromDouble(double 6.000000e+00) + %15 = call i32 @PyList_SetItem(ptr %9, i64 2, ptr %14) + %16 = call ptr @PyList_New(i64 3) + %17 = call ptr @PyFloat_FromDouble(double 7.000000e+00) + %18 = call i32 @PyList_SetItem(ptr %16, i64 0, ptr %17) + %19 = call ptr @PyFloat_FromDouble(double 8.000000e+00) + %20 = call i32 @PyList_SetItem(ptr %16, i64 1, ptr %19) + %21 = call ptr @PyFloat_FromDouble(double 9.000000e+00) + %22 = call i32 @PyList_SetItem(ptr %16, i64 2, ptr %21) + %23 = call ptr @PyList_New(i64 3) + %24 = call i32 @PyList_SetItem(ptr %23, i64 0, ptr %2) + %25 = call i32 @PyList_SetItem(ptr %23, i64 1, ptr %9) + %26 = call i32 @PyList_SetItem(ptr %23, i64 2, ptr %16) + %27 = call ptr @PyList_New(i64 3) + %28 = call ptr @PyFloat_FromDouble(double 9.000000e+00) + %29 = call i32 @PyList_SetItem(ptr %27, i64 0, ptr %28) + %30 = call ptr @PyFloat_FromDouble(double 8.000000e+00) + %31 = call i32 @PyList_SetItem(ptr %27, i64 1, ptr %30) + %32 = call ptr @PyFloat_FromDouble(double 7.000000e+00) + %33 = call i32 @PyList_SetItem(ptr %27, i64 2, ptr %32) + %34 = call ptr @PyList_New(i64 3) + %35 = call ptr @PyFloat_FromDouble(double 6.000000e+00) + %36 = call i32 @PyList_SetItem(ptr %34, i64 0, ptr %35) + %37 = call ptr @PyFloat_FromDouble(double 5.000000e+00) + %38 = call i32 @PyList_SetItem(ptr %34, i64 1, ptr %37) + %39 = call ptr @PyFloat_FromDouble(double 4.000000e+00) + %40 = call i32 @PyList_SetItem(ptr %34, i64 2, ptr %39) + %41 = call ptr @PyList_New(i64 3) + %42 = call ptr @PyFloat_FromDouble(double 3.000000e+00) + %43 = call i32 @PyList_SetItem(ptr %41, i64 0, ptr %42) + %44 = call ptr @PyFloat_FromDouble(double 2.000000e+00) + %45 = call i32 @PyList_SetItem(ptr %41, i64 1, ptr %44) + %46 = call ptr @PyFloat_FromDouble(double 1.000000e+00) + %47 = call i32 @PyList_SetItem(ptr %41, i64 2, ptr %46) + %48 = call ptr @PyList_New(i64 3) + %49 = call i32 @PyList_SetItem(ptr %48, i64 0, ptr %27) + %50 = call i32 @PyList_SetItem(ptr %48, i64 1, ptr %34) + %51 = call i32 @PyList_SetItem(ptr %48, i64 2, ptr %41) + %52 = load ptr, ptr @__llgo_py.numpy.add, align 8 + %53 = call ptr (ptr, ...) @PyObject_CallFunctionObjArgs(ptr %52, ptr %23, ptr %48, ptr null) + %54 = call ptr @PyObject_Str(ptr %23) + %55 = call ptr @PyUnicode_AsUTF8(ptr %54) + %56 = call i32 (ptr, ...) @printf(ptr @0, ptr %55) + %57 = call ptr @PyObject_Str(ptr %48) + %58 = call ptr @PyUnicode_AsUTF8(ptr %57) + %59 = call i32 (ptr, ...) @printf(ptr @1, ptr %58) + %60 = call ptr @PyObject_Str(ptr %53) + %61 = call ptr @PyUnicode_AsUTF8(ptr %60) + %62 = call i32 (ptr, ...) @printf(ptr @2, ptr %61) + ret void +} + +declare void @"github.com/goplus/llgo/py/numpy.init"() + +declare void @"github.com/goplus/llgo/internal/runtime.init"() + +declare ptr @PyList_New(i64) + +declare ptr @PyFloat_FromDouble(double) + +declare i32 @PyList_SetItem(ptr, i64, ptr) + +declare ptr @PyObject_CallFunctionObjArgs(ptr, ...) + +declare ptr @PyObject_Str(ptr) + +declare ptr @PyUnicode_AsUTF8(ptr) + +declare i32 @printf(ptr, ...) + +declare void @llgoLoadPyModSyms(ptr, ...) + +declare void @Py_Initialize() diff --git a/cl/compile.go b/cl/compile.go index 539b80da..43d88f9f 100644 --- a/cl/compile.go +++ b/cl/compile.go @@ -521,14 +521,6 @@ func (p *context) stringData(b llssa.Builder, args []ssa.Value) (ret llssa.Expr) panic("stringData(s string): invalid arguments") } -func (p *context) pyList(b llssa.Builder, args []ssa.Value) (ret llssa.Expr) { - vals := make([]llssa.Expr, len(args)) - for i, arg := range args { - vals[i] = p.compileValue(b, arg) - } - return b.PyList(vals...) -} - func isPhi(i ssa.Instruction) bool { _, ok := i.(*ssa.Phi) return ok @@ -613,6 +605,9 @@ func (p *context) compileInstrOrValue(b llssa.Builder, iv instrOrValue, asValue case pyFunc: args := p.compileValues(b, args, kind) ret = b.Call(pyFn.Expr, args...) + case llgoPyList: + args := p.compileValues(b, args, fnHasVArg) + ret = b.PyList(args...) case llgoCstr: ret = cstr(b, args) case llgoAdvance: @@ -625,8 +620,6 @@ func (p *context) compileInstrOrValue(b llssa.Builder, iv instrOrValue, asValue ret = p.allocaCStr(b, args) case llgoStringData: ret = p.stringData(b, args) - case llgoPyList: - ret = p.pyList(b, args) case llgoUnreachable: // func unreachable() b.Unreachable() default: diff --git a/cl/compile_test.go b/cl/compile_test.go index 60419bc6..6f417cbe 100644 --- a/cl/compile_test.go +++ b/cl/compile_test.go @@ -29,7 +29,7 @@ func testCompile(t *testing.T, src, expected string) { } func TestFromTestpy(t *testing.T) { - cltest.FromDir(t, "matrix", "./_testpy", false) + cltest.FromDir(t, "", "./_testpy", false) } func TestFromTestlibc(t *testing.T) { diff --git a/py/list.go b/py/list.go index f87430b0..de52d74d 100644 --- a/py/list.go +++ b/py/list.go @@ -25,7 +25,7 @@ import ( // https://docs.python.org/3/c-api/list.html //go:linkname List llgo.pyList -func List(args ...any) *Object +func List(__llgo_va_list ...any) *Object // Return a new list of length len on success, or nil on failure. // diff --git a/ssa/expr.go b/ssa/expr.go index 33408ccc..420ceb97 100644 --- a/ssa/expr.go +++ b/ssa/expr.go @@ -1132,8 +1132,6 @@ func (b Builder) MakeInterface(tinter Type, x Expr) (ret Expr) { case kind == types.String: return Expr{b.InlineCall(pkg.rtFunc("MakeAnyString"), x).impl, tinter} } - case *types.Pointer: - panic("todo: pointer") } panic("todo") }