diff options
Diffstat (limited to 'meta/recipes-devtools/gcc/gcc-4.9/0058-gcc-r212171.patch')
-rw-r--r-- | meta/recipes-devtools/gcc/gcc-4.9/0058-gcc-r212171.patch | 112 |
1 files changed, 112 insertions, 0 deletions
diff --git a/meta/recipes-devtools/gcc/gcc-4.9/0058-gcc-r212171.patch b/meta/recipes-devtools/gcc/gcc-4.9/0058-gcc-r212171.patch new file mode 100644 index 0000000000..8a205b750b --- /dev/null +++ b/meta/recipes-devtools/gcc/gcc-4.9/0058-gcc-r212171.patch | |||
@@ -0,0 +1,112 @@ | |||
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 | ||