diff options
author | Russ Cox <rsc@golang.org> | 2009-10-03 10:37:12 -0700 |
---|---|---|
committer | Russ Cox <rsc@golang.org> | 2009-10-03 10:37:12 -0700 |
commit | 1bb8f19f5e9016a9eb118b8aba2b5689b4505812 (patch) | |
tree | 7b69b0974f4999bac76d11abed2071a2dc9e97aa /src/cmd/cgo | |
parent | 6b7539d607f26a1b1cd3eda71fc123ad4d52a133 (diff) | |
download | golang-1bb8f19f5e9016a9eb118b8aba2b5689b4505812.tar.gz |
8c, 8l dynamic loading support.
better mach binaries.
cgo working on darwin+linux amd64+386.
eliminated context switches - pi is 30x faster.
add libcgo to build.
on snow leopard:
- non-cgo binaries work; all tests pass.
- cgo binaries work on amd64 but not 386.
R=r
DELTA=2031 (1316 added, 626 deleted, 89 changed)
OCL=35264
CL=35304
Diffstat (limited to 'src/cmd/cgo')
-rw-r--r-- | src/cmd/cgo/ast.go | 1 | ||||
-rw-r--r-- | src/cmd/cgo/gcc.go | 16 | ||||
-rw-r--r-- | src/cmd/cgo/main.go | 38 | ||||
-rw-r--r-- | src/cmd/cgo/out.go | 2 |
4 files changed, 43 insertions, 14 deletions
diff --git a/src/cmd/cgo/ast.go b/src/cmd/cgo/ast.go index 9b122676c..57500680b 100644 --- a/src/cmd/cgo/ast.go +++ b/src/cmd/cgo/ast.go @@ -36,6 +36,7 @@ type Prog struct { Vardef map[string]*Type; Funcdef map[string]*FuncType; PtrSize int64; + GccOptions []string; } // A Type collects information about a type in both the C and Go worlds. diff --git a/src/cmd/cgo/gcc.go b/src/cmd/cgo/gcc.go index e3f526845..f573b98cb 100644 --- a/src/cmd/cgo/gcc.go +++ b/src/cmd/cgo/gcc.go @@ -172,6 +172,17 @@ func (p *Prog) loadDebugInfo() { p.Typedef = conv.typedef; } +func concat(a, b []string) []string { + c := make([]string, len(a)+len(b)); + for i, s := range a { + c[i] = s; + } + for i, s := range b { + c[i+len(a)] = s; + } + return c; +} + // gccDebug runs gcc -gdwarf-2 over the C program stdin and // returns the corresponding DWARF data and any messages // printed to standard error. @@ -182,7 +193,7 @@ func (p *Prog) gccDebug(stdin []byte) (*dwarf.Data, string) { } tmp := "_cgo_.o"; - _, stderr, ok := run(stdin, []string{ + base := []string{ "gcc", machine, "-Wall", // many warnings @@ -192,7 +203,8 @@ func (p *Prog) gccDebug(stdin []byte) (*dwarf.Data, string) { "-c", // do not link "-xc", // input language is C "-", // read input from standard input - }); + }; + _, stderr, ok := run(stdin, concat(base, p.GccOptions)); if !ok { return nil, string(stderr); } diff --git a/src/cmd/cgo/main.go b/src/cmd/cgo/main.go index b629f0a22..eb04fa77d 100644 --- a/src/cmd/cgo/main.go +++ b/src/cmd/cgo/main.go @@ -11,15 +11,13 @@ package main import ( - "flag"; "fmt"; "go/ast"; "os"; ) func usage() { - fmt.Fprint(os.Stderr, "usage: cgo file.cgo\n"); - flag.PrintDefaults(); + fmt.Fprint(os.Stderr, "usage: cgo [compiler options] file.go\n"); } var ptrSizeMap = map[string]int64 { @@ -28,9 +26,24 @@ var ptrSizeMap = map[string]int64 { "arm": 4 } +var expandName = map[string]string { + "schar": "signed char", + "uchar": "unsigned char", + "ushort": "unsigned short", + "uint": "unsigned int", + "ulong": "unsigned long", + "longlong": "long long", + "ulonglong": "unsigned long long", +} + func main() { - flag.Usage = usage; - flag.Parse(); + args := os.Args; + if len(args) < 2 { + usage(); + os.Exit(2); + } + gccOptions := args[1:len(args)-1]; + input := args[len(args)-1]; arch := os.Getenv("GOARCH"); if arch == "" { @@ -41,14 +54,17 @@ func main() { fatal("unknown architecture %s", arch); } - args := flag.Args(); - if len(args) != 1 { - usage(); - os.Exit(2); + p := openProg(input); + for _, cref := range p.Crefs { + // Convert C.ulong to C.unsigned long, etc. + if expand, ok := expandName[cref.Name]; ok { + cref.Name = expand; + } } - p := openProg(args[0]); + p.PtrSize = ptrSize; p.Preamble = p.Preamble + "\n" + builtinProlog; + p.GccOptions = gccOptions; p.loadDebugInfo(); p.Vardef = make(map[string]*Type); p.Funcdef = make(map[string]*FuncType); @@ -83,5 +99,5 @@ func main() { } p.PackagePath = p.Package; - p.writeOutput(args[0]); + p.writeOutput(input); } diff --git a/src/cmd/cgo/out.go b/src/cmd/cgo/out.go index 91473abeb..d2eedc331 100644 --- a/src/cmd/cgo/out.go +++ b/src/cmd/cgo/out.go @@ -198,7 +198,7 @@ const cProlog = ` #include "cgocall.h" #pragma dynld initcgo initcgo "%s/libcgo.so" -#pragma dynld cgo cgo "%s/libcgo.so" +#pragma dynld libcgo_thread_start libcgo_thread_start "%s/libcgo.so" #pragma dynld _cgo_malloc _cgo_malloc "%s/libcgo.so" #pragma dynld _cgo_free free "%s/libcgo.so" |