diff options
author | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-01-03 15:36:56 +0000 |
---|---|---|
committer | charlet <charlet@138bc75d-0d04-0410-961f-82ee72b054a4> | 2005-01-03 15:36:56 +0000 |
commit | d6cba86091d59e81c87f2eb8e95dd5e07037bf4b (patch) | |
tree | d74b1035aeb8ec71c272cbbcadc3d2a1f8e047da | |
parent | 81d55fa4ada403b403542a7fcca84790470b790d (diff) | |
download | gcc-d6cba86091d59e81c87f2eb8e95dd5e07037bf4b.tar.gz |
* exp_ch3.adb (Stream_Operations_OK): Predicate to determine when the
generation of predefined stream operations (specs and bodies) should
proceed. Under various restrictions these subprograms must not be
generated.
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@92836 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ada/exp_ch3.adb | 30 |
1 files changed, 22 insertions, 8 deletions
diff --git a/gcc/ada/exp_ch3.adb b/gcc/ada/exp_ch3.adb index 27173efe787..a09f7f57288 100644 --- a/gcc/ada/exp_ch3.adb +++ b/gcc/ada/exp_ch3.adb @@ -286,6 +286,11 @@ package body Exp_Ch3 is -- Freeze entities of all predefined primitive operations. This is needed -- because the bodies of these operations do not normally do any freezeing. + function Stream_Operations_OK (Typ : Entity_Id) return Boolean; + -- Check whether stream operations must be emitted for a given type. + -- Various restrictions prevent the generation of these operations, as + -- a useful optimization or for certification purposes. + -------------------------- -- Adjust_Discriminants -- -------------------------- @@ -5364,10 +5369,7 @@ package body Exp_Ch3 is -- We also skip these operations if dispatching is not available -- or if streams are not available (since what's the point?) - if not Is_Limited_Type (Tag_Typ) - and then RTE_Available (RE_Tag) - and then RTE_Available (RE_Root_Stream_Type) - then + if Stream_Operations_OK (Tag_Typ) then Append_To (Res, Predef_Stream_Attr_Spec (Loc, Tag_Typ, TSS_Stream_Read)); Append_To (Res, @@ -5819,11 +5821,9 @@ package body Exp_Ch3 is -- Bodies for Dispatching stream IO routines. We need these only for -- non-limited types (in the limited case there is no dispatching). - -- We also skip them if dispatching is not available. + -- We also skip them if dispatching or finalization are not available. - if not Is_Limited_Type (Tag_Typ) - and then not Restriction_Active (No_Finalization) - then + if Stream_Operations_OK (Tag_Typ) then if No (TSS (Tag_Typ, TSS_Stream_Read)) then Build_Record_Read_Procedure (Loc, Tag_Typ, Decl, Ent); Append_To (Res, Decl); @@ -6034,4 +6034,18 @@ package body Exp_Ch3 is return Res; end Predefined_Primitive_Freeze; + + -------------------------- + -- Stream_Operations_OK -- + -------------------------- + + function Stream_Operations_OK (Typ : Entity_Id) return Boolean is + begin + return + not Is_Limited_Type (Typ) + and then RTE_Available (RE_Tag) + and then RTE_Available (RE_Root_Stream_Type) + and then not Restriction_Active (No_Dispatch) + and then not Restriction_Active (No_Streams); + end Stream_Operations_OK; end Exp_Ch3; |