diff options
author | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-05-08 15:33:04 +0000 |
---|---|---|
committer | jason <jason@138bc75d-0d04-0410-961f-82ee72b054a4> | 2002-05-08 15:33:04 +0000 |
commit | 637d330830d1e4dd93eadfbc0095bf9bb2382200 (patch) | |
tree | 0aad108ce5fa34a70d37f19bc67a3ef24b870d2c /gcc/dwarf2out.c | |
parent | ea53c1b36510aa287e4224ba357ec209a926f6c2 (diff) | |
download | gcc-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.c | 20 |
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; |