diff --git a/gcc43-pr29609-3.patch b/gcc43-pr29609-3.patch new file mode 100644 index 0000000..bc2717a --- /dev/null +++ b/gcc43-pr29609-3.patch @@ -0,0 +1,155 @@ +--- gcc/cfglayout.c.jj 2008-10-07 21:35:33.000000000 +0200 ++++ gcc/cfglayout.c 2008-10-09 11:18:51.000000000 +0200 +@@ -448,13 +448,12 @@ change_scope (rtx orig_insn, tree s1, tr + } + } + +-/* Return lexical scope block insn belong to. */ ++/* Return lexical scope block locator belongs to. */ + static tree +-insn_scope (const_rtx insn) ++locator_scope (int loc) + { + int max = VEC_length (int, block_locators_locs); + int min = 0; +- int loc = INSN_LOCATOR (insn); + + /* When block_locators_locs was initialized, the pro- and epilogue + insns didn't exist yet and can therefore not be found this way. +@@ -488,6 +487,13 @@ insn_scope (const_rtx insn) + return VEC_index (tree, block_locators_blocks, min); + } + ++/* Return lexical scope block insn belongs to. */ ++static tree ++insn_scope (const_rtx insn) ++{ ++ return locator_scope (INSN_LOCATOR (insn)); ++} ++ + /* Return line number of the statement specified by the locator. */ + static location_t + locator_location (int loc) +@@ -551,6 +557,17 @@ insn_file (const_rtx insn) + return locator_file (INSN_LOCATOR (insn)); + } + ++/* Return true if LOC1 and LOC2 locators have the same location and scope. */ ++bool ++locator_eq (int loc1, int loc2) ++{ ++ if (loc1 == loc2) ++ return true; ++ if (locator_location (loc1) != locator_location (loc2)) ++ return false; ++ return locator_scope (loc1) == locator_scope (loc2); ++} ++ + /* Rebuild all the NOTE_INSN_BLOCK_BEG and NOTE_INSN_BLOCK_END notes based + on the scope tree and the newly reordered instructions. */ + +@@ -901,24 +918,30 @@ fixup_reorder_chain (void) + if (e->goto_locus && !(e->flags & EDGE_ABNORMAL)) + { + basic_block nb; ++ rtx end; + +- if (simplejump_p (BB_END (e->src))) ++ insn = BB_END (e->src); ++ end = PREV_INSN (BB_HEAD (e->src)); ++ while (insn != end ++ && (!INSN_P (insn) || INSN_LOCATOR (insn) == 0)) ++ insn = PREV_INSN (insn); ++ if (insn != end ++ && locator_eq (INSN_LOCATOR (insn), (int) e->goto_locus)) ++ continue; ++ if (simplejump_p (BB_END (e->src)) ++ && INSN_LOCATOR (BB_END (e->src)) == 0) + { +- if (INSN_LOCATOR (BB_END (e->src)) == (int) e->goto_locus) +- continue; +- if (INSN_LOCATOR (BB_END (e->src)) == 0) +- { +- INSN_LOCATOR (BB_END (e->src)) = e->goto_locus; +- continue; +- } ++ INSN_LOCATOR (BB_END (e->src)) = e->goto_locus; ++ continue; + } + if (e->dest != EXIT_BLOCK_PTR) + { + insn = BB_HEAD (e->dest); +- if (!INSN_P (insn)) +- insn = next_insn (insn); +- if (insn && INSN_P (insn) +- && INSN_LOCATOR (insn) == (int) e->goto_locus) ++ end = NEXT_INSN (BB_END (e->dest)); ++ while (insn != end && !INSN_P (insn)) ++ insn = NEXT_INSN (insn); ++ if (insn != end && INSN_LOCATOR (insn) ++ && locator_eq (INSN_LOCATOR (insn), (int) e->goto_locus)) + continue; + } + nb = split_edge (e); +--- gcc/rtl.h.jj 2008-10-07 21:25:44.000000000 +0200 ++++ gcc/rtl.h 2008-10-09 11:15:57.000000000 +0200 +@@ -1622,6 +1622,7 @@ extern int insn_line (const_rtx); + extern const char * insn_file (const_rtx); + extern int locator_line (int); + extern const char * locator_file (int); ++extern bool locator_eq (int, int); + extern int prologue_locator, epilogue_locator; + + /* In jump.c */ +--- gcc/cfgrtl.c.jj 2008-10-07 21:35:33.000000000 +0200 ++++ gcc/cfgrtl.c 2008-10-09 10:37:03.000000000 +0200 +@@ -2623,19 +2623,21 @@ cfg_layout_merge_blocks (basic_block a, + some unique locus, emit a nop with that locus in between. */ + if (!optimize && EDGE_SUCC (a, 0)->goto_locus) + { +- rtx insn = BB_END (a); ++ rtx insn = BB_END (a), end = PREV_INSN (BB_HEAD (a)); + int goto_locus = EDGE_SUCC (a, 0)->goto_locus; + +- if (NOTE_P (insn)) +- insn = prev_nonnote_insn (insn); +- if (insn && INSN_P (insn) && INSN_LOCATOR (insn) == goto_locus) ++ while (insn != end && (!INSN_P (insn) || INSN_LOCATOR (insn) == 0)) ++ insn = PREV_INSN (insn); ++ if (insn != end && locator_eq (INSN_LOCATOR (insn), goto_locus)) + goto_locus = 0; + else + { + insn = BB_HEAD (b); +- if (!INSN_P (insn)) +- insn = next_insn (insn); +- if (insn && INSN_P (insn) && INSN_LOCATOR (insn) == goto_locus) ++ end = NEXT_INSN (BB_END (b)); ++ while (insn != end && !INSN_P (insn)) ++ insn = NEXT_INSN (insn); ++ if (insn != end && INSN_LOCATOR (insn) != 0 ++ && locator_eq (INSN_LOCATOR (insn), goto_locus)) + goto_locus = 0; + } + if (goto_locus) +--- gcc/cfgcleanup.c.jj 2008-10-07 21:35:33.000000000 +0200 ++++ gcc/cfgcleanup.c 2008-10-09 11:07:40.000000000 +0200 +@@ -482,7 +482,7 @@ try_forward_edges (int mode, basic_block + blocks with different locus are not optimized out. */ + int locus = single_succ_edge (target)->goto_locus; + +- if (locus && goto_locus && locus != goto_locus) ++ if (locus && goto_locus && !locator_eq (locus, goto_locus)) + counter = n_basic_blocks; + else if (locus) + goto_locus = locus; +@@ -491,7 +491,8 @@ try_forward_edges (int mode, basic_block + { + locus = INSN_LOCATOR (BB_END (target)); + +- if (locus && goto_locus && locus != goto_locus) ++ if (locus && goto_locus ++ && !locator_eq (locus, goto_locus)) + counter = n_basic_blocks; + else if (locus) + goto_locus = locus; diff --git a/gcc43.spec b/gcc43.spec index 3aafd7d..51811c3 100644 --- a/gcc43.spec +++ b/gcc43.spec @@ -3,7 +3,7 @@ %define gcc_version 4.3.2 # Note, gcc_release must be integer, if you want to add suffixes to # %{release}, append them after %{gcc_release} on Release: line. -%define gcc_release 5 +%define gcc_release 6 %define _unpackaged_files_terminate_build 0 %define multilib_64_archs sparc64 ppc64 s390x x86_64 %define include_gappletviewer 1 @@ -159,6 +159,8 @@ Patch22: gcc43-pr34037.patch Patch23: gcc43-pr37738.patch Patch24: gcc43-pr29609.patch Patch25: gcc43-aes.patch +Patch26: gcc43-pr29609-2.patch +Patch27: gcc43-pr29609-3.patch # On ARM EABI systems, we do want -gnueabi to be part of the # target triple. @@ -468,6 +470,8 @@ which are required to run programs compiled with the GNAT. %patch23 -p0 -b .pr37738~ %patch24 -p0 -b .pr29609~ %patch25 -p0 -b .aes~ +%patch26 -p0 -b .pr29609-2~ +%patch26 -p0 -b .pr29609-3~ tar xzf %{SOURCE4} @@ -1717,6 +1721,9 @@ fi %doc rpm.doc/changelogs/libmudflap/ChangeLog* %changelog +* Thu Oct 9 2008 Jakub Jelinek 4.3.2-6 +- fix fallouts from the -g -O0 debugging patch (#466169, #466198) + * Wed Oct 8 2008 Jakub Jelinek 4.3.2-5 - update from gcc-4_3-branch - PRs c++/37555, c/35712, c/37645, fortran/35770, fortran/35945,