diff options
author | Russ Cox <rsc@golang.org> | 2009-08-24 17:30:00 -0700 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2009-08-24 17:30:00 -0700 |
commit | b5581bb7ceb7984d71d4a1fe845deb77cf8a697b (patch) | |
tree | d050621c48935fe92a55747351ede747cb1c210f /usr/rsc | |
parent | 83b749573cef6ceeac24202b3bc14d2860828490 (diff) | |
download | golang-b5581bb7ceb7984d71d4a1fe845deb77cf8a697b.tar.gz |
start of FFI support, and a demo.
R=r
DELTA=494 (492 added, 0 deleted, 2 changed)
OCL=33784
CL=33810
Diffstat (limited to 'usr/rsc')
-rw-r--r-- | usr/rsc/fib/6c.c | 20 | ||||
-rw-r--r-- | usr/rsc/fib/Makefile | 36 | ||||
-rw-r--r-- | usr/rsc/fib/gcc.c | 34 | ||||
-rw-r--r-- | usr/rsc/fib/go.go | 8 | ||||
-rw-r--r-- | usr/rsc/fib/main.go | 13 |
5 files changed, 111 insertions, 0 deletions
diff --git a/usr/rsc/fib/6c.c b/usr/rsc/fib/6c.c new file mode 100644 index 000000000..23ed84638 --- /dev/null +++ b/usr/rsc/fib/6c.c @@ -0,0 +1,20 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include "runtime.h" +#include "cgocall.h" + +// turn on ffi +#pragma dynld initcgo initcgo "libcgo.so" +#pragma dynld cgo cgo "libcgo.so" + +// pull in fib from fib.so +#pragma dynld extern_c_fib fib "fib.so" +void (*extern_c_fib)(void*); + +void +fibĀ·Fib(int32 n, int32, int32) +{ + cgocall(extern_c_fib, &n); +} diff --git a/usr/rsc/fib/Makefile b/usr/rsc/fib/Makefile new file mode 100644 index 000000000..0597633aa --- /dev/null +++ b/usr/rsc/fib/Makefile @@ -0,0 +1,36 @@ +# Copyright 2009 The Go Authors. All rights reserved. +# Use of this source code is governed by a BSD-style +# license that can be found in the LICENSE file. + +# FFI demo + +all: fib.a fib.so + +gcc.o: gcc.c + gcc -fPIC -O2 -o gcc.o -c gcc.c + +fib.so: gcc.o + gcc -shared -o fib.so gcc.o -L$(GOROOT)/pkg/$(GOOS)_$(GOARCH) -lcgo + +fib.a: 6c.6 go.6 + gopack grc fib.a 6c.6 go.6 + +6c.6: 6c.c + 6c -FVw -I$(GOROOT)/src/pkg/runtime 6c.c + +go.6: go.go + 6g go.go + +PKG=$(GOROOT)/pkg/$(GOOS)_$(GOARCH) + +install: $(PKG)/fib.so $(PKG)/fib.a + +$(PKG)/fib.so: fib.so + cp fib.so $@ + +$(PKG)/fib.a: fib.a + cp fib.a $@ + +clean: + rm -f *.6 *.o *.so *.a + diff --git a/usr/rsc/fib/gcc.c b/usr/rsc/fib/gcc.c new file mode 100644 index 000000000..a89839031 --- /dev/null +++ b/usr/rsc/fib/gcc.c @@ -0,0 +1,34 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +#include <stdint.h> + +typedef int32_t int32; + +static int32 +fib1(int32 n) +{ + int32 a, b, t; + + a = 0; + b = 1; + for(; n>0; n--) { + t = a; + a = b; + b += t; + } + return a; +} + +void +fib(void *v) +{ + struct { // 6g func(n int) int + int32 n; + int32 pad; + int32 ret; + } *args = v; + + args->ret = fib1(args->n); +} diff --git a/usr/rsc/fib/go.go b/usr/rsc/fib/go.go new file mode 100644 index 000000000..8145974f1 --- /dev/null +++ b/usr/rsc/fib/go.go @@ -0,0 +1,8 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package fib + +func Fib(n int) int + diff --git a/usr/rsc/fib/main.go b/usr/rsc/fib/main.go new file mode 100644 index 000000000..3ac5d5914 --- /dev/null +++ b/usr/rsc/fib/main.go @@ -0,0 +1,13 @@ +// Copyright 2009 The Go Authors. All rights reserved. +// Use of this source code is governed by a BSD-style +// license that can be found in the LICENSE file. + +package main + +import "fib" + +func main() { + for i := 0; i < 10; i++ { + println(fib.Fib(i)); + } +} |