goplus / llgo

A Go compiler based on LLVM in order to better integrate Go with the C ecosystem including Python
Apache License 2.0
216 stars 15 forks source link

llgo run pydemo get nothing on Linux/Ubuntu #341

Closed luoliwoshang closed 2 weeks ago

luoliwoshang commented 2 weeks ago

Install python3

apt-get install python3-dev

Set LLGO_LIB_PYTHON

root@88cbcacc17d2:~/llgo/_pydemo/callpy# ldconfig -p | grep python
libpython3.12.so.1.0 (libc6,AArch64) => /lib/aarch64-linux-gnu/libpython3.12.so.1.0

root@88cbcacc17d2:~/llgo/_pydemo/callpy# echo $LLGO_LIB_PYTHON
/lib/aarch64-linux-gnu/python3.12

There is no output after _pydemo/callpy is executed

root@88cbcacc17d2:~/llgo/_pydemo/callpy# llgo run .
root@88cbcacc17d2:~/llgo/_pydemo/callpy# 

Compiled output

root@88cbcacc17d2:~/llgo/_pydemo/callpy# llgo run -v .
internal/goarch
internal/goos
runtime/internal/sys
internal/race
internal/abi
internal/cpu
internal/bytealg
internal/coverage/rtcov
internal/goexperiment
runtime/internal/atomic
runtime/internal/math
runtime/internal/syscall
runtime
sync/atomic
sync
internal/unsafeheader
internal/reflectlite
errors
internal/itoa
internal/oserror
github.com/goplus/llgo/_pydemo/callpy
2024/06/17 08:42:35 ==> NewFunc main.init type: <nil> func() ftype: 1
2024/06/17 08:42:35 NewFunc main.init func() hasFreeVars: false
2024/06/17 08:42:35 ==> NewVar main.init$guard *bool
2024/06/17 08:42:35 ==> NewFunc main type: <nil> func() ftype: 1
2024/06/17 08:42:35 NewFunc main func(int32, **int8) int32 hasFreeVars: false
# Name: github.com/goplus/llgo/_pydemo/callpy.init
# Package: github.com/goplus/llgo/_pydemo/callpy
# Synthetic: package initializer
func init():
0:                                                                entry P:0 S:2
        t0 = *init$guard                                                   bool
        if t0 goto 2 else 1
1:                                                           init.start P:1 S:1
        *init$guard = true:bool
        t1 = github.com/goplus/llgo/c.init()                                 ()
        t2 = github.com/goplus/llgo/py.init()                                ()
        t3 = github.com/goplus/llgo/py/math.init()                           ()
        jump 2
2:                                                            init.done P:2 S:0
        return

2024/06/17 08:42:35 ==> FuncBody main.init
2024/06/17 08:42:35 Block _llgo_0:
2024/06/17 08:42:35 UnOp *, @"main.init$guard" = global i1 false, align 1
2024/06/17 08:42:35 Load @"main.init$guard" = global i1 false, align 1
2024/06/17 08:42:35 If   %0 = load i1, ptr @"main.init$guard", align 1, _llgo_2, _llgo_1
2024/06/17 08:42:35 Block _llgo_1:
2024/06/17 08:42:35 Store *bool, @"main.init$guard" = global i1 false, align 1, i1 true
2024/06/17 08:42:35 >>> Do 0 github.com/goplus/llgo/py/math.init []
2024/06/17 08:42:35 NewFunc github.com/goplus/llgo/py/math.init func() hasFreeVars: false
2024/06/17 08:42:35 Call 8 func() github.com/goplus/llgo/py/math.init
2024/06/17 08:42:35 Jump _llgo_2
2024/06/17 08:42:35 Block _llgo_2:
2024/06/17 08:42:35 Return 
# Name: github.com/goplus/llgo/_pydemo/callpy.main
# Package: github.com/goplus/llgo/_pydemo/callpy
# Location: /root/llgo/_pydemo/callpy/callpy.go:9:6
func main():
0:                                                                entry P:0 S:0
        t0 = github.com/goplus/llgo/py.Float(2:float64) *github.com/goplus/llgo/py.Object
        t1 = github.com/goplus/llgo/py/math.Sqrt(t0) *github.com/goplus/llgo/py.Object
        t2 = github.com/goplus/llgo/c.Str("sqrt(2) = %f\n":string)        *int8
        t3 = (*github.com/goplus/llgo/py.Object).Float64(t1)            float64
        t4 = new [1]any (varargs)                                       *[1]any
        t5 = &t4[0:int]                                                    *any
        t6 = make any <- float64 (t3)                                       any
        *t5 = t6
        t7 = slice t4[:]                                                  []any
        t8 = github.com/goplus/llgo/c.Printf(t2, t7...) github.com/goplus/llgo/c._Ctype_int
        return

