Hi Jason.
I found that for locally scoped functions we were not emitting early
dwarf. I've removed the restriction that only emitted non
function-context functions to handle the case below. BTW, this
shouldn't be a (bloat) problem, as we are going to clean up unused DIEs
later (well, next week :)).
void foobar ()
{
class Object {
public:
char Object_method ()
{
return 5;
}
};
Object local;
local.Object_method();
}
There was also a GDB regression with the above test (distilled from
gdb.cp/local.cc) where Object_method's type was being generated as
char Object_method (const Object *)
(or something like it). The problem was that gen_formal_types_die was
creating nameless DIEs for the formal parameters when generating an
object's members, but mainline was removing these nameless DIEs and I
had mistakenly removed that bit. I'm putting the code back in, but
guarding it with early_dwarf_dumping, since by the time we get to late
debug, we should have the correct named parameters which should then be
augmented with location information.
This patch fixes the gdb.cp/local.cc regressions, while generating early
dwarf for Object_method and associates.
I'm committing to the branch. Let me know if you have a problem with this.
Tested with the guality.exp suite as well as the GDB testsuite.
Aldy
commit 8673cbf8204fcd7099507293a859b173343a0f9a
Author: Aldy Hernandez <al...@redhat.com>
Date: Tue Mar 24 10:47:30 2015 -0700
Emit early dwarf for locally scoped functions.
Only remove cached DW_TAG_formal_parameter's when early dwarf dumping.
diff --git a/gcc/cgraphunit.c b/gcc/cgraphunit.c
index e60acd5..4a7b14d 100644
--- a/gcc/cgraphunit.c
+++ b/gcc/cgraphunit.c
@@ -2444,8 +2444,7 @@ symbol_table::finalize_compilation_unit (void)
locally scoped symbols. */
struct cgraph_node *cnode;
FOR_EACH_FUNCTION_WITH_GIMPLE_BODY (cnode)
- if (!decl_function_context (cnode->decl))
- (*debug_hooks->early_global_decl) (cnode->decl);
+ (*debug_hooks->early_global_decl) (cnode->decl);
/* Clean up anything that needs cleaning up after initial debug
generation. */
diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c
index 48e2eed..bcc1111 100644
--- a/gcc/dwarf2out.c
+++ b/gcc/dwarf2out.c
@@ -18792,6 +18792,18 @@ gen_subprogram_die (tree decl, dw_die_ref context_die)
parameters so they can be augmented with location
information later. */
remove_AT (subr_die, DW_AT_declaration);
+
+ /* gen_formal_types_die could have created nameless DIEs for
+ the formal parameters when generating an object's
+ members. Remove if early dumping; they will be shortly
+ recreated correctly. If we're not early dumping, we
+ should've already removed them and should have actual
+ named parameters. */
+ if (early_dwarf_dumping)
+ {
+ remove_AT (subr_die, DW_AT_object_pointer);
+ remove_child_TAG (subr_die, DW_TAG_formal_parameter);
+ }
}
/* Make a specification pointing to the previously built
declaration. */