mailru / easyjson

Fast JSON serializer for golang.
MIT License
4.39k stars 415 forks source link

tinygo support? #335

Open dkegel-fastly opened 3 years ago

dkegel-fastly commented 3 years ago

It would be nice if easyjson worked in tinygo so it could be used on embedded systems that normal go does not target.

Easygo's tests do not yet run in tinygo. Attempting e.g.

tinygo test ./buffer

fails with

../../../../../../../Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/netdb.h:217:17: unexpected token ILLEGAL

Trying a minimal example without tests also fails, e.g.

$ more go.mod
module example.com/jsondemo

go 1.16

require github.com/mailru/easyjson v0.7.7 // indirect

$ more main.go
package main

import "example.com/jsondemo/demo"

func main() {
        demo.Hello()
}

$ more demo/demo.go 
package demo

import "fmt"
import "log"

type AwesomeStruct struct {
        Foo string
        Bar string
}

func Hello() {
        foo := AwesomeStruct{
                Foo: "buz",
                Bar: "",
        }
        marshaled, err := foo.MarshalJSON()
        if err != nil {
                log.Fatal(err)
        }
        fmt.Printf("%s\n", marshaled) // => {"foo":"buz"}
}

$ easyjson -all demo/demo.go 

$ go run main.go
{"Foo":"buz","Bar":""}

$ tinygo run main.go
# net
../../../../../../../Library/Developer/CommandLineTools/SDKs/MacOSX10.15.sdk/usr/include/netdb.h:217:17: unexpected token ILLEGAL
ppedziwiatr commented 2 years ago

I'm still having issues with tinygo and easyjson. Trying to build the example from this issue (go 1.17) ends up with

tinygo build -o test main.go
Undefined symbols for architecture x86_64:
  "_crypto/x509/internal/macos.x509_CFStringCreateWithBytes_trampoline", referenced from:
      _crypto/x509/internal/macos$pack in main.o
  "_internal/abi.FuncPCABI0", referenced from:
      _crypto/x509/internal/macos.StringToCFString in main.o
  "_crypto/ed25519/internal/edwards25519/field.feSquare", referenced from:
      _(*crypto/ed25519/internal/edwards25519/field.Element).Square in main.o
  "_crypto/ed25519/internal/edwards25519/field.feMul", referenced from:
      _(*crypto/ed25519/internal/edwards25519/field.Element).Multiply in main.o
  "_vendor/golang.org/x/sys/cpu.xgetbv", referenced from:
      _runtime.run$1$gowrapper in main.o
  "_crypto/x509/internal/macos.syscall", referenced from:
      _crypto/x509/internal/macos.StringToCFString in main.o
  "_vendor/golang.org/x/sys/cpu.darwinSupportsAVX512", referenced from:
      _runtime.run$1$gowrapper in main.o
  "_vendor/golang.org/x/sys/cpu.cpuid", referenced from:
      _runtime.run$1$gowrapper in main.o
ld: symbol(s) not found for architecture x86_64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
error: failed to link /var/folders/65/fslm_l1d40x_xjx2x8w4s5g00000gn/T/tinygo2000666702/main: exit status 1
dkegel-fastly commented 2 years ago

The tinygo pull requests mentioned that they got things working on linux and wasi but not mac, fwiw.

dvob commented 2 years ago

I'm also still having this issue with Go 1.18.3 and tinygo 0.23.0

$ tinygo run main.go 
tinygo:ld.lld: error: undefined symbol: vendor/golang.org/x/sys/cpu.cpuid
>>> referenced by cpu_x86.go:64 (/usr/lib/go/src/vendor/golang.org/x/sys/cpu/cpu_x86.go:64)
>>>               /home/david/.cache/tinygo/thinlto/llvmcache-B1DAA9FCDD26FCE588056B11F8335D13B495CB67:(runtime.run$1$gowrapper)
>>> referenced by cpu_x86.go:70 (/usr/lib/go/src/vendor/golang.org/x/sys/cpu/cpu_x86.go:70)
>>>               /home/david/.cache/tinygo/thinlto/llvmcache-B1DAA9FCDD26FCE588056B11F8335D13B495CB67:(runtime.run$1$gowrapper)
>>> referenced by cpu_x86.go:109 (/usr/lib/go/src/vendor/golang.org/x/sys/cpu/cpu_x86.go:109)
>>>               /home/david/.cache/tinygo/thinlto/llvmcache-B1DAA9FCDD26FCE588056B11F8335D13B495CB67:(runtime.run$1$gowrapper)
>>> referenced 1 more times

tinygo:ld.lld: error: undefined symbol: vendor/golang.org/x/sys/cpu.xgetbv
>>> referenced by cpu_x86.go:88 (/usr/lib/go/src/vendor/golang.org/x/sys/cpu/cpu_x86.go:88)
>>>               /home/david/.cache/tinygo/thinlto/llvmcache-B1DAA9FCDD26FCE588056B11F8335D13B495CB67:(runtime.run$1$gowrapper)

tinygo:ld.lld: error: undefined symbol: crypto/ed25519/internal/edwards25519/field.feSquare
>>> referenced by fe.go:305 (/usr/lib/go/src/crypto/ed25519/internal/edwards25519/field/fe.go:305)
>>>               /home/david/.cache/tinygo/thinlto/llvmcache-B1DAA9FCDD26FCE588056B11F8335D13B495CB67:((*crypto/ed25519/internal/edwards25519/field.Element).Square)

