1
0
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:
Sebastien Binet 2011-01-19 14:30:57 -05:00 committed by Russ Cox
parent 13c2e62966
commit 655da99627
5 changed files with 52 additions and 22 deletions

View File

@ -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.

View File

@ -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()
{ {

Binary file not shown.

Binary file not shown.

View File

@ -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 {