mirror of
https://github.com/golang/go
synced 2024-11-21 21:54:40 -07:00
cgo: add complex float, complex double
R=rsc CC=binet, golang-dev https://golang.org/cl/3906041
This commit is contained in:
parent
13c2e62966
commit
655da99627
@ -27,13 +27,15 @@ var debugDefine = flag.Bool("debug-define", false, "print relevant #defines")
|
|||||||
var debugGcc = flag.Bool("debug-gcc", false, "print gcc invocations")
|
var debugGcc = flag.Bool("debug-gcc", false, "print gcc invocations")
|
||||||
|
|
||||||
var nameToC = map[string]string{
|
var nameToC = map[string]string{
|
||||||
"schar": "signed char",
|
"schar": "signed char",
|
||||||
"uchar": "unsigned char",
|
"uchar": "unsigned char",
|
||||||
"ushort": "unsigned short",
|
"ushort": "unsigned short",
|
||||||
"uint": "unsigned int",
|
"uint": "unsigned int",
|
||||||
"ulong": "unsigned long",
|
"ulong": "unsigned long",
|
||||||
"longlong": "long long",
|
"longlong": "long long",
|
||||||
"ulonglong": "unsigned long long",
|
"ulonglong": "unsigned long long",
|
||||||
|
"complexfloat": "float complex",
|
||||||
|
"complexdouble": "double complex",
|
||||||
}
|
}
|
||||||
|
|
||||||
// cname returns the C name to use for C.s.
|
// cname returns the C name to use for C.s.
|
||||||
@ -591,6 +593,7 @@ type typeConv struct {
|
|||||||
int8, int16, int32, int64 ast.Expr
|
int8, int16, int32, int64 ast.Expr
|
||||||
uint8, uint16, uint32, uint64, uintptr ast.Expr
|
uint8, uint16, uint32, uint64, uintptr ast.Expr
|
||||||
float32, float64 ast.Expr
|
float32, float64 ast.Expr
|
||||||
|
complex64, complex128 ast.Expr
|
||||||
void ast.Expr
|
void ast.Expr
|
||||||
unsafePointer ast.Expr
|
unsafePointer ast.Expr
|
||||||
string ast.Expr
|
string ast.Expr
|
||||||
@ -617,6 +620,8 @@ func (c *typeConv) Init(ptrSize int64) {
|
|||||||
c.uintptr = c.Ident("uintptr")
|
c.uintptr = c.Ident("uintptr")
|
||||||
c.float32 = c.Ident("float32")
|
c.float32 = c.Ident("float32")
|
||||||
c.float64 = c.Ident("float64")
|
c.float64 = c.Ident("float64")
|
||||||
|
c.complex64 = c.Ident("complex64")
|
||||||
|
c.complex128 = c.Ident("complex128")
|
||||||
c.unsafePointer = c.Ident("unsafe.Pointer")
|
c.unsafePointer = c.Ident("unsafe.Pointer")
|
||||||
c.void = c.Ident("void")
|
c.void = c.Ident("void")
|
||||||
c.string = c.Ident("string")
|
c.string = c.Ident("string")
|
||||||
@ -648,6 +653,8 @@ var dwarfToName = map[string]string{
|
|||||||
"long long int": "longlong",
|
"long long int": "longlong",
|
||||||
"long long unsigned int": "ulonglong",
|
"long long unsigned int": "ulonglong",
|
||||||
"signed char": "schar",
|
"signed char": "schar",
|
||||||
|
"float complex": "complexfloat",
|
||||||
|
"double complex": "complexdouble",
|
||||||
}
|
}
|
||||||
|
|
||||||
// Type returns a *Type with the same memory layout as
|
// Type returns a *Type with the same memory layout as
|
||||||
@ -749,6 +756,19 @@ func (c *typeConv) Type(dtype dwarf.Type) *Type {
|
|||||||
t.Align = c.ptrSize
|
t.Align = c.ptrSize
|
||||||
}
|
}
|
||||||
|
|
||||||
|
case *dwarf.ComplexType:
|
||||||
|
switch t.Size {
|
||||||
|
default:
|
||||||
|
fatal("unexpected: %d-byte complex type - %s", t.Size, dtype)
|
||||||
|
case 8:
|
||||||
|
t.Go = c.complex64
|
||||||
|
case 16:
|
||||||
|
t.Go = c.complex128
|
||||||
|
}
|
||||||
|
if t.Align = t.Size; t.Align >= c.ptrSize {
|
||||||
|
t.Align = c.ptrSize
|
||||||
|
}
|
||||||
|
|
||||||
case *dwarf.FuncType:
|
case *dwarf.FuncType:
|
||||||
// No attempt at translation: would enable calls
|
// No attempt at translation: would enable calls
|
||||||
// directly between worlds, but we need to moderate those.
|
// directly between worlds, but we need to moderate those.
|
||||||
|
7
src/pkg/debug/dwarf/testdata/typedef.c
vendored
7
src/pkg/debug/dwarf/testdata/typedef.c
vendored
@ -9,6 +9,7 @@ gcc -gdwarf-2 -m64 -c typedef.c && gcc -gdwarf-2 -m64 -o typedef.elf typedef.o
|
|||||||
OS X Mach-O:
|
OS X Mach-O:
|
||||||
gcc -gdwarf-2 -m64 -c typedef.c -o typedef.macho
|
gcc -gdwarf-2 -m64 -c typedef.c -o typedef.macho
|
||||||
*/
|
*/
|
||||||
|
#include <complex.h>
|
||||||
|
|
||||||
typedef volatile int* t_ptr_volatile_int;
|
typedef volatile int* t_ptr_volatile_int;
|
||||||
typedef const char *t_ptr_const_char;
|
typedef const char *t_ptr_const_char;
|
||||||
@ -16,6 +17,9 @@ typedef long t_long;
|
|||||||
typedef unsigned short t_ushort;
|
typedef unsigned short t_ushort;
|
||||||
typedef int t_func_int_of_float_double(float, double);
|
typedef int t_func_int_of_float_double(float, double);
|
||||||
typedef int (*t_ptr_func_int_of_float_double)(float, double);
|
typedef int (*t_ptr_func_int_of_float_double)(float, double);
|
||||||
|
typedef int (*t_ptr_func_int_of_float_complex)(float complex);
|
||||||
|
typedef int (*t_ptr_func_int_of_double_complex)(double complex);
|
||||||
|
typedef int (*t_ptr_func_int_of_long_double_complex)(long double complex);
|
||||||
typedef int *t_func_ptr_int_of_char_schar_uchar(char, signed char, unsigned char);
|
typedef int *t_func_ptr_int_of_char_schar_uchar(char, signed char, unsigned char);
|
||||||
typedef void t_func_void_of_char(char);
|
typedef void t_func_void_of_char(char);
|
||||||
typedef void t_func_void_of_void(void);
|
typedef void t_func_void_of_void(void);
|
||||||
@ -65,6 +69,9 @@ t_my_union *a12a;
|
|||||||
t_my_enum *a13;
|
t_my_enum *a13;
|
||||||
t_my_list *a14;
|
t_my_list *a14;
|
||||||
t_my_tree *a15;
|
t_my_tree *a15;
|
||||||
|
t_ptr_func_int_of_float_complex *a16;
|
||||||
|
t_ptr_func_int_of_double_complex *a17;
|
||||||
|
t_ptr_func_int_of_long_double_complex *a18;
|
||||||
|
|
||||||
int main()
|
int main()
|
||||||
{
|
{
|
||||||
|
BIN
src/pkg/debug/dwarf/testdata/typedef.elf
vendored
BIN
src/pkg/debug/dwarf/testdata/typedef.elf
vendored
Binary file not shown.
BIN
src/pkg/debug/dwarf/testdata/typedef.macho
vendored
BIN
src/pkg/debug/dwarf/testdata/typedef.macho
vendored
Binary file not shown.
@ -12,21 +12,24 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
var typedefTests = map[string]string{
|
var typedefTests = map[string]string{
|
||||||
"t_ptr_volatile_int": "*volatile int",
|
"t_ptr_volatile_int": "*volatile int",
|
||||||
"t_ptr_const_char": "*const char",
|
"t_ptr_const_char": "*const char",
|
||||||
"t_long": "long int",
|
"t_long": "long int",
|
||||||
"t_ushort": "short unsigned int",
|
"t_ushort": "short unsigned int",
|
||||||
"t_func_int_of_float_double": "func(float, double) int",
|
"t_func_int_of_float_double": "func(float, double) int",
|
||||||
"t_ptr_func_int_of_float_double": "*func(float, double) int",
|
"t_ptr_func_int_of_float_double": "*func(float, double) int",
|
||||||
"t_func_ptr_int_of_char_schar_uchar": "func(char, signed char, unsigned char) *int",
|
"t_ptr_func_int_of_float_complex": "*func(complex float) int",
|
||||||
"t_func_void_of_char": "func(char) void",
|
"t_ptr_func_int_of_double_complex": "*func(complex double) int",
|
||||||
"t_func_void_of_void": "func() void",
|
"t_ptr_func_int_of_long_double_complex": "*func(complex long double) int",
|
||||||
"t_func_void_of_ptr_char_dots": "func(*char, ...) void",
|
"t_func_ptr_int_of_char_schar_uchar": "func(char, signed char, unsigned char) *int",
|
||||||
"t_my_struct": "struct my_struct {vi volatile int@0; x char@4 : 1@7; y int@4 : 4@27; array [40]long long int@8}",
|
"t_func_void_of_char": "func(char) void",
|
||||||
"t_my_union": "union my_union {vi volatile int@0; x char@0 : 1@7; y int@0 : 4@28; array [40]long long int@0}",
|
"t_func_void_of_void": "func() void",
|
||||||
"t_my_enum": "enum my_enum {e1=1; e2=2; e3=-5; e4=1000000000000000}",
|
"t_func_void_of_ptr_char_dots": "func(*char, ...) void",
|
||||||
"t_my_list": "struct list {val short int@0; next *t_my_list@8}",
|
"t_my_struct": "struct my_struct {vi volatile int@0; x char@4 : 1@7; y int@4 : 4@27; array [40]long long int@8}",
|
||||||
"t_my_tree": "struct tree {left *struct tree@0; right *struct tree@8; val long long unsigned int@16}",
|
"t_my_union": "union my_union {vi volatile int@0; x char@0 : 1@7; y int@0 : 4@28; array [40]long long int@0}",
|
||||||
|
"t_my_enum": "enum my_enum {e1=1; e2=2; e3=-5; e4=1000000000000000}",
|
||||||
|
"t_my_list": "struct list {val short int@0; next *t_my_list@8}",
|
||||||
|
"t_my_tree": "struct tree {left *struct tree@0; right *struct tree@8; val long long unsigned int@16}",
|
||||||
}
|
}
|
||||||
|
|
||||||
func elfData(t *testing.T, name string) *Data {
|
func elfData(t *testing.T, name string) *Data {
|
||||||
|
Loading…
Reference in New Issue
Block a user