Skip to content

Commit

Permalink
fix: suppor aarch64 build
Browse files Browse the repository at this point in the history
  • Loading branch information
liuq19 committed Apr 8, 2024
1 parent 672f332 commit 28bdb2a
Show file tree
Hide file tree
Showing 12 changed files with 126 additions and 156 deletions.
8 changes: 4 additions & 4 deletions dev/Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -10,19 +10,19 @@ rustup:

linux_x86:
mkdir -p ./rs_wrapper/lib/linux
cd rs_wrapper && cargo update --package sonic-rs && RUSTFLAGS="-C target-cpu=haswell" cargo build --target=x86_64-unknown-linux-gnu --release && cp -a target/x86_64-unknown-linux-gnu/release/librs_wrapper.a ./lib/linux/libsonic_rs_x86_64-unknown-linux-gnu.a
cd rs_wrapper && cargo update --package sonic-rs && RUSTFLAGS="-C target-cpu=haswell" cargo build --target=x86_64-unknown-linux-gnu --release && cp -a target/aarch64-unknown-linux-gnu/release/librs_wrapper.so ../internal/link/libsonic_rs_x86_64-unknown-linux-gnu.so

linux_aarch64:
mkdir -p ./rs_wrapper/lib/linux
cd rs_wrapper && cargo update --package sonic-rs && RUSTFLAGS="-C target-feature=+neon" cargo build --target=aarch64-unknown-linux-gnu --release && cp -a target/aarch64-unknown-linux-gnu/release/librs_wrapper.so ../internal/link/librs_wrapper.so && cp -a target/aarch64-unknown-linux-gnu/release/librs_wrapper.so ./lib/linux/libsonic_rs_aarch64-unknown-linux-gnu.so
cd rs_wrapper && cargo update --package sonic-rs && RUSTFLAGS="-C target-feature=+neon" cargo build --target=aarch64-unknown-linux-gnu --release && cp -a target/aarch64-unknown-linux-gnu/release/librs_wrapper.so ../internal/link/libsonic_rs_aarch64-unknown-linux-gnu.so

darwin_x86:
mkdir -p ./rs_wrapper/lib/darwin
cd rs_wrapper && cargo update --package sonic-rs && RUSTFLAGS="-C target-cpu=haswell" cargo build --target=x86_64-apple-darwin --release && cp -a target/x86_64-apple-darwin/release/librs_wrapper.a ./lib/darwin/libsonic_rs_x86_64-apple-darwin.a
cd rs_wrapper && cargo update --package sonic-rs && RUSTFLAGS="-C target-cpu=haswell" cargo build --target=x86_64-apple-darwin --release && cp -a target/aarch64-unknown-linux-gnu/release/librs_wrapper.so ../internal/link/libsonic_rs_x86_64-unknown-darwin-gnu.so

darwin_aarch64:
mkdir -p ./rs_wrapper/lib/darwin
cd rs_wrapper && cargo update --package sonic-rs && RUSTFLAGS="-C target-feature=+neon" cargo build --target=aarch64-apple-darwin --release && cp -a target/aarch64-apple-darwin/release/librs_wrapper.a ./lib/darwin/libsonic_rs_aarch64-apple-darwin.a
cd rs_wrapper && cargo update --package sonic-rs && RUSTFLAGS="-C target-feature=+neon" cargo build --target=aarch64-apple-darwin --release && cp -a target/aarch64-unknown-linux-gnu/release/librs_wrapper.so ../internal/link/libsonic_rs_aarch64-unknown-darwin-gnu.so

clean:
rm -vrf ./rs_wrapper/lib/
Expand Down
84 changes: 0 additions & 84 deletions dev/ccall/asm.s

This file was deleted.

17 changes: 0 additions & 17 deletions dev/ccall/ccall.go

This file was deleted.

Empty file added dev/internal/ccall/asm.s
Empty file.
13 changes: 13 additions & 0 deletions dev/internal/ccall/ccall.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
package ccall

import "unsafe"

//go:linkname Cgo_runtime_cgocall runtime.cgocall
//go:noescape
func Cgo_runtime_cgocall(unsafe.Pointer, uintptr) int32

//go:linkname Cgo_always_false runtime.cgoAlwaysFalse
var Cgo_always_false bool

//go:linkname Cgo_use runtime.cgoUse
func Cgo_use(interface{})
1 change: 1 addition & 0 deletions dev/internal/link/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
!*.so
Original file line number Diff line number Diff line change
@@ -1,11 +1,9 @@
package link


import (
_ "embed"
)

//go:embed librs_wrapper.so
//go:embed libsonic_rs_aarch64-unknown-linux-gnu.so
var sonic_rs_blob []byte


Binary file not shown.
12 changes: 11 additions & 1 deletion dev/internal/link/link.go
Original file line number Diff line number Diff line change
Expand Up @@ -27,4 +27,14 @@ func Link(blob []byte, names []string) []unsafe.Pointer {
return cfuncs
}

func AddPcSp()

var Sonic_rs_parse unsafe.Pointer
var Sonic_rs_free unsafe.Pointer

