summaryrefslogtreecommitdiff
path: root/usr/rsc
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2009-08-24 17:30:00 -0700
committerRuss Cox <rsc@golang.org>2009-08-24 17:30:00 -0700
commitb5581bb7ceb7984d71d4a1fe845deb77cf8a697b (patch)
treed050621c48935fe92a55747351ede747cb1c210f /usr/rsc
parent83b749573cef6ceeac24202b3bc14d2860828490 (diff)
downloadgolang-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.c20
-rw-r--r--usr/rsc/fib/Makefile36
-rw-r--r--usr/rsc/fib/gcc.c34
-rw-r--r--usr/rsc/fib/go.go8
-rw-r--r--usr/rsc/fib/main.go13
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));
+ }
+}