2024/06/17 08:42:35 ==> FuncBody main
2024/06/17 08:42:35 Block _llgo_0:
2024/06/17 08:42:35 Store *int32, @__llgo_argc = global i32 0, align 4, i32 %0
2024/06/17 08:42:35 Store ***int8, @__llgo_argv = global ptr null, align 8, ptr %1
2024/06/17 08:42:35 NewFunc github.com/goplus/llgo/internal/runtime.init func() hasFreeVars: false
2024/06/17 08:42:35 Call 8 func() github.com/goplus/llgo/internal/runtime.init
2024/06/17 08:42:35 Call 8 func() main.init
2024/06/17 08:42:35 >>> Do 0 github.com/goplus/llgo/py.Float [2:float64]
2024/06/17 08:42:35 NewFunc PyFloat_FromDouble func(v float64) *github.com/goplus/llgo/py.Object hasFreeVars: false
2024/06/17 08:42:35 Call 8 func(v float64) *github.com/goplus/llgo/py.Object PyFloat_FromDouble: double 2.000000e+00
2024/06/17 08:42:35 >>> Do 0 github.com/goplus/llgo/py/math.Sqrt [github.com/goplus/llgo/py.Float(2:float64)]
2024/06/17 08:42:35 Call 12 *func(x *github.com/goplus/llgo/py.Object) *github.com/goplus/llgo/py.Object __llgo_py.math.sqrt:   %2 = call ptr @PyFloat_FromDouble(double 2.000000e+00)
2024/06/17 08:42:35 Load @__llgo_py.math.sqrt = linkonce global ptr null, align 8
2024/06/17 08:42:35 NewFunc PyObject_CallOneArg func(*github.com/goplus/llgo/py.Object, *github.com/goplus/llgo/py.Object) *github.com/goplus/llgo/py.Object hasFreeVars: false
2024/06/17 08:42:35 Call 8 func(*github.com/goplus/llgo/py.Object, *github.com/goplus/llgo/py.Object) *github.com/goplus/llgo/py.Object PyObject_CallOneArg:   %3 = load ptr, ptr @__llgo_py.math.sqrt, align 8,   %2 = call ptr @PyFloat_FromDouble(double 2.000000e+00)
2024/06/17 08:42:35 >>> Do 0 github.com/goplus/llgo/c.Str ["sqrt(2) = %f\n":string]
2024/06/17 08:42:35 >>> Do 0 (*github.com/goplus/llgo/py.Object).Float64 [github.com/goplus/llgo/py/math.Sqrt(t0)]
2024/06/17 08:42:35 NewFunc PyFloat_AsDouble func(o *github.com/goplus/llgo/py.Object) float64 hasFreeVars: false
2024/06/17 08:42:35 Call 8 func(o *github.com/goplus/llgo/py.Object) float64 PyFloat_AsDouble:   %4 = call ptr @PyObject_CallOneArg(ptr %3, ptr %2)
2024/06/17 08:42:35 >>> Do 0 github.com/goplus/llgo/c.Printf [github.com/goplus/llgo/c.Str("sqrt(2) = %f\n":string) slice t4[:]]
2024/06/17 08:42:35 NewFunc printf func(format *int8, __llgo_va_list ...any) github.com/goplus/llgo/c._Ctype_int hasFreeVars: false
2024/06/17 08:42:35 Call 8 func(format *int8, __llgo_va_list ...any) github.com/goplus/llgo/c._Ctype_int printf: @0 = private unnamed_addr constant [14 x i8] c"sqrt(2) = %f\0A\00", align 1,   %5 = call double @PyFloat_AsDouble(ptr %4)
2024/06/17 08:42:35 Return i32 0
2024/06/17 08:42:35 NewFunc llgoLoadPyModSyms func(*github.com/goplus/llgo/py.Object, __llgo_va_list ...interface{}) hasFreeVars: false
2024/06/17 08:42:35 Load @__llgo_py.math = external global ptr, align 8
2024/06/17 08:42:35 Call 8 func(*github.com/goplus/llgo/py.Object, __llgo_va_list ...interface{}) llgoLoadPyModSyms:   %1 = load ptr, ptr @__llgo_py.math, align 8, @1 = private unnamed_addr constant [5 x i8] c"sqrt\00", align 1, @__llgo_py.math.sqrt = linkonce global ptr null, align 8, ptr null
2024/06/17 08:42:35 Return 
2024/06/17 08:42:35 NewFunc Py_Initialize func() hasFreeVars: false
2024/06/17 08:42:35 Call 8 func() Py_Initialize
# github.com/goplus/llgo/_pydemo/callpy
clang [-o /usr/local/go/bin/callpy -Wno-override-module -l python3.12 -L /lib/aarch64-linux-gnu /root/llgo/py/module.ll /root/llgo/py/llgo_autogen.ll /root/llgo/py/math/llgo_autogen.ll /root/.cache/go-build/17/178b7485d34d1a8d2681d8e151cf42ab54c0b81247475c7c3e5e6d554abdb773-d.ll]

env

linux version

Ubuntu 24.04 LTS

clang version

clang -v
Ubuntu clang version 17.0.6 (9ubuntu1)
Target: aarch64-unknown-linux-gnu
Thread model: posix
InstalledDir: /usr/lib/llvm-17/bin
Found candidate GCC installation: /usr/lib/gcc/aarch64-linux-gnu/13
Selected GCC installation: /usr/lib/gcc/aarch64-linux-gnu/13
Candidate multilib: .;@m64
Selected multilib: .;@m64

Dockerfile https://github.com/luoliwoshang/DockerFiles/blob/c2b6fc3f01dca6aa71c0f50c80840aaae22b5a67/ubuntu/normal/Dockerfile#L1-L39

aofei commented 2 weeks ago

I tested using the Dockerfile you provided, and it works fine on my end.

luoliwoshang commented 2 weeks ago

I tested using the Dockerfile you provided, and it works fine on my end.

Sorry, the llgo version(17f17bcc9e314c63a588d00a56b510e9e7f20f8f) I used is two days ago, and can be executed after the update is completed