summaryrefslogtreecommitdiff
path: root/gcc/dwarf2out.c
diff options
context:
space:
mode:
authorjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2002-05-08 15:33:04 +0000
committerjason <jason@138bc75d-0d04-0410-961f-82ee72b054a4>2002-05-08 15:33:04 +0000
commit637d330830d1e4dd93eadfbc0095bf9bb2382200 (patch)
tree0aad108ce5fa34a70d37f19bc67a3ef24b870d2c /gcc/dwarf2out.c
parentea53c1b36510aa287e4224ba357ec209a926f6c2 (diff)
downloadgcc-637d330830d1e4dd93eadfbc0095bf9bb2382200.tar.gz
* 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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@53295 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/dwarf2out.c')
-rw-r--r--gcc/dwarf2out.c20
1 files changed, 15 insertions, 5 deletions
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;