summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gcc/ada/ChangeLog23
-rw-r--r--gcc/ada/g-socthi-mingw.adb112
-rw-r--r--gcc/ada/make.adb12
-rw-r--r--gcc/ada/sem_aggr.adb11
-rw-r--r--gcc/ada/sem_ch10.adb13
-rw-r--r--gcc/ada/sem_ch8.adb19
-rw-r--r--gcc/ada/sem_res.adb9
7 files changed, 173 insertions, 26 deletions
diff --git a/gcc/ada/ChangeLog b/gcc/ada/ChangeLog
index f8f8317b19a..8408a559241 100644
--- a/gcc/ada/ChangeLog
+++ b/gcc/ada/ChangeLog
@@ -1,5 +1,28 @@
2010-06-22 Robert Dewar <dewar@adacore.com>
+ * sem_aggr.adb (Resolve_Record_Aggregate): Do style check on component
+ name.
+ * sem_ch10.adb (Analyze_Subunit): Do style check on parent unit name.
+ * sem_ch8.adb (Find_Direct_Name): For non-overloadable entities, do
+ style check.
+ * sem_res.adb (Resolve_Entity_Name): Do style check for enumeration
+ literals.
+
+2010-06-22 Vincent Celier <celier@adacore.com>
+
+ * make.adb (Scan_Make_Arg): No longer pass -nostdlib to the compiler as
+ it has no effect. Always pass -nostdlib to gnatlink, even on VMS.
+
+2010-06-22 Pascal Obry <obry@adacore.com>
+
+ * g-socthi-mingw.adb: Fix implementation of the vectored sockets on
+ Windows.
+ (C_Recvmsg): Make sure the routine is atomic. Also fully
+ fill vectors in the proper order.
+ (C_Sendmsg): Make sure the routine is atomic.
+
+2010-06-22 Robert Dewar <dewar@adacore.com>
+
* sem_ch8.adb: Update comment.
* sem_res.adb: Minor code reorganization (use Ekind_In).
diff --git a/gcc/ada/g-socthi-mingw.adb b/gcc/ada/g-socthi-mingw.adb
index 23bab2c9a74..6cf0058e96c 100644
--- a/gcc/ada/g-socthi-mingw.adb
+++ b/gcc/ada/g-socthi-mingw.adb
@@ -6,7 +6,7 @@
-- --
-- B o d y --
-- --
--- Copyright (C) 2001-2009, AdaCore --
+-- Copyright (C) 2001-2010, AdaCore --
-- --
-- GNAT is free software; you can redistribute it and/or modify it under --
-- terms of the GNU General Public License as published by the Free Soft- --
@@ -37,8 +37,13 @@
-- This version is for NT
-with Interfaces.C.Strings; use Interfaces.C.Strings;
-with System; use System;
+with Ada.Streams; use Ada.Streams;
+with Ada.Unchecked_Conversion;
+with Interfaces.C.Strings; use Interfaces.C.Strings;
+with System; use System;
+with System.Storage_Elements; use System.Storage_Elements;
+
+with GNAT.Task_Lock;
package body GNAT.Sockets.Thin is
@@ -273,8 +278,10 @@ package body GNAT.Sockets.Thin is
is
use type C.size_t;
- Res : C.int;
- Count : C.int := 0;
+ Res : C.int;
+ Count : C.int := 0;
+ Locked : Boolean := False;
+ -- Set to false when the lock is activated
MH : Msghdr;
for MH'Address use Msg;
@@ -283,26 +290,105 @@ package body GNAT.Sockets.Thin is
for Iovec'Address use MH.Msg_Iov;
pragma Import (Ada, Iovec);
+ Iov_Index : Integer;
+ Current_Iovec : Vector_Element;
+
+ function To_Access is new Ada.Unchecked_Conversion
+ (System.Address, Stream_Element_Reference);
+ pragma Warnings (Off, Stream_Element_Reference);
+
+ Req : Request_Type (Name => N_Bytes_To_Read);
+
begin
-- Windows does not provide an implementation of recvmsg(). The spec for
-- WSARecvMsg() is incompatible with the data types we define, and is
-- not available in all versions of Windows. So, we use C_Recv instead.
- for J in Iovec'Range loop
+ -- First, wait for some data to be available if socket is blocking
+
+ declare
+ Selector : Selector_Type;
+ R_Socket_Set : Socket_Set_Type;
+ W_Socket_Set : Socket_Set_Type;
+ Status : Selector_Status;
+ Req : Request_Type (Name => Non_Blocking_IO);
+ begin
+ Control_Socket (Socket_Type (S), Req);
+
+ if not Req.Enabled then
+ -- We are in a blocking IO mode
+ Create_Selector (Selector);
+
+ Set (R_Socket_Set, Socket_Type (S));
+
+ Check_Selector (Selector, R_Socket_Set, W_Socket_Set, Status);
+
+ Close_Selector (Selector);
+ end if;
+ end;
+
+ GNAT.Task_Lock.Lock;
+ Locked := True;
+
+ -- Check how much data are available
+
+ Control_Socket (Socket_Type (S), Req);
+
+ -- Fill the vectors
+
+ Iov_Index := -1;
+ Current_Iovec := (Base => null, Length => 0);
+
+ loop
+ if Current_Iovec.Length = 0 then
+ Iov_Index := Iov_Index + 1;
+ exit when Iov_Index > Integer (Iovec'Last);
+ Current_Iovec := Iovec (SOSC.Msg_Iovlen_T (Iov_Index));
+ end if;
+
Res :=
C_Recv
(S,
- Iovec (J).Base.all'Address,
- C.int (Iovec (J).Length),
+ Current_Iovec.Base.all'Address,
+ C.int (Current_Iovec.Length),
Flags);
if Res < 0 then
+ Task_Lock.Unlock;
return System.CRTL.ssize_t (Res);
+
+ elsif Res = 0 then
+ exit;
+
else
+ pragma Assert (Stream_Element_Count (Res) <= Current_Iovec.Length);
+
Count := Count + Res;
+ Current_Iovec.Length :=
+ Current_Iovec.Length - Stream_Element_Count (Res);
+ Current_Iovec.Base :=
+ To_Access (Current_Iovec.Base.all'Address
+ + Storage_Offset (Res));
+
+ -- If we have read all the data that was initially available,
+ -- do not attempt to receive more, since this might block, or
+ -- merge data from successive datagrams in case of a datagram-
+ -- oriented socket.
+
+ exit when Natural (Count) >= Req.Size;
end if;
end loop;
+
+ Task_Lock.Unlock;
+
return System.CRTL.ssize_t (Count);
+
+ exception
+ when others =>
+ if Locked then
+ Task_Lock.Unlock;
+ end if;
+ raise;
end C_Recvmsg;
--------------
@@ -428,7 +514,10 @@ package body GNAT.Sockets.Thin is
-- not available in all versions of Windows. So, we'll use C_Sendto
-- instead.
+ Task_Lock.Lock;
+
for J in Iovec'Range loop
+
Res :=
C_Sendto
(S,
@@ -439,13 +528,20 @@ package body GNAT.Sockets.Thin is
Tolen => C.int (MH.Msg_Namelen));
if Res < 0 then
+ Task_Lock.Unlock;
return System.CRTL.ssize_t (Res);
else
Count := Count + Res;
end if;
end loop;
+ Task_Lock.Unlock;
+
return System.CRTL.ssize_t (Count);
+ exception
+ when others =>
+ Task_Lock.Unlock;
+ raise;
end C_Sendmsg;
--------------
diff --git a/gcc/ada/make.adb b/gcc/ada/make.adb
index eb18485c77b..8251052258b 100644
--- a/gcc/ada/make.adb
+++ b/gcc/ada/make.adb
@@ -8213,17 +8213,11 @@ package body Make is
elsif Argv (2 .. Argv'Last) = "nostdlib" then
- No_Stdlib := True;
+ -- Pass -nstdlib to gnatbind and gnatlink
- Add_Switch (Argv, Compiler, And_Save => And_Save);
+ No_Stdlib := True;
Add_Switch (Argv, Binder, And_Save => And_Save);
-
- -- On Open VMS, do not pass -nostdlib to gnatlink, it will disable
- -- linking with all standard library files.
-
- if not OpenVMS then
- Add_Switch (Argv, Linker, And_Save => And_Save);
- end if;
+ Add_Switch (Argv, Linker, And_Save => And_Save);
elsif Argv (2 .. Argv'Last) = "nostdinc" then
diff --git a/gcc/ada/sem_aggr.adb b/gcc/ada/sem_aggr.adb
index d487c442599..5ce3ea6e83a 100644
--- a/gcc/ada/sem_aggr.adb
+++ b/gcc/ada/sem_aggr.adb
@@ -54,6 +54,7 @@ with Sinfo; use Sinfo;
with Snames; use Snames;
with Stringt; use Stringt;
with Stand; use Stand;
+with Style; use Style;
with Targparm; use Targparm;
with Tbuild; use Tbuild;
with Uintp; use Uintp;
@@ -3779,7 +3780,15 @@ package body Sem_Aggr is
New_Assoc := First (New_Assoc_List);
while Present (New_Assoc) loop
Component := First (Choices (New_Assoc));
- exit when Chars (Selectr) = Chars (Component);
+
+ if Chars (Selectr) = Chars (Component) then
+ if Style_Check then
+ Check_Identifier (Selectr, Entity (Component));
+ end if;
+
+ exit;
+ end if;
+
Next (New_Assoc);
end loop;
diff --git a/gcc/ada/sem_ch10.adb b/gcc/ada/sem_ch10.adb
index 8d0fa4739a4..1ce76e89c25 100644
--- a/gcc/ada/sem_ch10.adb
+++ b/gcc/ada/sem_ch10.adb
@@ -2140,6 +2140,19 @@ package body Sem_Ch10 is
-- Start of processing for Analyze_Subunit
begin
+ if Style_Check then
+ declare
+ Nam : Node_Id := Name (Unit (N));
+
+ begin
+ if Nkind (Nam) = N_Selected_Component then
+ Nam := Selector_Name (Nam);
+ end if;
+
+ Check_Identifier (Nam, Par_Unit);
+ end;
+ end if;
+
if not Is_Empty_List (Context_Items (N)) then
-- Save current use clauses
diff --git a/gcc/ada/sem_ch8.adb b/gcc/ada/sem_ch8.adb
index 51ae114d4e1..3f1ea3bc56b 100644
--- a/gcc/ada/sem_ch8.adb
+++ b/gcc/ada/sem_ch8.adb
@@ -4377,13 +4377,18 @@ package body Sem_Ch8 is
return;
end if;
- -- Set the entity. Note that the reason we call Set_Entity here, as
- -- opposed to Set_Entity_With_Style_Check is that in the overloaded
- -- case, the initial call can set the wrong homonym. The call that
- -- sets the right homonym is in Sem_Res and that call does use
- -- Set_Entity_With_Style_Check, so we don't miss a style check.
-
- Set_Entity (N, E);
+ -- Set the entity. Note that the reason we call Set_Entity for the
+ -- overloadable case, as opposed to Set_Entity_With_Style_Check is
+ -- that in the overloaded case, the initial call can set the wrong
+ -- homonym. The call that sets the right homonym is in Sem_Res and
+ -- that call does use Set_Entity_With_Style_Check, so we don't miss
+ -- a style check.
+
+ if Is_Overloadable (E) then
+ Set_Entity (N, E);
+ else
+ Set_Entity_With_Style_Check (N, E);
+ end if;
if Is_Type (E) then
Set_Etype (N, E);
diff --git a/gcc/ada/sem_res.adb b/gcc/ada/sem_res.adb
index 5f7666adffb..ca2059dba5c 100644
--- a/gcc/ada/sem_res.adb
+++ b/gcc/ada/sem_res.adb
@@ -5793,6 +5793,14 @@ package body Sem_Res is
Set_Etype (N, Typ);
Eval_Named_Real (N);
+ -- For enumeration literals, we need to make sure that a proper style
+ -- check is done, since such literals are overloaded, and thus we did
+ -- not do a style check during the first phase of analysis.
+
+ elsif Ekind (E) = E_Enumeration_Literal then
+ Set_Entity_With_Style_Check (N, E);
+ Eval_Entity_Name (N);
+
-- Allow use of subtype only if it is a concurrent type where we are
-- currently inside the body. This will eventually be expanded into a
-- call to Self (for tasks) or _object (for protected objects). Any
@@ -5847,7 +5855,6 @@ package body Sem_Res is
and then not In_Spec_Expression
and then not Is_Imported (E)
then
-
if No_Initialization (Parent (E))
or else (Present (Full_View (E))
and then No_Initialization (Parent (Full_View (E))))