diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 5dc74174a56..b8aee3b467c 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +2006-08-01 Daniel Jacobowitz + + PR debug/23336 + * c-typeck.c (build_external_type): Mark used enum types. + * dwarf2out.c (dwarf2out_abstract_function): Save and restore + cfun also. + (gen_subprogram_die): Whitespace fix. + 2006-08-01 Jan Hubicka * tree-outof-ssa.c (check_replaceable): Do not allocate def_vars diff --git a/gcc/c-typeck.c b/gcc/c-typeck.c index c32ce95b99f..31dadc6ebeb 100644 --- a/gcc/c-typeck.c +++ b/gcc/c-typeck.c @@ -2067,6 +2067,7 @@ build_external_ref (tree id, int fun, location_t loc) if (TREE_CODE (ref) == CONST_DECL) { + used_types_insert (TREE_TYPE (ref)); ref = DECL_INITIAL (ref); TREE_CONSTANT (ref) = 1; TREE_INVARIANT (ref) = 1; diff --git a/gcc/cp/ChangeLog b/gcc/cp/ChangeLog index 4e85be176db..56c613b0aef 100644 --- a/gcc/cp/ChangeLog +++ b/gcc/cp/ChangeLog @@ -1,3 +1,9 @@ +2006-08-01 Daniel Jacobowitz + + PR debug/23336 + * pt.c (tsubst_copy_and_build): Mark used enum types. + * semantics.c (finish_id_expression): Likewise. + 2006-07-31 Volker Reichelt PR c++/6634 diff --git a/gcc/cp/pt.c b/gcc/cp/pt.c index 5a7bfb8da55..30e6cd09a4b 100644 --- a/gcc/cp/pt.c +++ b/gcc/cp/pt.c @@ -9240,7 +9240,10 @@ tsubst_copy_and_build (tree t, /* As in finish_id_expression, we resolve enumeration constants to their underlying values. */ if (TREE_CODE (t) == CONST_DECL) - return DECL_INITIAL (t); + { + used_types_insert (TREE_TYPE (t)); + return DECL_INITIAL (t); + } return t; default: diff --git a/gcc/cp/semantics.c b/gcc/cp/semantics.c index e96ba68b034..d36eba76e41 100644 --- a/gcc/cp/semantics.c +++ b/gcc/cp/semantics.c @@ -2589,7 +2589,10 @@ finish_id_expression (tree id_expression, { *idk = CP_ID_KIND_NONE; if (!processing_template_decl) - return DECL_INITIAL (decl); + { + used_types_insert (TREE_TYPE (decl)); + return DECL_INITIAL (decl); + } return decl; } else diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 3d0c89017e1..41aa5ace0cb 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -11457,6 +11457,7 @@ dwarf2out_abstract_function (tree decl) { dw_die_ref old_die; tree save_fn; + struct function *save_cfun; tree context; int was_abstract = DECL_ABSTRACT (decl); @@ -11480,7 +11481,9 @@ dwarf2out_abstract_function (tree decl) /* Pretend we've just finished compiling this function. */ save_fn = current_function_decl; + save_cfun = cfun; current_function_decl = decl; + cfun = DECL_STRUCT_FUNCTION (decl); set_decl_abstract_flags (decl, 1); dwarf2out_decl (decl); @@ -11488,6 +11491,7 @@ dwarf2out_abstract_function (tree decl) set_decl_abstract_flags (decl, 0); current_function_decl = save_fn; + cfun = save_cfun; } /* Helper function of premark_used_types() which gets called through @@ -11531,7 +11535,7 @@ gen_subprogram_die (tree decl, dw_die_ref context_die) int declaration = (current_function_decl != decl || class_or_namespace_scope_p (context_die)); - premark_used_types(); + premark_used_types (); /* It is possible to have both DECL_ABSTRACT and DECLARATION be true if we started to generate the abstract instance of an inline, decided to output diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 9887b2cdc4a..261cadc8ae2 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,11 @@ +2006-08-01 Daniel Jacobowitz + + PR debug/23336 + * lib/gcc-dg.exp (gcc-dg-debug-runtest): Suppress new tests + at -g1. + * gcc.dg/debug/enum-1.c, g++.dg/debug/enum-1.C, + g++.dg/debug/enum-2.C: New. + 2006-07-31 Volker Reichelt PR c++/6634 diff --git a/gcc/testsuite/g++.dg/debug/enum-1.C b/gcc/testsuite/g++.dg/debug/enum-1.C new file mode 100644 index 00000000000..7681e9b5215 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/enum-1.C @@ -0,0 +1,16 @@ +/* Verify that used enums are output. */ +/* { dg-do compile } */ +/* { dg-final { scan-assembler "JTI_MAX" } } */ + +int var; + +enum java_tree_index +{ + JTI_MAX +}; + +void function (void) +{ + var = JTI_MAX; +} + diff --git a/gcc/testsuite/g++.dg/debug/enum-2.C b/gcc/testsuite/g++.dg/debug/enum-2.C new file mode 100644 index 00000000000..d5501313d93 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/enum-2.C @@ -0,0 +1,22 @@ +/* Verify that used enums are output. */ +/* { dg-do compile } */ +/* { dg-final { scan-assembler "JTI_MAX" } } */ + +int var; + +enum java_tree_index +{ + JTI_MAX +}; + +template +void tmpl (void) +{ + var = JTI_MAX + X; +} + +void +function (void) +{ + tmpl<2>(); +} diff --git a/gcc/testsuite/gcc.dg/debug/enum-1.c b/gcc/testsuite/gcc.dg/debug/enum-1.c new file mode 100644 index 00000000000..7681e9b5215 --- /dev/null +++ b/gcc/testsuite/gcc.dg/debug/enum-1.c @@ -0,0 +1,16 @@ +/* Verify that used enums are output. */ +/* { dg-do compile } */ +/* { dg-final { scan-assembler "JTI_MAX" } } */ + +int var; + +enum java_tree_index +{ + JTI_MAX +}; + +void function (void) +{ + var = JTI_MAX; +} + diff --git a/gcc/testsuite/lib/gcc-dg.exp b/gcc/testsuite/lib/gcc-dg.exp index 869f944b4a5..1573545db6a 100644 --- a/gcc/testsuite/lib/gcc-dg.exp +++ b/gcc/testsuite/lib/gcc-dg.exp @@ -292,7 +292,12 @@ proc gcc-dg-debug-runtest { target_compile trivial opt_opts testcases } { foreach flags $DEBUG_TORTURE_OPTIONS { set doit 1 - if { [string match {*/debug-[126].c} "$nshort"] \ + + # These tests check for information which may be deliberately + # suppressed at -g1. + if { ([string match {*/debug-[126].c} "$nshort"] \ + || [string match {*/enum-1.c} "$nshort"] \ + || [string match {*/enum-[12].C} "$nshort"]) \ && [string match "*1" [lindex "$flags" 0] ] } { set doit 0 }