Skip to content

Commit e8bffc8

Browse files
authored
Merge pull request #180 from Hywan/feat-cross-compilation
feat(cross-compilation) Allow cross-compilation!
2 parents 9f9f1fb + 15998ca commit e8bffc8

File tree

4 files changed

+148
-4
lines changed

4 files changed

+148
-4
lines changed

wasmer/config.go

+8-4
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ func (self *Config) inner() *C.wasm_config_t {
2929
// config.UseJITEngine()
3030
//
3131
func (self *Config) UseJITEngine() {
32-
C.wasm_config_set_engine(self._inner, C.JIT)
32+
C.wasm_config_set_engine(self.inner(), C.JIT)
3333
}
3434

3535
// UseNativeEngine sets the engine to Native in the configuration.
@@ -38,7 +38,7 @@ func (self *Config) UseJITEngine() {
3838
// config.UseNativeEngine()
3939
//
4040
func (self *Config) UseNativeEngine() {
41-
C.wasm_config_set_engine(self._inner, C.NATIVE)
41+
C.wasm_config_set_engine(self.inner(), C.NATIVE)
4242
}
4343

4444
// UseCraneliftCompiler sets the compiler to Cranelift in the configuration.
@@ -47,7 +47,7 @@ func (self *Config) UseNativeEngine() {
4747
// config.UseCraneliftCompiler()
4848
//
4949
func (self *Config) UseCraneliftCompiler() {
50-
C.wasm_config_set_engine(self._inner, C.CRANELIFT)
50+
C.wasm_config_set_engine(self.inner(), C.CRANELIFT)
5151
}
5252

5353
// UseLLVMCompiler sets the compiler to LLVM in the configuration.
@@ -56,5 +56,9 @@ func (self *Config) UseCraneliftCompiler() {
5656
// config.UseLLVMCompiler()
5757
//
5858
func (self *Config) UseLLVMCompiler() {
59-
C.wasm_config_set_engine(self._inner, C.LLVM)
59+
C.wasm_config_set_engine(self.inner(), C.LLVM)
60+
}
61+
62+
func (self *Config) UseTarget(target *Target) {
63+
C.wasm_config_set_target(self.inner(), target.inner())
6064
}

wasmer/engine_test.go

+21
Original file line numberDiff line numberDiff line change
@@ -37,3 +37,24 @@ func TestNativeEngine(t *testing.T) {
3737

3838
testEngine(t, NewNativeEngine())
3939
}
40+
41+
func TestEngineWithTarget(t *testing.T) {
42+
triple, err := NewTriple("aarch64-unknown-linux-gnu")
43+
assert.NoError(t, err)
44+
45+
cpuFeatures := NewCpuFeatures()
46+
assert.NoError(t, err)
47+
48+
target := NewTarget(triple, cpuFeatures)
49+
50+
config := NewConfig()
51+
config.UseTarget(target)
52+
53+
engine := NewEngineWithConfig(config)
54+
store := NewStore(engine)
55+
56+
module, err := NewModule(store, testGetBytes("tests.wasm"))
57+
assert.NoError(t, err)
58+
59+
_ = module
60+
}

wasmer/target.go

+101
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,101 @@
1+
package wasmer
2+
3+
// #include <wasmer_wasm.h>
4+
import "C"
5+
import "runtime"
6+
7+
type Target struct {
8+
_inner *C.wasm_target_t
9+
}
10+
11+
func newTarget(target *C.wasm_target_t) *Target {
12+
self := &Target{
13+
_inner: target,
14+
}
15+
16+
runtime.SetFinalizer(self, func(self *Target) {
17+
C.wasm_target_delete(self.inner())
18+
})
19+
20+
return self
21+
}
22+
23+
func NewTarget(triple *Triple, cpuFeatures *CpuFeatures) *Target {
24+
return newTarget(C.wasm_target_new(triple.inner(), cpuFeatures.inner()))
25+
}
26+
27+
func (self *Target) inner() *C.wasm_target_t {
28+
return self._inner
29+
}
30+
31+
type Triple struct {
32+
_inner *C.wasm_triple_t
33+
}
34+
35+
func newTriple(triple *C.wasm_triple_t) *Triple {
36+
self := &Triple{
37+
_inner: triple,
38+
}
39+
40+
runtime.SetFinalizer(self, func(self *Triple) {
41+
C.wasm_triple_delete(self.inner())
42+
})
43+
44+
return self
45+
}
46+
47+
func NewTriple(triple string) (*Triple, error) {
48+
cTripleName := newName(triple)
49+
defer C.wasm_name_delete(&cTripleName)
50+
51+
cTriple := C.wasm_triple_new(&cTripleName)
52+
53+
if cTriple == nil {
54+
return nil, newErrorFromWasmer()
55+
}
56+
57+
return newTriple(cTriple), nil
58+
}
59+
60+
func NewTripleFromHost() *Triple {
61+
return newTriple(C.wasm_triple_new_from_host())
62+
}
63+
64+
func (self *Triple) inner() *C.wasm_triple_t {
65+
return self._inner
66+
}
67+
68+
type CpuFeatures struct {
69+
_inner *C.wasm_cpu_features_t
70+
}
71+
72+
func newCpuFeatures(cpu_features *C.wasm_cpu_features_t) *CpuFeatures {
73+
self := &CpuFeatures{
74+
_inner: cpu_features,
75+
}
76+
77+
runtime.SetFinalizer(self, func(self *CpuFeatures) {
78+
C.wasm_cpu_features_delete(self.inner())
79+
})
80+
81+
return self
82+
}
83+
84+
func NewCpuFeatures() *CpuFeatures {
85+
return newCpuFeatures(C.wasm_cpu_features_new())
86+
}
87+
88+
func (self *CpuFeatures) Add(feature string) error {
89+
cFeature := newName(feature)
90+
defer C.wasm_name_delete(&cFeature)
91+
92+
if !C.wasm_cpu_features_add(self.inner(), &cFeature) {
93+
return newErrorFromWasmer()
94+
}
95+
96+
return nil
97+
}
98+
99+
func (self *CpuFeatures) inner() *C.wasm_cpu_features_t {
100+
return self._inner
101+
}

wasmer/target_test.go

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
package wasmer
2+
3+
import (
4+
"github.com/stretchr/testify/assert"
5+
"testing"
6+
)
7+
8+
func testTarget(t *testing.T) {
9+
triple, err := NewTriple("x86_64-apple-darwin")
10+
assert.NoError(t, err)
11+
12+
cpuFeatures := NewCpuFeatures()
13+
cpuFeatures.Add("sse2")
14+
15+
target := NewTarget(triple, cpuFeatures)
16+
17+
_ = target
18+
}

0 commit comments

Comments
 (0)