Commit e443f142 by Tristan Gingold Committed by Arnaud Charlet

cstand.adb (Create_Standard): Change Import_Code component of…

cstand.adb (Create_Standard): Change Import_Code component of Standard_Exception_Type to Foreign_Data.

2013-10-14  Tristan Gingold  <gingold@adacore.com>

	* cstand.adb (Create_Standard): Change Import_Code component
	of Standard_Exception_Type to Foreign_Data. Its type is now
	Standard_A_Char (access to character).
	* exp_prag.adb (Expand_Pragma_Import_Export_Exception): Adjust
	definition of Code to match the type of Foreign_Data.
	* s-stalib.ads (Exception_Data): Replace Import_Code by Foreign_Data
	Change the definition of standard predefined exceptions.
	(Exception_Code): Remove.
	* raise.h (Exception_Code): Remove (Exception_Data): Replace
	Import_Code field by Foreign_Data.
	* rtsfind.ads (RE_Exception_Code): Remove
	(RE_Import_Address): Add.
	* a-exexpr-gcc.adb (Import_Code_For): Replaced by Foreign_Data_For.
	* exp_ch11.adb (Expand_N_Exception_Declaration): Associate null
	to Foreign_Data component.
	* raise-gcc.c (Import_Code_For): Replaced by Foreign_Data_For.
	(is_handled_by): Add comments. Use replaced function. Change
	condition so that an Ada occurrence is never handled by
	Foreign_Exception.
	* s-exctab.adb (Internal_Exception): Associate Null_Address to
	Foreign_Data component.
	* s-vmexta.adb, s-vmexta.ads (Exception_Code): Declare Replace
	SSL.Exception_Code by Exception_Code.

