From 29e0246c68efd4b68f9593ff26b3c123fb05161d Mon Sep 17 00:00:00 2001 From: Pierre-Marie de Rodat Date: Fri, 22 Mar 2019 13:59:02 +0000 Subject: [Ada] GNAT.Sockets: fix recent regressions The support for IPv6 that was added since last release triggered regressions on various platforms. The size of structures passed to low level routines was not correct anymore: it should depend on the address family, now. 2019-03-22 Dmitriy Anisimkov gcc/ada/ PR ada/89583 * libgnat/g-socket.adb (Bind_Socket, Connect_Socket, Send_Socket): Fix the computation of structure lengths passed to low level routines. (Is_IPv6_Address): Fix the number of expected colons. 2019-03-22 Simon Wright gcc/testsuite/ PR ada/89583 * gnat.dg/socket2.adb: New. From-SVN: r269873 --- gcc/ada/ChangeLog | 8 ++++++++ gcc/ada/libgnat/g-socket.adb | 13 ++++++------- 2 files changed, 14 insertions(+), 7 deletions(-) (limited to 'gcc/ada') diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 6cb5389..81b5db9 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,11 @@ +2019-03-22 Dmitriy Anisimkov + + PR ada/89583 + * libgnat/g-socket.adb (Bind_Socket, Connect_Socket, + Send_Socket): Fix the computation of structure lengths passed to + low level routines. + (Is_IPv6_Address): Fix the number of expected colons. + 2019-03-11 Martin Liska * gcc-interface/misc.c (gnat_post_options): Wrap option name in string diff --git a/gcc/ada/libgnat/g-socket.adb b/gcc/ada/libgnat/g-socket.adb index c0b3079..476a213 100644 --- a/gcc/ada/libgnat/g-socket.adb +++ b/gcc/ada/libgnat/g-socket.adb @@ -461,12 +461,12 @@ package body GNAT.Sockets is is Res : C.int; Sin : aliased Sockaddr; - Len : constant C.int := Sin'Size / 8; begin Set_Address (Sin'Unchecked_Access, Address); - Res := C_Bind (C.int (Socket), Sin'Address, Len); + Res := C_Bind + (C.int (Socket), Sin'Address, C.int (Lengths (Address.Family))); if Res = Failure then Raise_Socket_Error (Socket_Errno); @@ -666,12 +666,11 @@ package body GNAT.Sockets is Server : Sock_Addr_Type) return C.int is Sin : aliased Sockaddr; - Len : constant C.int := Sin'Size / 8; - begin Set_Address (Sin'Unchecked_Access, Server); - return C_Connect (C.int (Socket), Sin'Address, Len); + return C_Connect + (C.int (Socket), Sin'Address, C.int (Lengths (Server.Family))); end Connect_Socket; procedure Connect_Socket @@ -1794,7 +1793,7 @@ package body GNAT.Sockets is end if; end loop; - return Colons <= 7; + return Colons <= 8; end Is_IPv6_Address; --------------------- @@ -2403,7 +2402,7 @@ package body GNAT.Sockets is if To /= null then Set_Address (Sin'Unchecked_Access, To.all); C_To := Sin'Address; - Len := Sin'Size / 8; + Len := C.int (Thin_Common.Lengths (To.Family)); else C_To := System.Null_Address; -- cgit v1.1 From 22be58735992f08020817687378d0004ac1ab680 Mon Sep 17 00:00:00 2001 From: Eric Botcazou Date: Sun, 7 Apr 2019 10:34:19 +0000 Subject: c-ada-spec.c (is_float128): New predicate extracted from... c-family/ * c-ada-spec.c (is_float128): New predicate extracted from... (dump_ada_node) : Use it to recognize __cfloat128. : ...here. Call it. ada/ * libgnat/i-cexten.ads (CFloat_128): New type. From-SVN: r270188 --- gcc/ada/ChangeLog | 4 ++++ gcc/ada/libgnat/i-cexten.ads | 10 +++++++++- 2 files changed, 13 insertions(+), 1 deletion(-) (limited to 'gcc/ada') diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog index 81b5db9..7e36b01 100644 --- a/gcc/ada/ChangeLog +++ b/gcc/ada/ChangeLog @@ -1,3 +1,7 @@ +2019-04-07 Eric Botcazou + + * libgnat/i-cexten.ads (CFloat_128): New type. + 2019-03-22 Dmitriy Anisimkov PR ada/89583 diff --git a/gcc/ada/libgnat/i-cexten.ads b/gcc/ada/libgnat/i-cexten.ads index bf396a4..d0a0747 100644 --- a/gcc/ada/libgnat/i-cexten.ads +++ b/gcc/ada/libgnat/i-cexten.ads @@ -74,7 +74,7 @@ package Interfaces.C.Extensions is for Signed_128'Alignment use unsigned_long_long'Alignment * 2; -- 128-bit floating-point type available on x86: - -- typedef long_double float_128 __attribute__ ((mode (TF))); + -- typedef float float_128 __attribute__ ((mode (TF))); type Float_128 is record low, high : unsigned_long_long; @@ -82,6 +82,14 @@ package Interfaces.C.Extensions is pragma Convention (C_Pass_By_Copy, Float_128); for Float_128'Alignment use unsigned_long_long'Alignment * 2; + -- 128-bit complex floating-point type available on x86: + -- typedef _Complex float cfloat_128 __attribute__ ((mode (TC))); + + type CFloat_128 is record + re, im : Float_128; + end record; + pragma Convention (C_Pass_By_Copy, CFloat_128); + -- Types for bitfields type Unsigned_1 is mod 2 ** 1; -- cgit v1.1