* [patch 1/10] debug-early merge: Ada front-end
@ 2015-05-08 0:32 Aldy Hernandez
2015-05-08 10:27 ` Eric Botcazou
0 siblings, 1 reply; 10+ messages in thread
From: Aldy Hernandez @ 2015-05-08 0:32 UTC (permalink / raw)
To: gcc-patches
[-- Attachment #1: Type: text/plain, Size: 1 bytes --]
[-- Attachment #2: dearly-ada.patch --]
[-- Type: text/x-patch, Size: 4165 bytes --]
gcc/ada/
* gcc-interface/gigi.h (note_types_used_by_globals): New prototype.
* gcc-interface/misc.c (gnat_parse_file): Call
note_types_used_by_globals.
* gcc-interface/utils.c: Remove global_decls.
(gnat_pushdecl): Remove use of global_decls.
(gnat_write_global_declarations): Rename to
note_types_used_by_globals.
Remove call to finalize_compilation_unit.
Remove explicit call to debug_hooks.
diff --git a/gcc/ada/gcc-interface/gigi.h b/gcc/ada/gcc-interface/gigi.h
index 6d65fc5..fead2be 100644
--- a/gcc/ada/gcc-interface/gigi.h
+++ b/gcc/ada/gcc-interface/gigi.h
@@ -535,8 +535,7 @@ extern tree gnat_type_for_size (unsigned precision, int unsignedp);
an unsigned type; otherwise a signed type is returned. */
extern tree gnat_type_for_mode (machine_mode mode, int unsignedp);
-/* Emit debug info for all global variable declarations. */
-extern void gnat_write_global_declarations (void);
+extern void note_types_used_by_globals (void);
/* Return the unsigned version of a TYPE_NODE, a scalar type. */
extern tree gnat_unsigned_type (tree type_node);
diff --git a/gcc/ada/gcc-interface/misc.c b/gcc/ada/gcc-interface/misc.c
index edaab97..2056a61 100644
--- a/gcc/ada/gcc-interface/misc.c
+++ b/gcc/ada/gcc-interface/misc.c
@@ -122,6 +122,8 @@ gnat_parse_file (void)
/* Call the front end. */
_ada_gnat1drv ();
+
+ note_types_used_by_globals ();
}
/* Return language mask for option processing. */
@@ -972,8 +974,6 @@ gnat_init_ts (void)
#define LANG_HOOKS_GETDECLS lhd_return_null_tree_v
#undef LANG_HOOKS_PUSHDECL
#define LANG_HOOKS_PUSHDECL gnat_return_tree
-#undef LANG_HOOKS_WRITE_GLOBALS
-#define LANG_HOOKS_WRITE_GLOBALS gnat_write_global_declarations
#undef LANG_HOOKS_GET_ALIAS_SET
#define LANG_HOOKS_GET_ALIAS_SET gnat_get_alias_set
#undef LANG_HOOKS_PRINT_DECL
diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c
index 170aa4a..647b427 100644
--- a/gcc/ada/gcc-interface/utils.c
+++ b/gcc/ada/gcc-interface/utils.c
@@ -227,9 +227,6 @@ static GTY((deletable)) struct gnat_binding_level *free_binding_level;
/* The context to be used for global declarations. */
static GTY(()) tree global_context;
-/* An array of global declarations. */
-static GTY(()) vec<tree, va_gc> *global_decls;
-
/* An array of builtin function declarations. */
static GTY(()) vec<tree, va_gc> *builtin_decls;
@@ -764,9 +761,7 @@ gnat_pushdecl (tree decl, Node_Id gnat_node)
if (TREE_CODE (decl) == FUNCTION_DECL && DECL_BUILT_IN (decl))
vec_safe_push (builtin_decls, decl);
}
- else if (global_bindings_p ())
- vec_safe_push (global_decls, decl);
- else
+ else if (!global_bindings_p ())
{
DECL_CHAIN (decl) = BLOCK_VARS (current_binding_level->block);
BLOCK_VARS (current_binding_level->block) = decl;
@@ -5176,7 +5171,7 @@ smaller_form_type_p (tree type, tree orig_type)
static GTY (()) tree dummy_global;
void
-gnat_write_global_declarations (void)
+note_types_used_by_globals (void)
{
unsigned int i;
tree iter;
@@ -5204,28 +5199,6 @@ gnat_write_global_declarations (void)
types_used_by_var_decl_insert (t, dummy_global);
}
}
-
- /* Output debug information for all global type declarations first. 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. */
- FOR_EACH_VEC_SAFE_ELT (global_decls, i, iter)
- if (TREE_CODE (iter) == TYPE_DECL && !DECL_IGNORED_P (iter))
- debug_hooks->global_decl (iter);
-
- /* Proceed to optimize and emit assembly. */
- symtab->finalize_compilation_unit ();
-
- /* After cgraph has had a chance to emit everything that's going to
- be emitted, output debug information for the rest of globals. */
- if (!seen_error ())
- {
- timevar_push (TV_SYMOUT);
- FOR_EACH_VEC_SAFE_ELT (global_decls, i, iter)
- if (TREE_CODE (iter) != TYPE_DECL && !DECL_IGNORED_P (iter))
- debug_hooks->global_decl (iter);
- timevar_pop (TV_SYMOUT);
- }
}
/* ************************************************************************
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch 1/10] debug-early merge: Ada front-end
2015-05-08 0:32 [patch 1/10] debug-early merge: Ada front-end Aldy Hernandez
@ 2015-05-08 10:27 ` Eric Botcazou
2015-05-08 10:35 ` Richard Biener
` (2 more replies)
0 siblings, 3 replies; 10+ messages in thread
From: Eric Botcazou @ 2015-05-08 10:27 UTC (permalink / raw)
To: Aldy Hernandez; +Cc: gcc-patches
> @@ -5204,28 +5199,6 @@ gnat_write_global_declarations (void)
> types_used_by_var_decl_insert (t, dummy_global);
> }
> }
> -
> - /* Output debug information for all global type declarations first. 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. */
> - FOR_EACH_VEC_SAFE_ELT (global_decls, i, iter)
> - if (TREE_CODE (iter) == TYPE_DECL && !DECL_IGNORED_P (iter))
> - debug_hooks->global_decl (iter);
> -
> - /* Proceed to optimize and emit assembly. */
> - symtab->finalize_compilation_unit ();
> -
> - /* After cgraph has had a chance to emit everything that's going to
> - be emitted, output debug information for the rest of globals. */
> - if (!seen_error ())
> - {
> - timevar_push (TV_SYMOUT);
> - FOR_EACH_VEC_SAFE_ELT (global_decls, i, iter)
> - if (TREE_CODE (iter) != TYPE_DECL && !DECL_IGNORED_P (iter))
> - debug_hooks->global_decl (iter);
> - timevar_pop (TV_SYMOUT);
> - }
> }
What's the replacement mechanism for the first pass on global_decls? The
comment explains that generating debug info must be delayed in this case.
--
Eric Botcazou
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch 1/10] debug-early merge: Ada front-end
2015-05-08 10:27 ` Eric Botcazou
@ 2015-05-08 10:35 ` Richard Biener
2015-05-08 15:22 ` Aldy Hernandez
2015-05-08 16:23 ` Aldy Hernandez
2015-05-21 21:33 ` Aldy Hernandez
2 siblings, 1 reply; 10+ messages in thread
From: Richard Biener @ 2015-05-08 10:35 UTC (permalink / raw)
To: Eric Botcazou; +Cc: Aldy Hernandez, GCC Patches
On Fri, May 8, 2015 at 12:26 PM, Eric Botcazou <ebotcazou@adacore.com> wrote:
>> @@ -5204,28 +5199,6 @@ gnat_write_global_declarations (void)
>> types_used_by_var_decl_insert (t, dummy_global);
>> }
>> }
>> -
>> - /* Output debug information for all global type declarations first. 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. */
>> - FOR_EACH_VEC_SAFE_ELT (global_decls, i, iter)
>> - if (TREE_CODE (iter) == TYPE_DECL && !DECL_IGNORED_P (iter))
>> - debug_hooks->global_decl (iter);
Shouldn't that have used ->type_decl (iter) anyway? That is, are they not
already processed via rest_of_type_compilation or does the Ada FE not
use that?
>> - /* Proceed to optimize and emit assembly. */
>> - symtab->finalize_compilation_unit ();
>> -
>> - /* After cgraph has had a chance to emit everything that's going to
>> - be emitted, output debug information for the rest of globals. */
>> - if (!seen_error ())
>> - {
>> - timevar_push (TV_SYMOUT);
>> - FOR_EACH_VEC_SAFE_ELT (global_decls, i, iter)
>> - if (TREE_CODE (iter) != TYPE_DECL && !DECL_IGNORED_P (iter))
>> - debug_hooks->global_decl (iter);
>> - timevar_pop (TV_SYMOUT);
>> - }
>> }
>
> What's the replacement mechanism for the first pass on global_decls? The
> comment explains that generating debug info must be delayed in this case.
But yes, I don't think the patches add any replacement for processing
TYPE_DECLs that happen to be in global_decls.
Richard.
> --
> Eric Botcazou
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch 1/10] debug-early merge: Ada front-end
2015-05-08 10:35 ` Richard Biener
@ 2015-05-08 15:22 ` Aldy Hernandez
2015-05-09 11:31 ` Eric Botcazou
0 siblings, 1 reply; 10+ messages in thread
From: Aldy Hernandez @ 2015-05-08 15:22 UTC (permalink / raw)
To: Richard Biener, Eric Botcazou; +Cc: GCC Patches
On 05/08/2015 03:35 AM, Richard Biener wrote:
> On Fri, May 8, 2015 at 12:26 PM, Eric Botcazou <ebotcazou@adacore.com> wrote:
>>> @@ -5204,28 +5199,6 @@ gnat_write_global_declarations (void)
>>> types_used_by_var_decl_insert (t, dummy_global);
>>> }
>>> }
>>> -
>>> - /* Output debug information for all global type declarations first. 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. */
>>> - FOR_EACH_VEC_SAFE_ELT (global_decls, i, iter)
>>> - if (TREE_CODE (iter) == TYPE_DECL && !DECL_IGNORED_P (iter))
>>> - debug_hooks->global_decl (iter);
>
> Shouldn't that have used ->type_decl (iter) anyway? That is, are they not
> already processed via rest_of_type_compilation or does the Ada FE not
> use that?
My question exactly. Perhaps that was my confusion. Why is this using
->global_decl?
For example, the C front-end uses rest_of_type_compilation (see
finish_struct() in c/c-decl.c) which calls ->type_decl(), or it calls
->type_decl() from record_builtin_type().
>
>>> - /* Proceed to optimize and emit assembly. */
>>> - symtab->finalize_compilation_unit ();
>>> -
>>> - /* After cgraph has had a chance to emit everything that's going to
>>> - be emitted, output debug information for the rest of globals. */
>>> - if (!seen_error ())
>>> - {
>>> - timevar_push (TV_SYMOUT);
>>> - FOR_EACH_VEC_SAFE_ELT (global_decls, i, iter)
>>> - if (TREE_CODE (iter) != TYPE_DECL && !DECL_IGNORED_P (iter))
>>> - debug_hooks->global_decl (iter);
>>> - timevar_pop (TV_SYMOUT);
>>> - }
>>> }
>>
>> What's the replacement mechanism for the first pass on global_decls? The
>> comment explains that generating debug info must be delayed in this case.
>
> But yes, I don't think the patches add any replacement for processing
> TYPE_DECLs that happen to be in global_decls.
I can put the code back, but calling ->type_decl()? Assuming you folks
(Ada) don't want to use rest_of_type_compilation().
Aldy
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch 1/10] debug-early merge: Ada front-end
2015-05-08 10:27 ` Eric Botcazou
2015-05-08 10:35 ` Richard Biener
@ 2015-05-08 16:23 ` Aldy Hernandez
2015-05-09 11:31 ` Eric Botcazou
2015-05-21 21:33 ` Aldy Hernandez
2 siblings, 1 reply; 10+ messages in thread
From: Aldy Hernandez @ 2015-05-08 16:23 UTC (permalink / raw)
To: Eric Botcazou; +Cc: gcc-patches
On 05/08/2015 03:26 AM, Eric Botcazou wrote:
>> @@ -5204,28 +5199,6 @@ gnat_write_global_declarations (void)
>> types_used_by_var_decl_insert (t, dummy_global);
>> }
>> }
>> -
>> - /* Output debug information for all global type declarations first. 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. */
>> - FOR_EACH_VEC_SAFE_ELT (global_decls, i, iter)
>> - if (TREE_CODE (iter) == TYPE_DECL && !DECL_IGNORED_P (iter))
>> - debug_hooks->global_decl (iter);
>> -
>> - /* Proceed to optimize and emit assembly. */
>> - symtab->finalize_compilation_unit ();
>> -
>> - /* After cgraph has had a chance to emit everything that's going to
>> - be emitted, output debug information for the rest of globals. */
>> - if (!seen_error ())
>> - {
>> - timevar_push (TV_SYMOUT);
>> - FOR_EACH_VEC_SAFE_ELT (global_decls, i, iter)
>> - if (TREE_CODE (iter) != TYPE_DECL && !DECL_IGNORED_P (iter))
>> - debug_hooks->global_decl (iter);
>> - timevar_pop (TV_SYMOUT);
>> - }
>> }
>
> What's the replacement mechanism for the first pass on global_decls? The
> comment explains that generating debug info must be delayed in this case.
>
Ah, I see what you mean. I'll address this and repost.
Thanks.
Aldy
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch 1/10] debug-early merge: Ada front-end
2015-05-08 15:22 ` Aldy Hernandez
@ 2015-05-09 11:31 ` Eric Botcazou
0 siblings, 0 replies; 10+ messages in thread
From: Eric Botcazou @ 2015-05-09 11:31 UTC (permalink / raw)
To: Aldy Hernandez; +Cc: gcc-patches, Richard Biener
[-- Attachment #1: Type: text/plain, Size: 918 bytes --]
> My question exactly. Perhaps that was my confusion. Why is this using
> ->global_decl?
Because that's equivalent to ->type_decl (iter, false) in DWARF.
> For example, the C front-end uses rest_of_type_compilation (see
> finish_struct() in c/c-decl.c) which calls ->type_decl(), or it calls
> ->type_decl() from record_builtin_type().
All right, let's follow the gospel then. :-) Patch attached and installed.
> I can put the code back, but calling ->type_decl()? Assuming you folks
> (Ada) don't want to use rest_of_type_compilation().
No, we don't use it for local types either (it's a no-op in DWARF in this case
and we don't support STABS anymore because of the need to manually delay the
generation of debug info for local types, which is a real pain in Ada).
* gcc-interface/utils.c (gnat_write_global_declarations): Use type_decl
method instead of global_decl for TYPE_DECLs.
--
Eric Botcazou
[-- Attachment #2: p.diff --]
[-- Type: text/x-patch, Size: 574 bytes --]
Index: gcc-interface/utils.c
===================================================================
--- gcc-interface/utils.c (revision 222673)
+++ gcc-interface/utils.c (working copy)
@@ -5211,7 +5211,7 @@ gnat_write_global_declarations (void)
finalized in the right context. */
FOR_EACH_VEC_SAFE_ELT (global_decls, i, iter)
if (TREE_CODE (iter) == TYPE_DECL && !DECL_IGNORED_P (iter))
- debug_hooks->global_decl (iter);
+ debug_hooks->type_decl (iter, false);
/* Proceed to optimize and emit assembly. */
symtab->finalize_compilation_unit ();
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch 1/10] debug-early merge: Ada front-end
2015-05-08 16:23 ` Aldy Hernandez
@ 2015-05-09 11:31 ` Eric Botcazou
0 siblings, 0 replies; 10+ messages in thread
From: Eric Botcazou @ 2015-05-09 11:31 UTC (permalink / raw)
To: Aldy Hernandez; +Cc: gcc-patches
> Ah, I see what you mean. I'll address this and repost.
Thanks. Did the first version pass the GDB testsuite? I thought we had a
testcase exercising the pointer to Taft amendment type case in it.
--
Eric Botcazou
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch 1/10] debug-early merge: Ada front-end
2015-05-08 10:27 ` Eric Botcazou
2015-05-08 10:35 ` Richard Biener
2015-05-08 16:23 ` Aldy Hernandez
@ 2015-05-21 21:33 ` Aldy Hernandez
2015-05-22 8:52 ` Eric Botcazou
2 siblings, 1 reply; 10+ messages in thread
From: Aldy Hernandez @ 2015-05-21 21:33 UTC (permalink / raw)
To: Eric Botcazou; +Cc: gcc-patches, jason merrill
[-- Attachment #1: Type: text/plain, Size: 1360 bytes --]
On 05/08/2015 06:26 AM, Eric Botcazou wrote:
[Jason, question below.]
> What's the replacement mechanism for the first pass on global_decls? The
> comment explains that generating debug info must be delayed in this case.
My apologies for the delay on Ada. I have reworked the patch to leave
the first pass on the TYPE_DECLs which are definitely needed. I also
optimized things a bit, since we don't need to save all the globals any
more.
There is one regression which I'd like you and Jason's input before
proceeding:
+FAIL: gnat.dg/specs/debug1.ads scan-assembler-times DW_AT_artificial 17
The problem is that the Ada front-end twiddles the DECL_ARTIFICIAL flag
*after* it has called debug_hooks->early_global_decl(). The function
gnat_to_gnu_entity() calls create_var_decl_1->rest_of_decl_compilation,
but then much later twiddles DECL_ARTIFICIAL:
if (!Comes_From_Source (gnat_entity))
DECL_ARTIFICIAL (gnu_decl) = 1;
Twiddling DECL_ARTIFICIAL after we create early dwarf, means the DIE
does not get the DW_AT_artificial. Would it be possible for you guys
(ahem, Ada folk) to set DECL_ARTIFICIAL before calling
rest_of_decl_compilation?
If not, Jason I suppose we could tag the DW_AT_artificial in
late_global_decl when we notice it now has DECL_ARTIFICIAL set. But I'd
prefer not to hack things this way.
Thoughts?
Aldy
[-- Attachment #2: dearly-ada.patch --]
[-- Type: text/x-patch, Size: 4233 bytes --]
gcc/ada/
* gcc-interface/gigi.h (note_types_used_by_globals): Rename from
gnat_write_global_declarations.
* gcc-interface/misc.c (gnat_parse_file): Call
note_types_used_by_globals.
Remove LANG_HOOKS_WRITE_GLOBALS.
* gcc-interface/utils.c: Rename global_decls to type_decls.
(gnat_write_global_declarations): Rename
to note_types_used_by_globals.
Remove call to finalize_compilation_unit.
Remove debug_hooks->global_decl() call for globals.
(gnat_pushdecls): Only insert into type_decls if TYPE_DECL.
diff --git a/gcc/ada/gcc-interface/gigi.h b/gcc/ada/gcc-interface/gigi.h
index 6d65fc5..fead2be 100644
--- a/gcc/ada/gcc-interface/gigi.h
+++ b/gcc/ada/gcc-interface/gigi.h
@@ -535,8 +535,7 @@ extern tree gnat_type_for_size (unsigned precision, int unsignedp);
an unsigned type; otherwise a signed type is returned. */
extern tree gnat_type_for_mode (machine_mode mode, int unsignedp);
-/* Emit debug info for all global variable declarations. */
-extern void gnat_write_global_declarations (void);
+extern void note_types_used_by_globals (void);
/* Return the unsigned version of a TYPE_NODE, a scalar type. */
extern tree gnat_unsigned_type (tree type_node);
diff --git a/gcc/ada/gcc-interface/misc.c b/gcc/ada/gcc-interface/misc.c
index edaab97..2056a61 100644
--- a/gcc/ada/gcc-interface/misc.c
+++ b/gcc/ada/gcc-interface/misc.c
@@ -122,6 +122,8 @@ gnat_parse_file (void)
/* Call the front end. */
_ada_gnat1drv ();
+
+ note_types_used_by_globals ();
}
/* Return language mask for option processing. */
@@ -972,8 +974,6 @@ gnat_init_ts (void)
#define LANG_HOOKS_GETDECLS lhd_return_null_tree_v
#undef LANG_HOOKS_PUSHDECL
#define LANG_HOOKS_PUSHDECL gnat_return_tree
-#undef LANG_HOOKS_WRITE_GLOBALS
-#define LANG_HOOKS_WRITE_GLOBALS gnat_write_global_declarations
#undef LANG_HOOKS_GET_ALIAS_SET
#define LANG_HOOKS_GET_ALIAS_SET gnat_get_alias_set
#undef LANG_HOOKS_PRINT_DECL
diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c
index 5968857..3ef3a3a 100644
--- a/gcc/ada/gcc-interface/utils.c
+++ b/gcc/ada/gcc-interface/utils.c
@@ -227,8 +227,8 @@ static GTY((deletable)) struct gnat_binding_level *free_binding_level;
/* The context to be used for global declarations. */
static GTY(()) tree global_context;
-/* An array of global declarations. */
-static GTY(()) vec<tree, va_gc> *global_decls;
+/* An array of global type declarations. */
+static GTY(()) vec<tree, va_gc> *type_decls;
/* An array of builtin function declarations. */
static GTY(()) vec<tree, va_gc> *builtin_decls;
@@ -765,7 +765,10 @@ gnat_pushdecl (tree decl, Node_Id gnat_node)
vec_safe_push (builtin_decls, decl);
}
else if (global_bindings_p ())
- vec_safe_push (global_decls, decl);
+ {
+ if (TREE_CODE (decl) == TYPE_DECL)
+ vec_safe_push (type_decls, decl);
+ }
else
{
DECL_CHAIN (decl) = BLOCK_VARS (current_binding_level->block);
@@ -5176,7 +5179,7 @@ smaller_form_type_p (tree type, tree orig_type)
static GTY (()) tree dummy_global;
void
-gnat_write_global_declarations (void)
+note_types_used_by_globals (void)
{
unsigned int i;
tree iter;
@@ -5209,23 +5212,9 @@ gnat_write_global_declarations (void)
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. */
- FOR_EACH_VEC_SAFE_ELT (global_decls, i, iter)
- if (TREE_CODE (iter) == TYPE_DECL && !DECL_IGNORED_P (iter))
+ FOR_EACH_VEC_SAFE_ELT (type_decls, i, iter)
+ if (!DECL_IGNORED_P (iter))
debug_hooks->type_decl (iter, false);
-
- /* Proceed to optimize and emit assembly. */
- symtab->finalize_compilation_unit ();
-
- /* After cgraph has had a chance to emit everything that's going to
- be emitted, output debug information for the rest of globals. */
- if (!seen_error ())
- {
- timevar_push (TV_SYMOUT);
- FOR_EACH_VEC_SAFE_ELT (global_decls, i, iter)
- if (TREE_CODE (iter) != TYPE_DECL && !DECL_IGNORED_P (iter))
- debug_hooks->global_decl (iter);
- timevar_pop (TV_SYMOUT);
- }
}
/* ************************************************************************
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch 1/10] debug-early merge: Ada front-end
2015-05-21 21:33 ` Aldy Hernandez
@ 2015-05-22 8:52 ` Eric Botcazou
2015-05-22 12:33 ` Aldy Hernandez
0 siblings, 1 reply; 10+ messages in thread
From: Eric Botcazou @ 2015-05-22 8:52 UTC (permalink / raw)
To: Aldy Hernandez; +Cc: gcc-patches, jason merrill
> My apologies for the delay on Ada. I have reworked the patch to leave
> the first pass on the TYPE_DECLs which are definitely needed. I also
> optimized things a bit, since we don't need to save all the globals any
> more.
Thanks, this looks fine modulo a couple of nits, see below.
> There is one regression which I'd like you and Jason's input before
> proceeding:
>
> +FAIL: gnat.dg/specs/debug1.ads scan-assembler-times DW_AT_artificial 17
>
> The problem is that the Ada front-end twiddles the DECL_ARTIFICIAL flag
> *after* it has called debug_hooks->early_global_decl(). The function
> gnat_to_gnu_entity() calls create_var_decl_1->rest_of_decl_compilation,
> but then much later twiddles DECL_ARTIFICIAL:
>
> if (!Comes_From_Source (gnat_entity))
> DECL_ARTIFICIAL (gnu_decl) = 1;
>
> Twiddling DECL_ARTIFICIAL after we create early dwarf, means the DIE
> does not get the DW_AT_artificial. Would it be possible for you guys
> (ahem, Ada folk) to set DECL_ARTIFICIAL before calling
> rest_of_decl_compilation?
Sure, just add a ??? comment before the above lines for now.
@@ -535,8 +535,7 @@ extern tree gnat_type_for_size (unsigned precision, int
unsignedp);
an unsigned type; otherwise a signed type is returned. */
extern tree gnat_type_for_mode (machine_mode mode, int unsignedp);
-/* Emit debug info for all global variable declarations. */
-extern void gnat_write_global_declarations (void);
+extern void note_types_used_by_globals (void);
The comment needs to be adjusted instead of removed and preferably be the same
as the one (ajusted too) above the function in utils.c.
--
Eric Botcazou
^ permalink raw reply [flat|nested] 10+ messages in thread
* Re: [patch 1/10] debug-early merge: Ada front-end
2015-05-22 8:52 ` Eric Botcazou
@ 2015-05-22 12:33 ` Aldy Hernandez
0 siblings, 0 replies; 10+ messages in thread
From: Aldy Hernandez @ 2015-05-22 12:33 UTC (permalink / raw)
To: Eric Botcazou; +Cc: gcc-patches, jason merrill
[-- Attachment #1: Type: text/plain, Size: 1844 bytes --]
On 05/22/2015 04:31 AM, Eric Botcazou wrote:
>> My apologies for the delay on Ada. I have reworked the patch to leave
>> the first pass on the TYPE_DECLs which are definitely needed. I also
>> optimized things a bit, since we don't need to save all the globals any
>> more.
>
> Thanks, this looks fine modulo a couple of nits, see below.
>
>> There is one regression which I'd like you and Jason's input before
>> proceeding:
>>
>> +FAIL: gnat.dg/specs/debug1.ads scan-assembler-times DW_AT_artificial 17
>>
>> The problem is that the Ada front-end twiddles the DECL_ARTIFICIAL flag
>> *after* it has called debug_hooks->early_global_decl(). The function
>> gnat_to_gnu_entity() calls create_var_decl_1->rest_of_decl_compilation,
>> but then much later twiddles DECL_ARTIFICIAL:
>>
>> if (!Comes_From_Source (gnat_entity))
>> DECL_ARTIFICIAL (gnu_decl) = 1;
>>
>> Twiddling DECL_ARTIFICIAL after we create early dwarf, means the DIE
>> does not get the DW_AT_artificial. Would it be possible for you guys
>> (ahem, Ada folk) to set DECL_ARTIFICIAL before calling
>> rest_of_decl_compilation?
>
> Sure, just add a ??? comment before the above lines for now.
Done.
>
>
> @@ -535,8 +535,7 @@ extern tree gnat_type_for_size (unsigned precision, int
> unsignedp);
> an unsigned type; otherwise a signed type is returned. */
> extern tree gnat_type_for_mode (machine_mode mode, int unsignedp);
>
> -/* Emit debug info for all global variable declarations. */
> -extern void gnat_write_global_declarations (void);
> +extern void note_types_used_by_globals (void);
>
> The comment needs to be adjusted instead of removed and preferably be the same
> as the one (ajusted too) above the function in utils.c.
Done.
I have queued the attached patch for merge into mainline once the rest
of the patches are approved.
Thank you.
[-- Attachment #2: dearly-ada.patch --]
[-- Type: text/x-patch, Size: 5415 bytes --]
gcc/ada/
* gcc-interface/gigi.h (note_types_used_by_globals): Rename from
gnat_write_global_declarations.
* gcc-interface/misc.c (gnat_parse_file): Call
note_types_used_by_globals.
Remove LANG_HOOKS_WRITE_GLOBALS.
* gcc-interface/utils.c: Rename global_decls to type_decls.
(gnat_write_global_declarations): Rename
to note_types_used_by_globals.
Remove call to finalize_compilation_unit.
Remove debug_hooks->global_decl() call for globals.
(gnat_pushdecls): Only insert into type_decls if TYPE_DECL.
diff --git a/gcc/ada/gcc-interface/decl.c b/gcc/ada/gcc-interface/decl.c
index d908a1b..e778616 100644
--- a/gcc/ada/gcc-interface/decl.c
+++ b/gcc/ada/gcc-interface/decl.c
@@ -5241,6 +5241,13 @@ gnat_to_gnu_entity (Entity_Id gnat_entity, tree gnu_expr, int definition)
&& !Present (Alias (gnat_entity))
&& !(Present (Renamed_Object (gnat_entity)) && saved))
{
+ /* ?? DECL_ARTIFICIAL, and possibly DECL_IGNORED_P below, should
+ be set before calling rest_of_decl_compilation above (through
+ create_var_decl_1). This is because rest_of_decl_compilation
+ calls the debugging backend and will create a DIE without
+ DW_AT_artificial.
+
+ This is currently causing gnat.dg/specs/debug1.ads to FAIL. */
if (!Comes_From_Source (gnat_entity))
DECL_ARTIFICIAL (gnu_decl) = 1;
diff --git a/gcc/ada/gcc-interface/gigi.h b/gcc/ada/gcc-interface/gigi.h
index 6d65fc5..ace4ac8 100644
--- a/gcc/ada/gcc-interface/gigi.h
+++ b/gcc/ada/gcc-interface/gigi.h
@@ -535,8 +535,9 @@ extern tree gnat_type_for_size (unsigned precision, int unsignedp);
an unsigned type; otherwise a signed type is returned. */
extern tree gnat_type_for_mode (machine_mode mode, int unsignedp);
-/* Emit debug info for all global variable declarations. */
-extern void gnat_write_global_declarations (void);
+/* Keep track of types used at the global level and emit debug info
+ for all global types. */
+extern void note_types_used_by_globals (void);
/* Return the unsigned version of a TYPE_NODE, a scalar type. */
extern tree gnat_unsigned_type (tree type_node);
diff --git a/gcc/ada/gcc-interface/misc.c b/gcc/ada/gcc-interface/misc.c
index edaab97..2056a61 100644
--- a/gcc/ada/gcc-interface/misc.c
+++ b/gcc/ada/gcc-interface/misc.c
@@ -122,6 +122,8 @@ gnat_parse_file (void)
/* Call the front end. */
_ada_gnat1drv ();
+
+ note_types_used_by_globals ();
}
/* Return language mask for option processing. */
@@ -972,8 +974,6 @@ gnat_init_ts (void)
#define LANG_HOOKS_GETDECLS lhd_return_null_tree_v
#undef LANG_HOOKS_PUSHDECL
#define LANG_HOOKS_PUSHDECL gnat_return_tree
-#undef LANG_HOOKS_WRITE_GLOBALS
-#define LANG_HOOKS_WRITE_GLOBALS gnat_write_global_declarations
#undef LANG_HOOKS_GET_ALIAS_SET
#define LANG_HOOKS_GET_ALIAS_SET gnat_get_alias_set
#undef LANG_HOOKS_PRINT_DECL
diff --git a/gcc/ada/gcc-interface/utils.c b/gcc/ada/gcc-interface/utils.c
index 5968857..915cbe1 100644
--- a/gcc/ada/gcc-interface/utils.c
+++ b/gcc/ada/gcc-interface/utils.c
@@ -227,8 +227,8 @@ static GTY((deletable)) struct gnat_binding_level *free_binding_level;
/* The context to be used for global declarations. */
static GTY(()) tree global_context;
-/* An array of global declarations. */
-static GTY(()) vec<tree, va_gc> *global_decls;
+/* An array of global type declarations. */
+static GTY(()) vec<tree, va_gc> *type_decls;
/* An array of builtin function declarations. */
static GTY(()) vec<tree, va_gc> *builtin_decls;
@@ -765,7 +765,10 @@ gnat_pushdecl (tree decl, Node_Id gnat_node)
vec_safe_push (builtin_decls, decl);
}
else if (global_bindings_p ())
- vec_safe_push (global_decls, decl);
+ {
+ if (TREE_CODE (decl) == TYPE_DECL)
+ vec_safe_push (type_decls, decl);
+ }
else
{
DECL_CHAIN (decl) = BLOCK_VARS (current_binding_level->block);
@@ -5175,8 +5178,11 @@ smaller_form_type_p (tree type, tree orig_type)
static GTY (()) tree dummy_global;
+/* Keep track of types used at the global level and emit debug info
+ for all global types. */
+
void
-gnat_write_global_declarations (void)
+note_types_used_by_globals (void)
{
unsigned int i;
tree iter;
@@ -5206,26 +5212,12 @@ gnat_write_global_declarations (void)
}
/* Output debug information for all global type declarations first. This
- ensures that global types whose compilation hasn't been finalized yet,
+ ensures that global types whose compilation haven't been finalized yet,
for example pointers to Taft amendment types, have their compilation
finalized in the right context. */
- FOR_EACH_VEC_SAFE_ELT (global_decls, i, iter)
- if (TREE_CODE (iter) == TYPE_DECL && !DECL_IGNORED_P (iter))
+ FOR_EACH_VEC_SAFE_ELT (type_decls, i, iter)
+ if (!DECL_IGNORED_P (iter))
debug_hooks->type_decl (iter, false);
-
- /* Proceed to optimize and emit assembly. */
- symtab->finalize_compilation_unit ();
-
- /* After cgraph has had a chance to emit everything that's going to
- be emitted, output debug information for the rest of globals. */
- if (!seen_error ())
- {
- timevar_push (TV_SYMOUT);
- FOR_EACH_VEC_SAFE_ELT (global_decls, i, iter)
- if (TREE_CODE (iter) != TYPE_DECL && !DECL_IGNORED_P (iter))
- debug_hooks->global_decl (iter);
- timevar_pop (TV_SYMOUT);
- }
}
/* ************************************************************************
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2015-05-22 12:21 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2015-05-08 0:32 [patch 1/10] debug-early merge: Ada front-end Aldy Hernandez
2015-05-08 10:27 ` Eric Botcazou
2015-05-08 10:35 ` Richard Biener
2015-05-08 15:22 ` Aldy Hernandez
2015-05-09 11:31 ` Eric Botcazou
2015-05-08 16:23 ` Aldy Hernandez
2015-05-09 11:31 ` Eric Botcazou
2015-05-21 21:33 ` Aldy Hernandez
2015-05-22 8:52 ` Eric Botcazou
2015-05-22 12:33 ` Aldy Hernandez
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).