+2002-05-08 Jason Merrill <jason@redhat.com>
+
+ * 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 <nickc@cambridge.redhat.com>
* config/arm/t-arm-elf (MULTILIB): Do not allow big-endian/
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)
== 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 ();
}
}
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;