aboutsummaryrefslogtreecommitdiff
path: root/gcc/ada/gcc-interface
diff options
context:
space:
mode:
authorEric Botcazou <ebotcazou@gcc.gnu.org>2020-06-23 18:14:12 +0200
committerEric Botcazou <ebotcazou@gcc.gnu.org>2020-06-23 18:35:47 +0200
commitb523ee1f4b139532ecffb2bf707e65cfc5a837fe (patch)
tree9e0be3d5a4157a2a1c210f5ac1da45b7bb7d270e /gcc/ada/gcc-interface
parentce36abee27776e8cf8eee220b6acab45a53fe61f (diff)
downloadgcc-b523ee1f4b139532ecffb2bf707e65cfc5a837fe.zip
gcc-b523ee1f4b139532ecffb2bf707e65cfc5a837fe.tar.gz
gcc-b523ee1f4b139532ecffb2bf707e65cfc5a837fe.tar.bz2
Emit debug info for integral variables first
This makes it possible for global dynamic types to reference the DIE of these integral variables. gcc/ada/ChangeLog: * gcc-interface/utils.c (gnat_write_global_declarations): Output integral global variables first and the imported functions later.
Diffstat (limited to 'gcc/ada/gcc-interface')
-rw-r--r--gcc/ada/gcc-interface/utils.c42
1 files changed, 25 insertions, 17 deletions
diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c
index 7adc313..a96fde6 100644
--- a/gcc/ada/gcc-interface/utils.c
+++ b/gcc/ada/gcc-interface/utils.c
@@ -5880,7 +5880,16 @@ gnat_write_global_declarations (void)
}
}
- /* Output debug information for all global type declarations first. This
+ /* First output the integral global variables, so that they can be referenced
+ as bounds by the global dynamic types. Skip external variables, unless we
+ really need to emit debug info for them:, e.g. imported variables. */
+ FOR_EACH_VEC_SAFE_ELT (global_decls, i, iter)
+ if (TREE_CODE (iter) == VAR_DECL
+ && INTEGRAL_TYPE_P (TREE_TYPE (iter))
+ && (!DECL_EXTERNAL (iter) || !DECL_IGNORED_P (iter)))
+ rest_of_decl_compilation (iter, true, 0);
+
+ /* Now output debug information for the global type declarations. This
ensures that global types whose compilation hasn't been finalized yet,
for example pointers to Taft amendment types, have their compilation
finalized in the right context. */
@@ -5888,30 +5897,29 @@ gnat_write_global_declarations (void)
if (TREE_CODE (iter) == TYPE_DECL && !DECL_IGNORED_P (iter))
debug_hooks->type_decl (iter, false);
- /* Output imported functions. */
+ /* Then output the other global variables. We need to do that after the
+ information for global types is emitted so that they are finalized. */
FOR_EACH_VEC_SAFE_ELT (global_decls, i, iter)
- if (TREE_CODE (iter) == FUNCTION_DECL
- && DECL_EXTERNAL (iter)
- && DECL_INITIAL (iter) == NULL
- && !DECL_IGNORED_P (iter)
- && DECL_FUNCTION_IS_DEF (iter))
- debug_hooks->early_global_decl (iter);
+ if (TREE_CODE (iter) == VAR_DECL
+ && !INTEGRAL_TYPE_P (TREE_TYPE (iter))
+ && (!DECL_EXTERNAL (iter) || !DECL_IGNORED_P (iter)))
+ rest_of_decl_compilation (iter, true, 0);
- /* Output global constants. */
+ /* Output debug information for the global constants. */
FOR_EACH_VEC_SAFE_ELT (global_decls, i, iter)
if (TREE_CODE (iter) == CONST_DECL && !DECL_IGNORED_P (iter))
debug_hooks->early_global_decl (iter);
- /* Then output the global variables. We need to do that after the debug
- information for global types is emitted so that they are finalized. Skip
- external global variables, unless we need to emit debug info for them:
- this is useful for imported variables, for instance. */
+ /* Output it for the imported functions. */
FOR_EACH_VEC_SAFE_ELT (global_decls, i, iter)
- if (TREE_CODE (iter) == VAR_DECL
- && (!DECL_EXTERNAL (iter) || !DECL_IGNORED_P (iter)))
- rest_of_decl_compilation (iter, true, 0);
+ if (TREE_CODE (iter) == FUNCTION_DECL
+ && DECL_EXTERNAL (iter)
+ && DECL_INITIAL (iter) == NULL
+ && !DECL_IGNORED_P (iter)
+ && DECL_FUNCTION_IS_DEF (iter))
+ debug_hooks->early_global_decl (iter);
- /* Output the imported modules/declarations. In GNAT, these are only
+ /* Output it for the imported modules/declarations. In GNAT, these are only
materializing subprogram. */
FOR_EACH_VEC_SAFE_ELT (global_decls, i, iter)
if (TREE_CODE (iter) == IMPORTED_DECL && !DECL_IGNORED_P (iter))