summaryrefslogtreecommitdiff
path: root/src/cmd/cgo
diff options
context:
space:
mode:
Diffstat (limited to 'src/cmd/cgo')
-rw-r--r--src/cmd/cgo/ast.go1
-rw-r--r--src/cmd/cgo/gcc.go16
-rw-r--r--src/cmd/cgo/main.go38
-rw-r--r--src/cmd/cgo/out.go2
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"