Commit 4519314c by Arnaud Charlet

2010-06-17 Joel Brobecker <brobecker@adacore.com brobecker>

	* gnat_ugn.texi: Add a section introducing gdbserver.

2010-06-17  Thomas Quinot  <quinot@adacore.com>

	* sem_res.adb, sem_ch4.adb, s-stoele.adb, par-labl.adb: Minor
	reformatting.

2010-06-17  Ed Schonberg  <schonberg@adacore.com>

	* sem_aggr.adb (Valid_Ancestor_Type): handle properly the case of a
	constrained discriminated parent that is a private type.
	(Analyze_Record_Aggregate): when collecting inherited discriminants,
	handle properly an ancestor type that is a constrained private type.

2010-06-17  Ed Schonberg  <schonberg@adacore.com>

	* sem_util.adb (Enclosing_Subprogram): If the called subprogram is
	protected, use the protected_subprogram_body only if the original
	subprogram has not been eliminated.

2010-06-17  Ed Schonberg  <schonberg@adacore.com>

	* freeze.adb (Freeze_Expression): The designated type of an
	access_to_suprogram type can only be frozen if all types in its profile
	are fully defined.

From-SVN: r160923
parent b49cf425
2010-06-17 Joel Brobecker <brobecker@adacore.com brobecker>
* gnat_ugn.texi: Add a section introducing gdbserver.
2010-06-17 Thomas Quinot <quinot@adacore.com>
* sem_res.adb, sem_ch4.adb, s-stoele.adb, par-labl.adb: Minor
reformatting.
2010-06-17 Ed Schonberg <schonberg@adacore.com>
* sem_aggr.adb (Valid_Ancestor_Type): handle properly the case of a
constrained discriminated parent that is a private type.
(Analyze_Record_Aggregate): when collecting inherited discriminants,
handle properly an ancestor type that is a constrained private type.
2010-06-17 Ed Schonberg <schonberg@adacore.com>
* sem_util.adb (Enclosing_Subprogram): If the called subprogram is
protected, use the protected_subprogram_body only if the original
subprogram has not been eliminated.
2010-06-17 Ed Schonberg <schonberg@adacore.com>
* freeze.adb (Freeze_Expression): The designated type of an
access_to_suprogram type can only be frozen if all types in its profile
are fully defined.
2010-06-17 Robert Dewar <dewar@adacore.com>
* par.adb: Minor comment fix
......
......@@ -5306,6 +5306,26 @@ package body Freeze is
return True;
end;
-- For the designated type of an access to subprogram. all types in
-- the profile must be fully defined.
elsif Ekind (T) = E_Subprogram_Type then
declare
F : Entity_Id;
begin
F := First_Formal (T);
while Present (F) loop
if not Is_Fully_Defined (Etype (F)) then
return False;
end if;
Next_Formal (F);
end loop;
return Is_Fully_Defined (Etype (T));
end;
else
return not Is_Private_Type (T)
or else Present (Full_View (Base_Type (T)));
......
......@@ -531,6 +531,7 @@ Running and Debugging Ada Programs
* Ada Exceptions::
* Ada Tasks::
* Debugging Generic Units::
* Remote Debugging using gdbserver::
* GNAT Abnormal Termination or Failure to Terminate::
* Naming Conventions for GNAT Source Files::
* Getting Internal Debugging Information::
......@@ -22375,6 +22376,7 @@ the incorrect user program.
* Ada Exceptions::
* Ada Tasks::
* Debugging Generic Units::
* Remote Debugging using gdbserver::
* GNAT Abnormal Termination or Failure to Terminate::
* Naming Conventions for GNAT Source Files::
* Getting Internal Debugging Information::
......@@ -22832,6 +22834,56 @@ When the breakpoint occurs, you can step through the code of the
instance in the normal manner and examine the values of local variables, as for
other units.
@node Remote Debugging using gdbserver
@section Remote Debugging using gdbserver
@cindex Remote Debugging using gdbserver
@noindent
On platforms where gdbserver is supported, it is possible to use this tool
to debug your application remotely. This can be useful in situations
where the program needs to be run on a target host that is different
from the host used for development, particularly when the target has
a limited amount of resources (either CPU and/or memory).
To do so, start your program using gdbserver on the target machine.
gdbserver then automatically suspends the execution of your program
at its entry point, waiting for a debugger to connect to it. The
following commands starts an application and tells gdbserver to
wait for a connection with the debugger on localhost port 4444.
@smallexample
$ gdbserver localhost:4444 program
Process program created; pid = 5685
Listening on port 4444
@end smallexample
Once gdbserver has started listening, we can tell the debugger to establish
a connection with this gdbserver, and then start the same debugging session
as if the program was being debugged on the same host, directly under
the control of GDB.
@smallexample
$ gdb program
(gdb) target remote targethost:4444
Remote debugging using targethost:4444
0x00007f29936d0af0 in ?? () from /lib64/ld-linux-x86-64.so.
(gdb) b foo.adb:3
Breakpoint 1 at 0x401f0c: file foo.adb, line 3.
(gdb) continue
Continuing.
Breakpoint 1, foo () at foo.adb:4
4 end foo;
@end smallexample
It is also possible to use gdbserver to attach to an already running
program, in which case the execution of that program is simply suspended
until the connection between the debugger and gdbserver is established.
For more information on how to use gdbserver, @ref{Top, Server, Using
the gdbserver Program, gdb, Debugging with GDB}. GNAT Pro provides support
for gdbserver on x86-linux, x86-windows and x86_64-linux.
@node GNAT Abnormal Termination or Failure to Terminate
@section GNAT Abnormal Termination or Failure to Terminate
@cindex GNAT Abnormal Termination or Failure to Terminate
......@@ -381,15 +381,15 @@ procedure Labl is
-- statements are always part of some list, so
-- List_Containing always makes sense.
if
List_Containing (Node (N)) = List_Containing (Node (S1))
if List_Containing (Node (N)) =
List_Containing (Node (S1))
then
Source := S1;
Found := True;
else
-- The goto is within some nested structure
else
No_Header (N);
return;
end if;
......
......@@ -39,7 +39,7 @@ package body System.Storage_Elements is
-- Conversion to/from address
-- Note qualification below of To_Address to avoid ambiguities on VMS.
-- Note qualification below of To_Address to avoid ambiguities on VMS
function To_Address is
new Ada.Unchecked_Conversion (Storage_Offset, Address);
......@@ -51,18 +51,30 @@ package body System.Storage_Elements is
-- These functions must be place first because they are inlined_always
-- and are used and inlined in other subprograms defined in this unit.
function To_Integer (Value : Address) return Integer_Address is
begin
return Integer_Address (Value);
end To_Integer;
----------------
-- To_Address --
----------------
function To_Address (Value : Integer_Address) return Address is
begin
return Address (Value);
end To_Address;
----------------
-- To_Integer --
----------------
function To_Integer (Value : Address) return Integer_Address is
begin
return Integer_Address (Value);
end To_Integer;
-- Address arithmetic
---------
-- "+" --
---------
function "+" (Left : Address; Right : Storage_Offset) return Address is
begin
return Storage_Elements.To_Address
......@@ -75,6 +87,10 @@ package body System.Storage_Elements is
(To_Integer (To_Address (Left)) + To_Integer (Right));
end "+";
---------
-- "-" --
---------
function "-" (Left : Address; Right : Storage_Offset) return Address is
begin
return Storage_Elements.To_Address
......@@ -87,6 +103,10 @@ package body System.Storage_Elements is
(To_Integer (Left) - To_Integer (Right)));
end "-";
-----------
-- "mod" --
-----------
function "mod"
(Left : Address;
Right : Storage_Offset) return Storage_Offset
......@@ -106,4 +126,5 @@ package body System.Storage_Elements is
raise Constraint_Error;
end if;
end "mod";
end System.Storage_Elements;
......@@ -2288,6 +2288,18 @@ package body Sem_Aggr is
then
A_Type := Etype (Imm_Type);
return True;
-- The parent type may be a private extension. The aggregate is
-- legal if the type of the aggregate is an extension of it that
-- is not a private extension.
elsif Is_Private_Type (A_Type)
and then not Is_Private_Type (Imm_Type)
and then Present (Full_View (A_Type))
and then Base_Type (Full_View (A_Type)) = Etype (Imm_Type)
then
return True;
else
Imm_Type := Etype (Base_Type (Imm_Type));
end if;
......@@ -2502,11 +2514,9 @@ package body Sem_Aggr is
From : List_Id;
Consider_Others_Choice : Boolean := False)
return Node_Id;
-- Given a record component stored in parameter Compon, the following
-- function returns its value as it appears in the list From, which is
-- a list of N_Component_Association nodes.
-- What is this referring to??? There is no "following function" in
-- sight???
-- Given a record component stored in parameter Compon, this function
-- returns its value as it appears in the list From, which is a list
-- of N_Component_Association nodes.
--
-- If no component association has a choice for the searched component,
-- the value provided by the others choice is returned, if there is one,
......@@ -3241,12 +3251,11 @@ package body Sem_Aggr is
Dnode := Declaration_Node (Base_Type (Root_Typ));
-- If we don't get a full declaration, then we have some
-- error which will get signalled later so skip this part.
-- Otherwise, gather components of root that apply to the
-- aggregate type. We use the base type in case there is an
-- applicable stored constraint that renames the discriminants
-- of the root.
-- If we don't get a full declaration, then we have some error
-- which will get signalled later so skip this part. Otherwise
-- gather components of root that apply to the aggregate type.
-- We use the base type in case there is an applicable stored
-- constraint that renames the discriminants of the root.
if Nkind (Dnode) = N_Full_Type_Declaration then
Record_Def := Type_Definition (Dnode);
......@@ -3281,6 +3290,15 @@ package body Sem_Aggr is
Ancestor_Part (N), Parent_Typ);
return;
end if;
-- The current view of ancestor part may be a private type,
-- while the context type is always non-private.
elsif Is_Private_Type (Root_Typ)
and then Present (Full_View (Root_Typ))
and then Nkind (N) = N_Extension_Aggregate
then
exit when Base_Type (Full_View (Root_Typ)) = Parent_Typ;
end if;
end loop;
......
......@@ -6119,8 +6119,8 @@ package body Sem_Ch4 is
First_Actual : Node_Id;
begin
-- Place the name of the operation, with its interpretations,
-- on the rewritten call.
-- Place the name of the operation, with its interpretations, on the
-- rewritten call.
Set_Name (Call_Node, Subprog);
......
......@@ -2121,7 +2121,7 @@ package body Sem_Res is
-- If this is an indirect call, use the subprogram_type
-- in the message, to have a meaningful location.
-- Indicate as well if this is an inherited operation,
-- Also indicate if this is an inherited operation,
-- created by a type declaration.
elsif Nkind (N) = N_Function_Call
......@@ -2202,7 +2202,7 @@ package body Sem_Res is
null;
-- For procedure or function calls, set the type of the name,
-- and also the entity pointer for the prefix
-- and also the entity pointer for the prefix.
elsif Nkind_In (N, N_Procedure_Call_Statement, N_Function_Call)
and then (Is_Entity_Name (Name (N))
......@@ -2238,9 +2238,9 @@ package body Sem_Res is
end if;
-- At this stage Found indicates whether or not an acceptable
-- interpretation exists. If not, then we have an error, except
-- that if the context is Any_Type as a result of some other error,
-- then we suppress the error report.
-- interpretation exists. If not, then we have an error, except that if
-- the context is Any_Type as a result of some other error, then we
-- suppress the error report.
if not Found then
if Typ /= Any_Type then
......
......@@ -2549,7 +2549,12 @@ package body Sem_Util is
elsif Ekind (Dynamic_Scope) = E_Task_Type then
return Get_Task_Body_Procedure (Dynamic_Scope);
elsif Convention (Dynamic_Scope) = Convention_Protected then
-- No body is generated if the protected operation is eliminated
elsif Convention (Dynamic_Scope) = Convention_Protected
and then not Is_Eliminated (Dynamic_Scope)
and then Present (Protected_Body_Subprogram (Dynamic_Scope))
then
return Protected_Body_Subprogram (Dynamic_Scope);
else
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment