diff options
author | Hristian Kirtchev <kirtchev@adacore.com> | 2019-07-03 08:16:29 +0000 |
---|---|---|
committer | Pierre-Marie de Rodat <pmderodat@gcc.gnu.org> | 2019-07-03 08:16:29 +0000 |
commit | 76b4158b8fee22fd85d98e760cf4d12d7ae50051 (patch) | |
tree | 40ad2a358112f68898f4d5ef18d7e1cb961308f4 /gcc/ada/butil.ads | |
parent | 336878fc11b75f8ac962efd9150151b74685f7fb (diff) | |
download | gcc-76b4158b8fee22fd85d98e760cf4d12d7ae50051.zip gcc-76b4158b8fee22fd85d98e760cf4d12d7ae50051.tar.gz gcc-76b4158b8fee22fd85d98e760cf4d12d7ae50051.tar.bz2 |
[Ada] Forced elaboration order in Elaboration order v4.0
This patch refactors the forced elaboration order functionality,
reintegrates it in Binde, and impelements it in Bindo.
------------
-- Source --
------------
-- server.ads
package Server is
end Server;
-- client.ads
with Server;
package Client is
end Client;
-- main.adb
with Client;
procedure Main is begin null; end Main;
-- duplicate_1.txt
server (spec)
client (spec)
server (spec)
-- error_unit_1.txt
no such unit
client (spec)
-- error_unit_2.txt
no such unit
client (spec)
-- error_unit_3.txt
no such unit -- comment
client (spec)
-- error_unit_4.txt
no such unit -- comment
client (spec)
-- error_unit_5.txt
no such unit (body)
client (spec)
-- error_unit_6.txt
no such unit (body)
client (spec)
-- error_unit_7.txt
no such unit (body) -- comment
client (spec)
-- error_unit_8.txt
no such unit (body)-- comment
client (spec)
-- error_unit_9.txt
no such unit-- comment
client (spec)
-- no_unit_1.txt
-- no_unit_2.txt
-- no_unit_3.txt
-- comment
-- no_unit_4.txt
-- no_unit_5.txt
-- no_unit_6.txt
-- comment
-- no_unit_7.txt
-- no_unit_8.txt
-- comment
-- comment
-- ok_unit_1.txt
server (spec)
client (spec)
-- ok_unit_2.txt
server (spec)
client (spec)
-- ok_unit_3.txt
server (spec)
client (spec)
-- ok_unit_4.txt
server (spec) -- comment
client (spec)
-- ok_unit_5.txt
server (spec)
client (spec)
-- ok_unit_6.txt
server (spec)
client (spec) -- comment
-- ok_unit_7.txt
server (spec)
client (spec) -- comment
-- ok_unit_8.txt
-- comment
-- comment
server (spec)
-- comment
-- comment
client (spec) -- comment
-- ok_unit_9.txt
server (spec)-- comment
client (spec)
----------------------------
-- Compilation and output --
----------------------------
$ gnatmake -q main.adb
$ gnatbind -fno_unit_1.txt main.ali
$ gnatbind -fno_unit_2.txt main.ali
$ gnatbind -fno_unit_3.txt main.ali
$ gnatbind -fno_unit_4.txt main.ali
$ gnatbind -fno_unit_5.txt main.ali
$ gnatbind -fno_unit_6.txt main.ali
$ gnatbind -fno_unit_7.txt main.ali
$ gnatbind -fno_unit_8.txt main.ali
$ gnatbind -ferror_unit_1.txt main.ali
$ gnatbind -ferror_unit_2.txt main.ali
$ gnatbind -ferror_unit_3.txt main.ali
$ gnatbind -ferror_unit_4.txt main.ali
$ gnatbind -ferror_unit_5.txt main.ali
$ gnatbind -ferror_unit_6.txt main.ali
$ gnatbind -ferror_unit_7.txt main.ali
$ gnatbind -ferror_unit_8.txt main.ali
$ gnatbind -ferror_unit_9.txt main.ali
$ gnatbind -fduplicate_1.txt main.ali
$ gnatbind -fok_unit_1.txt main.ali
$ gnatbind -fok_unit_2.txt main.ali
$ gnatbind -fok_unit_3.txt main.ali
$ gnatbind -fok_unit_4.txt main.ali
$ gnatbind -fok_unit_5.txt main.ali
$ gnatbind -fok_unit_6.txt main.ali
$ gnatbind -fok_unit_7.txt main.ali
$ gnatbind -fok_unit_8.txt main.ali
$ gnatbind -fok_unit_9.txt main.ali
"no such unit": not present; ignored
"no such unit": not present; ignored
"no such unit": not present; ignored
"no such unit": not present; ignored
"no such unit%b": not present; ignored
"no such unit%b": not present; ignored
"no such unit%b": not present; ignored
"no such unit%b": not present; ignored
"no such unit": not present; ignored
server (spec) <-- client (spec)
error: duplicate_1.txt:3: duplicate unit name "server (spec)" from line 1
server (spec) <-- client (spec)
server (spec) <-- client (spec)
server (spec) <-- client (spec)
server (spec) <-- client (spec)
server (spec) <-- client (spec)
server (spec) <-- client (spec)
server (spec) <-- client (spec)
server (spec) <-- client (spec)
server (spec) <-- client (spec)
2019-07-03 Hristian Kirtchev <kirtchev@adacore.com>
gcc/ada/
* binde.adb: Remove with clause for System.OS_Lib.
(Force_Elab_Order): Refactor the majority of the code in Butil.
Use the new forced units iterator to obtain unit names.
* bindo-builders.adb: Add with and use clauses for Binderr,
Butil, Opt, Output, Types, GNAT, and GNAT.Dynamic_HTables. Add
a hash table which maps units to line number in the forced
elaboration order file.
(Add_Unit): New routine.
(Build_Library_Graph): Create forced edges between pairs of
units listed in the forced elaboration order file.
(Create_Forced_Edge, Create_Forced_Edges, Destroy_Line_Number,
Duplicate_Unit_Error, Hash_Unit, Internal_Unit_Info,
Is_Duplicate_Unit, Missing_Unit_Info): New routines.
* bindo-graphs.adb (Is_Internal_Unit, Is_Predefined_Unit):
Refactor some of the behavior to Bindo-Units.
* bindo-graphs.ads: Enable the enumeration literal for forced
edges.
* bindo-units.adb, bindo-units.ads (Is_Internal_Unit,
Is_Predefined_Unit): New routines.
* butil.adb: Add with and use clauses for Opt, GNAT, and
System.OS_Lib. Add with clause for Unchecked_Deallocation.
(Has_Next, Iterate_Forced_Units, Next, Parse_Next_Unit_Name,
Read_Forced_Elab_Order_File): New routines.
* butil.ads: Add with and use clauses for Types. Add new
iterator over the units listed in the forced elaboration order
file.
(Has_Next, Iterate_Forced_Units, Next): New routine.
* namet.adb, namet.ads (Present): New routine.
From-SVN: r272987
Diffstat (limited to 'gcc/ada/butil.ads')
-rw-r--r-- | gcc/ada/butil.ads | 53 |
1 files changed, 51 insertions, 2 deletions
diff --git a/gcc/ada/butil.ads b/gcc/ada/butil.ads index 80eb2a5..3ce2f1e 100644 --- a/gcc/ada/butil.ads +++ b/gcc/ada/butil.ads @@ -23,12 +23,13 @@ -- -- ------------------------------------------------------------------------------ +-- This package contains utility routines for the binder + with Namet; use Namet; +with Types; use Types; package Butil is --- This package contains utility routines for the binder - function Is_Predefined_Unit return Boolean; -- Given a unit name stored in Name_Buffer with length in Name_Len, -- returns True if this is the name of a predefined unit or a child of @@ -51,4 +52,52 @@ package Butil is -- Output unit name with (body) or (spec) after as required. On return -- Name_Len is set to the number of characters which were output. + --------------- + -- Iterators -- + --------------- + + -- The following type represents an iterator over all units that are + -- specified in the forced-elaboration-order file supplied by the binder + -- via switch -f. + + type Forced_Units_Iterator is private; + + function Has_Next (Iter : Forced_Units_Iterator) return Boolean; + pragma Inline (Has_Next); + -- Determine whether iterator Iter has more units to examine + + function Iterate_Forced_Units return Forced_Units_Iterator; + pragma Inline (Iterate_Forced_Units); + -- Obtain an iterator over all units in the forced-elaboration-order file + + procedure Next + (Iter : in out Forced_Units_Iterator; + Unit_Name : out Unit_Name_Type; + Unit_Line : out Logical_Line_Number); + pragma Inline (Next); + -- Return the current unit referenced by iterator Iter along with the + -- line number it appears on, and advance to the next available unit. + +private + First_Line_Number : constant Logical_Line_Number := No_Line_Number + 1; + + type Forced_Units_Iterator is record + Order : String_Ptr := null; + -- A reference to the contents of the forced-elaboration-order file, + -- read in as a string. + + Order_Index : Positive := 1; + -- Index into the order string + + Order_Line : Logical_Line_Number := First_Line_Number; + -- Logical line number within the order string + + Unit_Line : Logical_Line_Number := No_Line_Number; + -- The logical line number of the current unit name within the order + -- string. + + Unit_Name : Unit_Name_Type := No_Unit_Name; + -- The current unit name parsed from the order string + end record; + end Butil; |