------------------------------------------------------------------------------
--                                                                          --
--                         GNAT COMPILER COMPONENTS                         --
--                                                                          --
--                                G E N _ I L                               --
--                                                                          --
--                                 S p e c                                  --
--                                                                          --
--          Copyright (C) 2020-2023, 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- --
-- ware  Foundation;  either version 3,  or (at your option) any later ver- --
-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
-- for  more details.  You should have  received  a copy of the GNU General --
-- Public License  distributed with GNAT; see file COPYING3.  If not, go to --
-- http://www.gnu.org/licenses for a complete copy of the license.          --
--                                                                          --
-- GNAT was originally developed  by the GNAT team at  New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc.      --
--                                                                          --
------------------------------------------------------------------------------
pragma Warnings (Off); -- with clauses for children
with Ada.Characters.Handling; use Ada.Characters.Handling;
with Ada.Streams.Stream_IO;
pragma Warnings (On);
package Gen_IL is -- generate intermediate language
   --  This package and children generates the main intermediate language used
   --  by the GNAT compiler, which is a decorated syntax tree.
   --  The generated Ada packages are:
   --
   --    Seinfo
   --    Sinfo.Nodes
   --    Einfo.Entities
   --    Nmake
   --    Seinfo_Tables
   --
   --  We also generate C code:
   --
   --    einfo.h
   --    sinfo.h
   --    snames.h
   --
   --  It is necessary to look at this generated code in order to understand
   --  the compiler. In addition, it is necessary to look at comments in the
   --  spec and body of Gen_IL.
   --
   --  Note that the Gen_IL "compiler" and the GNAT Ada compiler are separate
   --  programs, with no dependencies between them in either direction. That
   --  is, Gen_IL does not say "with" of GNAT units, and GNAT does not say
   --  "with Gen_IL". There are many things declared in Gen_IL and GNAT with
   --  the same name; these are typically related, but they are not the same
   --  thing.
   --  Misc declarations used throughout:
   type Root_Int is new Integer;
   function Image (X : Root_Int) return String;
   --  Without the extra blank. You can derive from Root_Int or the subtypes
   --  below, and inherit a convenient Image function that leaves out that
   --  blank.
   subtype Root_Nat is Root_Int range 0 .. Root_Int'Last;
   subtype Root_Pos is Root_Int range 1 .. Root_Int'Last;
   function Capitalize (S : String) return String;
   procedure Capitalize (S : in out String);
   --  Turns an identifier into Mixed_Case
   --  The following declares a minimal implementation of formatted output
   --  that is piggybacked on Ada.Streams.Stream_IO for bootstrap reasons.
   --  It uses LF as universal line terminator to make it host independent.
   type Sink is record
      File     : Ada.Streams.Stream_IO.File_Type;
      Indent   : Natural;
      New_Line : Boolean;
   end record;
   procedure Create_File (Buffer : in out Sink; Name : String);
   procedure Increase_Indent (Buffer : in out Sink; Amount : Natural);
   procedure Decrease_Indent (Buffer : in out Sink; Amount : Natural);
   procedure Put (Buffer : in out Sink; Item : String);
   LF : constant String := "" & ASCII.LF;
end Gen_IL;