From-SVN: r203538
parent 5a015f2b
2013-10-14 Tristan Gingold <gingold@adacore.com>
* cstand.adb (Create_Standard): Change Import_Code component
of Standard_Exception_Type to Foreign_Data. Its type is now
Standard_A_Char (access to character).
* exp_prag.adb (Expand_Pragma_Import_Export_Exception): Adjust
definition of Code to match the type of Foreign_Data.
* s-stalib.ads (Exception_Data): Replace Import_Code by Foreign_Data
Change the definition of standard predefined exceptions.
(Exception_Code): Remove.
* raise.h (Exception_Code): Remove (Exception_Data): Replace
Import_Code field by Foreign_Data.
* rtsfind.ads (RE_Exception_Code): Remove
(RE_Import_Address): Add.
* a-exexpr-gcc.adb (Import_Code_For): Replaced by Foreign_Data_For.
* exp_ch11.adb (Expand_N_Exception_Declaration): Associate null
to Foreign_Data component.
* raise-gcc.c (Import_Code_For): Replaced by Foreign_Data_For.
(is_handled_by): Add comments. Use replaced function. Change
condition so that an Ada occurrence is never handled by
Foreign_Exception.
* s-exctab.adb (Internal_Exception): Associate Null_Address to
Foreign_Data component.
* s-vmexta.adb, s-vmexta.ads (Exception_Code): Declare Replace
SSL.Exception_Code by Exception_Code.
2013-10-14 Robert Dewar <dewar@adacore.com> 2013-10-14 Robert Dewar <dewar@adacore.com>
* gnat_ugn.texi: Document -gnateu switch. * gnat_ugn.texi: Document -gnateu switch.
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
-- -- -- --
-- B o d y -- -- B o d y --
-- -- -- --
-- Copyright (C) 1992-2012, Free Software Foundation, Inc. -- -- Copyright (C) 1992-2013, Free Software Foundation, Inc. --
-- -- -- --
-- GNAT is free software; you can redistribute it and/or modify it under -- -- 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- -- -- terms of the GNU General Public License as published by the Free Soft- --
...@@ -270,8 +270,8 @@ package body Exception_Propagation is ...@@ -270,8 +270,8 @@ package body Exception_Propagation is
function Language_For (E : Exception_Data_Ptr) return Character; function Language_For (E : Exception_Data_Ptr) return Character;
pragma Export (C, Language_For, "__gnat_language_for"); pragma Export (C, Language_For, "__gnat_language_for");
function Import_Code_For (E : Exception_Data_Ptr) return Exception_Code; function Foreign_Data_For (E : Exception_Data_Ptr) return Address;
pragma Export (C, Import_Code_For, "__gnat_import_code_for"); pragma Export (C, Foreign_Data_For, "__gnat_foreign_data_for");
function EID_For (GNAT_Exception : not null GNAT_GCC_Exception_Access) function EID_For (GNAT_Exception : not null GNAT_GCC_Exception_Access)
return Exception_Id; return Exception_Id;
...@@ -489,16 +489,16 @@ package body Exception_Propagation is ...@@ -489,16 +489,16 @@ package body Exception_Propagation is
return GNAT_Exception.Occurrence.Id; return GNAT_Exception.Occurrence.Id;
end EID_For; end EID_For;
--------------------- ----------------------
-- Import_Code_For -- -- Foreign_Data_For --
--------------------- ----------------------
function Import_Code_For function Foreign_Data_For
(E : SSL.Exception_Data_Ptr) return Exception_Code (E : SSL.Exception_Data_Ptr) return Address
is is
begin begin
return E.all.Import_Code; return E.Foreign_Data;
end Import_Code_For; end Foreign_Data_For;
-------------------------- --------------------------
-- Is_Handled_By_Others -- -- Is_Handled_By_Others --
......
...@@ -1470,14 +1470,7 @@ package body CStand is ...@@ -1470,14 +1470,7 @@ package body CStand is
end Build_Duration; end Build_Duration;
-- Build standard exception type. Note that the type name here is -- Build standard exception type. Note that the type name here is
-- actually used in the generated code, so it must be set correctly -- actually used in the generated code, so it must be set correctly.
-- ??? Also note that the Import_Code component is now declared
-- as a System.Standard_Library.Exception_Code to enforce run-time
-- library implementation consistency. It's too early here to resort
-- to rtsfind to get the proper node for that type, so we use the
-- closest possible available type node at hand instead. We should
-- probably be fixing this up at some point.
Standard_Exception_Type := New_Standard_Entity; Standard_Exception_Type := New_Standard_Entity;
Set_Ekind (Standard_Exception_Type, E_Record_Type); Set_Ekind (Standard_Exception_Type, E_Record_Type);
...@@ -1501,7 +1494,7 @@ package body CStand is ...@@ -1501,7 +1494,7 @@ package body CStand is
Make_Component Make_Component
(Standard_Exception_Type, Standard_A_Char, "HTable_Ptr"); (Standard_Exception_Type, Standard_A_Char, "HTable_Ptr");
Make_Component Make_Component
(Standard_Exception_Type, Standard_Unsigned, "Import_Code"); (Standard_Exception_Type, Standard_A_Char, "Foreign_Data");
Make_Component Make_Component
(Standard_Exception_Type, Standard_A_Char, "Raise_Hook"); (Standard_Exception_Type, Standard_A_Char, "Raise_Hook");
......
...@@ -1172,7 +1172,7 @@ package body Exp_Ch11 is ...@@ -1172,7 +1172,7 @@ package body Exp_Ch11 is
-- Name_Length => exceptE'Length, -- Name_Length => exceptE'Length,
-- Full_Name => exceptE'Address, -- Full_Name => exceptE'Address,
-- HTable_Ptr => null, -- HTable_Ptr => null,
-- Import_Code => 0, -- Foreign_Data => null,
-- Raise_Hook => null, -- Raise_Hook => null,
-- ); -- );
...@@ -1319,9 +1319,9 @@ package body Exp_Ch11 is ...@@ -1319,9 +1319,9 @@ package body Exp_Ch11 is
Append_To (L, Make_Null (Loc)); Append_To (L, Make_Null (Loc));
-- Import_Code component: 0 -- Foreign_Data component: null
Append_To (L, Make_Integer_Literal (Loc, 0)); Append_To (L, Make_Null (Loc));
-- Raise_Hook component: null -- Raise_Hook component: null
......
...@@ -646,8 +646,9 @@ package body Exp_Prag is ...@@ -646,8 +646,9 @@ package body Exp_Prag is
-- alias to define the symbol. -- alias to define the symbol.
Code := Code :=
Unchecked_Convert_To (Standard_A_Char,
Make_Integer_Literal (Loc, Make_Integer_Literal (Loc,
Intval => Exception_Code (Id)); Intval => Exception_Code (Id)));
-- Declare a dummy object -- Declare a dummy object
...@@ -655,7 +656,7 @@ package body Exp_Prag is ...@@ -655,7 +656,7 @@ package body Exp_Prag is
Make_Object_Declaration (Loc, Make_Object_Declaration (Loc,
Defining_Identifier => Excep_Internal, Defining_Identifier => Excep_Internal,
Object_Definition => Object_Definition =>
New_Reference_To (RTE (RE_Exception_Code), Loc)); New_Reference_To (RTE (RE_Address), Loc));
Insert_Action (N, Excep_Object); Insert_Action (N, Excep_Object);
Analyze (Excep_Object); Analyze (Excep_Object);
...@@ -711,13 +712,12 @@ package body Exp_Prag is ...@@ -711,13 +712,12 @@ package body Exp_Prag is
else else
Code := Code :=
Unchecked_Convert_To (RTE (RE_Exception_Code),
Make_Function_Call (Loc, Make_Function_Call (Loc,
Name => Name =>
New_Reference_To (RTE (RE_Import_Value), Loc), New_Reference_To (RTE (RE_Import_Address), Loc),
Parameter_Associations => New_List Parameter_Associations => New_List
(Make_String_Literal (Loc, (Make_String_Literal (Loc,
Strval => Excep_Image)))); Strval => Excep_Image)));
end if; end if;
-- Generate the call to Register_VMS_Exception -- Generate the call to Register_VMS_Exception
...@@ -733,7 +733,7 @@ package body Exp_Prag is ...@@ -733,7 +733,7 @@ package body Exp_Prag is
Prefix => New_Occurrence_Of (Id, Loc), Prefix => New_Occurrence_Of (Id, Loc),
Attribute_Name => Name_Unrestricted_Access))))); Attribute_Name => Name_Unrestricted_Access)))));
Analyze_And_Resolve (Code, RTE (RE_Exception_Code)); Analyze_And_Resolve (Code, RTE (RE_Address));
Analyze (Call); Analyze (Call);
end if; end if;
......
...@@ -812,22 +812,32 @@ get_call_site_action_for (_Unwind_Ptr ip, ...@@ -812,22 +812,32 @@ get_call_site_action_for (_Unwind_Ptr ip,
#define Is_Handled_By_Others __gnat_is_handled_by_others #define Is_Handled_By_Others __gnat_is_handled_by_others
#define Language_For __gnat_language_for #define Language_For __gnat_language_for
#define Import_Code_For __gnat_import_code_for #define Foreign_Data_For __gnat_foreign_data_for
#define EID_For __gnat_eid_for #define EID_For __gnat_eid_for
extern bool Is_Handled_By_Others (_Unwind_Ptr eid); extern bool Is_Handled_By_Others (_Unwind_Ptr eid);
extern char Language_For (_Unwind_Ptr eid); extern char Language_For (_Unwind_Ptr eid);
extern Exception_Code Import_Code_For (_Unwind_Ptr eid); extern void *Foreign_Data_For (_Unwind_Ptr eid);
extern Exception_Id EID_For (_GNAT_Exception * e); extern Exception_Id EID_For (_GNAT_Exception * e);
#define Foreign_Exception system__exceptions__foreign_exception
extern struct Exception_Data Foreign_Exception;
#ifdef VMS
#define Non_Ada_Error system__aux_dec__non_ada_error
extern struct Exception_Data Non_Ada_Error;
#endif
static enum action_kind static enum action_kind
is_handled_by (_Unwind_Ptr choice, _GNAT_Exception * propagated_exception) is_handled_by (_Unwind_Ptr choice, _GNAT_Exception * propagated_exception)
{ {
/* All others choice match everything. */
if (choice == GNAT_ALL_OTHERS) if (choice == GNAT_ALL_OTHERS)
return handler; return handler;
/* GNAT exception occurrence. */
if (propagated_exception->common.exception_class == GNAT_EXCEPTION_CLASS) if (propagated_exception->common.exception_class == GNAT_EXCEPTION_CLASS)
{ {
/* Pointer to the GNAT exception data corresponding to the propagated /* Pointer to the GNAT exception data corresponding to the propagated
...@@ -845,6 +855,7 @@ is_handled_by (_Unwind_Ptr choice, _GNAT_Exception * propagated_exception) ...@@ -845,6 +855,7 @@ is_handled_by (_Unwind_Ptr choice, _GNAT_Exception * propagated_exception)
if (choice == E || (choice == GNAT_OTHERS && Is_Handled_By_Others (E))) if (choice == E || (choice == GNAT_OTHERS && Is_Handled_By_Others (E)))
return handler; return handler;
#ifdef VMS
/* In addition, on OpenVMS, Non_Ada_Error matches VMS exceptions, and we /* In addition, on OpenVMS, Non_Ada_Error matches VMS exceptions, and we
may have different exception data pointers that should match for the may have different exception data pointers that should match for the
same condition code, if both an export and an import have been same condition code, if both an export and an import have been
...@@ -852,29 +863,25 @@ is_handled_by (_Unwind_Ptr choice, _GNAT_Exception * propagated_exception) ...@@ -852,29 +863,25 @@ is_handled_by (_Unwind_Ptr choice, _GNAT_Exception * propagated_exception)
occurrence are expected to have been masked off regarding severity occurrence are expected to have been masked off regarding severity
bits already (at registration time for the former and from within the bits already (at registration time for the former and from within the
low level exception vector for the latter). */ low level exception vector for the latter). */
#ifdef VMS
# define Non_Ada_Error system__aux_dec__non_ada_error
extern struct Exception_Data Non_Ada_Error;
if ((Language_For (E) == 'V' if ((Language_For (E) == 'V'
&& choice != GNAT_OTHERS && choice != GNAT_OTHERS
&& ((Language_For (choice) == 'V' && ((Language_For (choice) == 'V'
&& Import_Code_For (choice) != 0 && Foreign_Data_For (choice) != 0
&& Import_Code_For (choice) == Import_Code_For (E)) && Foreign_Data_For (choice) == Foreign_Data_For (E))
|| choice == (_Unwind_Ptr)&Non_Ada_Error))) || choice == (_Unwind_Ptr)&Non_Ada_Error)))
return handler; return handler;
#endif #endif
/* Otherwise, it doesn't match an Ada choice. */
return nothing;
} }
else
{
# define Foreign_Exception system__exceptions__foreign_exception
extern struct Exception_Data Foreign_Exception;
/* All others and others choice match any foreign exception. */
if (choice == GNAT_ALL_OTHERS if (choice == GNAT_ALL_OTHERS
|| choice == GNAT_OTHERS || choice == GNAT_OTHERS
|| choice == (_Unwind_Ptr) &Foreign_Exception) || choice == (_Unwind_Ptr) &Foreign_Exception)
return handler; return handler;
}
return nothing; return nothing;
} }
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
* * * *
* C Header File * * C Header File *
* * * *
* Copyright (C) 1992-2012, Free Software Foundation, Inc. * * Copyright (C) 1992-2013, Free Software Foundation, Inc. *
* * * *
* GNAT is free software; you can redistribute it and/or modify it under * * 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- * * terms of the GNU General Public License as published by the Free Soft- *
...@@ -35,15 +35,14 @@ extern "C" { ...@@ -35,15 +35,14 @@ extern "C" {
/* C counterparts of what System.Standard_Library defines. */ /* C counterparts of what System.Standard_Library defines. */
typedef unsigned Exception_Code;
struct Exception_Data struct Exception_Data
{ {
char Not_Handled_By_Others; char Not_Handled_By_Others;
char Lang; char Lang;
int Name_Length; int Name_Length;
char *Full_Name, *Htable_Ptr; char *Full_Name;
Exception_Code Import_Code; char *Htable_Ptr;
void *Foreign_Data;
void (*Raise_Hook)(void); void (*Raise_Hook)(void);
}; };
......
...@@ -748,6 +748,7 @@ package Rtsfind is ...@@ -748,6 +748,7 @@ package Rtsfind is
RE_Uint64, -- System.Atomic_Primitives RE_Uint64, -- System.Atomic_Primitives
RE_AST_Handler, -- System.Aux_DEC RE_AST_Handler, -- System.Aux_DEC
RE_Import_Address, -- System.Aux_DEC
RE_Import_Value, -- System.Aux_DEC RE_Import_Value, -- System.Aux_DEC
RE_No_AST_Handler, -- System.Aux_DEC RE_No_AST_Handler, -- System.Aux_DEC
RE_Type_Class, -- System.Aux_DEC RE_Type_Class, -- System.Aux_DEC
...@@ -1413,7 +1414,6 @@ package Rtsfind is ...@@ -1413,7 +1414,6 @@ package Rtsfind is
RE_Shared_Var_Procs, -- System.Shared_Storage RE_Shared_Var_Procs, -- System.Shared_Storage
RE_Abort_Undefer_Direct, -- System.Standard_Library RE_Abort_Undefer_Direct, -- System.Standard_Library
RE_Exception_Code, -- System.Standard_Library
RE_Exception_Data_Ptr, -- System.Standard_Library RE_Exception_Data_Ptr, -- System.Standard_Library
RE_Integer_Address, -- System.Storage_Elements RE_Integer_Address, -- System.Storage_Elements
...@@ -2001,6 +2001,7 @@ package Rtsfind is ...@@ -2001,6 +2001,7 @@ package Rtsfind is
RE_Uint64 => System_Atomic_Primitives, RE_Uint64 => System_Atomic_Primitives,
RE_AST_Handler => System_Aux_DEC, RE_AST_Handler => System_Aux_DEC,
RE_Import_Address => System_Aux_DEC,
RE_Import_Value => System_Aux_DEC, RE_Import_Value => System_Aux_DEC,
RE_No_AST_Handler => System_Aux_DEC, RE_No_AST_Handler => System_Aux_DEC,
RE_Type_Class => System_Aux_DEC, RE_Type_Class => System_Aux_DEC,
...@@ -2670,7 +2671,6 @@ package Rtsfind is ...@@ -2670,7 +2671,6 @@ package Rtsfind is
RE_Shared_Var_Procs => System_Shared_Storage, RE_Shared_Var_Procs => System_Shared_Storage,
RE_Abort_Undefer_Direct => System_Standard_Library, RE_Abort_Undefer_Direct => System_Standard_Library,
RE_Exception_Code => System_Standard_Library,
RE_Exception_Data_Ptr => System_Standard_Library, RE_Exception_Data_Ptr => System_Standard_Library,
RE_Integer_Address => System_Storage_Elements, RE_Integer_Address => System_Storage_Elements,
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
-- -- -- --
-- B o d y -- -- B o d y --
-- -- -- --
-- Copyright (C) 1996-2009, Free Software Foundation, Inc. -- -- Copyright (C) 1996-2013, Free Software Foundation, Inc. --
-- -- -- --
-- GNAT is free software; you can redistribute it and/or modify it under -- -- 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- -- -- terms of the GNU General Public License as published by the Free Soft- --
...@@ -180,7 +180,7 @@ package body System.Exception_Table is ...@@ -180,7 +180,7 @@ package body System.Exception_Table is
Name_Length => Copy'Length, Name_Length => Copy'Length,
Full_Name => Dyn_Copy.all'Address, Full_Name => Dyn_Copy.all'Address,
HTable_Ptr => null, HTable_Ptr => null,
Import_Code => 0, Foreign_Data => Null_Address,
Raise_Hook => null); Raise_Hook => null);
Register_Exception (Res); Register_Exception (Res);
......
...@@ -85,20 +85,6 @@ package System.Standard_Library is ...@@ -85,20 +85,6 @@ package System.Standard_Library is
type Exception_Data_Ptr is access all Exception_Data; type Exception_Data_Ptr is access all Exception_Data;
-- An equivalent of Exception_Id that is public -- An equivalent of Exception_Id that is public
type Exception_Code is mod 2 ** Integer'Size;
-- A scalar value bound to some exception data. Typically used for
-- imported or exported exceptions on VMS. Having a separate type for this
-- is useful to enforce consistency throughout the various run-time units
-- handling such codes, and having it unsigned is the most appropriate
-- choice for it's currently single use on VMS.
-- ??? The construction in Cstand has no way to access the proper type
-- node for Exception_Code, and currently uses Standard_Unsigned as a
-- fallback. The representations shall match, and the size clause below
-- is aimed at ensuring that.
for Exception_Code'Size use Integer'Size;
-- The following record defines the underlying representation of exceptions -- The following record defines the underlying representation of exceptions
-- WARNING! Any changes to this may need to be reflected in the following -- WARNING! Any changes to this may need to be reflected in the following
...@@ -121,6 +107,7 @@ package System.Standard_Library is ...@@ -121,6 +107,7 @@ package System.Standard_Library is
-- A character indicating the language raising the exception. -- A character indicating the language raising the exception.
-- Set to "A" for exceptions defined by an Ada program. -- Set to "A" for exceptions defined by an Ada program.
-- Set to "V" for imported VMS exceptions. -- Set to "V" for imported VMS exceptions.
-- Set to "C" for imported C++ exceptions.
Name_Length : Natural; Name_Length : Natural;
-- Length of fully expanded name of exception -- Length of fully expanded name of exception
...@@ -134,11 +121,10 @@ package System.Standard_Library is ...@@ -134,11 +121,10 @@ package System.Standard_Library is
-- built (by Register_Exception in s-exctab.adb) for converting between -- built (by Register_Exception in s-exctab.adb) for converting between
-- identities and names. -- identities and names.
Import_Code : Exception_Code; Foreign_Data : Address;
-- Value for imported exceptions. Needed only for the handling of -- Data for imported exceptions. This represents the exception code
-- Import/Export_Exception for the VMS case, but present in all -- for the handling of Import/Export_Exception for the VMS case.
-- implementations (we might well extend this mechanism for other -- This represents the address of the RTTI for the C++ case.
-- systems in the future).
Raise_Hook : Raise_Action; Raise_Hook : Raise_Action;
-- This field can be used to place a "hook" on an exception. If the -- This field can be used to place a "hook" on an exception. If the
...@@ -169,7 +155,7 @@ package System.Standard_Library is ...@@ -169,7 +155,7 @@ package System.Standard_Library is
Name_Length => Constraint_Error_Name'Length, Name_Length => Constraint_Error_Name'Length,
Full_Name => Constraint_Error_Name'Address, Full_Name => Constraint_Error_Name'Address,
HTable_Ptr => null, HTable_Ptr => null,
Import_Code => 0, Foreign_Data => Null_Address,
Raise_Hook => null); Raise_Hook => null);
Numeric_Error_Def : aliased Exception_Data := Numeric_Error_Def : aliased Exception_Data :=
...@@ -178,7 +164,7 @@ package System.Standard_Library is ...@@ -178,7 +164,7 @@ package System.Standard_Library is
Name_Length => Numeric_Error_Name'Length, Name_Length => Numeric_Error_Name'Length,
Full_Name => Numeric_Error_Name'Address, Full_Name => Numeric_Error_Name'Address,
HTable_Ptr => null, HTable_Ptr => null,
Import_Code => 0, Foreign_Data => Null_Address,
Raise_Hook => null); Raise_Hook => null);
Program_Error_Def : aliased Exception_Data := Program_Error_Def : aliased Exception_Data :=
...@@ -187,7 +173,7 @@ package System.Standard_Library is ...@@ -187,7 +173,7 @@ package System.Standard_Library is
Name_Length => Program_Error_Name'Length, Name_Length => Program_Error_Name'Length,
Full_Name => Program_Error_Name'Address, Full_Name => Program_Error_Name'Address,
HTable_Ptr => null, HTable_Ptr => null,
Import_Code => 0, Foreign_Data => Null_Address,
Raise_Hook => null); Raise_Hook => null);
Storage_Error_Def : aliased Exception_Data := Storage_Error_Def : aliased Exception_Data :=
...@@ -196,7 +182,7 @@ package System.Standard_Library is ...@@ -196,7 +182,7 @@ package System.Standard_Library is
Name_Length => Storage_Error_Name'Length, Name_Length => Storage_Error_Name'Length,
Full_Name => Storage_Error_Name'Address, Full_Name => Storage_Error_Name'Address,
HTable_Ptr => null, HTable_Ptr => null,
Import_Code => 0, Foreign_Data => Null_Address,
Raise_Hook => null); Raise_Hook => null);
Tasking_Error_Def : aliased Exception_Data := Tasking_Error_Def : aliased Exception_Data :=
...@@ -205,7 +191,7 @@ package System.Standard_Library is ...@@ -205,7 +191,7 @@ package System.Standard_Library is
Name_Length => Tasking_Error_Name'Length, Name_Length => Tasking_Error_Name'Length,
Full_Name => Tasking_Error_Name'Address, Full_Name => Tasking_Error_Name'Address,
HTable_Ptr => null, HTable_Ptr => null,
Import_Code => 0, Foreign_Data => Null_Address,
Raise_Hook => null); Raise_Hook => null);
Abort_Signal_Def : aliased Exception_Data := Abort_Signal_Def : aliased Exception_Data :=
...@@ -214,7 +200,7 @@ package System.Standard_Library is ...@@ -214,7 +200,7 @@ package System.Standard_Library is
Name_Length => Abort_Signal_Name'Length, Name_Length => Abort_Signal_Name'Length,
Full_Name => Abort_Signal_Name'Address, Full_Name => Abort_Signal_Name'Address,
HTable_Ptr => null, HTable_Ptr => null,
Import_Code => 0, Foreign_Data => Null_Address,
Raise_Hook => null); Raise_Hook => null);
pragma Export (C, Constraint_Error_Def, "constraint_error"); pragma Export (C, Constraint_Error_Def, "constraint_error");
......
...@@ -6,7 +6,7 @@ ...@@ -6,7 +6,7 @@
-- -- -- --
-- B o d y -- -- B o d y --
-- -- -- --
-- Copyright (C) 1997-2009, Free Software Foundation, Inc. -- -- Copyright (C) 1997-2013, Free Software Foundation, Inc. --
-- -- -- --
-- GNAT is free software; you can redistribute it and/or modify it under -- -- 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- -- -- terms of the GNU General Public License as published by the Free Soft- --
...@@ -36,8 +36,6 @@ pragma Elaborate_All (System.HTable); ...@@ -36,8 +36,6 @@ pragma Elaborate_All (System.HTable);
package body System.VMS_Exception_Table is package body System.VMS_Exception_Table is
use type SSL.Exception_Code;
type HTable_Headers is range 1 .. 37; type HTable_Headers is range 1 .. 37;
type Exception_Code_Data; type Exception_Code_Data;
...@@ -47,7 +45,7 @@ package body System.VMS_Exception_Table is ...@@ -47,7 +45,7 @@ package body System.VMS_Exception_Table is
-- Ada exception. -- Ada exception.
type Exception_Code_Data is record type Exception_Code_Data is record
Code : SSL.Exception_Code; Code : Exception_Code;
Except : SSL.Exception_Data_Ptr; Except : SSL.Exception_Data_Ptr;
HTable_Ptr : Exception_Code_Data_Ptr; HTable_Ptr : Exception_Code_Data_Ptr;
end record; end record;
...@@ -59,8 +57,8 @@ package body System.VMS_Exception_Table is ...@@ -59,8 +57,8 @@ package body System.VMS_Exception_Table is
function Get_HT_Link (T : Exception_Code_Data_Ptr) function Get_HT_Link (T : Exception_Code_Data_Ptr)
return Exception_Code_Data_Ptr; return Exception_Code_Data_Ptr;
function Hash (F : SSL.Exception_Code) return HTable_Headers; function Hash (F : Exception_Code) return HTable_Headers;
function Get_Key (T : Exception_Code_Data_Ptr) return SSL.Exception_Code; function Get_Key (T : Exception_Code_Data_Ptr) return Exception_Code;
package Exception_Code_HTable is new System.HTable.Static_HTable ( package Exception_Code_HTable is new System.HTable.Static_HTable (
Header_Num => HTable_Headers, Header_Num => HTable_Headers,
...@@ -69,7 +67,7 @@ package body System.VMS_Exception_Table is ...@@ -69,7 +67,7 @@ package body System.VMS_Exception_Table is
Null_Ptr => null, Null_Ptr => null,
Set_Next => Set_HT_Link, Set_Next => Set_HT_Link,
Next => Get_HT_Link, Next => Get_HT_Link,
Key => SSL.Exception_Code, Key => Exception_Code,
Get_Key => Get_Key, Get_Key => Get_Key,
Hash => Hash, Hash => Hash,
Equal => "="); Equal => "=");
...@@ -79,7 +77,7 @@ package body System.VMS_Exception_Table is ...@@ -79,7 +77,7 @@ package body System.VMS_Exception_Table is
------------------ ------------------
function Base_Code_In function Base_Code_In
(Code : SSL.Exception_Code) return SSL.Exception_Code (Code : Exception_Code) return Exception_Code
is is
begin begin
return Code and not 2#0111#; return Code and not 2#0111#;
...@@ -90,7 +88,7 @@ package body System.VMS_Exception_Table is ...@@ -90,7 +88,7 @@ package body System.VMS_Exception_Table is
--------------------- ---------------------
function Coded_Exception function Coded_Exception
(X : SSL.Exception_Code) return SSL.Exception_Data_Ptr (X : Exception_Code) return SSL.Exception_Data_Ptr
is is
Res : Exception_Code_Data_Ptr; Res : Exception_Code_Data_Ptr;
...@@ -121,7 +119,7 @@ package body System.VMS_Exception_Table is ...@@ -121,7 +119,7 @@ package body System.VMS_Exception_Table is
------------- -------------
function Get_Key (T : Exception_Code_Data_Ptr) function Get_Key (T : Exception_Code_Data_Ptr)
return SSL.Exception_Code return Exception_Code
is is
begin begin
return T.Code; return T.Code;
...@@ -132,10 +130,10 @@ package body System.VMS_Exception_Table is ...@@ -132,10 +130,10 @@ package body System.VMS_Exception_Table is
---------- ----------
function Hash function Hash
(F : SSL.Exception_Code) return HTable_Headers (F : Exception_Code) return HTable_Headers
is is
Headers_Magnitude : constant SSL.Exception_Code := Headers_Magnitude : constant Exception_Code :=
SSL.Exception_Code (HTable_Headers'Last - HTable_Headers'First + 1); Exception_Code (HTable_Headers'Last - HTable_Headers'First + 1);
begin begin
return HTable_Headers (F mod Headers_Magnitude + 1); return HTable_Headers (F mod Headers_Magnitude + 1);
...@@ -146,13 +144,13 @@ package body System.VMS_Exception_Table is ...@@ -146,13 +144,13 @@ package body System.VMS_Exception_Table is
---------------------------- ----------------------------
procedure Register_VMS_Exception procedure Register_VMS_Exception
(Code : SSL.Exception_Code; (Code : Exception_Code;
E : SSL.Exception_Data_Ptr) E : SSL.Exception_Data_Ptr)
is is
-- We bind the exception data with the base code found in the -- We bind the exception data with the base code found in the
-- input value, that is with the severity bits masked off. -- input value, that is with the severity bits masked off.
Excode : constant SSL.Exception_Code := Base_Code_In (Code); Excode : constant Exception_Code := Base_Code_In (Code);
begin begin
-- The exception data registered here is mostly filled prior to this -- The exception data registered here is mostly filled prior to this
...@@ -165,7 +163,7 @@ package body System.VMS_Exception_Table is ...@@ -165,7 +163,7 @@ package body System.VMS_Exception_Table is
-- routine attempts to match the import codes in this case. -- routine attempts to match the import codes in this case.
E.Lang := 'V'; E.Lang := 'V';
E.Import_Code := Excode; E.Foreign_Data := Excode;
if Exception_Code_HTable.Get (Excode) = null then if Exception_Code_HTable.Get (Excode) = null then
Exception_Code_HTable.Set (new Exception_Code_Data'(Excode, E, null)); Exception_Code_HTable.Set (new Exception_Code_Data'(Excode, E, null));
......
...@@ -38,8 +38,10 @@ package System.VMS_Exception_Table is ...@@ -38,8 +38,10 @@ package System.VMS_Exception_Table is
package SSL renames System.Standard_Library; package SSL renames System.Standard_Library;
subtype Exception_Code is System.Address;
procedure Register_VMS_Exception procedure Register_VMS_Exception
(Code : SSL.Exception_Code; (Code : Exception_Code;
E : SSL.Exception_Data_Ptr); E : SSL.Exception_Data_Ptr);
-- Register an exception in hash table mapping with a VMS condition code. -- Register an exception in hash table mapping with a VMS condition code.
-- --
...@@ -55,10 +57,10 @@ private ...@@ -55,10 +57,10 @@ private
-- The following functions are directly called (without import/export) in -- The following functions are directly called (without import/export) in
-- init.c by __gnat_handle_vms_condition. -- init.c by __gnat_handle_vms_condition.
function Base_Code_In (Code : SSL.Exception_Code) return SSL.Exception_Code; function Base_Code_In (Code : Exception_Code) return Exception_Code;
-- Value of Code with the severity bits masked off -- Value of Code with the severity bits masked off
function Coded_Exception (X : SSL.Exception_Code) function Coded_Exception (X : Exception_Code)
return SSL.Exception_Data_Ptr; return SSL.Exception_Data_Ptr;
-- Given a VMS condition, find and return its allocated Ada exception -- Given a VMS condition, find and return its allocated Ada exception
......
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