This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[Ada] Implement pragma External
- To: gcc-patches at gcc dot gnu dot org
- Subject: [Ada] Implement pragma External
- From: Geert Bosch <bosch at gnat dot com>
- Date: Wed, 10 Oct 2001 20:00:13 -0400 (EDT)
The following adds support for the pragma External.
-Geert
2001-10-10 Robert Dewar <dewar@gnat.com>
* sem_prag.adb:
Add processing for pragma External for 9201-012
* snames.ads:
Add entry for pragma External for 9201-012
* par-prag.adb:
Add pragma External
* snames.adb:
Updated to match snames.ads revision 1.210
*** sem_prag.adb 2001/09/23 23:26:45 1.558
--- sem_prag.adb 2001/09/30 05:20:36 1.559
***************
*** 5256,5261 ****
--- 5256,5285 ----
Check_Arg_Is_One_Of (Arg1, Name_On, Name_Off);
Extensions_Allowed := (Chars (Expression (Arg1)) = Name_On);
+ --------------
+ -- External --
+ --------------
+
+ -- pragma External (
+ -- [ Convention =>] convention_IDENTIFIER,
+ -- [ Entity =>] local_NAME
+ -- [, [External_Name =>] static_string_EXPRESSION ]
+ -- [, [Link_Name =>] static_string_EXPRESSION ]);
+
+ when Pragma_External => External : declare
+ C : Convention_Id;
+ Def_Id : Entity_Id;
+
+ begin
+ GNAT_Pragma;
+ Check_At_Least_N_Arguments (2);
+ Check_At_Most_N_Arguments (4);
+ Process_Convention (C, Def_Id);
+ Note_Possible_Modification (Expression (Arg2));
+ Process_Interface_Name (Def_Id, Arg3, Arg4);
+ Set_Exported (Def_Id, Arg2);
+ end External;
+
--------------------------
-- External_Name_Casing --
--------------------------
*** snames.ads 2001/09/23 23:28:43 1.209
--- snames.ads 2001/09/30 05:20:46 1.210
***************
*** 374,421 ****
Name_Export_Object : constant Name_Id := N + 158; -- GNAT
Name_Export_Procedure : constant Name_Id := N + 159; -- GNAT
Name_Export_Valued_Procedure : constant Name_Id := N + 160; -- GNAT
! Name_Finalize_Storage_Only : constant Name_Id := N + 161; -- GNAT
! Name_Ident : constant Name_Id := N + 162; -- VMS
! Name_Import : constant Name_Id := N + 163;
! Name_Import_Exception : constant Name_Id := N + 164; -- VMS
! Name_Import_Function : constant Name_Id := N + 165; -- GNAT
! Name_Import_Object : constant Name_Id := N + 166; -- GNAT
! Name_Import_Procedure : constant Name_Id := N + 167; -- GNAT
! Name_Import_Valued_Procedure : constant Name_Id := N + 168; -- GNAT
! Name_Inline : constant Name_Id := N + 169;
! Name_Inline_Always : constant Name_Id := N + 170; -- GNAT
! Name_Inline_Generic : constant Name_Id := N + 171; -- GNAT
! Name_Inspection_Point : constant Name_Id := N + 172;
! Name_Interface : constant Name_Id := N + 173; -- Ada 83
! Name_Interface_Name : constant Name_Id := N + 174; -- GNAT
! Name_Interrupt_Handler : constant Name_Id := N + 175;
! Name_Interrupt_Priority : constant Name_Id := N + 176;
! Name_Java_Constructor : constant Name_Id := N + 177; -- GNAT
! Name_Java_Interface : constant Name_Id := N + 178; -- GNAT
! Name_Link_With : constant Name_Id := N + 179; -- GNAT
! Name_Linker_Alias : constant Name_Id := N + 180; -- GNAT
! Name_Linker_Options : constant Name_Id := N + 181;
! Name_Linker_Section : constant Name_Id := N + 182; -- GNAT
! Name_List : constant Name_Id := N + 183;
! Name_Machine_Attribute : constant Name_Id := N + 184; -- GNAT
! Name_Main : constant Name_Id := N + 185; -- GNAT
! Name_Main_Storage : constant Name_Id := N + 186; -- GNAT
! Name_Memory_Size : constant Name_Id := N + 187; -- Ada 83
! Name_No_Return : constant Name_Id := N + 188; -- GNAT
! Name_Optimize : constant Name_Id := N + 189;
! Name_Pack : constant Name_Id := N + 190;
! Name_Page : constant Name_Id := N + 191;
! Name_Passive : constant Name_Id := N + 192; -- GNAT
! Name_Preelaborate : constant Name_Id := N + 193;
! Name_Priority : constant Name_Id := N + 194;
! Name_Psect_Object : constant Name_Id := N + 195; -- VMS
! Name_Pure : constant Name_Id := N + 196;
! Name_Pure_Function : constant Name_Id := N + 197; -- GNAT
! Name_Remote_Call_Interface : constant Name_Id := N + 198;
! Name_Remote_Types : constant Name_Id := N + 199;
! Name_Share_Generic : constant Name_Id := N + 200; -- GNAT
! Name_Shared : constant Name_Id := N + 201; -- Ada 83
! Name_Shared_Passive : constant Name_Id := N + 202;
-- Note: Storage_Size is not in this list because its name matches the
-- name of the corresponding attribute. However, it is included in the
--- 374,422 ----
Name_Export_Object : constant Name_Id := N + 158; -- GNAT
Name_Export_Procedure : constant Name_Id := N + 159; -- GNAT
Name_Export_Valued_Procedure : constant Name_Id := N + 160; -- GNAT
! Name_External : constant Name_Id := N + 161; -- GNAT
! Name_Finalize_Storage_Only : constant Name_Id := N + 162; -- GNAT
! Name_Ident : constant Name_Id := N + 163; -- VMS
! Name_Import : constant Name_Id := N + 164;
! Name_Import_Exception : constant Name_Id := N + 165; -- VMS
! Name_Import_Function : constant Name_Id := N + 166; -- GNAT
! Name_Import_Object : constant Name_Id := N + 167; -- GNAT
! Name_Import_Procedure : constant Name_Id := N + 168; -- GNAT
! Name_Import_Valued_Procedure : constant Name_Id := N + 169; -- GNAT
! Name_Inline : constant Name_Id := N + 170;
! Name_Inline_Always : constant Name_Id := N + 171; -- GNAT
! Name_Inline_Generic : constant Name_Id := N + 172; -- GNAT
! Name_Inspection_Point : constant Name_Id := N + 173;
! Name_Interface : constant Name_Id := N + 174; -- Ada 83
! Name_Interface_Name : constant Name_Id := N + 175; -- GNAT
! Name_Interrupt_Handler : constant Name_Id := N + 176;
! Name_Interrupt_Priority : constant Name_Id := N + 177;
! Name_Java_Constructor : constant Name_Id := N + 178; -- GNAT
! Name_Java_Interface : constant Name_Id := N + 179; -- GNAT
! Name_Link_With : constant Name_Id := N + 180; -- GNAT
! Name_Linker_Alias : constant Name_Id := N + 181; -- GNAT
! Name_Linker_Options : constant Name_Id := N + 182;
! Name_Linker_Section : constant Name_Id := N + 183; -- GNAT
! Name_List : constant Name_Id := N + 184;
! Name_Machine_Attribute : constant Name_Id := N + 185; -- GNAT
! Name_Main : constant Name_Id := N + 186; -- GNAT
! Name_Main_Storage : constant Name_Id := N + 187; -- GNAT
! Name_Memory_Size : constant Name_Id := N + 188; -- Ada 83
! Name_No_Return : constant Name_Id := N + 189; -- GNAT
! Name_Optimize : constant Name_Id := N + 190;
! Name_Pack : constant Name_Id := N + 191;
! Name_Page : constant Name_Id := N + 192;
! Name_Passive : constant Name_Id := N + 193; -- GNAT
! Name_Preelaborate : constant Name_Id := N + 194;
! Name_Priority : constant Name_Id := N + 195;
! Name_Psect_Object : constant Name_Id := N + 196; -- VMS
! Name_Pure : constant Name_Id := N + 197;
! Name_Pure_Function : constant Name_Id := N + 198; -- GNAT
! Name_Remote_Call_Interface : constant Name_Id := N + 199;
! Name_Remote_Types : constant Name_Id := N + 200;
! Name_Share_Generic : constant Name_Id := N + 201; -- GNAT
! Name_Shared : constant Name_Id := N + 202; -- Ada 83
! Name_Shared_Passive : constant Name_Id := N + 203;
-- Note: Storage_Size is not in this list because its name matches the
-- name of the corresponding attribute. However, it is included in the
***************
*** 425,449 ****
-- Note: Storage_Unit is also omitted from the list because of a clash
-- with an attribute name, and is treated similarly.
! Name_Source_Reference : constant Name_Id := N + 203; -- GNAT
! Name_Stream_Convert : constant Name_Id := N + 204; -- GNAT
! Name_Subtitle : constant Name_Id := N + 205; -- GNAT
! Name_Suppress_All : constant Name_Id := N + 206; -- GNAT
! Name_Suppress_Debug_Info : constant Name_Id := N + 207; -- GNAT
! Name_Suppress_Initialization : constant Name_Id := N + 208; -- GNAT
! Name_System_Name : constant Name_Id := N + 209; -- Ada 83
! Name_Task_Info : constant Name_Id := N + 210; -- GNAT
! Name_Task_Name : constant Name_Id := N + 211; -- GNAT
! Name_Task_Storage : constant Name_Id := N + 212; -- VMS
! Name_Time_Slice : constant Name_Id := N + 213; -- GNAT
! Name_Title : constant Name_Id := N + 214; -- GNAT
! Name_Unchecked_Union : constant Name_Id := N + 215; -- GNAT
! Name_Unimplemented_Unit : constant Name_Id := N + 216; -- GNAT
! Name_Unreserve_All_Interrupts : constant Name_Id := N + 217; -- GNAT
! Name_Volatile : constant Name_Id := N + 218;
! Name_Volatile_Components : constant Name_Id := N + 219;
! Name_Weak_External : constant Name_Id := N + 220; -- GNAT
! Last_Pragma_Name : constant Name_Id := N + 220;
-- Language convention names for pragma Convention/Export/Import/Interface
-- Note that Name_C is not included in this list, since it was already
--- 426,450 ----
-- Note: Storage_Unit is also omitted from the list because of a clash
-- with an attribute name, and is treated similarly.
! Name_Source_Reference : constant Name_Id := N + 204; -- GNAT
! Name_Stream_Convert : constant Name_Id := N + 205; -- GNAT
! Name_Subtitle : constant Name_Id := N + 206; -- GNAT
! Name_Suppress_All : constant Name_Id := N + 207; -- GNAT
! Name_Suppress_Debug_Info : constant Name_Id := N + 208; -- GNAT
! Name_Suppress_Initialization : constant Name_Id := N + 209; -- GNAT
! Name_System_Name : constant Name_Id := N + 210; -- Ada 83
! Name_Task_Info : constant Name_Id := N + 211; -- GNAT
! Name_Task_Name : constant Name_Id := N + 212; -- GNAT
! Name_Task_Storage : constant Name_Id := N + 213; -- VMS
! Name_Time_Slice : constant Name_Id := N + 214; -- GNAT
! Name_Title : constant Name_Id := N + 215; -- GNAT
! Name_Unchecked_Union : constant Name_Id := N + 216; -- GNAT
! Name_Unimplemented_Unit : constant Name_Id := N + 217; -- GNAT
! Name_Unreserve_All_Interrupts : constant Name_Id := N + 218; -- GNAT
! Name_Volatile : constant Name_Id := N + 219;
! Name_Volatile_Components : constant Name_Id := N + 220;
! Name_Weak_External : constant Name_Id := N + 221; -- GNAT
! Last_Pragma_Name : constant Name_Id := N + 221;
-- Language convention names for pragma Convention/Export/Import/Interface
-- Note that Name_C is not included in this list, since it was already
***************
*** 459,495 ****
-- this case the convention of the record type is set to C, but in
-- addition the flag C_Pass_By_Copy is set on the record type.
! First_Convention_Name : constant Name_Id := N + 221;
! Name_Ada : constant Name_Id := N + 221;
! Name_Asm : constant Name_Id := N + 222;
! Name_Assembler : constant Name_Id := N + 223;
! Name_COBOL : constant Name_Id := N + 224;
! Name_CPP : constant Name_Id := N + 225;
! Name_DLL : constant Name_Id := N + 226;
! Name_Fortran : constant Name_Id := N + 227;
! Name_Intrinsic : constant Name_Id := N + 228;
! Name_Java : constant Name_Id := N + 229;
! Name_Stdcall : constant Name_Id := N + 230;
! Name_Stubbed : constant Name_Id := N + 231;
! Name_Win32 : constant Name_Id := N + 232;
! Last_Convention_Name : constant Name_Id := N + 232;
-- Other special names used in processing pragma arguments
! Name_As_Is : constant Name_Id := N + 233;
! Name_Body_File_Name : constant Name_Id := N + 234;
! Name_Casing : constant Name_Id := N + 235;
! Name_Code : constant Name_Id := N + 236;
! Name_Component : constant Name_Id := N + 237;
! Name_Component_Size_4 : constant Name_Id := N + 238;
! Name_Copy : constant Name_Id := N + 239;
! Name_D_Float : constant Name_Id := N + 240;
! Name_Descriptor : constant Name_Id := N + 241;
! Name_Default : constant Name_Id := N + 242;
! Name_Dot_Replacement : constant Name_Id := N + 243;
! Name_Dynamic : constant Name_Id := N + 244;
! Name_Entity : constant Name_Id := N + 245;
! Name_External : constant Name_Id := N + 246;
Name_External_Name : constant Name_Id := N + 247;
Name_First_Optional_Parameter : constant Name_Id := N + 248;
Name_Form : constant Name_Id := N + 249;
--- 460,495 ----
-- this case the convention of the record type is set to C, but in
-- addition the flag C_Pass_By_Copy is set on the record type.
! First_Convention_Name : constant Name_Id := N + 222;
! Name_Ada : constant Name_Id := N + 222;
! Name_Asm : constant Name_Id := N + 223;
! Name_Assembler : constant Name_Id := N + 224;
! Name_COBOL : constant Name_Id := N + 225;
! Name_CPP : constant Name_Id := N + 226;
! Name_DLL : constant Name_Id := N + 227;
! Name_Fortran : constant Name_Id := N + 228;
! Name_Intrinsic : constant Name_Id := N + 229;
! Name_Java : constant Name_Id := N + 230;
! Name_Stdcall : constant Name_Id := N + 231;
! Name_Stubbed : constant Name_Id := N + 232;
! Name_Win32 : constant Name_Id := N + 233;
! Last_Convention_Name : constant Name_Id := N + 233;
-- Other special names used in processing pragma arguments
! Name_As_Is : constant Name_Id := N + 234;
! Name_Body_File_Name : constant Name_Id := N + 235;
! Name_Casing : constant Name_Id := N + 236;
! Name_Code : constant Name_Id := N + 237;
! Name_Component : constant Name_Id := N + 238;
! Name_Component_Size_4 : constant Name_Id := N + 239;
! Name_Copy : constant Name_Id := N + 240;
! Name_D_Float : constant Name_Id := N + 241;
! Name_Descriptor : constant Name_Id := N + 242;
! Name_Default : constant Name_Id := N + 243;
! Name_Dot_Replacement : constant Name_Id := N + 244;
! Name_Dynamic : constant Name_Id := N + 245;
! Name_Entity : constant Name_Id := N + 246;
Name_External_Name : constant Name_Id := N + 247;
Name_First_Optional_Parameter : constant Name_Id := N + 248;
Name_Form : constant Name_Id := N + 249;
***************
*** 1183,1188 ****
--- 1183,1189 ----
Pragma_Export_Object,
Pragma_Export_Procedure,
Pragma_Export_Valued_Procedure,
+ Pragma_External,
Pragma_Finalize_Storage_Only,
Pragma_Ident,
Pragma_Import,
*** par-prag.adb 2001/09/23 23:25:45 1.149
--- par-prag.adb 2001/09/30 05:20:14 1.150
***************
*** 854,859 ****
--- 854,860 ----
Pragma_Export_Procedure |
Pragma_Export_Valued_Procedure |
Pragma_Extend_System |
+ Pragma_External |
Pragma_External_Name_Casing |
Pragma_Finalize_Storage_Only |
Pragma_Float_Representation |
*** snames.adb 2001/09/23 23:28:40 1.205
--- snames.adb 2001/09/30 05:20:42 1.206
***************
*** 204,209 ****
--- 204,210 ----
"export_object#" &
"export_procedure#" &
"export_valued_procedure#" &
+ "external#" &
"finalize_storage_only#" &
"ident#" &
"import#" &
***************
*** 289,295 ****
"dot_replacement#" &
"dynamic#" &
"entity#" &
- "external#" &
"external_name#" &
"first_optional_parameter#" &
"form#" &
--- 290,295 ----