aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/sem_ch10.adb
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@adacore.com>2022-05-21 21:54:45 +0200
committerPierre-Marie de Rodat <derodat@adacore.com>2022-06-02 09:06:46 +0000
commitbbb9c475bff9e3646542fa5273433abc0300cf6a (patch)
treebdd4dc384f1e2f1fcab16adab1c6b309d4607e2e /gcc/ada/sem_ch10.adb
parentda7cd04339b4db1bfdc4846eca2df04deca1a9b2 (diff)
downloadgcc-bbb9c475bff9e3646542fa5273433abc0300cf6a.zip
gcc-bbb9c475bff9e3646542fa5273433abc0300cf6a.tar.gz
gcc-bbb9c475bff9e3646542fa5273433abc0300cf6a.tar.bz2
[Ada] Restore full generation of static dispatch tables with -gnatzr
The -gnatzr switch triggers the creation of distribution stubs for use by the implementation of PolyORB. Now these stubs declare tagged types and are generated at the very end of the analysis of compilation units, after the static dispatch tables have been built, so these tables are missing for the tagged types of the stubs. Therefore this change defers the generation of static dispatch tables for compilation units, which is the common case, until after the stubs are (potentially) generated. For the other cases, in particular the generic instances that are not compilation units, nothing is changed. gcc/ada/ * exp_ch7.adb (Expand_N_Package_Body): Build static dispatch tables only for units that are not compilation units, unless they are generic instances. Do not push a scope for this. (Expand_N_Package_Declaration): Build static dispatch tables only for units that are both not compilation units and generic instances. * exp_disp.adb (Build_Static_Dispatch_Tables): Remove redundant early return. Push a scope for package bodies. * sem_ch10.adb: Add with and use clauses for Exp_Disp. (Analyze_Compilation_Unit): Build static dispatch tables here.
Diffstat (limited to 'gcc/ada/sem_ch10.adb')
-rw-r--r--gcc/ada/sem_ch10.adb17
1 files changed, 17 insertions, 0 deletions
diff --git a/gcc/ada/sem_ch10.adb b/gcc/ada/sem_ch10.adb
index 5976b4d..9b9a9f1 100644
--- a/gcc/ada/sem_ch10.adb
+++ b/gcc/ada/sem_ch10.adb
@@ -31,6 +31,7 @@ with Einfo; use Einfo;
with Einfo.Entities; use Einfo.Entities;
with Einfo.Utils; use Einfo.Utils;
with Errout; use Errout;
+with Exp_Disp; use Exp_Disp;
with Exp_Put_Image;
with Exp_Util; use Exp_Util;
with Elists; use Elists;
@@ -1000,6 +1001,22 @@ package body Sem_Ch10 is
end if;
end if;
+ -- Build dispatch tables of library-level tagged types only now because
+ -- the generation of distribution stubs above may create some of them.
+
+ if Expander_Active and then Tagged_Type_Expansion then
+ case Nkind (Unit_Node) is
+ when N_Package_Declaration | N_Package_Body =>
+ Build_Static_Dispatch_Tables (Unit_Node);
+
+ when N_Package_Instantiation =>
+ Build_Static_Dispatch_Tables (Instance_Spec (Unit_Node));
+
+ when others =>
+ null;
+ end case;
+ end if;
+
-- Remove unit from visibility, so that environment is clean for the
-- next compilation, which is either the main unit or some other unit
-- in the context.