The first patch fixes the ICE in dwarf2out_var_location, at dwarf2out.c. r212171: * except.c (emit_note_eh_region_end): New helper function. (convert_to_eh_region_ranges): Use emit_note_eh_region_end to emit EH_REGION_END note. * jump.c (cleanup_barriers): Do not split a call and its corresponding CALL_ARG_LOCATION note. But it introduced a regression issue: https://gcc.gnu.org/bugzilla/show_bug.cgi?id=63348 so backport the fix for the regression as well: r215613: PR rtl-optimization/63348 * emit-rtl.c (try_split): Do not emit extra barrier. (From OE-Core rev: de52db1b1b0dbc9060dddceb42b7dd4f66a7e0f3) Signed-off-by: Jackie Huang <jackie.huang@windriver.com> Signed-off-by: Ross Burton <ross.burton@intel.com> Signed-off-by: Richard Purdie <richard.purdie@linuxfoundation.org>
114 lines
3.5 KiB
Diff
114 lines
3.5 KiB
Diff
From ca03cf1b133d66eb978c68f6dbc345e9aabcba88 Mon Sep 17 00:00:00 2001
|
|
From: uros <uros@138bc75d-0d04-0410-961f-82ee72b054a4>
|
|
Date: Mon, 30 Jun 2014 19:30:52 +0000
|
|
Subject: [PATCH] r212171
|
|
|
|
* except.c (emit_note_eh_region_end): New helper
|
|
function. (convert_to_eh_region_ranges): Use
|
|
emit_note_eh_region_end to emit EH_REGION_END note.
|
|
* jump.c (cleanup_barriers): Do not split a call and its
|
|
corresponding CALL_ARG_LOCATION note.
|
|
|
|
git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@212171 138bc75d-0d04-0410-961f-82ee72b054a4
|
|
|
|
Upstream-status: Backport [https://gcc.gnu.org/viewcvs/gcc?view=revision&revision=212171]
|
|
Signed-off-by: Baoshan Pang <baoshan.pang@windriver.com>
|
|
---
|
|
gcc/except.c | 23 ++++++++++++++++++-----
|
|
gcc/jump.c | 19 +++++++++++++++----
|
|
2 files changed, 33 insertions(+), 9 deletions(-)
|
|
|
|
diff --git a/gcc/except.c b/gcc/except.c
|
|
index dc5c1d2..7ac114f 100644
|
|
--- a/gcc/except.c
|
|
+++ b/gcc/except.c
|
|
@@ -2466,6 +2466,20 @@ add_call_site (rtx landing_pad, int action, int section)
|
|
return call_site_base + crtl->eh.call_site_record_v[section]->length () - 1;
|
|
}
|
|
|
|
+static rtx
|
|
+emit_note_eh_region_end (rtx insn)
|
|
+{
|
|
+ rtx next = NEXT_INSN (insn);
|
|
+
|
|
+ /* Make sure we do not split a call and its corresponding
|
|
+ CALL_ARG_LOCATION note. */
|
|
+ if (next && NOTE_P (next)
|
|
+ && NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
|
|
+ insn = next;
|
|
+
|
|
+ return emit_note_after (NOTE_INSN_EH_REGION_END, insn);
|
|
+}
|
|
+
|
|
/* Turn REG_EH_REGION notes back into NOTE_INSN_EH_REGION notes.
|
|
The new note numbers will not refer to region numbers, but
|
|
instead to call site entries. */
|
|
@@ -2544,8 +2558,8 @@ convert_to_eh_region_ranges (void)
|
|
note = emit_note_before (NOTE_INSN_EH_REGION_BEG,
|
|
first_no_action_insn_before_switch);
|
|
NOTE_EH_HANDLER (note) = call_site;
|
|
- note = emit_note_after (NOTE_INSN_EH_REGION_END,
|
|
- last_no_action_insn_before_switch);
|
|
+ note
|
|
+ = emit_note_eh_region_end (last_no_action_insn_before_switch);
|
|
NOTE_EH_HANDLER (note) = call_site;
|
|
gcc_assert (last_action != -3
|
|
|| (last_action_insn
|
|
@@ -2569,8 +2583,7 @@ convert_to_eh_region_ranges (void)
|
|
first_no_action_insn = NULL_RTX;
|
|
}
|
|
|
|
- note = emit_note_after (NOTE_INSN_EH_REGION_END,
|
|
- last_action_insn);
|
|
+ note = emit_note_eh_region_end (last_action_insn);
|
|
NOTE_EH_HANDLER (note) = call_site;
|
|
}
|
|
|
|
@@ -2617,7 +2630,7 @@ convert_to_eh_region_ranges (void)
|
|
|
|
if (last_action >= -1 && ! first_no_action_insn)
|
|
{
|
|
- note = emit_note_after (NOTE_INSN_EH_REGION_END, last_action_insn);
|
|
+ note = emit_note_eh_region_end (last_action_insn);
|
|
NOTE_EH_HANDLER (note) = call_site;
|
|
}
|
|
|
|
diff --git a/gcc/jump.c b/gcc/jump.c
|
|
index 9418f65..a5e5f52 100644
|
|
--- a/gcc/jump.c
|
|
+++ b/gcc/jump.c
|
|
@@ -121,15 +121,26 @@ rebuild_jump_labels_chain (rtx chain)
|
|
static unsigned int
|
|
cleanup_barriers (void)
|
|
{
|
|
- rtx insn, next, prev;
|
|
- for (insn = get_insns (); insn; insn = next)
|
|
+ rtx insn;
|
|
+ for (insn = get_insns (); insn; insn = NEXT_INSN (insn))
|
|
{
|
|
- next = NEXT_INSN (insn);
|
|
if (BARRIER_P (insn))
|
|
{
|
|
- prev = prev_nonnote_insn (insn);
|
|
+ rtx prev = prev_nonnote_insn (insn);
|
|
if (!prev)
|
|
continue;
|
|
+
|
|
+ if (CALL_P (prev))
|
|
+ {
|
|
+ /* Make sure we do not split a call and its corresponding
|
|
+ CALL_ARG_LOCATION note. */
|
|
+ rtx next = NEXT_INSN (prev);
|
|
+
|
|
+ if (NOTE_P (next)
|
|
+ && NOTE_KIND (next) == NOTE_INSN_CALL_ARG_LOCATION)
|
|
+ prev = next;
|
|
+ }
|
|
+
|
|
if (BARRIER_P (prev))
|
|
delete_insn (insn);
|
|
else if (prev != PREV_INSN (insn))
|
|
--
|
|
1.7.9.5
|
|
|