Patrick Williams | c124f4f | 2015-09-15 14:41:29 -0500 | [diff] [blame] | 1 | From ca03cf1b133d66eb978c68f6dbc345e9aabcba88 Mon Sep 17 00:00:00 2001 |
| 2 | From: uros <uros@138bc75d-0d04-0410-961f-82ee72b054a4> |
| 3 | Date: Mon, 30 Jun 2014 19:30:52 +0000 |
| 4 | Subject: [PATCH] r212171 |
| 5 | |
| 6 | * except.c (emit_note_eh_region_end): New helper |
| 7 | function. (convert_to_eh_region_ranges): Use |
| 8 | emit_note_eh_region_end to emit EH_REGION_END note. |
| 9 | * jump.c (cleanup_barriers): Do not split a call and its |
| 10 | corresponding CALL_ARG_LOCATION note. |
| 11 | |
| 12 | git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@212171 138bc75d-0d04-0410-961f-82ee72b054a4 |
| 13 | |
| 14 | Upstream-Status: Backport [https://gcc.gnu.org/viewcvs/gcc?view=revision&revision=212171] |
| 15 | Signed-off-by: Baoshan Pang <baoshan.pang@windriver.com> |
| 16 | --- |
| 17 | gcc/except.c | 23 ++++++++++++++++++----- |
| 18 | gcc/jump.c | 19 +++++++++++++++---- |
| 19 | 2 files changed, 33 insertions(+), 9 deletions(-) |
| 20 | |
| 21 | diff --git a/gcc/except.c b/gcc/except.c |
| 22 | index dc5c1d2..7ac114f 100644 |
| 23 | --- a/gcc/except.c |
| 24 | +++ b/gcc/except.c |
| 25 | @@ -2466,6 +2466,20 @@ add_call_site (rtx landing_pad, int action, int section) |
| 26 | return call_site_base + crtl->eh.call_site_record_v[section]->length () - 1; |
| 27 | } |
| 28 | |
| 29 | +static rtx |
| 30 | +emit_note_eh_region_end (rtx insn) |
| 31 | +{ |
| 32 | + rtx next = NEXT_INSN (insn); |
| 33 | + |
| 34 | + /* Make sure we do not split a call and its corresponding |
| 35 | + CALL_ARG_LOCATION note. */ |
| 36 | + if (next && NOTE_P (next) |
| 37 | + && NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION) |
| 38 | + insn = next; |
| 39 | + |
| 40 | + return emit_note_after (NOTE_INSN_EH_REGION_END, insn); |
| 41 | +} |
| 42 | + |
| 43 | /* Turn REG_EH_REGION notes back into NOTE_INSN_EH_REGION notes. |
| 44 | The new note numbers will not refer to region numbers, but |
| 45 | instead to call site entries. */ |
| 46 | @@ -2544,8 +2558,8 @@ convert_to_eh_region_ranges (void) |
| 47 | note = emit_note_before (NOTE_INSN_EH_REGION_BEG, |
| 48 | first_no_action_insn_before_switch); |
| 49 | NOTE_EH_HANDLER (note) = call_site; |
| 50 | - note = emit_note_after (NOTE_INSN_EH_REGION_END, |
| 51 | - last_no_action_insn_before_switch); |
| 52 | + note |
| 53 | + = emit_note_eh_region_end (last_no_action_insn_before_switch); |
| 54 | NOTE_EH_HANDLER (note) = call_site; |
| 55 | gcc_assert (last_action != -3 |
| 56 | || (last_action_insn |
| 57 | @@ -2569,8 +2583,7 @@ convert_to_eh_region_ranges (void) |
| 58 | first_no_action_insn = NULL_RTX; |
| 59 | } |
| 60 | |
| 61 | - note = emit_note_after (NOTE_INSN_EH_REGION_END, |
| 62 | - last_action_insn); |
| 63 | + note = emit_note_eh_region_end (last_action_insn); |
| 64 | NOTE_EH_HANDLER (note) = call_site; |
| 65 | } |
| 66 | |
| 67 | @@ -2617,7 +2630,7 @@ convert_to_eh_region_ranges (void) |
| 68 | |
| 69 | if (last_action >= -1 && ! first_no_action_insn) |
| 70 | { |
| 71 | - note = emit_note_after (NOTE_INSN_EH_REGION_END, last_action_insn); |
| 72 | + note = emit_note_eh_region_end (last_action_insn); |
| 73 | NOTE_EH_HANDLER (note) = call_site; |
| 74 | } |
| 75 | |
| 76 | diff --git a/gcc/jump.c b/gcc/jump.c |
| 77 | index 9418f65..a5e5f52 100644 |
| 78 | --- a/gcc/jump.c |
| 79 | +++ b/gcc/jump.c |
| 80 | @@ -121,15 +121,26 @@ rebuild_jump_labels_chain (rtx chain) |
| 81 | static unsigned int |
| 82 | cleanup_barriers (void) |
| 83 | { |
| 84 | - rtx insn, next, prev; |
| 85 | - for (insn = get_insns (); insn; insn = next) |
| 86 | + rtx insn; |
| 87 | + for (insn = get_insns (); insn; insn = NEXT_INSN (insn)) |
| 88 | { |
| 89 | - next = NEXT_INSN (insn); |
| 90 | if (BARRIER_P (insn)) |
| 91 | { |
| 92 | - prev = prev_nonnote_insn (insn); |
| 93 | + rtx prev = prev_nonnote_insn (insn); |
| 94 | if (!prev) |
| 95 | continue; |
| 96 | + |
| 97 | + if (CALL_P (prev)) |
| 98 | + { |
| 99 | + /* Make sure we do not split a call and its corresponding |
| 100 | + CALL_ARG_LOCATION note. */ |
| 101 | + rtx next = NEXT_INSN (prev); |
| 102 | + |
| 103 | + if (NOTE_P (next) |
| 104 | + && NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION) |
| 105 | + prev = next; |
| 106 | + } |
| 107 | + |
| 108 | if (BARRIER_P (prev)) |
| 109 | delete_insn (insn); |
| 110 | else if (prev != PREV_INSN (insn)) |
| 111 | -- |
| 112 | 1.7.9.5 |
| 113 | |