func init() {
syms := Link(sonic_rs_blob, []string{"sonic_rs_ffi_parse", "sonic_rs_ffi_free"})
Sonic_rs_parse = syms[0]
Sonic_rs_free = syms[1]
println("symbols are ", Sonic_rs_parse, Sonic_rs_free)
}

63 changes: 42 additions & 21 deletions dev/internal/sonic_rs.go
Original file line number Diff line number Diff line change
@@ -1,10 +1,5 @@
package internal

//#cgo linux,arm64 LDFLAGS: -L ../rs_wrapper/lib/linux -lsonic_rs_aarch64-unknown-linux-gnu
//#cgo linux,amd64 LDFLAGS: -L ../rs_wrapper/lib/linux -lsonic_rs_x86_64-unknown-linux-gnu
//#cgo darwin,arm64 LDFLAGS: -L ../rs_wrapper/lib/darwin -lsonic_rs_aarch64-apple-darwin
//#cgo darwin,amd64 LDFLAGS: -L ../rs_wrapper/lib/darwin -lsonic_rs_x86_64-apple-darwin
//
//#include "../rs_wrapper/include/sonic_rs.h"
import "C"
import (
Expand All @@ -14,23 +9,52 @@ import (
"runtime"
"unsafe"

"github.com/bytedance/sonic/dev/internal/ccall"
"github.com/bytedance/sonic/dev/internal/link"
"github.com/bytedance/sonic/dev/internal/rt"
_ "github.com/davecgh/go-spew/spew"
)

func Cgo_func(arg uintptr) uintptr {
return uintptr(C.func_1args(C.size_t(arg)))

type parseArgs struct {
json *C.char
len C.uint64_t
config C.uint64_t
dom C.Document
}

var parse_func func(data string, opt uint64) (Dom, error)
var delete_func func(*Dom)
type freeArgs struct {
dom *C.Document
msg *C.char
cap C.uint64_t
}

var cgo_parse unsafe.Pointer
var cgo_delet unsafe.Pointer
//go:noinline
func sonic_rs_ffi_parse(p0 *C.char, p1 C.size_t, p2 C.uint64_t) (r1 C.Document) {
args := parseArgs {
json: p0,
len: C.uint64_t(p1),
config: p2,
}
ccall.Cgo_runtime_cgocall(link.Sonic_rs_parse, uintptr(unsafe.Pointer(&args)))
if ccall.Cgo_always_false {
ccall.Cgo_use(args)
}
return args.dom
}

func init() {
parse_func = Parse
delete_func = Delete
//go:noinline
func sonic_rs_ffi_free(p0 unsafe.Pointer, p1 *C.char, p2 C.uint64_t) {
args := freeArgs {
dom: (*C.Document)(p0),
msg: p1,
cap: p2,
}
ccall.Cgo_runtime_cgocall(link.Sonic_rs_free, uintptr(unsafe.Pointer(&args)))
if ccall.Cgo_always_false {
ccall.Cgo_use(args)
}
return
}

type Context struct {
Expand All @@ -41,7 +65,7 @@ type Context struct {
}

func NewContext(json string, opts uint64) (Context, error) {
dom, err := parse_func(json, opts)
dom, err := Parse(json, opts)
if err != nil {
return Context{}, err
}
Expand Down Expand Up @@ -88,7 +112,7 @@ func (dom *Dom) StrStart() uintptr {
}

func (dom *Dom) Delete() {
delete_func(dom)
sonic_rs_ffi_free(dom.cdom.dom, dom.cdom.str_buf, dom.cdom.error_msg_cap)
}

type Array struct {
Expand All @@ -110,12 +134,12 @@ func (arr Array) Len() int {
}

func Delete(dom *Dom) {
C.sonic_rs_ffi_free(dom.cdom.dom, dom.cdom.str_buf, dom.cdom.error_msg_cap)
sonic_rs_ffi_free(dom.cdom.dom, dom.cdom.str_buf, dom.cdom.error_msg_cap)
}

func Parse(data string, opt uint64) (Dom, error) {
var s = (*reflect.StringHeader)((unsafe.Pointer)(&data))
cdom := C.sonic_rs_ffi_parse((*C.char)(unsafe.Pointer((s.Data))), C.size_t(s.Len), C.uint64_t(opt))
cdom := sonic_rs_ffi_parse((*C.char)(unsafe.Pointer((s.Data))), C.size_t(s.Len), C.uint64_t(opt))
runtime.KeepAlive(data)
ret := Dom{
cdom: cdom,
Expand All @@ -130,9 +154,6 @@ func Parse(data string, opt uint64) (Dom, error) {
}

return ret, nil
// return Dom{
// cdom: C.Document {},
// }, nil
}

// / Helper functions to eliminate CGO calls
Expand Down
12 changes: 12 additions & 0 deletions dev/rs_wrapper/include/types.h
Original file line number Diff line number Diff line change
Expand Up @@ -72,3 +72,15 @@ typedef struct {
uint64_t error_msg_cap;
} Document;

typedef struct {
char* json; /* Non NULL terminated */
uint64_t len;
uint64_t config;
Document dom;
} ParseArgs;

typedef struct {
Document* dom; /* Non NULL terminated */
char* error_msg;
uint64_t msg_cap;
} FreeArgs;
Loading

0 comments on commit 28bdb2a

Please sign in to comment.