cgo: can look up C identifier kind (type or value) and type
gmp.go:197:4: type mpz_t C type mpz_t
gmp.go:205:2: call mpz_init C value func(mpz_ptr) void
gmp.go:206:2: call mpz_set C value func(mpz_ptr, mpz_srcptr) void
gmp.go:221:2: call mpz_init C value func(mpz_ptr) void
gmp.go:227:7: call size_t C type size_t
gmp.go:228:2: call mpz_export C value func(*void, *size_t, int, size_t, int, size_t, mpz_srcptr) *void
gmp.go:235:13: call mpz_sizeinbase C value func(mpz_srcptr, int) size_t
gmp.go:241:2: call mpz_set C value func(mpz_ptr, mpz_srcptr) void
gmp.go:252:3: call mpz_import C value func(mpz_ptr, size_t, int, size_t, int, size_t, *const void) void
gmp.go:261:2: call mpz_set_si C value func(mpz_ptr, long int) void
gmp.go:273:5: call mpz_set_str C value func(mpz_ptr, *const char, int) int
gmp.go:282:9: call mpz_get_str C value func(*char, int, mpz_srcptr) *char
gmp.go:287:3: call mpz_clear C value func(mpz_ptr) void
gmp.go:302:2: call mpz_add C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:311:2: call mpz_sub C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:320:2: call mpz_mul C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:329:2: call mpz_tdiv_q C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:339:2: call mpz_tdiv_r C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:348:2: call mpz_mul_2exp C value func(mpz_ptr, mpz_srcptr, long unsigned int) void
gmp.go:356:2: call mpz_div_2exp C value func(mpz_ptr, mpz_srcptr, long unsigned int) void
gmp.go:367:3: call mpz_pow_ui C value func(mpz_ptr, mpz_srcptr, long unsigned int) void
gmp.go:369:3: call mpz_powm C value func(mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr) void
gmp.go:378:2: call mpz_neg C value func(mpz_ptr, mpz_srcptr) void
gmp.go:386:2: call mpz_abs C value func(mpz_ptr, mpz_srcptr) void
gmp.go:404:9: call mpz_cmp C value func(mpz_srcptr, mpz_srcptr) int
gmp.go:413:2: call mpz_tdiv_qr C value func(mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:426:2: call mpz_gcdext C value func(mpz_ptr, mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr) void
R=r
DELTA=938 (628 added, 308 deleted, 2 changed)
OCL=34733
CL=34791
2009-09-18 12:52:00 -06:00
|
|
|
// 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.
|
|
|
|
|
2009-09-24 12:43:19 -06:00
|
|
|
// Cgo; see gmp.go for an overview.
|
|
|
|
|
|
|
|
// TODO(rsc):
|
|
|
|
// Emit correct line number annotations.
|
|
|
|
// Make 6g understand the annotations.
|
|
|
|
|
cgo: can look up C identifier kind (type or value) and type
gmp.go:197:4: type mpz_t C type mpz_t
gmp.go:205:2: call mpz_init C value func(mpz_ptr) void
gmp.go:206:2: call mpz_set C value func(mpz_ptr, mpz_srcptr) void
gmp.go:221:2: call mpz_init C value func(mpz_ptr) void
gmp.go:227:7: call size_t C type size_t
gmp.go:228:2: call mpz_export C value func(*void, *size_t, int, size_t, int, size_t, mpz_srcptr) *void
gmp.go:235:13: call mpz_sizeinbase C value func(mpz_srcptr, int) size_t
gmp.go:241:2: call mpz_set C value func(mpz_ptr, mpz_srcptr) void
gmp.go:252:3: call mpz_import C value func(mpz_ptr, size_t, int, size_t, int, size_t, *const void) void
gmp.go:261:2: call mpz_set_si C value func(mpz_ptr, long int) void
gmp.go:273:5: call mpz_set_str C value func(mpz_ptr, *const char, int) int
gmp.go:282:9: call mpz_get_str C value func(*char, int, mpz_srcptr) *char
gmp.go:287:3: call mpz_clear C value func(mpz_ptr) void
gmp.go:302:2: call mpz_add C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:311:2: call mpz_sub C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:320:2: call mpz_mul C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:329:2: call mpz_tdiv_q C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:339:2: call mpz_tdiv_r C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:348:2: call mpz_mul_2exp C value func(mpz_ptr, mpz_srcptr, long unsigned int) void
gmp.go:356:2: call mpz_div_2exp C value func(mpz_ptr, mpz_srcptr, long unsigned int) void
gmp.go:367:3: call mpz_pow_ui C value func(mpz_ptr, mpz_srcptr, long unsigned int) void
gmp.go:369:3: call mpz_powm C value func(mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr) void
gmp.go:378:2: call mpz_neg C value func(mpz_ptr, mpz_srcptr) void
gmp.go:386:2: call mpz_abs C value func(mpz_ptr, mpz_srcptr) void
gmp.go:404:9: call mpz_cmp C value func(mpz_srcptr, mpz_srcptr) int
gmp.go:413:2: call mpz_tdiv_qr C value func(mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:426:2: call mpz_gcdext C value func(mpz_ptr, mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr) void
R=r
DELTA=938 (628 added, 308 deleted, 2 changed)
OCL=34733
CL=34791
2009-09-18 12:52:00 -06:00
|
|
|
package main
|
|
|
|
|
|
|
|
import (
|
2010-12-10 12:32:58 -07:00
|
|
|
"crypto/md5"
|
2010-07-14 18:17:53 -06:00
|
|
|
"flag"
|
2009-12-15 16:33:31 -07:00
|
|
|
"fmt"
|
|
|
|
"go/ast"
|
2010-07-14 18:17:53 -06:00
|
|
|
"go/token"
|
2010-12-10 12:32:58 -07:00
|
|
|
"io"
|
2009-12-15 16:33:31 -07:00
|
|
|
"os"
|
2011-06-16 18:17:33 -06:00
|
|
|
"path/filepath"
|
2010-07-14 18:17:53 -06:00
|
|
|
"reflect"
|
2011-09-19 09:50:59 -06:00
|
|
|
"runtime"
|
2009-12-17 14:20:56 -07:00
|
|
|
"strings"
|
cgo: can look up C identifier kind (type or value) and type
gmp.go:197:4: type mpz_t C type mpz_t
gmp.go:205:2: call mpz_init C value func(mpz_ptr) void
gmp.go:206:2: call mpz_set C value func(mpz_ptr, mpz_srcptr) void
gmp.go:221:2: call mpz_init C value func(mpz_ptr) void
gmp.go:227:7: call size_t C type size_t
gmp.go:228:2: call mpz_export C value func(*void, *size_t, int, size_t, int, size_t, mpz_srcptr) *void
gmp.go:235:13: call mpz_sizeinbase C value func(mpz_srcptr, int) size_t
gmp.go:241:2: call mpz_set C value func(mpz_ptr, mpz_srcptr) void
gmp.go:252:3: call mpz_import C value func(mpz_ptr, size_t, int, size_t, int, size_t, *const void) void
gmp.go:261:2: call mpz_set_si C value func(mpz_ptr, long int) void
gmp.go:273:5: call mpz_set_str C value func(mpz_ptr, *const char, int) int
gmp.go:282:9: call mpz_get_str C value func(*char, int, mpz_srcptr) *char
gmp.go:287:3: call mpz_clear C value func(mpz_ptr) void
gmp.go:302:2: call mpz_add C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:311:2: call mpz_sub C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:320:2: call mpz_mul C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:329:2: call mpz_tdiv_q C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:339:2: call mpz_tdiv_r C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:348:2: call mpz_mul_2exp C value func(mpz_ptr, mpz_srcptr, long unsigned int) void
gmp.go:356:2: call mpz_div_2exp C value func(mpz_ptr, mpz_srcptr, long unsigned int) void
gmp.go:367:3: call mpz_pow_ui C value func(mpz_ptr, mpz_srcptr, long unsigned int) void
gmp.go:369:3: call mpz_powm C value func(mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr) void
gmp.go:378:2: call mpz_neg C value func(mpz_ptr, mpz_srcptr) void
gmp.go:386:2: call mpz_abs C value func(mpz_ptr, mpz_srcptr) void
gmp.go:404:9: call mpz_cmp C value func(mpz_srcptr, mpz_srcptr) int
gmp.go:413:2: call mpz_tdiv_qr C value func(mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:426:2: call mpz_gcdext C value func(mpz_ptr, mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr) void
R=r
DELTA=938 (628 added, 308 deleted, 2 changed)
OCL=34733
CL=34791
2009-09-18 12:52:00 -06:00
|
|
|
)
|
|
|
|
|
2010-07-14 18:17:53 -06:00
|
|
|
// A Package collects information about the package we're going to write.
|
|
|
|
type Package struct {
|
|
|
|
PackageName string // name of package
|
|
|
|
PackagePath string
|
|
|
|
PtrSize int64
|
|
|
|
GccOptions []string
|
2011-02-01 06:44:18 -07:00
|
|
|
CgoFlags map[string]string // #cgo flags (CFLAGS, LDFLAGS)
|
2010-07-14 18:17:53 -06:00
|
|
|
Written map[string]bool
|
|
|
|
Name map[string]*Name // accumulated Name from Files
|
|
|
|
Typedef map[string]ast.Expr // accumulated Typedef from Files
|
|
|
|
ExpFunc []*ExpFunc // accumulated ExpFunc from Files
|
|
|
|
Decl []ast.Decl
|
2010-12-08 11:56:51 -07:00
|
|
|
GoFiles []string // list of Go files
|
|
|
|
GccFiles []string // list of gcc output files
|
2010-07-14 18:17:53 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
// A File collects information about a single Go input file.
|
|
|
|
type File struct {
|
|
|
|
AST *ast.File // parsed AST
|
2011-11-10 17:08:04 -07:00
|
|
|
Comments []*ast.CommentGroup // comments from file
|
2010-07-14 18:17:53 -06:00
|
|
|
Package string // Package name
|
|
|
|
Preamble string // C preamble (doc comment on import "C")
|
|
|
|
Ref []*Ref // all references to C.xxx in AST
|
|
|
|
ExpFunc []*ExpFunc // exported functions for this file
|
|
|
|
Name map[string]*Name // map from Go name to Name
|
|
|
|
Typedef map[string]ast.Expr // translations of all necessary types from C
|
|
|
|
}
|
|
|
|
|
|
|
|
// A Ref refers to an expression of the form C.xxx in the AST.
|
|
|
|
type Ref struct {
|
|
|
|
Name *Name
|
|
|
|
Expr *ast.Expr
|
|
|
|
Context string // "type", "expr", "call", or "call2"
|
|
|
|
}
|
|
|
|
|
go/ast: use token.Pos instead of token.Position; adjust all dependent code
Specifically:
* lib/godoc:
- provide file set (FSet) argument to formatters where needed
* src/cmd:
- cgo, ebnflint, godoc, gofmt, goinstall: provide file set (fset) where needed
- godoc: remove local binary search with sort.Search (change by rsc),
extract file set for formatters
* src/pkg:
- exp/eval: remove embedded token.Position fields from nodes and replace
with named token.Pos fields; add corresponding Pos() accessor methods
- go/token: added file.Line(), changed signature of File.Position()
* test/fixedbugs/:
- bug206.go: change test to not rely on token.Pos details
* added various extra comments
* Runs all.bash
* gofmt formats all of src, misc w/o changes
* godoc runs
* performance:
- The new version of godoc consumes about the same space after indexing
has completed, but indexing is half the speed. Significant space savings
are expected from smaller ASTs, but since they are thrown away after a
file has been indexed, this is not visible anymore. The slower indexing
time is due to the much more expensive computation of line information.
However, with the new compressed position information, indexing can be
rewritten and simplified. Furthermore, computing the line info can be
done more efficiently.
New godoc, immediately after indexing completed (best of three runs):
PID COMMAND %CPU TIME #TH #PRTS #MREGS RPRVT RSHRD RSIZE VSIZE
44381 godoc 0.0% 0:38.00 4 19 149 145M 184K 148M 176M
2010/12/03 17:58:35 index updated (39.231s, 18505 unique words, 386387 spots)
2010/12/03 17:58:35 bytes=90858456 footprint=199182584
2010/12/03 17:58:36 bytes=47858568 footprint=167295224
Old godoc, immediately after indexing completed (best of three runs):
PID COMMAND %CPU TIME #TH #PRTS #MREGS RPRVT RSHRD RSIZE VSIZE
23167 godoc 0.0% 0:22.02 4 17 132 129M 184K 132M 173M
2010/12/03 14:51:32 index updated (24.892s, 18765 unique words, 393830 spots)
2010/12/03 14:51:32 bytes=66404528 footprint=163907832
2010/12/03 14:51:32 bytes=46282224 footprint=163907832
The different numbers for unique words/spots stem from the fact the the
two workspaces are not exactly identical. The new godoc maintains a large
file set data structure during indexing which (probably) is the reason
for the larger heap (90858456 vs 66404528) before garbage collection.
R=rsc, r
CC=golang-dev
https://golang.org/cl/3050041
2010-12-06 15:23:18 -07:00
|
|
|
func (r *Ref) Pos() token.Pos {
|
2010-07-14 18:17:53 -06:00
|
|
|
return (*r.Expr).Pos()
|
|
|
|
}
|
|
|
|
|
|
|
|
// A Name collects information about C.xxx.
|
|
|
|
type Name struct {
|
|
|
|
Go string // name used in Go referring to package C
|
|
|
|
Mangle string // name used in generated Go
|
|
|
|
C string // name used in C
|
|
|
|
Define string // #define expansion
|
|
|
|
Kind string // "const", "type", "var", "func", "not-type"
|
|
|
|
Type *Type // the type of xxx
|
|
|
|
FuncType *FuncType
|
|
|
|
AddError bool
|
|
|
|
Const string // constant definition
|
|
|
|
}
|
|
|
|
|
|
|
|
// A ExpFunc is an exported function, callable from C.
|
|
|
|
// Such functions are identified in the Go input file
|
|
|
|
// by doc comments containing the line //export ExpName
|
|
|
|
type ExpFunc struct {
|
|
|
|
Func *ast.FuncDecl
|
|
|
|
ExpName string // name to use from C
|
|
|
|
}
|
|
|
|
|
cgo: fix dwarf type parsing
The recursive algorithm used to parse types in cgo
has a bug related to building the C type representation.
As an example, when the recursion starts at a type *T,
the C type representation won't be known until type T
itself is parsed. But then, it is possible that type T
references the type **T internally. The latter
representation is built based on the one of *T, which
started the recursion, so it won't attempt to parse it
again, and will instead use the current representation
value for *T, which is still empty at this point.
This problem was fixed by introducing a simple TypeRepr
type which builds the string representation lazily,
analogous to how the Go type information is built within
the same algorithm. This way, even if a type
representation is still unknown at some level in the
recursion, representations dependant on it can still
be created correctly.
R=rsc
CC=golang-dev
https://golang.org/cl/4244052
2011-03-06 16:05:57 -07:00
|
|
|
// A TypeRepr contains the string representation of a type.
|
|
|
|
type TypeRepr struct {
|
|
|
|
Repr string
|
|
|
|
FormatArgs []interface{}
|
|
|
|
}
|
|
|
|
|
2010-07-14 18:17:53 -06:00
|
|
|
// A Type collects information about a type in both the C and Go worlds.
|
|
|
|
type Type struct {
|
|
|
|
Size int64
|
|
|
|
Align int64
|
cgo: fix dwarf type parsing
The recursive algorithm used to parse types in cgo
has a bug related to building the C type representation.
As an example, when the recursion starts at a type *T,
the C type representation won't be known until type T
itself is parsed. But then, it is possible that type T
references the type **T internally. The latter
representation is built based on the one of *T, which
started the recursion, so it won't attempt to parse it
again, and will instead use the current representation
value for *T, which is still empty at this point.
This problem was fixed by introducing a simple TypeRepr
type which builds the string representation lazily,
analogous to how the Go type information is built within
the same algorithm. This way, even if a type
representation is still unknown at some level in the
recursion, representations dependant on it can still
be created correctly.
R=rsc
CC=golang-dev
https://golang.org/cl/4244052
2011-03-06 16:05:57 -07:00
|
|
|
C *TypeRepr
|
2010-07-14 18:17:53 -06:00
|
|
|
Go ast.Expr
|
|
|
|
EnumValues map[string]int64
|
|
|
|
}
|
|
|
|
|
|
|
|
// A FuncType collects information about a function type in both the C and Go worlds.
|
|
|
|
type FuncType struct {
|
|
|
|
Params []*Type
|
|
|
|
Result *Type
|
|
|
|
Go *ast.FuncType
|
|
|
|
}
|
|
|
|
|
|
|
|
func usage() {
|
2011-01-31 12:31:34 -07:00
|
|
|
fmt.Fprint(os.Stderr, "usage: cgo -- [compiler options] file.go ...\n")
|
|
|
|
flag.PrintDefaults()
|
2010-07-14 18:17:53 -06:00
|
|
|
os.Exit(2)
|
|
|
|
}
|
cgo: can look up C identifier kind (type or value) and type
gmp.go:197:4: type mpz_t C type mpz_t
gmp.go:205:2: call mpz_init C value func(mpz_ptr) void
gmp.go:206:2: call mpz_set C value func(mpz_ptr, mpz_srcptr) void
gmp.go:221:2: call mpz_init C value func(mpz_ptr) void
gmp.go:227:7: call size_t C type size_t
gmp.go:228:2: call mpz_export C value func(*void, *size_t, int, size_t, int, size_t, mpz_srcptr) *void
gmp.go:235:13: call mpz_sizeinbase C value func(mpz_srcptr, int) size_t
gmp.go:241:2: call mpz_set C value func(mpz_ptr, mpz_srcptr) void
gmp.go:252:3: call mpz_import C value func(mpz_ptr, size_t, int, size_t, int, size_t, *const void) void
gmp.go:261:2: call mpz_set_si C value func(mpz_ptr, long int) void
gmp.go:273:5: call mpz_set_str C value func(mpz_ptr, *const char, int) int
gmp.go:282:9: call mpz_get_str C value func(*char, int, mpz_srcptr) *char
gmp.go:287:3: call mpz_clear C value func(mpz_ptr) void
gmp.go:302:2: call mpz_add C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:311:2: call mpz_sub C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:320:2: call mpz_mul C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:329:2: call mpz_tdiv_q C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:339:2: call mpz_tdiv_r C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:348:2: call mpz_mul_2exp C value func(mpz_ptr, mpz_srcptr, long unsigned int) void
gmp.go:356:2: call mpz_div_2exp C value func(mpz_ptr, mpz_srcptr, long unsigned int) void
gmp.go:367:3: call mpz_pow_ui C value func(mpz_ptr, mpz_srcptr, long unsigned int) void
gmp.go:369:3: call mpz_powm C value func(mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr) void
gmp.go:378:2: call mpz_neg C value func(mpz_ptr, mpz_srcptr) void
gmp.go:386:2: call mpz_abs C value func(mpz_ptr, mpz_srcptr) void
gmp.go:404:9: call mpz_cmp C value func(mpz_srcptr, mpz_srcptr) int
gmp.go:413:2: call mpz_tdiv_qr C value func(mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:426:2: call mpz_gcdext C value func(mpz_ptr, mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr) void
R=r
DELTA=938 (628 added, 308 deleted, 2 changed)
OCL=34733
CL=34791
2009-09-18 12:52:00 -06:00
|
|
|
|
2009-10-06 12:42:55 -06:00
|
|
|
var ptrSizeMap = map[string]int64{
|
2010-03-02 14:46:51 -07:00
|
|
|
"386": 4,
|
2009-09-30 14:47:15 -06:00
|
|
|
"amd64": 8,
|
2010-03-02 14:46:51 -07:00
|
|
|
"arm": 4,
|
2009-09-30 14:47:15 -06:00
|
|
|
}
|
2009-09-24 12:43:19 -06:00
|
|
|
|
2010-12-10 12:32:58 -07:00
|
|
|
var cPrefix string
|
|
|
|
|
go/ast: use token.Pos instead of token.Position; adjust all dependent code
Specifically:
* lib/godoc:
- provide file set (FSet) argument to formatters where needed
* src/cmd:
- cgo, ebnflint, godoc, gofmt, goinstall: provide file set (fset) where needed
- godoc: remove local binary search with sort.Search (change by rsc),
extract file set for formatters
* src/pkg:
- exp/eval: remove embedded token.Position fields from nodes and replace
with named token.Pos fields; add corresponding Pos() accessor methods
- go/token: added file.Line(), changed signature of File.Position()
* test/fixedbugs/:
- bug206.go: change test to not rely on token.Pos details
* added various extra comments
* Runs all.bash
* gofmt formats all of src, misc w/o changes
* godoc runs
* performance:
- The new version of godoc consumes about the same space after indexing
has completed, but indexing is half the speed. Significant space savings
are expected from smaller ASTs, but since they are thrown away after a
file has been indexed, this is not visible anymore. The slower indexing
time is due to the much more expensive computation of line information.
However, with the new compressed position information, indexing can be
rewritten and simplified. Furthermore, computing the line info can be
done more efficiently.
New godoc, immediately after indexing completed (best of three runs):
PID COMMAND %CPU TIME #TH #PRTS #MREGS RPRVT RSHRD RSIZE VSIZE
44381 godoc 0.0% 0:38.00 4 19 149 145M 184K 148M 176M
2010/12/03 17:58:35 index updated (39.231s, 18505 unique words, 386387 spots)
2010/12/03 17:58:35 bytes=90858456 footprint=199182584
2010/12/03 17:58:36 bytes=47858568 footprint=167295224
Old godoc, immediately after indexing completed (best of three runs):
PID COMMAND %CPU TIME #TH #PRTS #MREGS RPRVT RSHRD RSIZE VSIZE
23167 godoc 0.0% 0:22.02 4 17 132 129M 184K 132M 173M
2010/12/03 14:51:32 index updated (24.892s, 18765 unique words, 393830 spots)
2010/12/03 14:51:32 bytes=66404528 footprint=163907832
2010/12/03 14:51:32 bytes=46282224 footprint=163907832
The different numbers for unique words/spots stem from the fact the the
two workspaces are not exactly identical. The new godoc maintains a large
file set data structure during indexing which (probably) is the reason
for the larger heap (90858456 vs 66404528) before garbage collection.
R=rsc, r
CC=golang-dev
https://golang.org/cl/3050041
2010-12-06 15:23:18 -07:00
|
|
|
var fset = token.NewFileSet()
|
|
|
|
|
2010-12-08 11:56:51 -07:00
|
|
|
var dynobj = flag.String("dynimport", "", "if non-empty, print dynamic import data for that file")
|
2011-12-14 20:42:42 -07:00
|
|
|
var dynout = flag.String("dynout", "", "write -dynobj output to this file")
|
2010-12-08 11:56:51 -07:00
|
|
|
|
2011-11-10 17:08:04 -07:00
|
|
|
// These flags are for bootstrapping a new Go implementation,
|
|
|
|
// to generate Go and C headers that match the data layout and
|
|
|
|
// constant values used in the host's C libraries and system calls.
|
|
|
|
var godefs = flag.Bool("godefs", false, "for bootstrap: write Go definitions for C file to standard output")
|
|
|
|
var cdefs = flag.Bool("cdefs", false, "for bootstrap: write C definitions for C file to standard output")
|
2011-12-14 20:42:42 -07:00
|
|
|
var objDir = flag.String("objdir", "", "object directory")
|
2011-11-10 17:08:04 -07:00
|
|
|
|
2011-12-14 16:40:35 -07:00
|
|
|
var gccgo = flag.Bool("gccgo", false, "generate files for use with gccgo")
|
2011-12-20 12:25:23 -07:00
|
|
|
var importRuntimeCgo = flag.Bool("import_runtime_cgo", true, "import runtime/cgo in generated code")
|
2011-09-19 09:50:59 -06:00
|
|
|
var goarch, goos string
|
|
|
|
|
cgo: can look up C identifier kind (type or value) and type
gmp.go:197:4: type mpz_t C type mpz_t
gmp.go:205:2: call mpz_init C value func(mpz_ptr) void
gmp.go:206:2: call mpz_set C value func(mpz_ptr, mpz_srcptr) void
gmp.go:221:2: call mpz_init C value func(mpz_ptr) void
gmp.go:227:7: call size_t C type size_t
gmp.go:228:2: call mpz_export C value func(*void, *size_t, int, size_t, int, size_t, mpz_srcptr) *void
gmp.go:235:13: call mpz_sizeinbase C value func(mpz_srcptr, int) size_t
gmp.go:241:2: call mpz_set C value func(mpz_ptr, mpz_srcptr) void
gmp.go:252:3: call mpz_import C value func(mpz_ptr, size_t, int, size_t, int, size_t, *const void) void
gmp.go:261:2: call mpz_set_si C value func(mpz_ptr, long int) void
gmp.go:273:5: call mpz_set_str C value func(mpz_ptr, *const char, int) int
gmp.go:282:9: call mpz_get_str C value func(*char, int, mpz_srcptr) *char
gmp.go:287:3: call mpz_clear C value func(mpz_ptr) void
gmp.go:302:2: call mpz_add C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:311:2: call mpz_sub C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:320:2: call mpz_mul C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:329:2: call mpz_tdiv_q C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:339:2: call mpz_tdiv_r C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:348:2: call mpz_mul_2exp C value func(mpz_ptr, mpz_srcptr, long unsigned int) void
gmp.go:356:2: call mpz_div_2exp C value func(mpz_ptr, mpz_srcptr, long unsigned int) void
gmp.go:367:3: call mpz_pow_ui C value func(mpz_ptr, mpz_srcptr, long unsigned int) void
gmp.go:369:3: call mpz_powm C value func(mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr) void
gmp.go:378:2: call mpz_neg C value func(mpz_ptr, mpz_srcptr) void
gmp.go:386:2: call mpz_abs C value func(mpz_ptr, mpz_srcptr) void
gmp.go:404:9: call mpz_cmp C value func(mpz_srcptr, mpz_srcptr) int
gmp.go:413:2: call mpz_tdiv_qr C value func(mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:426:2: call mpz_gcdext C value func(mpz_ptr, mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr) void
R=r
DELTA=938 (628 added, 308 deleted, 2 changed)
OCL=34733
CL=34791
2009-09-18 12:52:00 -06:00
|
|
|
func main() {
|
2010-07-14 18:17:53 -06:00
|
|
|
flag.Usage = usage
|
|
|
|
flag.Parse()
|
2010-12-08 11:56:51 -07:00
|
|
|
|
|
|
|
if *dynobj != "" {
|
|
|
|
// cgo -dynimport is essentially a separate helper command
|
|
|
|
// built into the cgo binary. It scans a gcc-produced executable
|
|
|
|
// and dumps information about the imported symbols and the
|
|
|
|
// imported libraries. The Make.pkg rules for cgo prepare an
|
|
|
|
// appropriate executable and then use its import information
|
|
|
|
// instead of needing to make the linkers duplicate all the
|
|
|
|
// specialized knowledge gcc has about where to look for imported
|
|
|
|
// symbols and which ones to use.
|
2011-04-27 21:21:03 -06:00
|
|
|
dynimport(*dynobj)
|
2010-12-08 11:56:51 -07:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2011-11-10 17:08:04 -07:00
|
|
|
if *godefs && *cdefs {
|
|
|
|
fmt.Fprintf(os.Stderr, "cgo: cannot use -cdefs and -godefs together\n")
|
|
|
|
os.Exit(2)
|
|
|
|
}
|
|
|
|
|
2010-07-14 18:17:53 -06:00
|
|
|
args := flag.Args()
|
|
|
|
if len(args) < 1 {
|
2009-12-15 16:33:31 -07:00
|
|
|
usage()
|
2009-10-03 11:37:12 -06:00
|
|
|
}
|
2009-12-17 14:20:56 -07:00
|
|
|
|
|
|
|
// Find first arg that looks like a go file and assume everything before
|
|
|
|
// that are options to pass to gcc.
|
|
|
|
var i int
|
2010-07-14 18:17:53 -06:00
|
|
|
for i = len(args); i > 0; i-- {
|
|
|
|
if !strings.HasSuffix(args[i-1], ".go") {
|
2009-12-17 14:20:56 -07:00
|
|
|
break
|
|
|
|
}
|
|
|
|
}
|
2010-07-14 18:17:53 -06:00
|
|
|
if i == len(args) {
|
|
|
|
usage()
|
|
|
|
}
|
2011-02-01 06:44:18 -07:00
|
|
|
|
|
|
|
goFiles := args[i:]
|
cgo: can look up C identifier kind (type or value) and type
gmp.go:197:4: type mpz_t C type mpz_t
gmp.go:205:2: call mpz_init C value func(mpz_ptr) void
gmp.go:206:2: call mpz_set C value func(mpz_ptr, mpz_srcptr) void
gmp.go:221:2: call mpz_init C value func(mpz_ptr) void
gmp.go:227:7: call size_t C type size_t
gmp.go:228:2: call mpz_export C value func(*void, *size_t, int, size_t, int, size_t, mpz_srcptr) *void
gmp.go:235:13: call mpz_sizeinbase C value func(mpz_srcptr, int) size_t
gmp.go:241:2: call mpz_set C value func(mpz_ptr, mpz_srcptr) void
gmp.go:252:3: call mpz_import C value func(mpz_ptr, size_t, int, size_t, int, size_t, *const void) void
gmp.go:261:2: call mpz_set_si C value func(mpz_ptr, long int) void
gmp.go:273:5: call mpz_set_str C value func(mpz_ptr, *const char, int) int
gmp.go:282:9: call mpz_get_str C value func(*char, int, mpz_srcptr) *char
gmp.go:287:3: call mpz_clear C value func(mpz_ptr) void
gmp.go:302:2: call mpz_add C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:311:2: call mpz_sub C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:320:2: call mpz_mul C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:329:2: call mpz_tdiv_q C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:339:2: call mpz_tdiv_r C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:348:2: call mpz_mul_2exp C value func(mpz_ptr, mpz_srcptr, long unsigned int) void
gmp.go:356:2: call mpz_div_2exp C value func(mpz_ptr, mpz_srcptr, long unsigned int) void
gmp.go:367:3: call mpz_pow_ui C value func(mpz_ptr, mpz_srcptr, long unsigned int) void
gmp.go:369:3: call mpz_powm C value func(mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr) void
gmp.go:378:2: call mpz_neg C value func(mpz_ptr, mpz_srcptr) void
gmp.go:386:2: call mpz_abs C value func(mpz_ptr, mpz_srcptr) void
gmp.go:404:9: call mpz_cmp C value func(mpz_srcptr, mpz_srcptr) int
gmp.go:413:2: call mpz_tdiv_qr C value func(mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:426:2: call mpz_gcdext C value func(mpz_ptr, mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr) void
R=r
DELTA=938 (628 added, 308 deleted, 2 changed)
OCL=34733
CL=34791
2009-09-18 12:52:00 -06:00
|
|
|
|
2011-11-10 17:08:04 -07:00
|
|
|
p := newPackage(args[:i])
|
cgo: can look up C identifier kind (type or value) and type
gmp.go:197:4: type mpz_t C type mpz_t
gmp.go:205:2: call mpz_init C value func(mpz_ptr) void
gmp.go:206:2: call mpz_set C value func(mpz_ptr, mpz_srcptr) void
gmp.go:221:2: call mpz_init C value func(mpz_ptr) void
gmp.go:227:7: call size_t C type size_t
gmp.go:228:2: call mpz_export C value func(*void, *size_t, int, size_t, int, size_t, mpz_srcptr) *void
gmp.go:235:13: call mpz_sizeinbase C value func(mpz_srcptr, int) size_t
gmp.go:241:2: call mpz_set C value func(mpz_ptr, mpz_srcptr) void
gmp.go:252:3: call mpz_import C value func(mpz_ptr, size_t, int, size_t, int, size_t, *const void) void
gmp.go:261:2: call mpz_set_si C value func(mpz_ptr, long int) void
gmp.go:273:5: call mpz_set_str C value func(mpz_ptr, *const char, int) int
gmp.go:282:9: call mpz_get_str C value func(*char, int, mpz_srcptr) *char
gmp.go:287:3: call mpz_clear C value func(mpz_ptr) void
gmp.go:302:2: call mpz_add C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:311:2: call mpz_sub C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:320:2: call mpz_mul C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:329:2: call mpz_tdiv_q C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:339:2: call mpz_tdiv_r C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:348:2: call mpz_mul_2exp C value func(mpz_ptr, mpz_srcptr, long unsigned int) void
gmp.go:356:2: call mpz_div_2exp C value func(mpz_ptr, mpz_srcptr, long unsigned int) void
gmp.go:367:3: call mpz_pow_ui C value func(mpz_ptr, mpz_srcptr, long unsigned int) void
gmp.go:369:3: call mpz_powm C value func(mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr) void
gmp.go:378:2: call mpz_neg C value func(mpz_ptr, mpz_srcptr) void
gmp.go:386:2: call mpz_abs C value func(mpz_ptr, mpz_srcptr) void
gmp.go:404:9: call mpz_cmp C value func(mpz_srcptr, mpz_srcptr) int
gmp.go:413:2: call mpz_tdiv_qr C value func(mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:426:2: call mpz_gcdext C value func(mpz_ptr, mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr) void
R=r
DELTA=938 (628 added, 308 deleted, 2 changed)
OCL=34733
CL=34791
2009-09-18 12:52:00 -06:00
|
|
|
|
2010-12-10 12:32:58 -07:00
|
|
|
// Need a unique prefix for the global C symbols that
|
|
|
|
// we use to coordinate between gcc and ourselves.
|
|
|
|
// We already put _cgo_ at the beginning, so the main
|
|
|
|
// concern is other cgo wrappers for the same functions.
|
|
|
|
// Use the beginning of the md5 of the input to disambiguate.
|
|
|
|
h := md5.New()
|
|
|
|
for _, input := range goFiles {
|
2011-04-05 00:42:14 -06:00
|
|
|
f, err := os.Open(input)
|
2010-12-10 12:32:58 -07:00
|
|
|
if err != nil {
|
2011-04-13 17:57:44 -06:00
|
|
|
fatalf("%s", err)
|
2010-12-10 12:32:58 -07:00
|
|
|
}
|
|
|
|
io.Copy(h, f)
|
|
|
|
f.Close()
|
|
|
|
}
|
2011-12-01 10:35:37 -07:00
|
|
|
cPrefix = fmt.Sprintf("_%x", h.Sum(nil)[0:6])
|
2010-12-10 12:32:58 -07:00
|
|
|
|
2011-02-01 06:44:18 -07:00
|
|
|
fs := make([]*File, len(goFiles))
|
|
|
|
for i, input := range goFiles {
|
|
|
|
// Parse flags for all files before translating due to CFLAGS.
|
2010-07-14 18:17:53 -06:00
|
|
|
f := new(File)
|
|
|
|
f.ReadGo(input)
|
2011-02-01 06:44:18 -07:00
|
|
|
p.ParseFlags(f, input)
|
|
|
|
fs[i] = f
|
|
|
|
}
|
|
|
|
|
2011-12-14 20:42:42 -07:00
|
|
|
if *objDir == "" {
|
|
|
|
// make sure that _obj directory exists, so that we can write
|
|
|
|
// all the output files there.
|
|
|
|
os.Mkdir("_obj", 0777)
|
|
|
|
*objDir = "_obj"
|
|
|
|
}
|
|
|
|
*objDir += string(filepath.Separator)
|
2011-03-02 12:22:33 -07:00
|
|
|
|
2011-02-01 06:44:18 -07:00
|
|
|
for i, input := range goFiles {
|
|
|
|
f := fs[i]
|
2010-07-14 18:17:53 -06:00
|
|
|
p.Translate(f)
|
|
|
|
for _, cref := range f.Ref {
|
2009-12-17 14:20:56 -07:00
|
|
|
switch cref.Context {
|
2010-07-14 18:17:53 -06:00
|
|
|
case "call", "call2":
|
|
|
|
if cref.Name.Kind != "type" {
|
2009-12-17 14:20:56 -07:00
|
|
|
break
|
|
|
|
}
|
2010-07-14 18:17:53 -06:00
|
|
|
*cref.Expr = cref.Name.Type.Go
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
cgo: can look up C identifier kind (type or value) and type
gmp.go:197:4: type mpz_t C type mpz_t
gmp.go:205:2: call mpz_init C value func(mpz_ptr) void
gmp.go:206:2: call mpz_set C value func(mpz_ptr, mpz_srcptr) void
gmp.go:221:2: call mpz_init C value func(mpz_ptr) void
gmp.go:227:7: call size_t C type size_t
gmp.go:228:2: call mpz_export C value func(*void, *size_t, int, size_t, int, size_t, mpz_srcptr) *void
gmp.go:235:13: call mpz_sizeinbase C value func(mpz_srcptr, int) size_t
gmp.go:241:2: call mpz_set C value func(mpz_ptr, mpz_srcptr) void
gmp.go:252:3: call mpz_import C value func(mpz_ptr, size_t, int, size_t, int, size_t, *const void) void
gmp.go:261:2: call mpz_set_si C value func(mpz_ptr, long int) void
gmp.go:273:5: call mpz_set_str C value func(mpz_ptr, *const char, int) int
gmp.go:282:9: call mpz_get_str C value func(*char, int, mpz_srcptr) *char
gmp.go:287:3: call mpz_clear C value func(mpz_ptr) void
gmp.go:302:2: call mpz_add C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:311:2: call mpz_sub C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:320:2: call mpz_mul C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:329:2: call mpz_tdiv_q C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:339:2: call mpz_tdiv_r C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:348:2: call mpz_mul_2exp C value func(mpz_ptr, mpz_srcptr, long unsigned int) void
gmp.go:356:2: call mpz_div_2exp C value func(mpz_ptr, mpz_srcptr, long unsigned int) void
gmp.go:367:3: call mpz_pow_ui C value func(mpz_ptr, mpz_srcptr, long unsigned int) void
gmp.go:369:3: call mpz_powm C value func(mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr) void
gmp.go:378:2: call mpz_neg C value func(mpz_ptr, mpz_srcptr) void
gmp.go:386:2: call mpz_abs C value func(mpz_ptr, mpz_srcptr) void
gmp.go:404:9: call mpz_cmp C value func(mpz_srcptr, mpz_srcptr) int
gmp.go:413:2: call mpz_tdiv_qr C value func(mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:426:2: call mpz_gcdext C value func(mpz_ptr, mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr) void
R=r
DELTA=938 (628 added, 308 deleted, 2 changed)
OCL=34733
CL=34791
2009-09-18 12:52:00 -06:00
|
|
|
}
|
2009-12-17 14:20:56 -07:00
|
|
|
if nerrors > 0 {
|
|
|
|
os.Exit(2)
|
|
|
|
}
|
2010-07-14 18:17:53 -06:00
|
|
|
pkg := f.Package
|
2009-12-21 09:31:02 -07:00
|
|
|
if dir := os.Getenv("CGOPKGPATH"); dir != "" {
|
2011-06-16 18:17:33 -06:00
|
|
|
pkg = filepath.Join(dir, pkg)
|
2009-12-21 09:31:02 -07:00
|
|
|
}
|
|
|
|
p.PackagePath = pkg
|
2010-07-14 18:17:53 -06:00
|
|
|
p.Record(f)
|
2011-11-10 17:08:04 -07:00
|
|
|
if *godefs {
|
|
|
|
os.Stdout.WriteString(p.godefs(f, input))
|
|
|
|
} else if *cdefs {
|
|
|
|
os.Stdout.WriteString(p.cdefs(f, input))
|
|
|
|
} else {
|
|
|
|
p.writeOutput(f, input)
|
|
|
|
}
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
|
2011-11-10 17:08:04 -07:00
|
|
|
if !*godefs && !*cdefs {
|
|
|
|
p.writeDefs()
|
|
|
|
}
|
2010-12-13 11:20:04 -07:00
|
|
|
if nerrors > 0 {
|
|
|
|
os.Exit(2)
|
|
|
|
}
|
cgo: can look up C identifier kind (type or value) and type
gmp.go:197:4: type mpz_t C type mpz_t
gmp.go:205:2: call mpz_init C value func(mpz_ptr) void
gmp.go:206:2: call mpz_set C value func(mpz_ptr, mpz_srcptr) void
gmp.go:221:2: call mpz_init C value func(mpz_ptr) void
gmp.go:227:7: call size_t C type size_t
gmp.go:228:2: call mpz_export C value func(*void, *size_t, int, size_t, int, size_t, mpz_srcptr) *void
gmp.go:235:13: call mpz_sizeinbase C value func(mpz_srcptr, int) size_t
gmp.go:241:2: call mpz_set C value func(mpz_ptr, mpz_srcptr) void
gmp.go:252:3: call mpz_import C value func(mpz_ptr, size_t, int, size_t, int, size_t, *const void) void
gmp.go:261:2: call mpz_set_si C value func(mpz_ptr, long int) void
gmp.go:273:5: call mpz_set_str C value func(mpz_ptr, *const char, int) int
gmp.go:282:9: call mpz_get_str C value func(*char, int, mpz_srcptr) *char
gmp.go:287:3: call mpz_clear C value func(mpz_ptr) void
gmp.go:302:2: call mpz_add C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:311:2: call mpz_sub C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:320:2: call mpz_mul C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:329:2: call mpz_tdiv_q C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:339:2: call mpz_tdiv_r C value func(mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:348:2: call mpz_mul_2exp C value func(mpz_ptr, mpz_srcptr, long unsigned int) void
gmp.go:356:2: call mpz_div_2exp C value func(mpz_ptr, mpz_srcptr, long unsigned int) void
gmp.go:367:3: call mpz_pow_ui C value func(mpz_ptr, mpz_srcptr, long unsigned int) void
gmp.go:369:3: call mpz_powm C value func(mpz_ptr, mpz_srcptr, mpz_srcptr, mpz_srcptr) void
gmp.go:378:2: call mpz_neg C value func(mpz_ptr, mpz_srcptr) void
gmp.go:386:2: call mpz_abs C value func(mpz_ptr, mpz_srcptr) void
gmp.go:404:9: call mpz_cmp C value func(mpz_srcptr, mpz_srcptr) int
gmp.go:413:2: call mpz_tdiv_qr C value func(mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr) void
gmp.go:426:2: call mpz_gcdext C value func(mpz_ptr, mpz_ptr, mpz_ptr, mpz_srcptr, mpz_srcptr) void
R=r
DELTA=938 (628 added, 308 deleted, 2 changed)
OCL=34733
CL=34791
2009-09-18 12:52:00 -06:00
|
|
|
}
|
2010-07-14 18:17:53 -06:00
|
|
|
|
2011-11-10 17:08:04 -07:00
|
|
|
// newPackage returns a new Package that will invoke
|
|
|
|
// gcc with the additional arguments specified in args.
|
|
|
|
func newPackage(args []string) *Package {
|
|
|
|
// Copy the gcc options to a new slice so the list
|
|
|
|
// can grow without overwriting the slice that args is in.
|
|
|
|
gccOptions := make([]string, len(args))
|
|
|
|
copy(gccOptions, args)
|
|
|
|
|
|
|
|
goarch = runtime.GOARCH
|
|
|
|
if s := os.Getenv("GOARCH"); s != "" {
|
|
|
|
goarch = s
|
|
|
|
}
|
|
|
|
goos = runtime.GOOS
|
|
|
|
if s := os.Getenv("GOOS"); s != "" {
|
|
|
|
goos = s
|
|
|
|
}
|
|
|
|
ptrSize := ptrSizeMap[goarch]
|
|
|
|
if ptrSize == 0 {
|
|
|
|
fatalf("unknown $GOARCH %q", goarch)
|
|
|
|
}
|
|
|
|
|
|
|
|
// Reset locale variables so gcc emits English errors [sic].
|
|
|
|
os.Setenv("LANG", "en_US.UTF-8")
|
|
|
|
os.Setenv("LC_ALL", "C")
|
|
|
|
|
|
|
|
p := &Package{
|
|
|
|
PtrSize: ptrSize,
|
|
|
|
GccOptions: gccOptions,
|
|
|
|
CgoFlags: make(map[string]string),
|
|
|
|
Written: make(map[string]bool),
|
|
|
|
}
|
|
|
|
return p
|
|
|
|
}
|
|
|
|
|
2010-07-14 18:17:53 -06:00
|
|
|
// Record what needs to be recorded about f.
|
|
|
|
func (p *Package) Record(f *File) {
|
|
|
|
if p.PackageName == "" {
|
|
|
|
p.PackageName = f.Package
|
|
|
|
} else if p.PackageName != f.Package {
|
2011-11-01 20:06:05 -06:00
|
|
|
error_(token.NoPos, "inconsistent package names: %s, %s", p.PackageName, f.Package)
|
2010-07-14 18:17:53 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
if p.Name == nil {
|
|
|
|
p.Name = f.Name
|
|
|
|
} else {
|
|
|
|
for k, v := range f.Name {
|
|
|
|
if p.Name[k] == nil {
|
|
|
|
p.Name[k] = v
|
|
|
|
} else if !reflect.DeepEqual(p.Name[k], v) {
|
2011-11-01 20:06:05 -06:00
|
|
|
error_(token.NoPos, "inconsistent definitions for C.%s", k)
|
2010-07-14 18:17:53 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-12-08 11:56:51 -07:00
|
|
|
p.ExpFunc = append(p.ExpFunc, f.ExpFunc...)
|
|
|
|
p.Decl = append(p.Decl, f.AST.Decls...)
|
2010-07-14 18:17:53 -06:00
|
|
|
}
|