home *** CD-ROM | disk | FTP | other *** search
/ Geek Gadgets 1 / ADE-1.bin / ade-dist / gnat-2.06-src.tgz / tar.out / fsf / gnat / ada / ali.ads < prev    next >
Text File  |  1996-09-28  |  13KB  |  373 lines

  1. ------------------------------------------------------------------------------
  2. --                                                                          --
  3. --                         GNAT COMPILER COMPONENTS                         --
  4. --                                                                          --
  5. --                                  A L I                                   --
  6. --                                                                          --
  7. --                                 S p e c                                  --
  8. --                                                                          --
  9. --                            $Revision: 1.19 $                             --
  10. --                                                                          --
  11. --           Copyright (c) 1992,1993,1994 NYU, All Rights Reserved          --
  12. --                                                                          --
  13. -- GNAT is free software;  you can  redistribute it  and/or modify it under --
  14. -- terms of the  GNU General Public License as published  by the Free Soft- --
  15. -- ware  Foundation;  either version 2,  or (at your option) any later ver- --
  16. -- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
  17. -- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
  18. -- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
  19. -- for  more details.  You should have  received  a copy of the GNU General --
  20. -- Public License  distributed with GNAT;  see file COPYING.  If not, write --
  21. -- to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. --
  22. --                                                                          --
  23. ------------------------------------------------------------------------------
  24.  
  25. --  This package defines the internal data structures used for representation
  26. --  of Ada Library Information (ALI) acquired from the ALI files generated
  27. --  by the front end.
  28.  
  29. with Table;
  30. with Types; use Types;
  31.  
  32. package ALI is
  33.  
  34.    --------------
  35.    -- Id Types --
  36.    --------------
  37.  
  38.    --  The various entries are stored in tables with distinct subscript
  39.    --  ranges. The following type definitions indicate the ranges used
  40.    --  for the subscripts (Id values) for the various tables.
  41.  
  42.    type ALI_Id is range 0 .. 999_999;
  43.    --  Id values used for ALIs table entries
  44.  
  45.    type Unit_Id is range 1_000_000 .. 1_999_999;
  46.    --  Id values used for Unit table entries
  47.  
  48.    type With_Id is range 2_000_000 .. 2_999_999;
  49.    --  Id values used for Withs table entries
  50.  
  51.    type Sdep_Id is range 3_000_000 .. 3_999_999;
  52.    --  Id values used for Sdep table entries
  53.  
  54.    type Source_Id is range 4_000_000 .. 4_999_999;
  55.    --  Id values used for Source table entries
  56.  
  57.    --------------------
  58.    -- ALI File Table --
  59.    --------------------
  60.  
  61.    --  Each ALI file read generates an entry in the ALIs table
  62.  
  63.    No_ALI_Id : constant ALI_Id := ALI_Id'First;
  64.    --  Special value indicating no ALI entry
  65.  
  66.    First_ALI_Entry : constant ALI_Id := No_ALI_Id + 1;
  67.    --  Id of first actual entry in table
  68.  
  69.    type Main_Program_Type is (None, Proc, Func);
  70.    --  Indicator of whether unit can be used as main program
  71.  
  72.    type ALIs_Record is record
  73.       Afile : File_Name_Type;
  74.       --  Name of ALI file
  75.  
  76.       Ofile_Full_Name : Name_Id;
  77.       --  Full name of object file corresponding to the ALI file
  78.  
  79.       Sfile : File_Name_Type;
  80.       --  Name of source file that generates this ALI file (which is equal
  81.       --  to the name of the source file in the first unit table entry for
  82.       --  this ALI file, since the body if present is always first).
  83.  
  84.       Ver : String (1 .. 16);
  85.       --  Value of library version (V line in ALI file)
  86.  
  87.       Std : String (1 .. 16);
  88.       --  Value of standard version (S line in ALI file)
  89.  
  90.       First_Unit : Unit_Id;
  91.       --  Id of first Unit table entry for this file
  92.  
  93.       Last_Unit : Unit_Id;
  94.       --  Id of last Unit table entry for this file
  95.  
  96.       First_Sdep : Sdep_Id;
  97.       --  Id of first Sdep table entry for this file
  98.  
  99.       Last_Sdep : Sdep_Id;
  100.       --  Id of last Sdep table entry for this file
  101.  
  102.       Main_Program : Main_Program_Type;
  103.       --  Indicator of whether first unit can be used as main program
  104.  
  105.       Main_Priority : Int;
  106.       --  Indicates priority value if Main_Program field indicates that
  107.       --  this can be a main program. A value of -1 (No_Main_Priority)
  108.       --  indicates that no parameter was found, or no M line was present.
  109.  
  110.    end record;
  111.  
  112.    No_Main_Priority : constant Int := -1;
  113.    --  Code for no main priority set
  114.  
  115.    package ALIs is new Table (
  116.      Table_Component_Type => ALIs_Record,
  117.      Table_Index_Type     => ALI_Id,
  118.      Table_Low_Bound      => First_ALI_Entry,
  119.      Table_Initial        => 500,
  120.      Table_Increment      => 200,
  121.      Table_Name           => "ALIs");
  122.  
  123.    ----------------
  124.    -- Unit Table --
  125.    ----------------
  126.  
  127.    --  Each unit within an ALI file generates an entry in the unit table
  128.  
  129.    No_Unit_Id : constant Unit_Id := Unit_Id'First;
  130.    --  Special value indicating no unit table entry
  131.  
  132.    First_Unit_Entry : constant Unit_Id := No_Unit_Id + 1;
  133.    --  Id of first actual entry in table
  134.  
  135.    type Unit_Type is (Is_Spec, Is_Body, Is_Spec_Only, Is_Body_Only);
  136.    --  Indicates type of entry, if both body and spec appear in the ALI file,
  137.    --  then the first unit is marked Is_Body, and the second is marked Is_Spec.
  138.    --  If only a spec appears, then it is marked as Is_Spec_Only, and if only
  139.    --  a body appears, then it is marked Is_Body_Only).
  140.  
  141.    subtype Version_String is String (1 .. 8);
  142.    --  Version string, taken from unit record
  143.  
  144.    type Unit_Record is record
  145.       My_ALI : ALI_Id;
  146.       --  Corresponding ALI entry
  147.  
  148.       Uname : Unit_Name_Type;
  149.       --  Name of Unit
  150.  
  151.       Sfile : File_Name_Type;
  152.       --  Name of source file
  153.  
  154.       Preelab : Boolean;
  155.       --  Indicates presence of PR parameter for a preelaborated package
  156.  
  157.       No_Elab : Boolean;
  158.       --  Indicates presence of NE parameter for a unit that has does not
  159.       --  have an elaboration routine (since it has no elaboration code).
  160.  
  161.       Pure : Boolean;
  162.       --  Indicates presence of PU parameter for a pure package
  163.  
  164.       Elaborate_Body : Boolean;
  165.       --  Indicates presence of EB parameter for a package which has a
  166.       --  pragma Preelaborate_Body.
  167.  
  168.       Remote_Types : Boolean;
  169.       --  Indicates presence of RT parameter for a package which has a
  170.       --  pragma Remote_Types.
  171.  
  172.       Shared_Passive : Boolean;
  173.       --  Indicates presence of SP parameter for a package which has a
  174.       --  pragma Shared_Passive.
  175.  
  176.       RCI : Boolean;
  177.       --  Indicates presence of RC parameter for a package which has a
  178.       --  pragma Remote_Call_Interface.
  179.  
  180.       Predefined : Boolean;
  181.       --  Indicates if unit is language predefined (or a child of such a unit)
  182.  
  183.       First_With : With_Id;
  184.       --  Id of first with table entry for this file
  185.  
  186.       Last_With : With_Id;
  187.       --  Id of last with table entry for this file
  188.  
  189.       Utype : Unit_Type;
  190.       --  Type of entry
  191.  
  192.       Version : Version_String;
  193.       --  Version of unit
  194.  
  195.    end record;
  196.  
  197.    package Unit is new Table (
  198.      Table_Component_Type => Unit_Record,
  199.      Table_Index_Type     => Unit_Id,
  200.      Table_Low_Bound      => First_Unit_Entry,
  201.      Table_Initial        => 100,
  202.      Table_Increment      => 200,
  203.      Table_Name           => "Unit");
  204.  
  205.    -----------------
  206.    -- Withs Table --
  207.    -----------------
  208.  
  209.    --  Each With line (W line) in an ALI file generates a Withs table entry
  210.  
  211.    No_With_Id : constant With_Id := With_Id'First;
  212.    --  Special value indicating no unit table entry
  213.  
  214.    First_With_Entry : constant With_Id := No_With_Id + 1;
  215.    --  Id of first actual entry in table
  216.  
  217.    type With_Record is record
  218.       Uname : Unit_Name_Type;
  219.       --  Name of Unit
  220.  
  221.       Sfile : File_Name_Type;
  222.       --  Name of source file, set to No_File in generic case
  223.  
  224.       Afile : File_Name_Type;
  225.       --  Name of ALI file, set to No_File in generic case
  226.  
  227.       Elaborate : Boolean;
  228.       --  Indicates presence of E parameter
  229.  
  230.       Elaborate_All : Boolean;
  231.       --  Indicates presence of EA parameter
  232.    end record;
  233.  
  234.    package Withs is new Table (
  235.      Table_Component_Type => With_Record,
  236.      Table_Index_Type     => With_Id,
  237.      Table_Low_Bound      => First_With_Entry,
  238.      Table_Initial        => 5000,
  239.      Table_Increment      => 200,
  240.      Table_Name           => "With");
  241.  
  242.    --------------------------
  243.    -- Linker_Options Table --
  244.    --------------------------
  245.  
  246.    --  Each unique linker option (L line) in an ALI file generates
  247.    --  an entry in the Linker_Options table. Note that only unique
  248.    --  entries are stored, i.e. if the same entry appears twice, the
  249.    --  second entry is suppressed. Each entry is a character sequence
  250.    --  terminated by a NUL character.
  251.  
  252.    package Linker_Options is new Table (
  253.      Table_Component_Type => Character,
  254.      Table_Index_Type     => Integer,
  255.      Table_Low_Bound      => 1,
  256.      Table_Initial        => 200,
  257.      Table_Increment      => 400,
  258.      Table_Name           => "Linker_Options");
  259.  
  260.    ------------------------------------
  261.    -- Sdep (Source Dependency) Table --
  262.    ------------------------------------
  263.  
  264.    --  Each source dependency (D line) in an ALI file generates an
  265.    --  entry in the Sdep table.
  266.  
  267.    No_Sdep_Id : constant Sdep_Id := Sdep_Id'First;
  268.    --  Special value indicating no Sdep table entry
  269.  
  270.    First_Sdep_Entry : constant Sdep_Id := No_Sdep_Id + 1;
  271.    --  Id of first actual entry in table
  272.  
  273.    type Sdep_Record is record
  274.       Sfile : File_Name_Type;
  275.       --  Name of source file
  276.  
  277.       Stamp : Time_Stamp_Type;
  278.       --  Time stamp value
  279.    end record;
  280.  
  281.    package Sdep is new Table (
  282.      Table_Component_Type => Sdep_Record,
  283.      Table_Index_Type     => Sdep_Id,
  284.      Table_Low_Bound      => First_Sdep_Entry,
  285.      Table_Initial        => 5000,
  286.      Table_Increment      => 200,
  287.      Table_Name           => "Sdep");
  288.  
  289.    -----------------------------
  290.    -- Source File Table Table --
  291.    -----------------------------
  292.  
  293.    --  A source file table entry is built for every source file that is
  294.    --  in the source dependency table of any of the ALI files that make
  295.    --  up the current program.
  296.  
  297.    No_Source_Id : constant Source_Id := Source_Id'First;
  298.    --  Special value indicating no Source table entry
  299.  
  300.    First_Source_Entry : constant Source_Id := No_Source_Id + 1;
  301.    --  Id of first actual entry in table
  302.  
  303.    type Source_Record is record
  304.       Sfile : File_Name_Type;
  305.       --  Name of source file
  306.  
  307.       Stamp : Time_Stamp_Type;
  308.       --  Time stamp value. If Check_Source_Files is set and the source
  309.       --  file is located, then Stamp is set from the source file. Otherwise
  310.       --  Stamp is set from the latest stamp value found in any of the
  311.       --  ALI files for the current program.
  312.  
  313.       Source_Found : Boolean;
  314.       --  This flag is set to True if the corresponding source file was
  315.       --  located and the Stamp value was set from the actual source file.
  316.       --  It is always false if Check_Source_Files is not set.
  317.    end record;
  318.  
  319.    package Source is new Table (
  320.      Table_Component_Type => Source_Record,
  321.      Table_Index_Type     => Source_Id,
  322.      Table_Low_Bound      => First_Source_Entry,
  323.      Table_Initial        => 1000,
  324.      Table_Increment      => 200,
  325.      Table_Name           => "Source");
  326.  
  327.    ----------------------------
  328.    -- Use of Name Table Info --
  329.    ----------------------------
  330.  
  331.    --  All unit names and file names are entered into the Names table. The
  332.    --  Info fields of these entries are used as follows:
  333.  
  334.    --    Unit name           Info field has Unit_Id of unit table entry
  335.    --    ALI file name       Info field has ALI_Id of ALI table entry
  336.    --    Source file name    Info field has Source_Id of source table entry
  337.  
  338.    --------------------------------------------------
  339.    -- Subprograms for Manipulating ALI Information --
  340.    --------------------------------------------------
  341.  
  342.    procedure Initialize_ALI;
  343.    --  Initialize the ALI tables for a new bind
  344.  
  345.    procedure Read_ALI (Id : ALI_Id);
  346.    --  Process an ALI file which has been read and scanned by looping
  347.    --  through all withed units in the ALI file; checking if they have
  348.    --  been processed; and for each that hasn't, reading, scanning, and
  349.    --  recursively processing.
  350.  
  351.    function Scan_ALI (F : File_Name_Type; T : Text_Buffer_Ptr) return ALI_Id;
  352.    --  Given the text of an ALI file, scan and store the information from
  353.    --  the file, and return the Id of the resulting entry in the ALI table.
  354.    --  If the file is found to be incorrectly formatted, an error message
  355.    --  is generated, and the program is terminated.
  356.  
  357.    procedure Set_Source_Table (A : ALI_Id);
  358.    --  Build source table corresponding to the ALI file whose id is A.
  359.  
  360.    procedure Set_Source_Table;
  361.    --  Build the entire source table.
  362.  
  363.    function Time_Stamp_Mismatch (A : ALI_Id) return File_Name_Type;
  364.    --  Looks in the Source_Table and checks time stamp mismatches between
  365.    --  the sources there and the sources in the Sdep section of ali file whose
  366.    --  id is A. If no time stamp mismatches are found No_File is returned.
  367.    --  Otherwise return the first file for which there is a mismatch.
  368.    --  Note that in check source files mode (Check_Source_Files = True), the
  369.    --  time stamp in the Source_Table should be the actual time stamp of the
  370.    --  source files.
  371.  
  372. end ALI;
  373.