diff options
author | Zdenek Dvorak <dvorakz@suse.cz> | 2007-04-29 19:33:34 +0200 |
---|---|---|
committer | Zdenek Dvorak <rakdver@gcc.gnu.org> | 2007-04-29 17:33:34 +0000 |
commit | 268886f3b849287becb0723c6d5da1596f673583 (patch) | |
tree | eeda8d346aacdcfb0bc2f25ac2d64a014a13730a /gcc/df-scan.c | |
parent | 677e29e167fb205d5bee619c68ba057d5211cf73 (diff) | |
download | gcc-268886f3b849287becb0723c6d5da1596f673583.zip gcc-268886f3b849287becb0723c6d5da1596f673583.tar.gz gcc-268886f3b849287becb0723c6d5da1596f673583.tar.bz2 |
df-scan.c (record_nonlocal_goto_receiver_defs): New function.
* df-scan.c (record_nonlocal_goto_receiver_defs): New function.
(df_refs_record): Call it.
From-SVN: r124283
Diffstat (limited to 'gcc/df-scan.c')
-rw-r--r-- | gcc/df-scan.c | 29 |
1 files changed, 29 insertions, 0 deletions
diff --git a/gcc/df-scan.c b/gcc/df-scan.c index d88da8a..87d21a4 100644 --- a/gcc/df-scan.c +++ b/gcc/df-scan.c @@ -1765,6 +1765,32 @@ df_bb_refs_record (struct dataflow *dflow, basic_block bb) } } +/* Records the implicit definitions at targets of nonlocal gotos in BLOCKS. */ + +static void +record_nonlocal_goto_receiver_defs (struct dataflow *dflow, bitmap blocks) +{ + rtx x; + basic_block bb; + + /* See expand_builtin_setjmp_receiver; hard_frame_pointer_rtx is used in + the nonlocal goto receiver, and needs to be considered defined + implicitly. */ + if (!(dflow->flags & DF_HARD_REGS)) + return; + + for (x = nonlocal_goto_handler_labels; x; x = XEXP (x, 1)) + { + bb = BLOCK_FOR_INSN (XEXP (x, 0)); + if (!bitmap_bit_p (blocks, bb->index)) + continue; + + df_ref_record (dflow, hard_frame_pointer_rtx, &hard_frame_pointer_rtx, + bb, NULL, + DF_REF_REG_DEF, DF_REF_ARTIFICIAL | DF_REF_AT_TOP, + false); + } +} /* Record all the refs in the basic blocks specified by BLOCKS. */ @@ -1785,6 +1811,9 @@ df_refs_record (struct dataflow *dflow, bitmap blocks) if (bitmap_bit_p (blocks, ENTRY_BLOCK)) df_record_entry_block_defs (dflow); + + if (current_function_has_nonlocal_label) + record_nonlocal_goto_receiver_defs (dflow, blocks); } |