From: Jason Merrill Date: Wed, 8 May 2002 15:33:04 +0000 (-0400) Subject: re PR c++/6381 (Missing assembler label) X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=29b91443e955b90f8c8ace2c4c4f1d7242abb4d5;p=gcc.git re PR c++/6381 (Missing assembler label) * dwarf2out.c (output_call_frame_info): Don't emit a CIE with no FDEs. * dwarf2out.c (gen_type_die): Abort on broken recursion. PR c++/6381 * dwarf2out.c (rtl_for_decl_location): Only expand INTEGER_CST and REAL_CST. From-SVN: r53295 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 617d19d5111..5b2c5a83281 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,13 @@ +2002-05-08 Jason Merrill + + * dwarf2out.c (output_call_frame_info): Don't emit a CIE with no FDEs. + + * dwarf2out.c (gen_type_die): Abort on broken recursion. + + PR c++/6381 + * dwarf2out.c (rtl_for_decl_location): Only expand INTEGER_CST and + REAL_CST. + 2002-05-08 Nick Clifton * config/arm/t-arm-elf (MULTILIB): Do not allow big-endian/ diff --git a/gcc/dwarf2out.c b/gcc/dwarf2out.c index 2b8e56c771f..9c0c6340d75 100644 --- a/gcc/dwarf2out.c +++ b/gcc/dwarf2out.c @@ -1814,6 +1814,10 @@ output_call_frame_info (for_eh) int per_encoding = DW_EH_PE_absptr; int lsda_encoding = DW_EH_PE_absptr; + /* Don't emit a CIE if there won't be any FDEs. */ + if (fde_table_in_use == 0) + return; + /* If we don't have any functions we'll want to unwind out of, don't emit any EH unwind information. */ if (for_eh) @@ -8946,15 +8950,17 @@ rtl_for_decl_location (decl) == strlen (TREE_STRING_POINTER (init)) + 1)) rtl = gen_rtx_CONST_STRING (VOIDmode, TREE_STRING_POINTER (init)); } - - if (rtl == NULL) + /* If the initializer is something that we know will expand into an + immediate RTL constant, expand it now. Expanding anything else + tends to produce unresolved symbols; see debug/5770 and c++/6381. */ + else if (TREE_CODE (DECL_INITIAL (decl)) == INTEGER_CST + || TREE_CODE (DECL_INITIAL (decl)) == REAL_CST) { rtl = expand_expr (DECL_INITIAL (decl), NULL_RTX, VOIDmode, EXPAND_INITIALIZER); - /* If expand_expr returned a MEM, we cannot use it, since - it won't be output, leading to unresolved symbol. */ + /* If expand_expr returns a MEM, it wasn't immediate. */ if (rtl && GET_CODE (rtl) == MEM) - rtl = NULL; + abort (); } } @@ -11071,6 +11077,10 @@ gen_type_die (type, context_die) if (TYPE_NAME (type) && TREE_CODE (TYPE_NAME (type)) == TYPE_DECL && DECL_ORIGINAL_TYPE (TYPE_NAME (type))) { + /* Prevent broken recursion; we can't hand off to the same type. */ + if (DECL_ORIGINAL_TYPE (TYPE_NAME (type)) == type) + abort (); + TREE_ASM_WRITTEN (type) = 1; gen_decl_die (TYPE_NAME (type), context_die); return; diff --git a/gcc/testsuite/g++.dg/debug/const1.C b/gcc/testsuite/g++.dg/debug/const1.C new file mode 100644 index 00000000000..7cbc5714137 --- /dev/null +++ b/gcc/testsuite/g++.dg/debug/const1.C @@ -0,0 +1,11 @@ +// PR c++/6381 +// Bug: we were emitting the initializer for bar, which referenced foo, +// which was not emitted. + +// { dg-options "-O" } +// { dg-do link } + +static const int foo[] = { 0 }; +static const int * const bar[] = { foo }; + +int main() {}