tinygo:ld.lld: error: undefined symbol: crypto/ed25519/internal/edwards25519/field.feMul
>>> referenced by fe.go:299 (/usr/lib/go/src/crypto/ed25519/internal/edwards25519/field/fe.go:299)
>>>               /home/david/.cache/tinygo/thinlto/llvmcache-B1DAA9FCDD26FCE588056B11F8335D13B495CB67:((*crypto/ed25519/internal/edwards25519/field.Element).Multiply)
failed to run tool: ld.lld
error: failed to link /tmp/tinygo3092260760/main: exit status 1
dkegel-fastly commented 2 years ago

dvob, are you on mac?

dvob commented 2 years ago

dvob, are you on mac?

@dkegel-fastly no, on linux

dselans commented 1 year ago

Same - issues using tinygo with @dkegel-fastly 's example:

~/Code/batch/easyjson-test                                                                                                    ⍉
❯ tinygo version
tinygo version 0.27.0 darwin/amd64 (using go version go1.20.4 and LLVM version 15.0.0)

~/Code/batch/easyjson-test
❯ tinygo run main.go
tinygo:ld.lld: error: undefined symbol: _vendor/golang.org/x/sys/cpu.cpuid
>>> referenced by cpu_x86.go:109 (/usr/local/go/src/vendor/golang.org/x/sys/cpu/cpu_x86.go:109)
>>>               /Users/dselans/Library/Caches/tinygo/thinlto/llvmcache-D836F2F57011FE0EF4FB5298B85CE500A673F1D5:(symbol _runtime.run$1$gowrapper+0x291)
>>> referenced by cpu_x86.go:70 (/usr/local/go/src/vendor/golang.org/x/sys/cpu/cpu_x86.go:70)
>>>               /Users/dselans/Library/Caches/tinygo/thinlto/llvmcache-D836F2F57011FE0EF4FB5298B85CE500A673F1D5:(symbol _runtime.run$1$gowrapper+0x1a2)
>>> referenced by cpu_x86.go:64 (/usr/local/go/src/vendor/golang.org/x/sys/cpu/cpu_x86.go:64)
>>>               /Users/dselans/Library/Caches/tinygo/thinlto/llvmcache-D836F2F57011FE0EF4FB5298B85CE500A673F1D5:(symbol _runtime.run$1$gowrapper+0x17e)

tinygo:ld.lld: error: undefined symbol: _vendor/golang.org/x/sys/cpu.xgetbv
>>> referenced by cpu_x86.go:88 (/usr/local/go/src/vendor/golang.org/x/sys/cpu/cpu_x86.go:88)
>>>               /Users/dselans/Library/Caches/tinygo/thinlto/llvmcache-D836F2F57011FE0EF4FB5298B85CE500A673F1D5:(symbol _runtime.run$1$gowrapper+0x254)

tinygo:ld.lld: error: undefined symbol: _crypto/internal/edwards25519/field.feSquare
>>> referenced by fe.go:309 (/usr/local/go/src/crypto/internal/edwards25519/field/fe.go:309)
>>>               /Users/dselans/Library/Caches/tinygo/thinlto/llvmcache-D836F2F57011FE0EF4FB5298B85CE500A673F1D5:(symbol _(*crypto/internal/edwards25519/field.Element).Square+0x5)

tinygo:ld.lld: error: undefined symbol: _crypto/internal/edwards25519/field.feMul
>>> referenced by fe.go:303 (/usr/local/go/src/crypto/internal/edwards25519/field/fe.go:303)
>>>               /Users/dselans/Library/Caches/tinygo/thinlto/llvmcache-D836F2F57011FE0EF4FB5298B85CE500A673F1D5:(symbol _(*crypto/internal/edwards25519/field.Element).Multiply+0x5)

tinygo:ld.lld: error: undefined symbol: _crypto/x509/internal/macos.syscall
>>> referenced by corefoundation.go:77 (/usr/local/go/src/crypto/x509/internal/macos/corefoundation.go:77)
>>>               /Users/dselans/Library/Caches/tinygo/thinlto/llvmcache-D836F2F57011FE0EF4FB5298B85CE500A673F1D5:(symbol _crypto/x509/internal/macos.StringToCFString+0x33)

tinygo:ld.lld: error: undefined symbol: _internal/abi.FuncPCABI0
>>> referenced by corefoundation.go:77 (/usr/local/go/src/crypto/x509/internal/macos/corefoundation.go:77)
>>>               /Users/dselans/Library/Caches/tinygo/thinlto/llvmcache-D836F2F57011FE0EF4FB5298B85CE500A673F1D5:(symbol _crypto/x509/internal/macos.StringToCFString+0x17)

tinygo:ld.lld: error: undefined symbol: _crypto/x509/internal/macos.x509_CFStringCreateWithBytes_trampoline
>>> referenced by /<unknown>
>>>               /Users/dselans/Library/Caches/tinygo/thinlto/llvmcache-D836F2F57011FE0EF4FB5298B85CE500A673F1D5:(symbol _crypto/x509/internal/macos$pack.6+0x8)
failed to run tool: ld.lld
error: failed to link /var/folders/f5/kj28b7cd72b133qnwx6t81wc0000gn/T/tinygo1400670608/main: exit status 1
chipaca commented 7 months ago

The x/sys/cpu.cpuid error can be avoided with -tags=purego, FWIW