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.
|
|
|
|
|
2010-07-14 18:17:53 -06:00
|
|
|
// Annotate Ref in Prog with C types by parsing gcc debug output.
|
2009-09-24 12:43:19 -06:00
|
|
|
// Conversion of debug output to Go types.
|
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 (
|
2009-12-15 16:33:31 -07:00
|
|
|
"bytes"
|
|
|
|
"debug/dwarf"
|
|
|
|
"debug/elf"
|
|
|
|
"debug/macho"
|
2010-11-01 15:52:26 -06:00
|
|
|
"debug/pe"
|
2010-07-14 18:17:53 -06:00
|
|
|
"flag"
|
2009-12-15 16:33:31 -07:00
|
|
|
"fmt"
|
|
|
|
"go/ast"
|
2010-01-11 14:05:26 -07:00
|
|
|
"go/parser"
|
2009-12-15 16:33:31 -07:00
|
|
|
"go/token"
|
|
|
|
"os"
|
|
|
|
"strconv"
|
|
|
|
"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
|
|
|
var debugDefine = flag.Bool("debug-define", false, "print relevant #defines")
|
|
|
|
var debugGcc = flag.Bool("debug-gcc", false, "print gcc invocations")
|
|
|
|
|
|
|
|
var nameToC = 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",
|
|
|
|
}
|
|
|
|
|
|
|
|
// cname returns the C name to use for C.s.
|
|
|
|
// The expansions are listed in nameToC and also
|
|
|
|
// struct_foo becomes "struct foo", and similarly for
|
|
|
|
// union and enum.
|
|
|
|
func cname(s string) string {
|
|
|
|
if t, ok := nameToC[s]; ok {
|
|
|
|
return t
|
|
|
|
}
|
|
|
|
|
|
|
|
if strings.HasPrefix(s, "struct_") {
|
|
|
|
return "struct " + s[len("struct_"):]
|
|
|
|
}
|
|
|
|
if strings.HasPrefix(s, "union_") {
|
|
|
|
return "union " + s[len("union_"):]
|
|
|
|
}
|
|
|
|
if strings.HasPrefix(s, "enum_") {
|
|
|
|
return "enum " + s[len("enum_"):]
|
|
|
|
}
|
|
|
|
return s
|
|
|
|
}
|
|
|
|
|
|
|
|
// Translate rewrites f.AST, the original Go input, to remove
|
|
|
|
// references to the imported package C, replacing them with
|
|
|
|
// references to the equivalent Go types, functions, and variables.
|
|
|
|
func (p *Package) Translate(f *File) {
|
|
|
|
for _, cref := range f.Ref {
|
|
|
|
// Convert C.ulong to C.unsigned long, etc.
|
|
|
|
cref.Name.C = cname(cref.Name.Go)
|
|
|
|
}
|
|
|
|
p.loadDefines(f)
|
|
|
|
needType := p.guessKinds(f)
|
|
|
|
if len(needType) > 0 {
|
|
|
|
p.loadDWARF(f, needType)
|
|
|
|
}
|
|
|
|
p.rewriteRef(f)
|
|
|
|
}
|
|
|
|
|
|
|
|
// loadDefines coerces gcc into spitting out the #defines in use
|
|
|
|
// in the file f and saves relevant renamings in f.Name[name].Define.
|
|
|
|
func (p *Package) loadDefines(f *File) {
|
2010-01-11 14:05:26 -07:00
|
|
|
var b bytes.Buffer
|
2010-07-14 18:17:53 -06:00
|
|
|
b.WriteString(builtinProlog)
|
|
|
|
b.WriteString(f.Preamble)
|
|
|
|
stdout := p.gccDefines(b.Bytes())
|
2010-01-11 14:05:26 -07:00
|
|
|
|
2010-07-01 15:08:14 -06:00
|
|
|
for _, line := range strings.Split(stdout, "\n", -1) {
|
2010-01-11 14:05:26 -07:00
|
|
|
if len(line) < 9 || line[0:7] != "#define" {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
line = strings.TrimSpace(line[8:])
|
|
|
|
|
|
|
|
var key, val string
|
|
|
|
spaceIndex := strings.Index(line, " ")
|
|
|
|
tabIndex := strings.Index(line, "\t")
|
|
|
|
|
|
|
|
if spaceIndex == -1 && tabIndex == -1 {
|
|
|
|
continue
|
|
|
|
} else if tabIndex == -1 || (spaceIndex != -1 && spaceIndex < tabIndex) {
|
|
|
|
key = line[0:spaceIndex]
|
|
|
|
val = strings.TrimSpace(line[spaceIndex:])
|
|
|
|
} else {
|
|
|
|
key = line[0:tabIndex]
|
|
|
|
val = strings.TrimSpace(line[tabIndex:])
|
|
|
|
}
|
|
|
|
|
2010-07-14 18:17:53 -06:00
|
|
|
if n := f.Name[key]; n != nil {
|
|
|
|
if *debugDefine {
|
|
|
|
fmt.Fprintf(os.Stderr, "#define %s %s\n", key, val)
|
2010-01-11 14:05:26 -07:00
|
|
|
}
|
2010-07-14 18:17:53 -06:00
|
|
|
n.Define = val
|
2010-01-11 14:05:26 -07: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
|
|
|
}
|
2010-07-14 18:17:53 -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
|
|
|
|
2010-07-14 18:17:53 -06:00
|
|
|
// guessKinds tricks gcc into revealing the kind of each
|
|
|
|
// name xxx for the references C.xxx in the Go input.
|
|
|
|
// The kind is either a constant, type, or variable.
|
|
|
|
func (p *Package) guessKinds(f *File) []*Name {
|
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
|
|
|
// Coerce gcc into telling us whether each name is
|
|
|
|
// a type, a value, or undeclared. We compile a function
|
|
|
|
// containing the line:
|
|
|
|
// name;
|
|
|
|
// If name is a type, gcc will print:
|
2010-07-14 18:17:53 -06:00
|
|
|
// cgo-test:2: warning: useless type name in empty declaration
|
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
|
|
|
// If name is a value, gcc will print
|
2010-07-14 18:17:53 -06:00
|
|
|
// cgo-test:2: warning: statement with no effect
|
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
|
|
|
// If name is undeclared, gcc will print
|
2010-07-14 18:17:53 -06:00
|
|
|
// cgo-test:2: error: 'name' undeclared (first use in this function)
|
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
|
|
|
// A line number directive causes the line number to
|
|
|
|
// correspond to the index in the names array.
|
2010-07-14 18:17:53 -06:00
|
|
|
//
|
|
|
|
// The line also has an enum declaration:
|
|
|
|
// name; enum { _cgo_enum_1 = name };
|
|
|
|
// If name is not a constant, gcc will print:
|
|
|
|
// cgo-test:4: error: enumerator value for '_cgo_enum_4' is not an integer constant
|
|
|
|
// we assume lines without that error are constants.
|
|
|
|
|
|
|
|
// Make list of names that need sniffing, type lookup.
|
|
|
|
toSniff := make([]*Name, 0, len(f.Name))
|
|
|
|
needType := make([]*Name, 0, len(f.Name))
|
|
|
|
|
|
|
|
for _, n := range f.Name {
|
|
|
|
// If we've already found this name as a #define
|
|
|
|
// and we can translate it as a constant value, do so.
|
|
|
|
if n.Define != "" {
|
|
|
|
ok := false
|
|
|
|
if _, err := strconv.Atoi(n.Define); err == nil {
|
|
|
|
ok = true
|
|
|
|
} else if n.Define[0] == '"' || n.Define[0] == '\'' {
|
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
|
|
|
_, err := parser.ParseExpr(fset, "", n.Define)
|
2010-07-14 18:17:53 -06:00
|
|
|
if err == nil {
|
|
|
|
ok = true
|
|
|
|
}
|
|
|
|
}
|
|
|
|
if ok {
|
|
|
|
n.Kind = "const"
|
|
|
|
n.Const = n.Define
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
if isName(n.Define) {
|
|
|
|
n.C = n.Define
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// If this is a struct, union, or enum type name,
|
|
|
|
// record the kind but also that we need type information.
|
|
|
|
if strings.HasPrefix(n.C, "struct ") || strings.HasPrefix(n.C, "union ") || strings.HasPrefix(n.C, "enum ") {
|
|
|
|
n.Kind = "type"
|
|
|
|
i := len(needType)
|
|
|
|
needType = needType[0 : i+1]
|
|
|
|
needType[i] = n
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
|
|
|
|
i := len(toSniff)
|
|
|
|
toSniff = toSniff[0 : i+1]
|
|
|
|
toSniff[i] = n
|
|
|
|
}
|
|
|
|
|
|
|
|
if len(toSniff) == 0 {
|
|
|
|
return needType
|
|
|
|
}
|
|
|
|
|
|
|
|
var b bytes.Buffer
|
|
|
|
b.WriteString(builtinProlog)
|
|
|
|
b.WriteString(f.Preamble)
|
2009-12-15 16:33:31 -07:00
|
|
|
b.WriteString("void f(void) {\n")
|
|
|
|
b.WriteString("#line 0 \"cgo-test\"\n")
|
2010-07-14 18:17:53 -06:00
|
|
|
for i, n := range toSniff {
|
|
|
|
fmt.Fprintf(&b, "%s; enum { _cgo_enum_%d = %s }; /* cgo-test:%d */\n", n.C, i, n.C, 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
|
|
|
}
|
2009-12-15 16:33:31 -07:00
|
|
|
b.WriteString("}\n")
|
2010-07-14 18:17:53 -06:00
|
|
|
stderr := p.gccErrors(b.Bytes())
|
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
|
|
|
if stderr == "" {
|
2010-07-14 18:17:53 -06:00
|
|
|
fatal("gcc produced no output\non input:\n%s", b.Bytes())
|
|
|
|
}
|
|
|
|
|
|
|
|
names := make([]*Name, len(toSniff))
|
|
|
|
copy(names, toSniff)
|
|
|
|
|
|
|
|
isConst := make([]bool, len(toSniff))
|
|
|
|
for i := range isConst {
|
|
|
|
isConst[i] = true // until proven otherwise
|
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
|
|
|
|
2010-07-01 15:08:14 -06:00
|
|
|
for _, line := range strings.Split(stderr, "\n", -1) {
|
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
|
|
|
if len(line) < 9 || line[0:9] != "cgo-test:" {
|
2010-09-16 11:38:23 -06:00
|
|
|
if len(line) > 8 && line[0:8] == "<stdin>:" {
|
|
|
|
fatal("gcc produced unexpected output:\n%s\non input:\n%s", line, b.Bytes())
|
|
|
|
}
|
2009-11-09 13:07:39 -07:00
|
|
|
continue
|
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-15 16:33:31 -07:00
|
|
|
line = line[9:]
|
|
|
|
colon := strings.Index(line, ":")
|
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
|
|
|
if colon < 0 {
|
2009-11-09 13:07:39 -07:00
|
|
|
continue
|
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-15 16:33:31 -07:00
|
|
|
i, err := strconv.Atoi(line[0:colon])
|
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
|
|
|
if err != nil {
|
2009-11-09 13:07:39 -07:00
|
|
|
continue
|
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-15 16:33:31 -07:00
|
|
|
what := ""
|
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
|
|
|
switch {
|
|
|
|
default:
|
2009-11-09 13:07:39 -07:00
|
|
|
continue
|
2010-11-01 16:21:35 -06:00
|
|
|
case strings.Contains(line, ": useless type name in empty declaration"):
|
2009-11-09 13:07:39 -07:00
|
|
|
what = "type"
|
2010-07-14 18:17:53 -06:00
|
|
|
isConst[i] = false
|
2010-11-01 16:21:35 -06:00
|
|
|
case strings.Contains(line, ": statement with no effect"):
|
2010-07-14 18:17:53 -06:00
|
|
|
what = "not-type" // const or func or var
|
2010-11-01 16:21:35 -06:00
|
|
|
case strings.Contains(line, "undeclared"):
|
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
|
|
|
error(token.NoPos, "%s", strings.TrimSpace(line[colon+1:]))
|
2010-11-01 16:21:35 -06:00
|
|
|
case strings.Contains(line, "is not an integer constant"):
|
2010-07-14 18:17:53 -06:00
|
|
|
isConst[i] = false
|
|
|
|
continue
|
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
|
|
|
n := toSniff[i]
|
|
|
|
if n == nil {
|
|
|
|
continue
|
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
|
|
|
toSniff[i] = nil
|
|
|
|
n.Kind = what
|
|
|
|
|
|
|
|
j := len(needType)
|
|
|
|
needType = needType[0 : j+1]
|
|
|
|
needType[j] = n
|
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
|
|
|
for i, b := range isConst {
|
|
|
|
if b {
|
|
|
|
names[i].Kind = "const"
|
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
|
|
|
for _, n := range toSniff {
|
|
|
|
if n == nil {
|
|
|
|
continue
|
|
|
|
}
|
|
|
|
if n.Kind != "" {
|
|
|
|
continue
|
|
|
|
}
|
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
|
|
|
error(token.NoPos, "could not determine kind of name for C.%s", n.Go)
|
2010-07-14 18:17:53 -06:00
|
|
|
}
|
2009-11-11 17:58:27 -07:00
|
|
|
if nerrors > 0 {
|
2010-07-14 18:17:53 -06:00
|
|
|
fatal("unresolved names")
|
2009-11-11 17:58:27 -07:00
|
|
|
}
|
2010-07-14 18:17:53 -06:00
|
|
|
return needType
|
|
|
|
}
|
2009-11-11 17:58:27 -07:00
|
|
|
|
2010-07-14 18:17:53 -06:00
|
|
|
// loadDWARF parses the DWARF debug information generated
|
|
|
|
// by gcc to learn the details of the constants, variables, and types
|
|
|
|
// being referred to as C.xxx.
|
|
|
|
func (p *Package) loadDWARF(f *File, names []*Name) {
|
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
|
|
|
// Extract the types from the DWARF section of an object
|
|
|
|
// from a well-formed C program. Gcc only generates DWARF info
|
|
|
|
// for symbols in the object file, so it is not enough to print the
|
|
|
|
// preamble and hope the symbols we care about will be there.
|
|
|
|
// Instead, emit
|
|
|
|
// typeof(names[i]) *__cgo__i;
|
|
|
|
// for each entry in names and then dereference the type we
|
|
|
|
// learn for __cgo__i.
|
2010-07-14 18:17:53 -06:00
|
|
|
var b bytes.Buffer
|
|
|
|
b.WriteString(builtinProlog)
|
|
|
|
b.WriteString(f.Preamble)
|
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
|
|
|
for i, n := range names {
|
2010-07-14 18:17:53 -06:00
|
|
|
fmt.Fprintf(&b, "typeof(%s) *__cgo__%d;\n", n.C, i)
|
|
|
|
if n.Kind == "const" {
|
|
|
|
fmt.Fprintf(&b, "enum { __cgo_enum__%d = %s };\n", i, n.C)
|
|
|
|
}
|
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
|
|
|
d := p.gccDebug(b.Bytes())
|
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-11-02 13:02:16 -07:00
|
|
|
// Scan DWARF info for top-level TagVariable entries with AttrName __cgo__i.
|
2009-12-15 16:33:31 -07:00
|
|
|
types := make([]dwarf.Type, len(names))
|
2009-12-15 22:24:17 -07:00
|
|
|
enums := make([]dwarf.Offset, len(names))
|
2010-07-14 18:17:53 -06:00
|
|
|
nameToIndex := make(map[*Name]int)
|
|
|
|
for i, n := range names {
|
|
|
|
nameToIndex[n] = i
|
|
|
|
}
|
2009-12-15 16:33:31 -07:00
|
|
|
r := d.Reader()
|
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
|
|
|
for {
|
2009-12-15 16:33:31 -07:00
|
|
|
e, err := r.Next()
|
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
|
|
|
if err != nil {
|
2009-11-09 13:07:39 -07:00
|
|
|
fatal("reading DWARF entry: %s", err)
|
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
|
|
|
}
|
|
|
|
if e == nil {
|
2009-11-09 13:07:39 -07:00
|
|
|
break
|
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-15 22:24:17 -07:00
|
|
|
switch e.Tag {
|
|
|
|
case dwarf.TagEnumerationType:
|
|
|
|
offset := e.Offset
|
|
|
|
for {
|
|
|
|
e, err := r.Next()
|
|
|
|
if err != nil {
|
|
|
|
fatal("reading DWARF entry: %s", err)
|
|
|
|
}
|
|
|
|
if e.Tag == 0 {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
if e.Tag == dwarf.TagEnumerator {
|
|
|
|
entryName := e.Val(dwarf.AttrName).(string)
|
2010-07-14 18:17:53 -06:00
|
|
|
if strings.HasPrefix(entryName, "__cgo_enum__") {
|
|
|
|
n, _ := strconv.Atoi(entryName[len("__cgo_enum__"):])
|
|
|
|
if 0 <= n && n < len(names) {
|
|
|
|
enums[n] = offset
|
|
|
|
}
|
2009-12-15 22:24:17 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
case dwarf.TagVariable:
|
|
|
|
name, _ := e.Val(dwarf.AttrName).(string)
|
|
|
|
typOff, _ := e.Val(dwarf.AttrType).(dwarf.Offset)
|
|
|
|
if name == "" || typOff == 0 {
|
|
|
|
fatal("malformed DWARF TagVariable entry")
|
|
|
|
}
|
|
|
|
if !strings.HasPrefix(name, "__cgo__") {
|
|
|
|
break
|
|
|
|
}
|
|
|
|
typ, err := d.Type(typOff)
|
|
|
|
if err != nil {
|
|
|
|
fatal("loading DWARF type: %s", err)
|
|
|
|
}
|
|
|
|
t, ok := typ.(*dwarf.PtrType)
|
|
|
|
if !ok || t == nil {
|
|
|
|
fatal("internal error: %s has non-pointer type", name)
|
|
|
|
}
|
|
|
|
i, err := strconv.Atoi(name[7:])
|
|
|
|
if err != nil {
|
|
|
|
fatal("malformed __cgo__ name: %s", name)
|
|
|
|
}
|
|
|
|
if enums[i] != 0 {
|
|
|
|
t, err := d.Type(enums[i])
|
|
|
|
if err != nil {
|
|
|
|
fatal("loading DWARF type: %s", err)
|
|
|
|
}
|
|
|
|
types[i] = t
|
|
|
|
} else {
|
|
|
|
types[i] = t.Type
|
|
|
|
}
|
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
|
|
|
}
|
|
|
|
if e.Tag != dwarf.TagCompileUnit {
|
2009-11-09 13:07:39 -07:00
|
|
|
r.SkipChildren()
|
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
|
|
|
// Record types and typedef information.
|
2009-12-15 16:33:31 -07:00
|
|
|
var conv typeConv
|
|
|
|
conv.Init(p.PtrSize)
|
2010-07-14 18:17:53 -06:00
|
|
|
for i, n := range names {
|
2009-12-15 16:33:31 -07:00
|
|
|
f, fok := types[i].(*dwarf.FuncType)
|
2010-07-14 18:17:53 -06:00
|
|
|
if n.Kind != "type" && fok {
|
|
|
|
n.Kind = "func"
|
|
|
|
n.FuncType = conv.FuncType(f)
|
2009-09-24 12:43:19 -06:00
|
|
|
} else {
|
2010-07-14 18:17:53 -06:00
|
|
|
n.Type = conv.Type(types[i])
|
|
|
|
if enums[i] != 0 && n.Type.EnumValues != nil {
|
|
|
|
n.Kind = "const"
|
|
|
|
n.Const = strconv.Itoa64(n.Type.EnumValues[fmt.Sprintf("__cgo_enum__%d", i)])
|
|
|
|
}
|
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
|
|
|
}
|
2010-07-14 18:17:53 -06:00
|
|
|
f.Typedef = conv.typedef
|
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
|
|
|
// rewriteRef rewrites all the C.xxx references in f.AST to refer to the
|
|
|
|
// Go equivalents, now that we have figured out the meaning of all
|
|
|
|
// the xxx.
|
|
|
|
func (p *Package) rewriteRef(f *File) {
|
|
|
|
// Assign mangled names.
|
|
|
|
for _, n := range f.Name {
|
|
|
|
if n.Kind == "not-type" {
|
|
|
|
n.Kind = "var"
|
|
|
|
}
|
|
|
|
if n.Mangle == "" {
|
|
|
|
n.Mangle = "_C" + n.Kind + "_" + n.Go
|
|
|
|
}
|
2009-10-03 11:37:12 -06:00
|
|
|
}
|
2010-07-14 18:17:53 -06:00
|
|
|
|
|
|
|
// Now that we have all the name types filled in,
|
|
|
|
// scan through the Refs to identify the ones that
|
|
|
|
// are trying to do a ,err call. Also check that
|
|
|
|
// functions are only used in calls.
|
|
|
|
for _, r := range f.Ref {
|
|
|
|
var expr ast.Expr = ast.NewIdent(r.Name.Mangle) // default
|
|
|
|
switch r.Context {
|
|
|
|
case "call", "call2":
|
|
|
|
if r.Name.Kind != "func" {
|
|
|
|
if r.Name.Kind == "type" {
|
|
|
|
r.Context = "type"
|
|
|
|
expr = r.Name.Type.Go
|
|
|
|
break
|
|
|
|
}
|
|
|
|
error(r.Pos(), "call of non-function C.%s", r.Name.Go)
|
|
|
|
break
|
|
|
|
}
|
|
|
|
if r.Context == "call2" {
|
|
|
|
if r.Name.FuncType.Result == nil {
|
|
|
|
error(r.Pos(), "assignment count mismatch: 2 = 0")
|
|
|
|
}
|
|
|
|
// Invent new Name for the two-result function.
|
|
|
|
n := f.Name["2"+r.Name.Go]
|
|
|
|
if n == nil {
|
|
|
|
n = new(Name)
|
|
|
|
*n = *r.Name
|
|
|
|
n.AddError = true
|
|
|
|
n.Mangle = "_C2func_" + n.Go
|
|
|
|
f.Name["2"+r.Name.Go] = n
|
|
|
|
}
|
2010-08-04 18:15:04 -06:00
|
|
|
expr = ast.NewIdent(n.Mangle)
|
2010-07-14 18:17:53 -06:00
|
|
|
r.Name = n
|
|
|
|
break
|
|
|
|
}
|
|
|
|
case "expr":
|
|
|
|
if r.Name.Kind == "func" {
|
|
|
|
error(r.Pos(), "must call C.%s", r.Name.Go)
|
|
|
|
}
|
|
|
|
if r.Name.Kind == "type" {
|
|
|
|
// Okay - might be new(T)
|
|
|
|
expr = r.Name.Type.Go
|
|
|
|
}
|
|
|
|
if r.Name.Kind == "var" {
|
|
|
|
expr = &ast.StarExpr{X: expr}
|
|
|
|
}
|
|
|
|
|
|
|
|
case "type":
|
|
|
|
if r.Name.Kind != "type" {
|
|
|
|
error(r.Pos(), "expression C.%s used as type", r.Name.Go)
|
2010-09-16 11:38:23 -06:00
|
|
|
} else {
|
|
|
|
expr = r.Name.Type.Go
|
2010-07-14 18:17:53 -06:00
|
|
|
}
|
|
|
|
default:
|
|
|
|
if r.Name.Kind == "func" {
|
|
|
|
error(r.Pos(), "must call C.%s", r.Name.Go)
|
|
|
|
}
|
|
|
|
}
|
|
|
|
*r.Expr = expr
|
2009-10-03 11:37:12 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2010-08-18 08:03:01 -06:00
|
|
|
// gccName returns the name of the compiler to run. Use $GCC if set in
|
2010-07-16 12:01:04 -06:00
|
|
|
// the environment, otherwise just "gcc".
|
|
|
|
|
|
|
|
func (p *Package) gccName() (ret string) {
|
2010-08-18 08:03:01 -06:00
|
|
|
if ret = os.Getenv("GCC"); ret == "" {
|
2010-07-16 12:01:04 -06:00
|
|
|
ret = "gcc"
|
|
|
|
}
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2010-07-14 18:17:53 -06:00
|
|
|
// gccMachine returns the gcc -m flag to use, either "-m32" or "-m64".
|
|
|
|
func (p *Package) gccMachine() string {
|
2009-09-30 14:47:15 -06:00
|
|
|
if p.PtrSize == 8 {
|
2010-07-14 18:17:53 -06:00
|
|
|
return "-m64"
|
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
|
|
|
return "-m32"
|
|
|
|
}
|
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
|
|
|
const gccTmp = "_cgo_.o"
|
|
|
|
|
|
|
|
// gccCmd returns the gcc command line to use for compiling
|
|
|
|
// the input.
|
|
|
|
func (p *Package) gccCmd() []string {
|
|
|
|
return []string{
|
2010-07-16 12:01:04 -06:00
|
|
|
p.gccName(),
|
2010-07-14 18:17:53 -06:00
|
|
|
p.gccMachine(),
|
2010-02-25 17:07:55 -07:00
|
|
|
"-Wall", // many warnings
|
|
|
|
"-Werror", // warnings are errors
|
2010-07-14 18:17:53 -06:00
|
|
|
"-o" + gccTmp, // write object to tmp
|
2010-02-25 17:07:55 -07:00
|
|
|
"-gdwarf-2", // generate DWARF v2 debugging symbols
|
2010-01-06 16:45:08 -07:00
|
|
|
"-fno-eliminate-unused-debug-types", // gets rid of e.g. untyped enum otherwise
|
2010-02-25 17:07:55 -07:00
|
|
|
"-c", // do not link
|
|
|
|
"-xc", // input language is C
|
|
|
|
"-", // read input from standard input
|
2009-12-15 16:33:31 -07:00
|
|
|
}
|
2010-07-14 18:17:53 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
// gccDebug runs gcc -gdwarf-2 over the C program stdin and
|
|
|
|
// returns the corresponding DWARF data and any messages
|
|
|
|
// printed to standard error.
|
|
|
|
func (p *Package) gccDebug(stdin []byte) *dwarf.Data {
|
2010-10-27 20:47:23 -06:00
|
|
|
runGcc(stdin, append(p.gccCmd(), p.GccOptions...))
|
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
|
|
|
|
|
|
|
// Try to parse f as ELF and Mach-O and hope one works.
|
2009-11-05 16:33:26 -07:00
|
|
|
var f interface {
|
2009-12-15 16:33:31 -07:00
|
|
|
DWARF() (*dwarf.Data, os.Error)
|
2009-11-05 16:33:26 -07:00
|
|
|
}
|
2009-12-15 16:33:31 -07:00
|
|
|
var err os.Error
|
2010-07-14 18:17:53 -06:00
|
|
|
if f, err = elf.Open(gccTmp); err != nil {
|
|
|
|
if f, err = macho.Open(gccTmp); err != nil {
|
2010-11-01 15:52:26 -06:00
|
|
|
if f, err = pe.Open(gccTmp); err != nil {
|
|
|
|
fatal("cannot parse gcc output %s as ELF or Mach-O or PE object", gccTmp)
|
|
|
|
}
|
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-15 16:33:31 -07:00
|
|
|
d, err := f.DWARF()
|
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
|
|
|
if err != nil {
|
2010-07-14 18:17:53 -06:00
|
|
|
fatal("cannot load DWARF debug information from %s: %s", gccTmp, err)
|
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
|
|
|
return d
|
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
|
|
|
// gccDefines runs gcc -E -dM -xc - over the C program stdin
|
|
|
|
// and returns the corresponding standard output, which is the
|
|
|
|
// #defines that gcc encountered while processing the input
|
|
|
|
// and its included files.
|
|
|
|
func (p *Package) gccDefines(stdin []byte) string {
|
2010-07-16 12:01:04 -06:00
|
|
|
base := []string{p.gccName(), p.gccMachine(), "-E", "-dM", "-xc", "-"}
|
2010-10-27 20:47:23 -06:00
|
|
|
stdout, _ := runGcc(stdin, append(base, p.GccOptions...))
|
2010-07-14 18:17:53 -06:00
|
|
|
return stdout
|
|
|
|
}
|
|
|
|
|
|
|
|
// gccErrors runs gcc over the C program stdin and returns
|
|
|
|
// the errors that gcc prints. That is, this function expects
|
|
|
|
// gcc to fail.
|
|
|
|
func (p *Package) gccErrors(stdin []byte) string {
|
|
|
|
// TODO(rsc): require failure
|
2010-10-27 20:47:23 -06:00
|
|
|
args := append(p.gccCmd(), p.GccOptions...)
|
2010-07-14 18:17:53 -06:00
|
|
|
if *debugGcc {
|
|
|
|
fmt.Fprintf(os.Stderr, "$ %s <<EOF\n", strings.Join(args, " "))
|
|
|
|
os.Stderr.Write(stdin)
|
|
|
|
fmt.Fprint(os.Stderr, "EOF\n")
|
|
|
|
}
|
|
|
|
stdout, stderr, _ := run(stdin, args)
|
|
|
|
if *debugGcc {
|
|
|
|
os.Stderr.Write(stdout)
|
|
|
|
os.Stderr.Write(stderr)
|
2010-01-11 14:05:26 -07:00
|
|
|
}
|
2010-07-14 18:17:53 -06:00
|
|
|
return string(stderr)
|
|
|
|
}
|
2010-01-11 14:05:26 -07:00
|
|
|
|
2010-07-14 18:17:53 -06:00
|
|
|
// runGcc runs the gcc command line args with stdin on standard input.
|
|
|
|
// If the command exits with a non-zero exit status, runGcc prints
|
|
|
|
// details about what was run and exits.
|
|
|
|
// Otherwise runGcc returns the data written to standard output and standard error.
|
|
|
|
// Note that for some of the uses we expect useful data back
|
|
|
|
// on standard error, but for those uses gcc must still exit 0.
|
|
|
|
func runGcc(stdin []byte, args []string) (string, string) {
|
|
|
|
if *debugGcc {
|
|
|
|
fmt.Fprintf(os.Stderr, "$ %s <<EOF\n", strings.Join(args, " "))
|
|
|
|
os.Stderr.Write(stdin)
|
|
|
|
fmt.Fprint(os.Stderr, "EOF\n")
|
|
|
|
}
|
|
|
|
stdout, stderr, ok := run(stdin, args)
|
|
|
|
if *debugGcc {
|
|
|
|
os.Stderr.Write(stdout)
|
|
|
|
os.Stderr.Write(stderr)
|
|
|
|
}
|
2010-01-11 14:05:26 -07:00
|
|
|
if !ok {
|
2010-07-14 18:17:53 -06:00
|
|
|
fmt.Fprint(os.Stderr, "Error running gcc:\n")
|
|
|
|
fmt.Fprintf(os.Stderr, "$ %s <<EOF\n", strings.Join(args, " "))
|
|
|
|
os.Stderr.Write(stdin)
|
|
|
|
fmt.Fprint(os.Stderr, "EOF\n")
|
|
|
|
os.Stderr.Write(stderr)
|
|
|
|
os.Exit(2)
|
2010-01-11 14:05:26 -07:00
|
|
|
}
|
2010-07-14 18:17:53 -06:00
|
|
|
return string(stdout), string(stderr)
|
2010-01-11 14:05:26 -07:00
|
|
|
}
|
|
|
|
|
2009-09-24 12:43:19 -06:00
|
|
|
// A typeConv is a translator from dwarf types to Go types
|
|
|
|
// with equivalent memory layout.
|
|
|
|
type typeConv struct {
|
|
|
|
// Cache of already-translated or in-progress types.
|
2009-12-15 16:33:31 -07:00
|
|
|
m map[dwarf.Type]*Type
|
|
|
|
typedef map[string]ast.Expr
|
2009-09-24 12:43:19 -06:00
|
|
|
|
|
|
|
// Predeclared types.
|
2010-01-13 11:25:28 -07:00
|
|
|
bool ast.Expr
|
2009-12-15 16:33:31 -07:00
|
|
|
byte ast.Expr // denotes padding
|
|
|
|
int8, int16, int32, int64 ast.Expr
|
|
|
|
uint8, uint16, uint32, uint64, uintptr ast.Expr
|
|
|
|
float32, float64 ast.Expr
|
|
|
|
void ast.Expr
|
|
|
|
unsafePointer ast.Expr
|
|
|
|
string ast.Expr
|
2009-09-24 12:43:19 -06:00
|
|
|
|
2009-12-15 16:33:31 -07:00
|
|
|
ptrSize int64
|
2009-09-24 12:43:19 -06:00
|
|
|
|
2009-12-15 16:33:31 -07:00
|
|
|
tagGen int
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
func (c *typeConv) Init(ptrSize int64) {
|
2009-12-15 16:33:31 -07:00
|
|
|
c.ptrSize = ptrSize
|
|
|
|
c.m = make(map[dwarf.Type]*Type)
|
|
|
|
c.typedef = make(map[string]ast.Expr)
|
2010-01-13 11:25:28 -07:00
|
|
|
c.bool = c.Ident("bool")
|
2009-12-15 16:33:31 -07:00
|
|
|
c.byte = c.Ident("byte")
|
|
|
|
c.int8 = c.Ident("int8")
|
|
|
|
c.int16 = c.Ident("int16")
|
|
|
|
c.int32 = c.Ident("int32")
|
|
|
|
c.int64 = c.Ident("int64")
|
|
|
|
c.uint8 = c.Ident("uint8")
|
|
|
|
c.uint16 = c.Ident("uint16")
|
|
|
|
c.uint32 = c.Ident("uint32")
|
|
|
|
c.uint64 = c.Ident("uint64")
|
|
|
|
c.uintptr = c.Ident("uintptr")
|
|
|
|
c.float32 = c.Ident("float32")
|
|
|
|
c.float64 = c.Ident("float64")
|
|
|
|
c.unsafePointer = c.Ident("unsafe.Pointer")
|
|
|
|
c.void = c.Ident("void")
|
|
|
|
c.string = c.Ident("string")
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
// base strips away qualifiers and typedefs to get the underlying type
|
|
|
|
func base(dt dwarf.Type) dwarf.Type {
|
|
|
|
for {
|
|
|
|
if d, ok := dt.(*dwarf.QualType); ok {
|
2009-12-15 16:33:31 -07:00
|
|
|
dt = d.Type
|
|
|
|
continue
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
if d, ok := dt.(*dwarf.TypedefType); ok {
|
2009-12-15 16:33:31 -07:00
|
|
|
dt = d.Type
|
|
|
|
continue
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
2009-12-15 16:33:31 -07:00
|
|
|
break
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
2009-12-15 16:33:31 -07:00
|
|
|
return dt
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
// Map from dwarf text names to aliases we use in package "C".
|
2010-07-14 18:17:53 -06:00
|
|
|
var dwarfToName = map[string]string{
|
2010-03-02 14:46:51 -07:00
|
|
|
"long int": "long",
|
|
|
|
"long unsigned int": "ulong",
|
|
|
|
"unsigned int": "uint",
|
|
|
|
"short unsigned int": "ushort",
|
|
|
|
"short int": "short",
|
|
|
|
"long long int": "longlong",
|
2009-09-24 12:43:19 -06:00
|
|
|
"long long unsigned int": "ulonglong",
|
2010-03-02 14:46:51 -07:00
|
|
|
"signed char": "schar",
|
2009-11-05 16:33:26 -07:00
|
|
|
}
|
2009-09-24 12:43:19 -06:00
|
|
|
|
|
|
|
// Type returns a *Type with the same memory layout as
|
|
|
|
// dtype when used as the type of a variable or a struct field.
|
|
|
|
func (c *typeConv) Type(dtype dwarf.Type) *Type {
|
|
|
|
if t, ok := c.m[dtype]; ok {
|
|
|
|
if t.Go == nil {
|
2009-11-09 13:07:39 -07:00
|
|
|
fatal("type conversion loop at %s", dtype)
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
2009-12-15 16:33:31 -07:00
|
|
|
return t
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
|
2009-12-15 16:33:31 -07:00
|
|
|
t := new(Type)
|
|
|
|
t.Size = dtype.Size()
|
|
|
|
t.Align = -1
|
|
|
|
t.C = dtype.Common().Name
|
2009-12-15 22:24:17 -07:00
|
|
|
t.EnumValues = nil
|
2009-12-15 16:33:31 -07:00
|
|
|
c.m[dtype] = t
|
2010-07-14 18:17:53 -06:00
|
|
|
|
2009-09-24 12:43:19 -06:00
|
|
|
if t.Size < 0 {
|
2009-11-19 23:09:01 -07:00
|
|
|
// Unsized types are [0]byte
|
2009-12-15 16:33:31 -07:00
|
|
|
t.Size = 0
|
|
|
|
t.Go = c.Opaque(0)
|
2009-11-29 19:14:39 -07:00
|
|
|
if t.C == "" {
|
|
|
|
t.C = "void"
|
|
|
|
}
|
2009-12-15 16:33:31 -07:00
|
|
|
return t
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
switch dt := dtype.(type) {
|
|
|
|
default:
|
2009-11-09 13:07:39 -07:00
|
|
|
fatal("unexpected type: %s", dtype)
|
2009-09-24 12:43:19 -06:00
|
|
|
|
|
|
|
case *dwarf.AddrType:
|
|
|
|
if t.Size != c.ptrSize {
|
2009-11-09 13:07:39 -07:00
|
|
|
fatal("unexpected: %d-byte address type - %s", t.Size, dtype)
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
2009-12-15 16:33:31 -07:00
|
|
|
t.Go = c.uintptr
|
|
|
|
t.Align = t.Size
|
2009-09-24 12:43:19 -06:00
|
|
|
|
|
|
|
case *dwarf.ArrayType:
|
|
|
|
if dt.StrideBitSize > 0 {
|
|
|
|
// Cannot represent bit-sized elements in Go.
|
2009-12-15 16:33:31 -07:00
|
|
|
t.Go = c.Opaque(t.Size)
|
|
|
|
break
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
gt := &ast.ArrayType{
|
|
|
|
Len: c.intExpr(dt.Count),
|
2009-12-15 16:33:31 -07:00
|
|
|
}
|
|
|
|
t.Go = gt // publish before recursive call
|
|
|
|
sub := c.Type(dt.Type)
|
|
|
|
t.Align = sub.Align
|
|
|
|
gt.Elt = sub.Go
|
|
|
|
t.C = fmt.Sprintf("typeof(%s[%d])", sub.C, dt.Count)
|
2009-09-24 12:43:19 -06:00
|
|
|
|
2010-01-13 11:25:28 -07:00
|
|
|
case *dwarf.BoolType:
|
|
|
|
t.Go = c.bool
|
|
|
|
t.Align = c.ptrSize
|
|
|
|
|
2009-09-24 12:43:19 -06:00
|
|
|
case *dwarf.CharType:
|
|
|
|
if t.Size != 1 {
|
2009-11-09 13:07:39 -07:00
|
|
|
fatal("unexpected: %d-byte char type - %s", t.Size, dtype)
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
2009-12-15 16:33:31 -07:00
|
|
|
t.Go = c.int8
|
|
|
|
t.Align = 1
|
2009-09-24 12:43:19 -06:00
|
|
|
|
|
|
|
case *dwarf.EnumType:
|
|
|
|
switch t.Size {
|
|
|
|
default:
|
2009-11-09 13:07:39 -07:00
|
|
|
fatal("unexpected: %d-byte enum type - %s", t.Size, dtype)
|
2009-09-24 12:43:19 -06:00
|
|
|
case 1:
|
2009-11-09 13:07:39 -07:00
|
|
|
t.Go = c.uint8
|
2009-09-24 12:43:19 -06:00
|
|
|
case 2:
|
2009-11-09 13:07:39 -07:00
|
|
|
t.Go = c.uint16
|
2009-09-24 12:43:19 -06:00
|
|
|
case 4:
|
2009-11-09 13:07:39 -07:00
|
|
|
t.Go = c.uint32
|
2009-09-24 12:43:19 -06:00
|
|
|
case 8:
|
2009-11-09 13:07:39 -07:00
|
|
|
t.Go = c.uint64
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
if t.Align = t.Size; t.Align >= c.ptrSize {
|
2009-11-09 13:07:39 -07:00
|
|
|
t.Align = c.ptrSize
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
2009-12-15 16:33:31 -07:00
|
|
|
t.C = "enum " + dt.EnumName
|
2009-12-15 22:24:17 -07:00
|
|
|
t.EnumValues = make(map[string]int64)
|
|
|
|
for _, ev := range dt.Val {
|
|
|
|
t.EnumValues[ev.Name] = ev.Val
|
|
|
|
}
|
2009-09-24 12:43:19 -06:00
|
|
|
|
|
|
|
case *dwarf.FloatType:
|
|
|
|
switch t.Size {
|
|
|
|
default:
|
2009-11-09 13:07:39 -07:00
|
|
|
fatal("unexpected: %d-byte float type - %s", t.Size, dtype)
|
2009-09-24 12:43:19 -06:00
|
|
|
case 4:
|
2009-11-09 13:07:39 -07:00
|
|
|
t.Go = c.float32
|
2009-09-24 12:43:19 -06:00
|
|
|
case 8:
|
2009-11-09 13:07:39 -07:00
|
|
|
t.Go = c.float64
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
if t.Align = t.Size; t.Align >= c.ptrSize {
|
2009-11-09 13:07:39 -07:00
|
|
|
t.Align = c.ptrSize
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
case *dwarf.FuncType:
|
|
|
|
// No attempt at translation: would enable calls
|
|
|
|
// directly between worlds, but we need to moderate those.
|
2009-12-15 16:33:31 -07:00
|
|
|
t.Go = c.uintptr
|
|
|
|
t.Align = c.ptrSize
|
2009-09-24 12:43:19 -06:00
|
|
|
|
|
|
|
case *dwarf.IntType:
|
|
|
|
if dt.BitSize > 0 {
|
2009-11-09 13:07:39 -07:00
|
|
|
fatal("unexpected: %d-bit int type - %s", dt.BitSize, dtype)
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
switch t.Size {
|
|
|
|
default:
|
2009-11-09 13:07:39 -07:00
|
|
|
fatal("unexpected: %d-byte int type - %s", t.Size, dtype)
|
2009-09-24 12:43:19 -06:00
|
|
|
case 1:
|
2009-11-09 13:07:39 -07:00
|
|
|
t.Go = c.int8
|
2009-09-24 12:43:19 -06:00
|
|
|
case 2:
|
2009-11-09 13:07:39 -07:00
|
|
|
t.Go = c.int16
|
2009-09-24 12:43:19 -06:00
|
|
|
case 4:
|
2009-11-09 13:07:39 -07:00
|
|
|
t.Go = c.int32
|
2009-09-24 12:43:19 -06:00
|
|
|
case 8:
|
2009-11-09 13:07:39 -07:00
|
|
|
t.Go = c.int64
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
if t.Align = t.Size; t.Align >= c.ptrSize {
|
2009-11-09 13:07:39 -07:00
|
|
|
t.Align = c.ptrSize
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
case *dwarf.PtrType:
|
2009-12-15 16:33:31 -07:00
|
|
|
t.Align = c.ptrSize
|
2009-09-24 12:43:19 -06:00
|
|
|
|
|
|
|
// Translate void* as unsafe.Pointer
|
|
|
|
if _, ok := base(dt.Type).(*dwarf.VoidType); ok {
|
2009-12-15 16:33:31 -07:00
|
|
|
t.Go = c.unsafePointer
|
|
|
|
t.C = "void*"
|
|
|
|
break
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
|
2009-12-15 16:33:31 -07:00
|
|
|
gt := &ast.StarExpr{}
|
|
|
|
t.Go = gt // publish before recursive call
|
|
|
|
sub := c.Type(dt.Type)
|
|
|
|
gt.X = sub.Go
|
|
|
|
t.C = sub.C + "*"
|
2009-09-24 12:43:19 -06:00
|
|
|
|
|
|
|
case *dwarf.QualType:
|
|
|
|
// Ignore qualifier.
|
2009-12-15 16:33:31 -07:00
|
|
|
t = c.Type(dt.Type)
|
|
|
|
c.m[dtype] = t
|
|
|
|
return t
|
2009-09-24 12:43:19 -06:00
|
|
|
|
|
|
|
case *dwarf.StructType:
|
|
|
|
// Convert to Go struct, being careful about alignment.
|
|
|
|
// Have to give it a name to simulate C "struct foo" references.
|
2009-12-15 16:33:31 -07:00
|
|
|
tag := dt.StructName
|
2009-09-24 12:43:19 -06:00
|
|
|
if tag == "" {
|
2009-12-15 16:33:31 -07:00
|
|
|
tag = "__" + strconv.Itoa(c.tagGen)
|
|
|
|
c.tagGen++
|
2009-09-24 12:43:19 -06:00
|
|
|
} else if t.C == "" {
|
2009-11-09 13:07:39 -07:00
|
|
|
t.C = dt.Kind + " " + tag
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
2010-07-14 18:17:53 -06:00
|
|
|
name := c.Ident("_Ctype_" + dt.Kind + "_" + tag)
|
2009-12-15 16:33:31 -07:00
|
|
|
t.Go = name // publish before recursive calls
|
2009-09-24 12:43:19 -06:00
|
|
|
switch dt.Kind {
|
|
|
|
case "union", "class":
|
2010-08-13 11:42:18 -06:00
|
|
|
c.typedef[name.Name] = c.Opaque(t.Size)
|
2009-09-24 12:43:19 -06:00
|
|
|
if t.C == "" {
|
2009-11-09 13:07:39 -07:00
|
|
|
t.C = fmt.Sprintf("typeof(unsigned char[%d])", t.Size)
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
case "struct":
|
2009-12-15 16:33:31 -07:00
|
|
|
g, csyntax, align := c.Struct(dt)
|
2009-09-24 12:43:19 -06:00
|
|
|
if t.C == "" {
|
2009-11-09 13:07:39 -07:00
|
|
|
t.C = csyntax
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
2009-12-15 16:33:31 -07:00
|
|
|
t.Align = align
|
2010-08-13 11:42:18 -06:00
|
|
|
c.typedef[name.Name] = g
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
case *dwarf.TypedefType:
|
|
|
|
// Record typedef for printing.
|
|
|
|
if dt.Name == "_GoString_" {
|
|
|
|
// Special C name for Go string type.
|
|
|
|
// Knows string layout used by compilers: pointer plus length,
|
|
|
|
// which rounds up to 2 pointers after alignment.
|
2009-12-15 16:33:31 -07:00
|
|
|
t.Go = c.string
|
|
|
|
t.Size = c.ptrSize * 2
|
|
|
|
t.Align = c.ptrSize
|
|
|
|
break
|
|
|
|
}
|
2010-07-14 18:17:53 -06:00
|
|
|
name := c.Ident("_Ctypedef_" + dt.Name)
|
2009-12-15 16:33:31 -07:00
|
|
|
t.Go = name // publish before recursive call
|
|
|
|
sub := c.Type(dt.Type)
|
|
|
|
t.Size = sub.Size
|
|
|
|
t.Align = sub.Align
|
2010-08-13 11:42:18 -06:00
|
|
|
if _, ok := c.typedef[name.Name]; !ok {
|
|
|
|
c.typedef[name.Name] = sub.Go
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
case *dwarf.UcharType:
|
|
|
|
if t.Size != 1 {
|
2009-11-09 13:07:39 -07:00
|
|
|
fatal("unexpected: %d-byte uchar type - %s", t.Size, dtype)
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
2009-12-15 16:33:31 -07:00
|
|
|
t.Go = c.uint8
|
|
|
|
t.Align = 1
|
2009-09-24 12:43:19 -06:00
|
|
|
|
|
|
|
case *dwarf.UintType:
|
|
|
|
if dt.BitSize > 0 {
|
2009-11-09 13:07:39 -07:00
|
|
|
fatal("unexpected: %d-bit uint type - %s", dt.BitSize, dtype)
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
switch t.Size {
|
|
|
|
default:
|
2009-11-09 13:07:39 -07:00
|
|
|
fatal("unexpected: %d-byte uint type - %s", t.Size, dtype)
|
2009-09-24 12:43:19 -06:00
|
|
|
case 1:
|
2009-11-09 13:07:39 -07:00
|
|
|
t.Go = c.uint8
|
2009-09-24 12:43:19 -06:00
|
|
|
case 2:
|
2009-11-09 13:07:39 -07:00
|
|
|
t.Go = c.uint16
|
2009-09-24 12:43:19 -06:00
|
|
|
case 4:
|
2009-11-09 13:07:39 -07:00
|
|
|
t.Go = c.uint32
|
2009-09-24 12:43:19 -06:00
|
|
|
case 8:
|
2009-11-09 13:07:39 -07:00
|
|
|
t.Go = c.uint64
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
if t.Align = t.Size; t.Align >= c.ptrSize {
|
2009-11-09 13:07:39 -07:00
|
|
|
t.Align = c.ptrSize
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
case *dwarf.VoidType:
|
2009-12-15 16:33:31 -07:00
|
|
|
t.Go = c.void
|
|
|
|
t.C = "void"
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
switch dtype.(type) {
|
2010-01-13 11:25:28 -07:00
|
|
|
case *dwarf.AddrType, *dwarf.BoolType, *dwarf.CharType, *dwarf.IntType, *dwarf.FloatType, *dwarf.UcharType, *dwarf.UintType:
|
2009-12-15 16:33:31 -07:00
|
|
|
s := dtype.Common().Name
|
2009-09-24 12:43:19 -06:00
|
|
|
if s != "" {
|
2010-07-14 18:17:53 -06:00
|
|
|
if ss, ok := dwarfToName[s]; ok {
|
2009-11-09 13:07:39 -07:00
|
|
|
s = ss
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
2010-07-01 15:08:14 -06:00
|
|
|
s = strings.Join(strings.Split(s, " ", -1), "") // strip spaces
|
2010-07-14 18:17:53 -06:00
|
|
|
name := c.Ident("_Ctype_" + s)
|
2010-08-13 11:42:18 -06:00
|
|
|
c.typedef[name.Name] = t.Go
|
2009-12-15 16:33:31 -07:00
|
|
|
t.Go = name
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
if t.C == "" {
|
2009-11-09 13:07:39 -07:00
|
|
|
fatal("internal error: did not create C name for %s", dtype)
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
|
2009-12-15 16:33:31 -07:00
|
|
|
return t
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
// FuncArg returns a Go type with the same memory layout as
|
|
|
|
// dtype when used as the type of a C function argument.
|
|
|
|
func (c *typeConv) FuncArg(dtype dwarf.Type) *Type {
|
2009-12-15 16:33:31 -07:00
|
|
|
t := c.Type(dtype)
|
2009-09-24 12:43:19 -06:00
|
|
|
switch dt := dtype.(type) {
|
|
|
|
case *dwarf.ArrayType:
|
|
|
|
// Arrays are passed implicitly as pointers in C.
|
|
|
|
// In Go, we must be explicit.
|
|
|
|
return &Type{
|
2010-03-02 14:46:51 -07:00
|
|
|
Size: c.ptrSize,
|
2009-09-24 12:43:19 -06:00
|
|
|
Align: c.ptrSize,
|
2010-03-02 14:46:51 -07:00
|
|
|
Go: &ast.StarExpr{X: t.Go},
|
|
|
|
C: t.C + "*",
|
2009-11-09 13:07:39 -07:00
|
|
|
}
|
2009-09-24 12:43:19 -06:00
|
|
|
case *dwarf.TypedefType:
|
|
|
|
// C has much more relaxed rules than Go for
|
|
|
|
// implicit type conversions. When the parameter
|
|
|
|
// is type T defined as *X, simulate a little of the
|
|
|
|
// laxness of C by making the argument *X instead of T.
|
|
|
|
if ptr, ok := base(dt.Type).(*dwarf.PtrType); ok {
|
2009-11-18 00:42:21 -07:00
|
|
|
// Unless the typedef happens to point to void* since
|
|
|
|
// Go has special rules around using unsafe.Pointer.
|
|
|
|
if _, void := base(ptr.Type).(*dwarf.VoidType); !void {
|
|
|
|
return c.Type(ptr)
|
|
|
|
}
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
}
|
2009-12-15 16:33:31 -07:00
|
|
|
return t
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
// FuncType returns the Go type analogous to dtype.
|
|
|
|
// There is no guarantee about matching memory layout.
|
|
|
|
func (c *typeConv) FuncType(dtype *dwarf.FuncType) *FuncType {
|
2009-12-15 16:33:31 -07:00
|
|
|
p := make([]*Type, len(dtype.ParamType))
|
|
|
|
gp := make([]*ast.Field, len(dtype.ParamType))
|
2009-09-24 12:43:19 -06:00
|
|
|
for i, f := range dtype.ParamType {
|
2009-11-23 23:02:12 -07:00
|
|
|
// gcc's DWARF generator outputs a single DotDotDotType parameter for
|
|
|
|
// function pointers that specify no parameters (e.g. void
|
|
|
|
// (*__cgo_0)()). Treat this special case as void. This case is
|
|
|
|
// invalid according to ISO C anyway (i.e. void (*__cgo_1)(...) is not
|
|
|
|
// legal).
|
|
|
|
if _, ok := f.(*dwarf.DotDotDotType); ok && i == 0 {
|
2009-12-15 16:33:31 -07:00
|
|
|
p, gp = nil, nil
|
|
|
|
break
|
2009-11-23 23:02:12 -07:00
|
|
|
}
|
2009-12-15 16:33:31 -07:00
|
|
|
p[i] = c.FuncArg(f)
|
|
|
|
gp[i] = &ast.Field{Type: p[i].Go}
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
2009-12-15 16:33:31 -07:00
|
|
|
var r *Type
|
|
|
|
var gr []*ast.Field
|
2009-09-24 12:43:19 -06:00
|
|
|
if _, ok := dtype.ReturnType.(*dwarf.VoidType); !ok && dtype.ReturnType != nil {
|
2009-12-15 16:33:31 -07:00
|
|
|
r = c.Type(dtype.ReturnType)
|
|
|
|
gr = []*ast.Field{&ast.Field{Type: r.Go}}
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
return &FuncType{
|
|
|
|
Params: p,
|
|
|
|
Result: r,
|
|
|
|
Go: &ast.FuncType{
|
2010-03-02 14:46:51 -07:00
|
|
|
Params: &ast.FieldList{List: gp},
|
2010-02-24 17:17:11 -07:00
|
|
|
Results: &ast.FieldList{List: gr},
|
2009-11-05 16:33:26 -07:00
|
|
|
},
|
2009-12-15 16:33:31 -07:00
|
|
|
}
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
// Identifier
|
2010-07-14 18:17:53 -06:00
|
|
|
func (c *typeConv) Ident(s string) *ast.Ident {
|
|
|
|
return ast.NewIdent(s)
|
|
|
|
}
|
2009-09-24 12:43:19 -06:00
|
|
|
|
|
|
|
// Opaque type of n bytes.
|
|
|
|
func (c *typeConv) Opaque(n int64) ast.Expr {
|
|
|
|
return &ast.ArrayType{
|
|
|
|
Len: c.intExpr(n),
|
2009-11-05 16:33:26 -07:00
|
|
|
Elt: c.byte,
|
2009-11-09 13:07:39 -07:00
|
|
|
}
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
// Expr for integer n.
|
|
|
|
func (c *typeConv) intExpr(n int64) ast.Expr {
|
|
|
|
return &ast.BasicLit{
|
2010-03-02 14:46:51 -07:00
|
|
|
Kind: token.INT,
|
2010-02-25 17:01:29 -07:00
|
|
|
Value: []byte(strconv.Itoa64(n)),
|
2009-11-09 13:07:39 -07:00
|
|
|
}
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
|
|
|
|
// Add padding of given size to fld.
|
|
|
|
func (c *typeConv) pad(fld []*ast.Field, size int64) []*ast.Field {
|
2009-12-15 16:33:31 -07:00
|
|
|
n := len(fld)
|
|
|
|
fld = fld[0 : n+1]
|
|
|
|
fld[n] = &ast.Field{Names: []*ast.Ident{c.Ident("_")}, Type: c.Opaque(size)}
|
|
|
|
return fld
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
|
2010-07-14 18:17:53 -06:00
|
|
|
// Struct conversion: return Go and (6g) C syntax for type.
|
2009-11-05 16:33:26 -07:00
|
|
|
func (c *typeConv) Struct(dt *dwarf.StructType) (expr *ast.StructType, csyntax string, align int64) {
|
2010-07-14 18:17:53 -06:00
|
|
|
var buf bytes.Buffer
|
|
|
|
buf.WriteString("struct {")
|
2009-12-15 16:33:31 -07:00
|
|
|
fld := make([]*ast.Field, 0, 2*len(dt.Field)+1) // enough for padding around every field
|
|
|
|
off := int64(0)
|
2009-11-18 10:59:10 -07:00
|
|
|
|
2010-07-14 18:17:53 -06:00
|
|
|
// Rename struct fields that happen to be named Go keywords into
|
2009-11-18 10:59:10 -07:00
|
|
|
// _{keyword}. Create a map from C ident -> Go ident. The Go ident will
|
|
|
|
// be mangled. Any existing identifier that already has the same name on
|
|
|
|
// the C-side will cause the Go-mangled version to be prefixed with _.
|
|
|
|
// (e.g. in a struct with fields '_type' and 'type', the latter would be
|
|
|
|
// rendered as '__type' in Go).
|
2009-12-15 16:33:31 -07:00
|
|
|
ident := make(map[string]string)
|
|
|
|
used := make(map[string]bool)
|
2009-11-18 10:59:10 -07:00
|
|
|
for _, f := range dt.Field {
|
2009-12-15 16:33:31 -07:00
|
|
|
ident[f.Name] = f.Name
|
|
|
|
used[f.Name] = true
|
2009-11-18 10:59:10 -07:00
|
|
|
}
|
|
|
|
for cid, goid := range ident {
|
2010-02-25 17:01:29 -07:00
|
|
|
if token.Lookup([]byte(goid)).IsKeyword() {
|
2009-11-18 10:59:10 -07:00
|
|
|
// Avoid keyword
|
2009-12-15 16:33:31 -07:00
|
|
|
goid = "_" + goid
|
2009-11-18 10:59:10 -07:00
|
|
|
|
|
|
|
// Also avoid existing fields
|
|
|
|
for _, exist := used[goid]; exist; _, exist = used[goid] {
|
|
|
|
goid = "_" + goid
|
|
|
|
}
|
|
|
|
|
2009-12-15 16:33:31 -07:00
|
|
|
used[goid] = true
|
|
|
|
ident[cid] = goid
|
2009-11-18 10:59:10 -07:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2009-09-24 12:43:19 -06:00
|
|
|
for _, f := range dt.Field {
|
2009-12-17 13:38:29 -07:00
|
|
|
if f.BitSize > 0 && f.BitSize != f.ByteSize*8 {
|
|
|
|
continue
|
|
|
|
}
|
2009-09-24 12:43:19 -06:00
|
|
|
if f.ByteOffset > off {
|
2009-12-15 16:33:31 -07:00
|
|
|
fld = c.pad(fld, f.ByteOffset-off)
|
|
|
|
off = f.ByteOffset
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
2009-12-15 16:33:31 -07:00
|
|
|
t := c.Type(f.Type)
|
|
|
|
n := len(fld)
|
|
|
|
fld = fld[0 : n+1]
|
2009-11-18 10:59:10 -07:00
|
|
|
|
2009-12-15 16:33:31 -07:00
|
|
|
fld[n] = &ast.Field{Names: []*ast.Ident{c.Ident(ident[f.Name])}, Type: t.Go}
|
|
|
|
off += t.Size
|
2010-07-14 18:17:53 -06:00
|
|
|
buf.WriteString(t.C)
|
|
|
|
buf.WriteString(" ")
|
|
|
|
buf.WriteString(f.Name)
|
|
|
|
buf.WriteString("; ")
|
2009-09-24 12:43:19 -06:00
|
|
|
if t.Align > align {
|
2009-11-09 13:07:39 -07:00
|
|
|
align = t.Align
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
}
|
|
|
|
if off < dt.ByteSize {
|
2009-12-15 16:33:31 -07:00
|
|
|
fld = c.pad(fld, dt.ByteSize-off)
|
|
|
|
off = dt.ByteSize
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
|
|
|
if off != dt.ByteSize {
|
2009-11-09 13:07:39 -07:00
|
|
|
fatal("struct size calculation error")
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|
2010-07-14 18:17:53 -06:00
|
|
|
buf.WriteString("}")
|
|
|
|
csyntax = buf.String()
|
2010-02-24 17:17:11 -07:00
|
|
|
expr = &ast.StructType{Fields: &ast.FieldList{List: fld}}
|
2009-12-15 16:33:31 -07:00
|
|
|
return
|
2009-09-24 12:43:19 -06:00
|
|
|
}
|