diff options
author | Arnaud Charlet <charlet@gcc.gnu.org> | 2005-01-03 16:36:56 +0100 |
---|---|---|
committer | Arnaud Charlet <charlet@gcc.gnu.org> | 2005-01-03 16:36:56 +0100 |
commit | a778d033f9229cc036805510c646cfc50d9f12a7 (patch) | |
tree | d74b1035aeb8ec71c272cbbcadc3d2a1f8e047da /gcc | |
parent | 42de0044766f78d4dc915b46f5de94a6a5846ae2 (diff) | |
download | gcc-a778d033f9229cc036805510c646cfc50d9f12a7.zip gcc-a778d033f9229cc036805510c646cfc50d9f12a7.tar.gz gcc-a778d033f9229cc036805510c646cfc50d9f12a7.tar.bz2 |
exp_ch3.adb (Stream_Operations_OK): Predicate to determine when the generation of predefined stream operations...
* 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.
From-SVN: r92836
Diffstat (limited to 'gcc')
-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 27173ef..a09f7f5 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; |