summaryrefslogtreecommitdiff
path: root/src/cmd/cgo/main.go
diff options
context:
space:
mode:
authorRuss Cox <rsc@golang.org>2009-10-03 10:37:12 -0700
committerRuss Cox <rsc@golang.org>2009-10-03 10:37:12 -0700
commite7a28869ec5829d4e202b44797b748522a533b2a (patch)
tree7b69b0974f4999bac76d11abed2071a2dc9e97aa /src/cmd/cgo/main.go
parente6310aac93e28c68953277b30e2eaf8bdd9f106a (diff)
downloadgo-e7a28869ec5829d4e202b44797b748522a533b2a.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/main.go')
-rw-r--r--src/cmd/cgo/main.go38
1 files changed, 27 insertions, 11 deletions
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);
}