This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]

[Ada] Implement pragma External


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 ----



Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]