summaryrefslogtreecommitdiffstats
path: root/gcc/ada/fname-uf.adb
diff options
context:
space:
mode:
authorcharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2004-03-29 12:03:27 +0000
committercharlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4>2004-03-29 12:03:27 +0000
commitfa7497e853a70dd5d253a1313d0dfa7ddbc02eec (patch)
treeb41024c63720bbb6fd3edef3c99d72097d058a4e /gcc/ada/fname-uf.adb
parent611a00932367c28e71b5682cb244fb548eeac5e7 (diff)
downloadppe42-gcc-fa7497e853a70dd5d253a1313d0dfa7ddbc02eec.tar.gz
ppe42-gcc-fa7497e853a70dd5d253a1313d0dfa7ddbc02eec.zip
2004-03-29 Javier Miranda <miranda@gnat.com>
* checks.adb (Null_Exclusion_Static_Checks): New subprogram (Install_Null_Excluding_Check): Local subprogram that determines whether an access node requires a runtime access check and if so inserts the appropriate run-time check. (Apply_Access_Check): Call Install_Null_Excluding check if required (Apply_Constraint_Check): Call Install_Null_Excluding check if required * checks.ads: (Null_Exclusion_Static_Checks): New subprogram * einfo.ads: Fix typo in comment * exp_ch3.adb (Build_Assignment): Generate conversion to the null-excluding type to force the corresponding run-time check. (Expand_N_Object_Declaration): Generate conversion to the null-excluding type to force the corresponding run-time check. * exp_ch5.adb (Expand_N_Assignment_Statement): Generate conversion to the null-excluding type to force the corresponding run-time check. * exp_ch6.adb (Expand_Call): Do not generate the run-time check in case of access types unless they have the null-excluding attribute. * sprint.adb (Sprint_Node_Actual): Give support to the null-exclusing part. * exp_util.ads: Fix typo in comment * par.adb (P_Null_Exclusion): New subprogram (P_Subtype_Indication): New formal that indicates if the null-excluding part has been scanned-out and it was present * par-ch3.adb, par-ch4.adb, par-ch6.adb: Give support to AI-231 * sem_aggr.adb: (Check_Can_Never_Be_Null): New subprogram (Aggregate_Constraint_Checks): Generate conversion to the null-excluding type to force the corresponding run-time check (Resolve_Aggregate): Propagate the null-excluding attribute to the array components (Resolve_Array_Aggregate): Carry out some static checks (Resolve_Record_Aggregate.Get_Value): Carry out some static check * sem_ch3.adb (Access_Definition): In Ada 0Y the Can_Never_Be_Null attribute must be set only if specified by means of the null-excluding part. In addition, we must also propagate the access-constant attribute if present. (Access_Subprogram_Declaration, Access_Type_Declaration, Analyze_Component_Declaration, Analyze_Object_Declaration, Array_Type_Declaration, Process_Discriminants, Analyze_Subtype_Declaration): Propagate the null-excluding attribute and carry out some static checks. (Build_Derived_Access_Type): Set the null-excluding attribute (Derived_Type_Declaration, Process_Subtype): Carry out some static checks. * sem_ch4.adb (Analyze_Allocator): Carry out some static checks * sem_ch5.adb (Analyze_Assignment): Carry out some static checks * sem_ch6.adb (Process_Formals): Carry out some static checks. (Set_Actual_Subtypes): Generate null-excluding subtype if the null-excluding part was present; it is not required to be done here in case of anonymous access types. (Set_Formal_Mode): Ada 0Y allows anonymous access to have the null value. * sem_res.adb (Resolve_Actuals): Carry out some static check (Resolve_Null): Allow null in anonymous access * sinfo.adb: New subprogram Null_Exclusion_Present All_Present and Constant_Present available on access_definition nodes * sinfo.ads: New flag Null_Exclusion_Present on subtype_declaration, object_declaration, derived_type_definition, component_definition, discriminant_specification, access_to_object_definition, access_function_definition, allocator, access_procedure_definition, access_definition, parameter_specification, All_Present and Constant_Present flags available on access_definition nodes. 2004-03-29 Robert Dewar <dewar@gnat.com> * fname.adb, fname.ads, fname-sf.adb, fname-uf.adb, fname-uf.ads, gnat1drv.adb, lib.adb, lib.ads, lib-load.adb, lib-writ.adb, opt.ads, osint.adb, osint.ads, osint-c.adb, par.adb, par-ch10.adb, par-load.adb, par-prag.adb, sfn_scan.adb, sfn_scan.ads, sinput-l.adb, sinput-l.ads, switch-c.adb, sem_prag.adb: Updates to handle multiple units/file * par.adb: Change test for s-rpc to s-rp for detecting rpc and children * par.adb, memtrack.adb, prj-makr.adb, prj-part.adb, sem_util.adb: Minor reformatting * sem_ch12.adb: Add comment for previous change 2004-03-29 Laurent Pautet <pautet@act-europe.fr> * osint.adb (Executable_Prefix): Set Exec_Name to the current executable name when not initialized. Otherwise, use its current value. * osint.ads (Exec_Name): Move Exec_Name from body to spec in order to initialize it to another executable name than the current one. This allows to configure paths for an executable name (gnatmake) different from the current one (gnatdist). 2004-03-29 Ed Schonberg <schonberg@gnat.com> * exp_ch6.adb (Expand_Call): A call to a function declared in the current unit cannot be inlined if it appears in the body of a withed unit, to avoid order of elaboration problems in gigi. * exp_ch9.adb (Build_Protected_Sub_Specification): Generate debugging information for protected (wrapper) operation as well, to simplify gdb use. * sem_ch6.adb (Analyze_Subprogram_Body): For a private operation in a protected body, indicate that the entity for the generated spec comes from source, to ensure that references are properly generated for it. (Build_Body_To_Inline): Do not inline a function that returns a controlled type. * sem_prag.adb (Process_Convention): If subprogram is overloaded, only apply convention to homonyms that are declared explicitly. * sem_res.adb (Make_Call_Into_Operator): If the operation is a function that renames an equality operator and the operands are overloaded, resolve them with the declared formal types, before rewriting as an operator. 2004-03-29 GNAT Script <nobody@gnat.com> * Make-lang.in: Makefile automatically updated git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@80055 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/ada/fname-uf.adb')
-rw-r--r--gcc/ada/fname-uf.adb76
1 files changed, 72 insertions, 4 deletions
diff --git a/gcc/ada/fname-uf.adb b/gcc/ada/fname-uf.adb
index 9852688d686..00af708cae6 100644
--- a/gcc/ada/fname-uf.adb
+++ b/gcc/ada/fname-uf.adb
@@ -32,6 +32,7 @@ with Namet; use Namet;
with Opt; use Opt;
with Osint; use Osint;
with Table;
+with Uname; use Uname;
with Widechar; use Widechar;
with GNAT.HTable;
@@ -43,8 +44,9 @@ package body Fname.UF is
--------------------------------------------------------
type SFN_Entry is record
- U : Unit_Name_Type; -- Unit name
- F : File_Name_Type; -- Spec/Body file name
+ U : Unit_Name_Type; -- Unit name
+ F : File_Name_Type; -- Spec/Body file name
+ Index : Nat; -- Index from SFN pragma (0 if none)
end record;
-- Record single Unit_Name type call to Set_File_Name
@@ -118,6 +120,53 @@ package body Fname.UF is
return Get_File_Name (Name_Enter, Subunit => False);
end File_Name_Of_Spec;
+ ----------------------------
+ -- Get_Expected_Unit_Type --
+ ----------------------------
+
+ function Get_Expected_Unit_Type
+ (Fname : File_Name_Type) return Expected_Unit_Type
+ is
+ begin
+ -- In syntax checking only mode or in multiple unit per file mode,
+ -- there can be more than one unit in a file, so the file name is
+ -- not a useful guide to the nature of the unit.
+
+ if Operating_Mode = Check_Syntax
+ or else Multiple_Unit_Index /= 0
+ then
+ return Unknown;
+ end if;
+
+ -- Search the file mapping table, if we find an entry for this
+ -- file we know whether it is a spec or a body.
+
+ for J in SFN_Table.First .. SFN_Table.Last loop
+ if Fname = SFN_Table.Table (J).F then
+ if Is_Body_Name (SFN_Table.Table (J).U) then
+ return Expect_Body;
+ else
+ return Expect_Spec;
+ end if;
+ end if;
+ end loop;
+
+ -- If no entry in file naming table, assume .ads/.adb for spec/body
+ -- and return unknown if we have neither of these two cases.
+
+ Get_Name_String (Fname);
+
+ if Name_Len > 4 then
+ if Name_Buffer (Name_Len - 3 .. Name_Len) = ".ads" then
+ return Expect_Spec;
+ elsif Name_Buffer (Name_Len - 3 .. Name_Len) = ".adb" then
+ return Expect_Body;
+ end if;
+ end if;
+
+ return Unknown;
+ end Get_Expected_Unit_Type;
+
-------------------
-- Get_File_Name --
-------------------
@@ -457,6 +506,20 @@ package body Fname.UF is
end;
end Get_File_Name;
+ --------------------
+ -- Get_Unit_Index --
+ --------------------
+
+ function Get_Unit_Index (Uname : Unit_Name_Type) return Nat is
+ N : constant Int := SFN_HTable.Get (Uname);
+ begin
+ if N /= No_Entry then
+ return SFN_Table.Table (N).Index;
+ else
+ return 0;
+ end if;
+ end Get_Unit_Index;
+
----------------
-- Initialize --
----------------
@@ -496,10 +559,14 @@ package body Fname.UF is
-- Set_File_Name --
-------------------
- procedure Set_File_Name (U : Unit_Name_Type; F : File_Name_Type) is
+ procedure Set_File_Name
+ (U : Unit_Name_Type;
+ F : File_Name_Type;
+ Index : Nat)
+ is
begin
SFN_Table.Increment_Last;
- SFN_Table.Table (SFN_Table.Last) := (U, F);
+ SFN_Table.Table (SFN_Table.Last) := (U, F, Index);
SFN_HTable.Set (U, SFN_Table.Last);
end Set_File_Name;
@@ -514,6 +581,7 @@ package body Fname.UF is
Cas : Casing_Type)
is
L : constant Nat := SFN_Patterns.Last;
+
begin
SFN_Patterns.Increment_Last;
OpenPOWER on IntegriCloud