lib-load.ads: Minor reformatting.
2014-07-30 Thomas Quinot <quinot@adacore.com> * lib-load.ads: Minor reformatting. * sinfo.ads (Library_Unit): Update comment. * lib.ads (Notes): Simplify. The Unit component in Notes_Entry is redundant. Instead used the pragma Node_Id directly as the element type. 2014-07-30 Thomas Quinot <quinot@adacore.com> * lib.adb (Store_Note): Store only notes that do not come from an instance, and that are in the extended main source unit. * lib-writ (Write_Unit_Information): Annotations from subunits must be emitted along with those for the main unit, and they must carry a specific file name. * ali.ads (Notes_Record): Use a File_Name_Type instead of a Unit_Id for the source file containing the pragma, as in the case of annotations from subunits we might not have a readily available unit id. * ali.adb (Scan_ALI): Account for above change in data structure. From-SVN: r213295
This commit is contained in:
parent
3ea8f61e9f
commit
9e5a6ee7c8
|
@ -1,3 +1,24 @@
|
|||
2014-07-30 Thomas Quinot <quinot@adacore.com>
|
||||
|
||||
* lib-load.ads: Minor reformatting.
|
||||
* sinfo.ads (Library_Unit): Update comment.
|
||||
* lib.ads (Notes): Simplify. The Unit component in Notes_Entry
|
||||
is redundant. Instead used the pragma Node_Id directly as the
|
||||
element type.
|
||||
|
||||
2014-07-30 Thomas Quinot <quinot@adacore.com>
|
||||
|
||||
* lib.adb (Store_Note): Store only notes that do not come from
|
||||
an instance, and that are in the extended main source unit.
|
||||
* lib-writ (Write_Unit_Information): Annotations from subunits
|
||||
must be emitted along with those for the main unit, and they
|
||||
must carry a specific file name.
|
||||
* ali.ads (Notes_Record): Use a File_Name_Type instead of a
|
||||
Unit_Id for the source file containing the pragma, as in the
|
||||
case of annotations from subunits we might not have a readily
|
||||
available unit id.
|
||||
* ali.adb (Scan_ALI): Account for above change in data structure.
|
||||
|
||||
2014-07-30 Vincent Celier <celier@adacore.com>
|
||||
|
||||
* makeutl.adb (Insert_Project_Sources): When the library project
|
||||
|
|
|
@ -2185,20 +2185,30 @@ package body ALI is
|
|||
Notes.Table (Notes.Last).Pragma_Line := Get_Nat;
|
||||
Checkc (':');
|
||||
Notes.Table (Notes.Last).Pragma_Col := Get_Nat;
|
||||
Notes.Table (Notes.Last).Unit := Units.Last;
|
||||
|
||||
if not At_Eol and then Nextc = ':' then
|
||||
Checkc (':');
|
||||
Notes.Table (Notes.Last).Pragma_Source_File :=
|
||||
Get_File_Name (Lower => True);
|
||||
else
|
||||
Notes.Table (Notes.Last).Pragma_Source_File :=
|
||||
Units.Table (Units.Last).Sfile;
|
||||
end if;
|
||||
|
||||
if At_Eol then
|
||||
Notes.Table (Notes.Last).Pragma_Args := No_Name;
|
||||
|
||||
else
|
||||
-- Note: can't use Get_Name here as the remainder of the
|
||||
-- line is unstructured text whose syntax depends on the
|
||||
-- particular pragma used.
|
||||
|
||||
Checkc (' ');
|
||||
|
||||
Name_Len := 0;
|
||||
while not At_Eol loop
|
||||
Add_Char_To_Name_Buffer (Getc);
|
||||
end loop;
|
||||
|
||||
Notes.Table (Notes.Last).Pragma_Args := Name_Enter;
|
||||
end if;
|
||||
|
||||
Skip_Eol;
|
||||
|
|
|
@ -669,8 +669,8 @@ package ALI is
|
|||
Pragma_Col : Nat;
|
||||
-- Column number of pragma
|
||||
|
||||
Unit : Unit_Id;
|
||||
-- Unit_Id for the entry
|
||||
Pragma_Source_File : File_Name_Type;
|
||||
-- Source file of pragma
|
||||
|
||||
Pragma_Args : Name_Id;
|
||||
-- Pragma arguments. No_Name if no arguments, otherwise a single
|
||||
|
|
|
@ -6,7 +6,7 @@
|
|||
-- --
|
||||
-- S p e c --
|
||||
-- --
|
||||
-- Copyright (C) 1992-2013, Free Software Foundation, Inc. --
|
||||
-- Copyright (C) 1992-2014, Free Software Foundation, Inc. --
|
||||
-- --
|
||||
-- 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- --
|
||||
|
@ -103,14 +103,14 @@ package Lib.Load is
|
|||
-- and then closed on return.
|
||||
|
||||
function Load_Unit
|
||||
(Load_Name : Unit_Name_Type;
|
||||
Required : Boolean;
|
||||
Error_Node : Node_Id;
|
||||
Subunit : Boolean;
|
||||
Corr_Body : Unit_Number_Type := No_Unit;
|
||||
Renamings : Boolean := False;
|
||||
With_Node : Node_Id := Empty;
|
||||
PMES : Boolean := False) return Unit_Number_Type;
|
||||
(Load_Name : Unit_Name_Type;
|
||||
Required : Boolean;
|
||||
Error_Node : Node_Id;
|
||||
Subunit : Boolean;
|
||||
Corr_Body : Unit_Number_Type := No_Unit;
|
||||
Renamings : Boolean := False;
|
||||
With_Node : Node_Id := Empty;
|
||||
PMES : Boolean := False) return Unit_Number_Type;
|
||||
-- This function loads and parses the unit specified by Load_Name (or
|
||||
-- returns the unit number for the previously constructed units table
|
||||
-- entry if this is not the first call for this unit). Required indicates
|
||||
|
|
|
@ -647,13 +647,26 @@ package body Lib.Writ is
|
|||
|
||||
for J in 1 .. Notes.Last loop
|
||||
declare
|
||||
N : constant Node_Id := Notes.Table (J).Pragma_Node;
|
||||
N : constant Node_Id := Notes.Table (J);
|
||||
L : constant Source_Ptr := Sloc (N);
|
||||
U : constant Unit_Number_Type := Notes.Table (J).Unit;
|
||||
U : constant Unit_Number_Type :=
|
||||
Unit (Get_Source_File_Index (L));
|
||||
C : Character;
|
||||
|
||||
Note_Unit : Unit_Number_Type;
|
||||
-- The unit in whose U section this note must be emitted:
|
||||
-- notes for subunits are emitted along with the main unit;
|
||||
-- all other notes are emitted as part of the enclosing
|
||||
-- compilation unit.
|
||||
|
||||
begin
|
||||
if U = Unit_Num then
|
||||
if Nkind (Unit (Cunit (U))) = N_Subunit then
|
||||
Note_Unit := Main_Unit;
|
||||
else
|
||||
Note_Unit := U;
|
||||
end if;
|
||||
|
||||
if Note_Unit = Unit_Num then
|
||||
Write_Info_Initiate ('N');
|
||||
Write_Info_Char (' ');
|
||||
|
||||
|
@ -677,6 +690,15 @@ package body Lib.Writ is
|
|||
Write_Info_Char (':');
|
||||
Write_Info_Int (Int (Get_Column_Number (L)));
|
||||
|
||||
-- Indicate source file of annotation if different from
|
||||
-- compilation unit source file (case of annotation coming
|
||||
-- from a separate).
|
||||
|
||||
if Get_Source_File_Index (L) /= Source_Index (Unit_Num) then
|
||||
Write_Info_Char (':');
|
||||
Write_Info_Name (File_Name (Get_Source_File_Index (L)));
|
||||
end if;
|
||||
|
||||
declare
|
||||
A : Node_Id;
|
||||
|
||||
|
|
|
@ -1046,8 +1046,16 @@ package body Lib is
|
|||
----------------
|
||||
|
||||
procedure Store_Note (N : Node_Id) is
|
||||
Sfile : constant Source_File_Index := Get_Source_File_Index (Sloc (N));
|
||||
begin
|
||||
Notes.Append ((Pragma_Node => N, Unit => Current_Sem_Unit));
|
||||
-- Notes for a generic are emitted when processing the template, never
|
||||
-- in instances.
|
||||
|
||||
if In_Extended_Main_Code_Unit (N)
|
||||
and then Instance (Sfile) = No_Instance_Id
|
||||
then
|
||||
Notes.Append (N);
|
||||
end if;
|
||||
end Store_Note;
|
||||
|
||||
-------------------------------
|
||||
|
|
|
@ -826,13 +826,8 @@ private
|
|||
|
||||
-- The following table stores references to pragmas that generate Notes
|
||||
|
||||
type Notes_Entry is record
|
||||
Pragma_Node : Node_Id;
|
||||
Unit : Unit_Number_Type;
|
||||
end record;
|
||||
|
||||
package Notes is new Table.Table (
|
||||
Table_Component_Type => Notes_Entry,
|
||||
Table_Component_Type => Node_Id,
|
||||
Table_Index_Type => Integer,
|
||||
Table_Low_Bound => 1,
|
||||
Table_Initial => Alloc.Notes_Initial,
|
||||
|
|
|
@ -1685,6 +1685,8 @@ package Sinfo is
|
|||
--
|
||||
-- For a subunit, Library_Unit points to the compilation unit node of
|
||||
-- the parent body.
|
||||
-- ??? not (always) true, in (at least some, maybe all?) cases it points
|
||||
-- to the corresponding spec for the parent body.
|
||||
--
|
||||
-- Note that this field is not used to hold the parent pointer for child
|
||||
-- unit (which might in any case need to use it for some other purpose as
|
||||
|
|
Loading…
Reference in New Issue