2020-06-15 Bob Duff <duff@adacore.com> gcc/ada/ * exp_put_image.ads, exp_put_image.adb (Image_Should_Call_Put_Image): New function to determine whether the call to Put_Image should be generated. (Build_Image_Call): New procedure to generate the call to Put_Image. * exp_imgv.adb (Expand_Image_Attribute): Use underlying types to bypass privacy (only in Ada 2020). If Image_Should_Call_Put_Image is True (which happens only in Ada 2020), then call Build_Image_Call. * rtsfind.ads, rtsfind.adb: Add the necessary declarations in Ada.Strings.Text_Output.Buffers. * sem_attr.adb (Check_Image_Type): Enable the Ada 2020 case. * libgnat/a-stoufo.ads, libgnat/a-stoufo.adb: Use the less restrictive type that allows newline characters.
104 lines
5.2 KiB
Ada
104 lines
5.2 KiB
Ada
------------------------------------------------------------------------------
|
|
-- --
|
|
-- GNAT COMPILER COMPONENTS --
|
|
-- --
|
|
-- E X P _ P U T _ I M A G E --
|
|
-- --
|
|
-- S p e c --
|
|
-- --
|
|
-- Copyright (C) 2020, 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. --
|
|
-- --
|
|
------------------------------------------------------------------------------
|
|
|
|
with Types; use Types;
|
|
|
|
package Exp_Put_Image is
|
|
|
|
-- Routines to build Put_Image calls. See Ada.Strings.Text_Output.Utils and
|
|
-- System.Put_Images for the run-time routines we are generating calls to.
|
|
|
|
-- For a call to T'Put_Image, if T is elementary, we expand the code
|
|
-- inline. If T is a tagged type, then Put_Image is a primitive procedure
|
|
-- of T, and can be dispatched to in the class-wide case. For untagged
|
|
-- composite types, we generate a procedure the first time we see a call,
|
|
-- and call it. Subsequent calls call the same procedure. Thus, if there
|
|
-- are calls to T'Put_Image in different units, there will be duplicates;
|
|
-- each unit will get a copy of the T'Put_Image procedure.
|
|
|
|
function Enable_Put_Image (Typ : Entity_Id) return Boolean;
|
|
-- True if the predefined Put_Image should be enabled for type T. Put_Image
|
|
-- is always enabled if there is a user-specified one.
|
|
|
|
function Build_Put_Image_Profile
|
|
(Loc : Source_Ptr; Typ : Entity_Id) return List_Id;
|
|
-- Builds the parameter profile for Put_Image. This is used for the tagged
|
|
-- case to build the spec for the primitive operation.
|
|
|
|
-- In the following Build_... routines, N is the attribute reference node,
|
|
-- from which the procedure to call and the parameters to pass can be
|
|
-- determined.
|
|
|
|
function Build_Elementary_Put_Image_Call (N : Node_Id) return Node_Id;
|
|
-- Builds a Put_Image call for an elementary type.
|
|
|
|
function Build_String_Put_Image_Call (N : Node_Id) return Node_Id;
|
|
-- Builds a Put_Image call for a standard string type.
|
|
|
|
function Build_Protected_Put_Image_Call (N : Node_Id) return Node_Id;
|
|
-- Builds a Put_Image call for a protected type.
|
|
|
|
function Build_Task_Put_Image_Call (N : Node_Id) return Node_Id;
|
|
-- Builds a Put_Image call for a task type.
|
|
|
|
-- The following routines build the Put_Image procedure for composite
|
|
-- types. Typ is the base type to which the procedure applies (i.e. the
|
|
-- base type of the Put_Image attribute prefix). The returned results are
|
|
-- the declaration and name (entity) of the procedure.
|
|
|
|
procedure Build_Array_Put_Image_Procedure
|
|
(Nod : Node_Id;
|
|
Typ : Entity_Id;
|
|
Decl : out Node_Id;
|
|
Pnam : out Entity_Id);
|
|
-- Nod provides the Sloc value for the generated code
|
|
|
|
procedure Build_Record_Put_Image_Procedure
|
|
(Loc : Source_Ptr;
|
|
Typ : Entity_Id;
|
|
Decl : out Node_Id;
|
|
Pnam : out Entity_Id);
|
|
-- Loc is the location of the subprogram declaration
|
|
|
|
function Build_Unknown_Put_Image_Call (N : Node_Id) return Node_Id;
|
|
-- Build a call to Put_Image_Unknown
|
|
|
|
function Image_Should_Call_Put_Image (N : Node_Id) return Boolean;
|
|
-- True if T'Image should call T'Put_Image. N is the attribute_reference
|
|
-- T'Image.
|
|
|
|
function Build_Image_Call (N : Node_Id) return Node_Id;
|
|
-- N is a call to T'Image, and this translates it into the appropriate code
|
|
-- to call T'Put_Image into a buffer and then extract the string from the
|
|
-- buffer.
|
|
|
|
procedure Preload_Sink (Compilation_Unit : Node_Id);
|
|
-- Call RTE (RE_Sink) if necessary, to load the packages involved in
|
|
-- Put_Image. We need to do this explicitly, fairly early during
|
|
-- compilation, because otherwise it happens during freezing, which
|
|
-- triggers visibility bugs in generic instantiations.
|
|
|
|
end Exp_Put_Image;
|