4.3.2-5
This commit is contained in:
parent
8b55e223d6
commit
469bb9a944
@ -1,2 +1,2 @@
|
||||
gcc-4.3.2-20080917.tar.bz2
|
||||
gcc-4.3.2-20081008.tar.bz2
|
||||
fastjar-0.95.tar.gz
|
||||
|
1351
gcc43-aes.patch
Normal file
1351
gcc43-aes.patch
Normal file
File diff suppressed because it is too large
Load Diff
899
gcc43-pr29609.patch
Normal file
899
gcc43-pr29609.patch
Normal file
@ -0,0 +1,899 @@
|
||||
2008-10-08 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* cfgexpand.c (expand_gimple_cond_expr): Convert also goto_block and
|
||||
goto_locus of true_edge into RTL locator.
|
||||
|
||||
2008-10-07 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
PR debug/29609
|
||||
PR debug/36690
|
||||
PR debug/37616
|
||||
* basic-block.h (struct edge_def): Add goto_block field.
|
||||
* cfglayout.c (fixup_reorder_chain): Ensure that there is at least
|
||||
one insn with locus corresponding to edge's goto_locus if !optimize.
|
||||
* profile.c (branch_prob): Copy edge's goto_block.
|
||||
* cfgrtl.c (force_nonfallthru_and_redirect): Use goto_locus for
|
||||
emitted jumps.
|
||||
(cfg_layout_merge_blocks): Emit a nop with edge's goto_locus
|
||||
locator in between the merged basic blocks if !optimize and needed.
|
||||
* cfgexpand.c (expand_gimple_cond_expr): Convert goto_block and
|
||||
goto_locus into RTL locator. For unconditional jump use that
|
||||
locator for the jump insn.
|
||||
(expand_gimple_basic_block): Convert goto_block and goto_locus into
|
||||
RTL locator for all remaining edges. For unconditional jump
|
||||
use that locator for the jump insn.
|
||||
* cfgcleanup.c (try_forward_edges): Avoid the optimization if
|
||||
there is more than one edge or insn locator along the forwarding
|
||||
edges and !optimize. If there is just one, set e->goto_locus.
|
||||
* tree-cfg.c (make_cond_expr_edges, make_goto_expr_edges): Set also
|
||||
edge's goto_block.
|
||||
(move_block_to_fn): Adjust edge's goto_block.
|
||||
|
||||
* gcc.dg/debug/pr29609-1.c: New test.
|
||||
* gcc.dg/debug/pr29609-2.c: New test.
|
||||
* gcc.dg/debug/pr36690-1.c: New test.
|
||||
* gcc.dg/debug/pr36690-2.c: New test.
|
||||
* gcc.dg/debug/pr36690-3.c: New test.
|
||||
* gcc.dg/debug/pr37616.c: New test.
|
||||
* gcc.dg/debug/dwarf2/pr29609-1.c: New test.
|
||||
* gcc.dg/debug/dwarf2/pr29609-2.c: New test.
|
||||
* gcc.dg/debug/dwarf2/pr36690-1.c: New test.
|
||||
* gcc.dg/debug/dwarf2/pr36690-2.c: New test.
|
||||
* gcc.dg/debug/dwarf2/pr36690-3.c: New test.
|
||||
* gcc.dg/debug/dwarf2/pr37616.c: New test.
|
||||
|
||||
--- gcc/profile.c (revision 140947)
|
||||
+++ gcc/profile.c (revision 140948)
|
||||
@@ -825,7 +825,9 @@ branch_prob (void)
|
||||
#endif
|
||||
{
|
||||
basic_block new = split_edge (e);
|
||||
- single_succ_edge (new)->goto_locus = e->goto_locus;
|
||||
+ edge ne = single_succ_edge (new);
|
||||
+ ne->goto_locus = e->goto_locus;
|
||||
+ ne->goto_block = e->goto_block;
|
||||
}
|
||||
if ((e->flags & (EDGE_ABNORMAL | EDGE_ABNORMAL_CALL))
|
||||
&& e->dest != EXIT_BLOCK_PTR)
|
||||
--- gcc/cfgexpand.c (revision 140947)
|
||||
+++ gcc/cfgexpand.c (revision 140948)
|
||||
@@ -1316,7 +1316,12 @@ expand_gimple_cond_expr (basic_block bb,
|
||||
add_reg_br_prob_note (last, true_edge->probability);
|
||||
maybe_dump_rtl_for_tree_stmt (stmt, last);
|
||||
if (true_edge->goto_locus)
|
||||
- set_curr_insn_source_location (location_from_locus (true_edge->goto_locus));
|
||||
+ {
|
||||
+ set_curr_insn_source_location (location_from_locus (true_edge->goto_locus));
|
||||
+ set_curr_insn_block (true_edge->goto_block);
|
||||
+ true_edge->goto_locus = curr_insn_locator ();
|
||||
+ }
|
||||
+ true_edge->goto_block = NULL;
|
||||
false_edge->flags |= EDGE_FALLTHRU;
|
||||
return NULL;
|
||||
}
|
||||
@@ -1326,7 +1331,12 @@ expand_gimple_cond_expr (basic_block bb,
|
||||
add_reg_br_prob_note (last, false_edge->probability);
|
||||
maybe_dump_rtl_for_tree_stmt (stmt, last);
|
||||
if (false_edge->goto_locus)
|
||||
- set_curr_insn_source_location (location_from_locus (false_edge->goto_locus));
|
||||
+ {
|
||||
+ set_curr_insn_source_location (location_from_locus (false_edge->goto_locus));
|
||||
+ set_curr_insn_block (false_edge->goto_block);
|
||||
+ false_edge->goto_locus = curr_insn_locator ();
|
||||
+ }
|
||||
+ false_edge->goto_block = NULL;
|
||||
true_edge->flags |= EDGE_FALLTHRU;
|
||||
return NULL;
|
||||
}
|
||||
@@ -1334,6 +1344,13 @@ expand_gimple_cond_expr (basic_block bb,
|
||||
jumpif (pred, label_rtx_for_bb (true_edge->dest));
|
||||
add_reg_br_prob_note (last, true_edge->probability);
|
||||
last = get_last_insn ();
|
||||
+ if (false_edge->goto_locus)
|
||||
+ {
|
||||
+ set_curr_insn_source_location (location_from_locus (false_edge->goto_locus));
|
||||
+ set_curr_insn_block (false_edge->goto_block);
|
||||
+ false_edge->goto_locus = curr_insn_locator ();
|
||||
+ }
|
||||
+ false_edge->goto_block = NULL;
|
||||
emit_jump (label_rtx_for_bb (false_edge->dest));
|
||||
|
||||
BB_END (bb) = last;
|
||||
@@ -1356,9 +1373,13 @@ expand_gimple_cond_expr (basic_block bb,
|
||||
|
||||
maybe_dump_rtl_for_tree_stmt (stmt, last2);
|
||||
|
||||
- if (false_edge->goto_locus)
|
||||
- set_curr_insn_source_location (location_from_locus (false_edge->goto_locus));
|
||||
-
|
||||
+ if (true_edge->goto_locus)
|
||||
+ {
|
||||
+ set_curr_insn_source_location (location_from_locus (true_edge->goto_locus));
|
||||
+ set_curr_insn_block (true_edge->goto_block);
|
||||
+ true_edge->goto_locus = curr_insn_locator ();
|
||||
+ }
|
||||
+ true_edge->goto_block = NULL;
|
||||
return new_bb;
|
||||
}
|
||||
|
||||
@@ -1613,19 +1634,21 @@ expand_gimple_basic_block (basic_block b
|
||||
}
|
||||
}
|
||||
|
||||
- /* Expand implicit goto. */
|
||||
+ /* Expand implicit goto and convert goto_locus. */
|
||||
FOR_EACH_EDGE (e, ei, bb->succs)
|
||||
{
|
||||
- if (e->flags & EDGE_FALLTHRU)
|
||||
- break;
|
||||
- }
|
||||
-
|
||||
- if (e && e->dest != bb->next_bb)
|
||||
- {
|
||||
- emit_jump (label_rtx_for_bb (e->dest));
|
||||
- if (e->goto_locus)
|
||||
- set_curr_insn_source_location (location_from_locus (e->goto_locus));
|
||||
- e->flags &= ~EDGE_FALLTHRU;
|
||||
+ if (e->goto_locus && e->goto_block)
|
||||
+ {
|
||||
+ set_curr_insn_source_location (location_from_locus (e->goto_locus));
|
||||
+ set_curr_insn_block (e->goto_block);
|
||||
+ e->goto_locus = curr_insn_locator ();
|
||||
+ }
|
||||
+ e->goto_block = NULL;
|
||||
+ if ((e->flags & EDGE_FALLTHRU) && e->dest != bb->next_bb)
|
||||
+ {
|
||||
+ emit_jump (label_rtx_for_bb (e->dest));
|
||||
+ e->flags &= ~EDGE_FALLTHRU;
|
||||
+ }
|
||||
}
|
||||
|
||||
do_pending_stack_adjust ();
|
||||
--- gcc/cfgcleanup.c (revision 140947)
|
||||
+++ gcc/cfgcleanup.c (revision 140948)
|
||||
@@ -429,7 +429,7 @@ try_forward_edges (int mode, basic_block
|
||||
for (ei = ei_start (b->succs); (e = ei_safe_edge (ei)); )
|
||||
{
|
||||
basic_block target, first;
|
||||
- int counter;
|
||||
+ int counter, goto_locus;
|
||||
bool threaded = false;
|
||||
int nthreaded_edges = 0;
|
||||
bool may_thread = first_pass | df_get_bb_dirty (b);
|
||||
@@ -447,6 +447,7 @@ try_forward_edges (int mode, basic_block
|
||||
|
||||
target = first = e->dest;
|
||||
counter = NUM_FIXED_BLOCKS;
|
||||
+ goto_locus = e->goto_locus;
|
||||
|
||||
/* If we are partitioning hot/cold basic_blocks, we don't want to mess
|
||||
up jumps that cross between hot/cold sections.
|
||||
@@ -476,6 +477,27 @@ try_forward_edges (int mode, basic_block
|
||||
new_target = single_succ (target);
|
||||
if (target == new_target)
|
||||
counter = n_basic_blocks;
|
||||
+ else if (!optimize)
|
||||
+ {
|
||||
+ /* When not optimizing, ensure that edges or forwarder
|
||||
+ blocks with different locus are not optimized out. */
|
||||
+ int locus = single_succ_edge (target)->goto_locus;
|
||||
+
|
||||
+ if (locus && goto_locus && locus != goto_locus)
|
||||
+ counter = n_basic_blocks;
|
||||
+ else if (locus)
|
||||
+ goto_locus = locus;
|
||||
+
|
||||
+ if (INSN_P (BB_END (target)))
|
||||
+ {
|
||||
+ locus = INSN_LOCATOR (BB_END (target));
|
||||
+
|
||||
+ if (locus && goto_locus && locus != goto_locus)
|
||||
+ counter = n_basic_blocks;
|
||||
+ else if (locus)
|
||||
+ goto_locus = locus;
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
|
||||
/* Allow to thread only over one edge at time to simplify updating
|
||||
@@ -539,6 +561,8 @@ try_forward_edges (int mode, basic_block
|
||||
int edge_frequency;
|
||||
int n = 0;
|
||||
|
||||
+ e->goto_locus = goto_locus;
|
||||
+
|
||||
/* Don't force if target is exit block. */
|
||||
if (threaded && target != EXIT_BLOCK_PTR)
|
||||
{
|
||||
--- gcc/cfglayout.c (revision 140947)
|
||||
+++ gcc/cfglayout.c (revision 140948)
|
||||
@@ -887,6 +887,46 @@ fixup_reorder_chain (void)
|
||||
if (e && !can_fallthru (e->src, e->dest))
|
||||
force_nonfallthru (e);
|
||||
}
|
||||
+
|
||||
+ /* Ensure goto_locus from edges has some instructions with that locus
|
||||
+ in RTL. */
|
||||
+ if (!optimize)
|
||||
+ FOR_EACH_BB (bb)
|
||||
+ {
|
||||
+ edge e;
|
||||
+ edge_iterator ei;
|
||||
+
|
||||
+ FOR_EACH_EDGE (e, ei, bb->succs)
|
||||
+ if (e->goto_locus && !(e->flags & EDGE_ABNORMAL))
|
||||
+ {
|
||||
+ basic_block nb;
|
||||
+
|
||||
+ if (simplejump_p (BB_END (e->src)))
|
||||
+ {
|
||||
+ 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;
|
||||
+ }
|
||||
+ }
|
||||
+ 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)
|
||||
+ continue;
|
||||
+ }
|
||||
+ nb = split_edge (e);
|
||||
+ if (!INSN_P (BB_END (nb)))
|
||||
+ BB_END (nb) = emit_insn_after_noloc (gen_nop (), BB_END (nb),
|
||||
+ nb);
|
||||
+ INSN_LOCATOR (BB_END (nb)) = e->goto_locus;
|
||||
+ }
|
||||
+ }
|
||||
}
|
||||
|
||||
/* Perform sanity checks on the insn chain.
|
||||
--- gcc/basic-block.h (revision 140947)
|
||||
+++ gcc/basic-block.h (revision 140948)
|
||||
@@ -129,7 +129,8 @@ struct edge_def GTY(())
|
||||
/* Auxiliary info specific to a pass. */
|
||||
PTR GTY ((skip (""))) aux;
|
||||
|
||||
- /* Location of any goto implicit in the edge, during tree-ssa. */
|
||||
+ /* Location of any goto implicit in the edge and associated BLOCK. */
|
||||
+ tree goto_block;
|
||||
source_locus goto_locus;
|
||||
|
||||
/* The index number corresponding to this edge in the edge vector
|
||||
--- gcc/tree-cfg.c (revision 140947)
|
||||
+++ gcc/tree-cfg.c (revision 140948)
|
||||
@@ -634,6 +634,7 @@ make_cond_expr_edges (basic_block bb)
|
||||
#else
|
||||
e->goto_locus = EXPR_LOCUS (COND_EXPR_THEN (entry));
|
||||
#endif
|
||||
+ e->goto_block = TREE_BLOCK (COND_EXPR_THEN (entry));
|
||||
e = make_edge (bb, else_bb, EDGE_FALSE_VALUE);
|
||||
if (e)
|
||||
{
|
||||
@@ -642,6 +643,7 @@ make_cond_expr_edges (basic_block bb)
|
||||
#else
|
||||
e->goto_locus = EXPR_LOCUS (COND_EXPR_ELSE (entry));
|
||||
#endif
|
||||
+ e->goto_block = TREE_BLOCK (COND_EXPR_ELSE (entry));
|
||||
}
|
||||
|
||||
/* We do not need the gotos anymore. */
|
||||
@@ -841,6 +843,7 @@ make_goto_expr_edges (basic_block bb)
|
||||
#else
|
||||
e->goto_locus = EXPR_LOCUS (goto_t);
|
||||
#endif
|
||||
+ e->goto_block = TREE_BLOCK (goto_t);
|
||||
bsi_remove (&last, true);
|
||||
return;
|
||||
}
|
||||
@@ -5874,6 +5877,23 @@ move_block_to_fn (struct function *dest_
|
||||
update_stmt (stmt);
|
||||
pop_cfun ();
|
||||
}
|
||||
+
|
||||
+ FOR_EACH_EDGE (e, ei, bb->succs)
|
||||
+ if (e->goto_locus)
|
||||
+ {
|
||||
+ tree block = e->goto_block;
|
||||
+ if (d->orig_block == NULL_TREE
|
||||
+ || block == d->orig_block)
|
||||
+ e->goto_block = d->new_block;
|
||||
+#ifdef ENABLE_CHECKING
|
||||
+ else if (block != d->new_block)
|
||||
+ {
|
||||
+ while (block && block != d->orig_block)
|
||||
+ block = BLOCK_SUPERCONTEXT (block);
|
||||
+ gcc_assert (block);
|
||||
+ }
|
||||
+#endif
|
||||
+ }
|
||||
}
|
||||
|
||||
/* Examine the statements in BB (which is in SRC_CFUN); find and return
|
||||
--- gcc/cfgrtl.c (revision 140947)
|
||||
+++ gcc/cfgrtl.c (revision 140948)
|
||||
@@ -1009,6 +1009,7 @@ force_nonfallthru_and_redirect (edge e,
|
||||
rtx note;
|
||||
edge new_edge;
|
||||
int abnormal_edge_flags = 0;
|
||||
+ int loc;
|
||||
|
||||
/* In the case the last instruction is conditional jump to the next
|
||||
instruction, first redirect the jump itself and then continue
|
||||
@@ -1127,11 +1128,15 @@ force_nonfallthru_and_redirect (edge e,
|
||||
else
|
||||
jump_block = e->src;
|
||||
|
||||
+ if (e->goto_locus && e->goto_block == NULL)
|
||||
+ loc = e->goto_locus;
|
||||
+ else
|
||||
+ loc = 0;
|
||||
e->flags &= ~EDGE_FALLTHRU;
|
||||
if (target == EXIT_BLOCK_PTR)
|
||||
{
|
||||
#ifdef HAVE_return
|
||||
- emit_jump_insn_after_noloc (gen_return (), BB_END (jump_block));
|
||||
+ emit_jump_insn_after_setloc (gen_return (), BB_END (jump_block), loc);
|
||||
#else
|
||||
gcc_unreachable ();
|
||||
#endif
|
||||
@@ -1139,7 +1144,7 @@ force_nonfallthru_and_redirect (edge e,
|
||||
else
|
||||
{
|
||||
rtx label = block_label (target);
|
||||
- emit_jump_insn_after_noloc (gen_jump (label), BB_END (jump_block));
|
||||
+ emit_jump_insn_after_setloc (gen_jump (label), BB_END (jump_block), loc);
|
||||
JUMP_LABEL (BB_END (jump_block)) = label;
|
||||
LABEL_NUSES (label)++;
|
||||
}
|
||||
@@ -2606,6 +2611,32 @@ cfg_layout_merge_blocks (basic_block a,
|
||||
try_redirect_by_replacing_jump (EDGE_SUCC (a, 0), b, true);
|
||||
gcc_assert (!JUMP_P (BB_END (a)));
|
||||
|
||||
+ /* When not optimizing and the edge is the only place in RTL which holds
|
||||
+ some unique locus, emit a nop with that locus in between. */
|
||||
+ if (!optimize && EDGE_SUCC (a, 0)->goto_locus)
|
||||
+ {
|
||||
+ rtx insn = BB_END (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)
|
||||
+ 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)
|
||||
+ goto_locus = 0;
|
||||
+ }
|
||||
+ if (goto_locus)
|
||||
+ {
|
||||
+ BB_END (a) = emit_insn_after_noloc (gen_nop (), BB_END (a), a);
|
||||
+ INSN_LOCATOR (BB_END (a)) = goto_locus;
|
||||
+ }
|
||||
+ }
|
||||
+
|
||||
/* Possible line number notes should appear in between. */
|
||||
if (b->il.rtl->header)
|
||||
{
|
||||
--- gcc/testsuite/gcc.dg/debug/pr36690-1.c (revision 0)
|
||||
+++ gcc/testsuite/gcc.dg/debug/pr36690-1.c (revision 140948)
|
||||
@@ -0,0 +1,23 @@
|
||||
+/* PR debug/36690 */
|
||||
+/* Verify that break func is hit.
|
||||
+ This version of the test just checks that it can be compiled, linked
|
||||
+ and executed, further testing is done in corresponding gcc.dg/dwarf2/
|
||||
+ test and hopefully in gdb testsuite. */
|
||||
+/* { dg-do run } */
|
||||
+/* { dg-options "-O0 -g -dA" } */
|
||||
+
|
||||
+int i;
|
||||
+
|
||||
+void
|
||||
+func (void)
|
||||
+{
|
||||
+ while (i == 1)
|
||||
+ i = 0;
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+main (void)
|
||||
+{
|
||||
+ func ();
|
||||
+ return 0;
|
||||
+}
|
||||
--- gcc/testsuite/gcc.dg/debug/pr36690-2.c (revision 0)
|
||||
+++ gcc/testsuite/gcc.dg/debug/pr36690-2.c (revision 140948)
|
||||
@@ -0,0 +1,40 @@
|
||||
+/* PR debug/36690 */
|
||||
+/* Verify that breakpoint can be put on goto f1, it is hit and
|
||||
+ varz at that spot is defined and contains 5. Nowhere else
|
||||
+ in the function should be varz in the scope.
|
||||
+ This version of the test just checks that it can be compiled, linked
|
||||
+ and executed, further testing is done in corresponding gcc.dg/dwarf2/
|
||||
+ test and hopefully in gdb testsuite. */
|
||||
+/* { dg-do run } */
|
||||
+/* { dg-options "-O0 -g -dA" } */
|
||||
+
|
||||
+int cnt;
|
||||
+
|
||||
+void
|
||||
+bar (int i)
|
||||
+{
|
||||
+ cnt += i;
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+foo (int i)
|
||||
+{
|
||||
+ if (!i)
|
||||
+ bar (0);
|
||||
+ else
|
||||
+ {
|
||||
+ static int varz = 5;
|
||||
+ goto f1;
|
||||
+ }
|
||||
+ bar (1);
|
||||
+f1:
|
||||
+ bar (2);
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+main (void)
|
||||
+{
|
||||
+ foo (0);
|
||||
+ foo (1);
|
||||
+ return 0;
|
||||
+}
|
||||
--- gcc/testsuite/gcc.dg/debug/pr29609-1.c (revision 0)
|
||||
+++ gcc/testsuite/gcc.dg/debug/pr29609-1.c (revision 140948)
|
||||
@@ -0,0 +1,33 @@
|
||||
+/* PR debug/29609 */
|
||||
+/* Verify that breakpoint on the break is hit.
|
||||
+ This version of the test just checks that it can be compiled, linked
|
||||
+ and executed, further testing is done in corresponding gcc.dg/dwarf2/
|
||||
+ test and hopefully in gdb testsuite. */
|
||||
+/* { dg-do run } */
|
||||
+/* { dg-options "-O0 -g -dA" } */
|
||||
+
|
||||
+extern void abort (void);
|
||||
+
|
||||
+int
|
||||
+foo (void)
|
||||
+{
|
||||
+ int a, i;
|
||||
+
|
||||
+ for (i = 1; i <= 10; i++)
|
||||
+ {
|
||||
+ if (i < 3)
|
||||
+ a = 1;
|
||||
+ else
|
||||
+ break;
|
||||
+ a = 5;
|
||||
+ }
|
||||
+ return a;
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+main (void)
|
||||
+{
|
||||
+ if (foo () != 5)
|
||||
+ abort ();
|
||||
+ return 0;
|
||||
+}
|
||||
--- gcc/testsuite/gcc.dg/debug/pr36690-3.c (revision 0)
|
||||
+++ gcc/testsuite/gcc.dg/debug/pr36690-3.c (revision 140948)
|
||||
@@ -0,0 +1,47 @@
|
||||
+/* PR debug/36690 */
|
||||
+/* { dg-do run } */
|
||||
+/* { dg-options "-O0 -g -dA" } */
|
||||
+
|
||||
+int cnt;
|
||||
+
|
||||
+void
|
||||
+bar (int i)
|
||||
+{
|
||||
+ cnt += i;
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+foo (int i, int j)
|
||||
+{
|
||||
+ if (j)
|
||||
+ {
|
||||
+ bar (i + 1);
|
||||
+ goto f1;
|
||||
+ }
|
||||
+ bar (i + 2);
|
||||
+ goto f2;
|
||||
+f1:
|
||||
+ if (i > 10)
|
||||
+ goto f3;
|
||||
+f2:
|
||||
+ if (i > 40)
|
||||
+ goto f4;
|
||||
+ else
|
||||
+ goto f5;
|
||||
+f3:
|
||||
+ bar (i);
|
||||
+f4:
|
||||
+ bar (i);
|
||||
+f5:
|
||||
+ bar (i);
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+main (void)
|
||||
+{
|
||||
+ foo (0, 1);
|
||||
+ foo (11, 1);
|
||||
+ foo (21, 0);
|
||||
+ foo (41, 0);
|
||||
+ return 0;
|
||||
+}
|
||||
--- gcc/testsuite/gcc.dg/debug/pr29609-2.c (revision 0)
|
||||
+++ gcc/testsuite/gcc.dg/debug/pr29609-2.c (revision 140948)
|
||||
@@ -0,0 +1,53 @@
|
||||
+/* PR debug/29609 */
|
||||
+/* Verify that breakpoint on both goto failure; stmts is hit.
|
||||
+ This version of the test just checks that it can be compiled, linked
|
||||
+ and executed, further testing is done in corresponding gcc.dg/dwarf2/
|
||||
+ test and hopefully in gdb testsuite. */
|
||||
+/* { dg-do run } */
|
||||
+/* { dg-options "-O0 -g -dA" } */
|
||||
+
|
||||
+extern void abort (void);
|
||||
+int x;
|
||||
+
|
||||
+int
|
||||
+foo (void)
|
||||
+{
|
||||
+ return 0 ^ x;
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+bar (void)
|
||||
+{
|
||||
+ return 1 ^ x;
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+baz (void)
|
||||
+{
|
||||
+ int c;
|
||||
+
|
||||
+ if (!foo ())
|
||||
+ goto failure;
|
||||
+
|
||||
+ if (!bar ())
|
||||
+ goto failure;
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+failure:
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+main (void)
|
||||
+{
|
||||
+ if (baz () != 1)
|
||||
+ abort ();
|
||||
+ x = 1;
|
||||
+ if (baz () != 1)
|
||||
+ abort ();
|
||||
+ x = 2;
|
||||
+ if (baz () != 0)
|
||||
+ abort ();
|
||||
+ return 0;
|
||||
+}
|
||||
--- gcc/testsuite/gcc.dg/debug/dwarf2/pr36690-1.c (revision 0)
|
||||
+++ gcc/testsuite/gcc.dg/debug/dwarf2/pr36690-1.c (revision 140948)
|
||||
@@ -0,0 +1,22 @@
|
||||
+/* PR debug/36690 */
|
||||
+/* Verify that break func is hit. */
|
||||
+/* { dg-do compile } */
|
||||
+/* { dg-options "-O0 -gdwarf-2 -dA" } */
|
||||
+
|
||||
+int i;
|
||||
+
|
||||
+void
|
||||
+func (void)
|
||||
+{
|
||||
+ while (i == 1)
|
||||
+ i = 0;
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+main (void)
|
||||
+{
|
||||
+ func ();
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/* { dg-final { scan-assembler "pr36690-1.c:11" } } */
|
||||
--- gcc/testsuite/gcc.dg/debug/dwarf2/pr36690-2.c (revision 0)
|
||||
+++ gcc/testsuite/gcc.dg/debug/dwarf2/pr36690-2.c (revision 140948)
|
||||
@@ -0,0 +1,39 @@
|
||||
+/* PR debug/36690 */
|
||||
+/* Verify that breakpoint can be put on goto f1, it is hit and
|
||||
+ varz at that spot is defined and contains 5. Nowhere else
|
||||
+ in the function should be varz in the scope. */
|
||||
+/* { dg-do compile } */
|
||||
+/* { dg-options "-O0 -gdwarf-2 -dA" } */
|
||||
+
|
||||
+int cnt;
|
||||
+
|
||||
+void
|
||||
+bar (int i)
|
||||
+{
|
||||
+ cnt += i;
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+foo (int i)
|
||||
+{
|
||||
+ if (!i)
|
||||
+ bar (0);
|
||||
+ else
|
||||
+ {
|
||||
+ static int varz = 5;
|
||||
+ goto f1;
|
||||
+ }
|
||||
+ bar (1);
|
||||
+f1:
|
||||
+ bar (2);
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+main (void)
|
||||
+{
|
||||
+ foo (0);
|
||||
+ foo (1);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/* { dg-final { scan-assembler "pr36690-2.c:24" } } */
|
||||
--- gcc/testsuite/gcc.dg/debug/dwarf2/pr29609-1.c (revision 0)
|
||||
+++ gcc/testsuite/gcc.dg/debug/dwarf2/pr29609-1.c (revision 140948)
|
||||
@@ -0,0 +1,32 @@
|
||||
+/* PR debug/29609 */
|
||||
+/* Verify that breakpoint on the break is hit. */
|
||||
+/* { dg-do compile } */
|
||||
+/* { dg-options "-O0 -gdwarf-2 -dA" } */
|
||||
+
|
||||
+void abort (void);
|
||||
+
|
||||
+int
|
||||
+foo (void)
|
||||
+{
|
||||
+ int a, i;
|
||||
+
|
||||
+ for (i = 1; i <= 10; i++)
|
||||
+ {
|
||||
+ if (i < 3)
|
||||
+ a = 1;
|
||||
+ else
|
||||
+ break;
|
||||
+ a = 5;
|
||||
+ }
|
||||
+ return a;
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+main (void)
|
||||
+{
|
||||
+ if (foo () != 5)
|
||||
+ abort ();
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/* { dg-final { scan-assembler "pr29609-1.c:18" } } */
|
||||
--- gcc/testsuite/gcc.dg/debug/dwarf2/pr36690-3.c (revision 0)
|
||||
+++ gcc/testsuite/gcc.dg/debug/dwarf2/pr36690-3.c (revision 140948)
|
||||
@@ -0,0 +1,53 @@
|
||||
+/* PR debug/36690 */
|
||||
+/* { dg-do compile } */
|
||||
+/* { dg-options "-O0 -gdwarf-2 -dA" } */
|
||||
+
|
||||
+int cnt;
|
||||
+
|
||||
+void
|
||||
+bar (int i)
|
||||
+{
|
||||
+ cnt += i;
|
||||
+}
|
||||
+
|
||||
+void
|
||||
+foo (int i, int j)
|
||||
+{
|
||||
+ if (j)
|
||||
+ {
|
||||
+ bar (i + 1);
|
||||
+ goto f1;
|
||||
+ }
|
||||
+ bar (i + 2);
|
||||
+ goto f2;
|
||||
+f1:
|
||||
+ if (i > 10)
|
||||
+ goto f3;
|
||||
+f2:
|
||||
+ if (i > 40)
|
||||
+ goto f4;
|
||||
+ else
|
||||
+ goto f5;
|
||||
+f3:
|
||||
+ bar (i);
|
||||
+f4:
|
||||
+ bar (i);
|
||||
+f5:
|
||||
+ bar (i);
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+main (void)
|
||||
+{
|
||||
+ foo (0, 1);
|
||||
+ foo (11, 1);
|
||||
+ foo (21, 0);
|
||||
+ foo (41, 0);
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/* { dg-final { scan-assembler "pr36690-3.c:19" } } */
|
||||
+/* { dg-final { scan-assembler "pr36690-3.c:22" } } */
|
||||
+/* { dg-final { scan-assembler "pr36690-3.c:25" } } */
|
||||
+/* { dg-final { scan-assembler "pr36690-3.c:28" } } */
|
||||
+/* { dg-final { scan-assembler "pr36690-3.c:30" } } */
|
||||
--- gcc/testsuite/gcc.dg/debug/dwarf2/pr29609-2.c (revision 0)
|
||||
+++ gcc/testsuite/gcc.dg/debug/dwarf2/pr29609-2.c (revision 140948)
|
||||
@@ -0,0 +1,53 @@
|
||||
+/* PR debug/29609 */
|
||||
+/* Verify that breakpoint on both goto failure; stmts is hit. */
|
||||
+/* { dg-do compile } */
|
||||
+/* { dg-options "-O0 -gdwarf-2 -dA" } */
|
||||
+
|
||||
+extern void abort (void);
|
||||
+int x;
|
||||
+
|
||||
+int
|
||||
+foo (void)
|
||||
+{
|
||||
+ return 0 ^ x;
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+bar (void)
|
||||
+{
|
||||
+ return 1 ^ x;
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+baz (void)
|
||||
+{
|
||||
+ int c;
|
||||
+
|
||||
+ if (!foo ())
|
||||
+ goto failure;
|
||||
+
|
||||
+ if (!bar ())
|
||||
+ goto failure;
|
||||
+
|
||||
+ return 0;
|
||||
+
|
||||
+failure:
|
||||
+ return 1;
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+main (void)
|
||||
+{
|
||||
+ if (baz () != 1)
|
||||
+ abort ();
|
||||
+ x = 1;
|
||||
+ if (baz () != 1)
|
||||
+ abort ();
|
||||
+ x = 2;
|
||||
+ if (baz () != 0)
|
||||
+ abort ();
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/* { dg-final { scan-assembler "pr29609-2.c:27" } } */
|
||||
+/* { dg-final { scan-assembler "pr29609-2.c:30" } } */
|
||||
--- gcc/testsuite/gcc.dg/debug/dwarf2/pr37616.c (revision 0)
|
||||
+++ gcc/testsuite/gcc.dg/debug/dwarf2/pr37616.c (revision 140948)
|
||||
@@ -0,0 +1,41 @@
|
||||
+/* PR debug/37616 */
|
||||
+/* Test that one can put breakpoints onto continue, exitlab and break
|
||||
+ and actually see program reaching those breakpoints. */
|
||||
+/* { dg-do compile } */
|
||||
+/* { dg-options "-O0 -gdwarf-2 -dA" } */
|
||||
+
|
||||
+extern void abort (void);
|
||||
+
|
||||
+int
|
||||
+foo (int parm)
|
||||
+{
|
||||
+ int varj, varm;
|
||||
+
|
||||
+ for (varj = 0; varj < 10; varj++)
|
||||
+ {
|
||||
+ if (varj == 5)
|
||||
+ continue;
|
||||
+ if (varj == 7 && !parm)
|
||||
+ goto exitlab;
|
||||
+ if (varj == 9)
|
||||
+ break;
|
||||
+ varm = varj;
|
||||
+ }
|
||||
+
|
||||
+exitlab:
|
||||
+ return varm;
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+main (void)
|
||||
+{
|
||||
+ if (foo (0) != 6)
|
||||
+ abort ();
|
||||
+ if (foo (1) != 8)
|
||||
+ abort ();
|
||||
+ return 0;
|
||||
+}
|
||||
+
|
||||
+/* { dg-final { scan-assembler "pr37616.c:17" } } */
|
||||
+/* { dg-final { scan-assembler "pr37616.c:19" } } */
|
||||
+/* { dg-final { scan-assembler "pr37616.c:21" } } */
|
||||
--- gcc/testsuite/gcc.dg/debug/pr37616.c (revision 0)
|
||||
+++ gcc/testsuite/gcc.dg/debug/pr37616.c (revision 140948)
|
||||
@@ -0,0 +1,40 @@
|
||||
+/* PR debug/37616 */
|
||||
+/* Test that one can put breakpoints onto continue, exitlab and break
|
||||
+ and actually see program reaching those breakpoints.
|
||||
+ This version of the test just checks that it can be compiled, linked
|
||||
+ and executed, further testing is done in corresponding gcc.dg/dwarf2/
|
||||
+ test and hopefully in gdb testsuite. */
|
||||
+/* { dg-do run } */
|
||||
+/* { dg-options "-O0 -g -dA" } */
|
||||
+
|
||||
+extern void abort (void);
|
||||
+
|
||||
+int
|
||||
+foo (int parm)
|
||||
+{
|
||||
+ int varj, varm;
|
||||
+
|
||||
+ for (varj = 0; varj < 10; varj++)
|
||||
+ {
|
||||
+ if (varj == 5)
|
||||
+ continue;
|
||||
+ if (varj == 7 && !parm)
|
||||
+ goto exitlab;
|
||||
+ if (varj == 9)
|
||||
+ break;
|
||||
+ varm = varj;
|
||||
+ }
|
||||
+
|
||||
+exitlab:
|
||||
+ return varm;
|
||||
+}
|
||||
+
|
||||
+int
|
||||
+main (void)
|
||||
+{
|
||||
+ if (foo (0) != 6)
|
||||
+ abort ();
|
||||
+ if (foo (1) != 8)
|
||||
+ abort ();
|
||||
+ return 0;
|
||||
+}
|
276
gcc43-pr37738.patch
Normal file
276
gcc43-pr37738.patch
Normal file
@ -0,0 +1,276 @@
|
||||
2008-10-07 Jakub Jelinek <jakub@redhat.com>
|
||||
|
||||
* f95-lang.c (poplevel): Don't clear BLOCK_VARS if functionbody.
|
||||
* trans-decl.c (gfc_build_qualified_array): Build accurate debug type
|
||||
even if nest.
|
||||
(build_entry_thunks, gfc_generate_function_code,
|
||||
gfc_generate_constructors): Ensure DECL_SAVED_TREE is a BIND_EXPR
|
||||
with DECL_INITIAL as its BLOCK.
|
||||
|
||||
PR debug/37738
|
||||
* dwarf2out.c (common_block_die_table): New variable.
|
||||
(common_block_die_table_hash, common_block_die_table_eq): New
|
||||
functions.
|
||||
(gen_variable_die): Look up a DW_TAG_common_block die for a particular
|
||||
COMMON block in the current scope rather than globally. Optimize
|
||||
DW_OP_addr SYMBOL_REF DW_OP_plus_uconst off into
|
||||
DW_OP_addr SYMBOL_REF+off.
|
||||
|
||||
* gfortran.dg/debug/pr37738.f: New test.
|
||||
|
||||
--- gcc/testsuite/gfortran.dg/debug/pr37738.f (revision 0)
|
||||
+++ gcc/testsuite/gfortran.dg/debug/pr37738.f (revision 140945)
|
||||
@@ -0,0 +1,30 @@
|
||||
+C PR debug/37738
|
||||
+C { dg-do compile }
|
||||
+C { dg-skip-if "DWARF-2 only" { "*-*-*" } { "*" } { "-gdwarf-2" } }
|
||||
+C { dg-options "-dA" }
|
||||
+
|
||||
+ subroutine a
|
||||
+ integer*4 a_i, c_i
|
||||
+ common /block/a_i, c_i
|
||||
+ a_i = 1
|
||||
+ c_i = 4
|
||||
+ end subroutine a
|
||||
+ subroutine b
|
||||
+ integer*4 b_i
|
||||
+ common /block/b_i, d_i
|
||||
+ b_i = 2
|
||||
+ d_i = 5
|
||||
+ end subroutine b
|
||||
+ subroutine c
|
||||
+ integer*4 a_i, c_i
|
||||
+ common /block/a_i, c_i
|
||||
+ if (a_i .ne. 2) call abort
|
||||
+ if (c_i .ne. 5) call abort
|
||||
+ end subroutine c
|
||||
+ program abc
|
||||
+ call a
|
||||
+ call b
|
||||
+ call c
|
||||
+ end program abc
|
||||
+
|
||||
+C { dg-final { scan-assembler-times "DIE\[^\n\]*DW_TAG_common_block" 3 } }
|
||||
--- gcc/dwarf2out.c (revision 140943)
|
||||
+++ gcc/dwarf2out.c (revision 140945)
|
||||
@@ -4748,6 +4748,10 @@ static GTY((param_is (struct dwarf_file_
|
||||
The key is a DECL_UID() which is a unique number identifying each decl. */
|
||||
static GTY ((param_is (struct die_struct))) htab_t decl_die_table;
|
||||
|
||||
+/* A hash table of references to DIE's that describe COMMON blocks.
|
||||
+ The key is DECL_UID() ^ die_parent. */
|
||||
+static GTY ((param_is (struct die_struct))) htab_t common_block_die_table;
|
||||
+
|
||||
/* Node of the variable location list. */
|
||||
struct var_loc_node GTY ((chain_next ("%h.next")))
|
||||
{
|
||||
@@ -4960,6 +4964,8 @@ static void equate_type_number_to_die (t
|
||||
static hashval_t decl_die_table_hash (const void *);
|
||||
static int decl_die_table_eq (const void *, const void *);
|
||||
static dw_die_ref lookup_decl_die (tree);
|
||||
+static hashval_t common_block_die_table_hash (const void *);
|
||||
+static int common_block_die_table_eq (const void *, const void *);
|
||||
static hashval_t decl_loc_table_hash (const void *);
|
||||
static int decl_loc_table_eq (const void *, const void *);
|
||||
static var_loc_list *lookup_decl_loc (const_tree);
|
||||
@@ -13812,6 +13818,26 @@ gen_subprogram_die (tree decl, dw_die_re
|
||||
|
||||
}
|
||||
|
||||
+/* Returns a hash value for X (which really is a die_struct). */
|
||||
+
|
||||
+static hashval_t
|
||||
+common_block_die_table_hash (const void *x)
|
||||
+{
|
||||
+ const_dw_die_ref d = (const_dw_die_ref) x;
|
||||
+ return (hashval_t) d->decl_id ^ htab_hash_pointer (d->die_parent);
|
||||
+}
|
||||
+
|
||||
+/* Return nonzero if decl_id and die_parent of die_struct X is the same
|
||||
+ as decl_id and die_parent of die_struct Y. */
|
||||
+
|
||||
+static int
|
||||
+common_block_die_table_eq (const void *x, const void *y)
|
||||
+{
|
||||
+ const_dw_die_ref d = (const_dw_die_ref) x;
|
||||
+ const_dw_die_ref e = (const_dw_die_ref) y;
|
||||
+ return d->decl_id == e->decl_id && d->die_parent == e->die_parent;
|
||||
+}
|
||||
+
|
||||
/* Generate a DIE to represent a declared data object. */
|
||||
|
||||
static void
|
||||
@@ -13853,6 +13879,7 @@ gen_variable_die (tree decl, dw_die_ref
|
||||
tree field;
|
||||
dw_die_ref com_die;
|
||||
dw_loc_descr_ref loc;
|
||||
+ die_node com_die_arg;
|
||||
|
||||
var_die = lookup_decl_die (decl);
|
||||
if (var_die)
|
||||
@@ -13863,21 +13890,41 @@ gen_variable_die (tree decl, dw_die_ref
|
||||
if (loc)
|
||||
{
|
||||
if (off)
|
||||
- add_loc_descr (&loc, new_loc_descr (DW_OP_plus_uconst,
|
||||
+ {
|
||||
+ /* Optimize the common case. */
|
||||
+ if (loc->dw_loc_opc == DW_OP_addr
|
||||
+ && loc->dw_loc_next == NULL
|
||||
+ && GET_CODE (loc->dw_loc_oprnd1.v.val_addr)
|
||||
+ == SYMBOL_REF)
|
||||
+ loc->dw_loc_oprnd1.v.val_addr
|
||||
+ = plus_constant (loc->dw_loc_oprnd1.v.val_addr, off);
|
||||
+ else
|
||||
+ add_loc_descr (&loc,
|
||||
+ new_loc_descr (DW_OP_plus_uconst,
|
||||
off, 0));
|
||||
+ }
|
||||
add_AT_loc (var_die, DW_AT_location, loc);
|
||||
remove_AT (var_die, DW_AT_declaration);
|
||||
}
|
||||
}
|
||||
return;
|
||||
}
|
||||
+
|
||||
+ if (common_block_die_table == NULL)
|
||||
+ common_block_die_table
|
||||
+ = htab_create_ggc (10, common_block_die_table_hash,
|
||||
+ common_block_die_table_eq, NULL);
|
||||
+
|
||||
field = TREE_OPERAND (DECL_VALUE_EXPR (decl), 0);
|
||||
- com_die = lookup_decl_die (com_decl);
|
||||
+ com_die_arg.decl_id = DECL_UID (com_decl);
|
||||
+ com_die_arg.die_parent = context_die;
|
||||
+ com_die = (dw_die_ref) htab_find (common_block_die_table, &com_die_arg);
|
||||
loc = loc_descriptor_from_tree (com_decl);
|
||||
if (com_die == NULL)
|
||||
{
|
||||
const char *cnam
|
||||
= IDENTIFIER_POINTER (DECL_ASSEMBLER_NAME (com_decl));
|
||||
+ void **slot;
|
||||
|
||||
com_die = new_die (DW_TAG_common_block, context_die, decl);
|
||||
add_name_and_src_coords_attributes (com_die, com_decl);
|
||||
@@ -13891,7 +13938,9 @@ gen_variable_die (tree decl, dw_die_ref
|
||||
else if (DECL_EXTERNAL (decl))
|
||||
add_AT_flag (com_die, DW_AT_declaration, 1);
|
||||
add_pubname_string (cnam, com_die); /* ??? needed? */
|
||||
- equate_decl_number_to_die (com_decl, com_die);
|
||||
+ com_die->decl_id = DECL_UID (com_decl);
|
||||
+ slot = htab_find_slot (common_block_die_table, com_die, INSERT);
|
||||
+ *slot = (void *) com_die;
|
||||
}
|
||||
else if (get_AT (com_die, DW_AT_location) == NULL && loc)
|
||||
{
|
||||
@@ -13907,7 +13956,17 @@ gen_variable_die (tree decl, dw_die_ref
|
||||
if (loc)
|
||||
{
|
||||
if (off)
|
||||
- add_loc_descr (&loc, new_loc_descr (DW_OP_plus_uconst, off, 0));
|
||||
+ {
|
||||
+ /* Optimize the common case. */
|
||||
+ if (loc->dw_loc_opc == DW_OP_addr
|
||||
+ && loc->dw_loc_next == NULL
|
||||
+ && GET_CODE (loc->dw_loc_oprnd1.v.val_addr) == SYMBOL_REF)
|
||||
+ loc->dw_loc_oprnd1.v.val_addr
|
||||
+ = plus_constant (loc->dw_loc_oprnd1.v.val_addr, off);
|
||||
+ else
|
||||
+ add_loc_descr (&loc, new_loc_descr (DW_OP_plus_uconst,
|
||||
+ off, 0));
|
||||
+ }
|
||||
add_AT_loc (var_die, DW_AT_location, loc);
|
||||
}
|
||||
else if (DECL_EXTERNAL (decl))
|
||||
--- gcc/fortran/f95-lang.c (revision 140943)
|
||||
+++ gcc/fortran/f95-lang.c (revision 140945)
|
||||
@@ -457,14 +457,8 @@ poplevel (int keep, int reverse, int fun
|
||||
current_binding_level = current_binding_level->level_chain;
|
||||
|
||||
if (functionbody)
|
||||
- {
|
||||
- /* This is the top level block of a function. The ..._DECL chain stored
|
||||
- in BLOCK_VARS are the function's parameters (PARM_DECL nodes). Don't
|
||||
- leave them in the BLOCK because they are found in the FUNCTION_DECL
|
||||
- instead. */
|
||||
- DECL_INITIAL (current_function_decl) = block_node;
|
||||
- BLOCK_VARS (block_node) = 0;
|
||||
- }
|
||||
+ /* This is the top level block of a function. */
|
||||
+ DECL_INITIAL (current_function_decl) = block_node;
|
||||
else if (current_binding_level == global_binding_level)
|
||||
/* When using gfc_start_block/gfc_finish_block from middle-end hooks,
|
||||
don't add newly created BLOCKs as sublocks of global_binding_level. */
|
||||
--- gcc/fortran/trans-decl.c (revision 140943)
|
||||
+++ gcc/fortran/trans-decl.c (revision 140945)
|
||||
@@ -704,7 +704,7 @@ gfc_build_qualified_array (tree decl, gf
|
||||
layout_type (type);
|
||||
}
|
||||
|
||||
- if (nest || write_symbols == NO_DEBUG)
|
||||
+ if (write_symbols == NO_DEBUG)
|
||||
return;
|
||||
|
||||
if (TYPE_NAME (type) != NULL_TREE
|
||||
@@ -1761,7 +1761,7 @@ build_entry_thunks (gfc_namespace * ns)
|
||||
|
||||
thunk_fndecl = thunk_sym->backend_decl;
|
||||
|
||||
- gfc_start_block (&body);
|
||||
+ gfc_init_block (&body);
|
||||
|
||||
/* Pass extra parameter identifying this entry point. */
|
||||
tmp = build_int_cst (gfc_array_index_type, el->id);
|
||||
@@ -1869,8 +1869,12 @@ build_entry_thunks (gfc_namespace * ns)
|
||||
|
||||
/* Finish off this function and send it for code generation. */
|
||||
DECL_SAVED_TREE (thunk_fndecl) = gfc_finish_block (&body);
|
||||
+ tmp = getdecls ();
|
||||
poplevel (1, 0, 1);
|
||||
BLOCK_SUPERCONTEXT (DECL_INITIAL (thunk_fndecl)) = thunk_fndecl;
|
||||
+ DECL_SAVED_TREE (thunk_fndecl)
|
||||
+ = build3_v (BIND_EXPR, tmp, DECL_SAVED_TREE (thunk_fndecl),
|
||||
+ DECL_INITIAL (thunk_fndecl));
|
||||
|
||||
/* Output the GENERIC tree. */
|
||||
dump_function (TDI_original, thunk_fndecl);
|
||||
@@ -3652,7 +3656,7 @@ gfc_generate_function_code (gfc_namespac
|
||||
|
||||
trans_function_start (sym);
|
||||
|
||||
- gfc_start_block (&block);
|
||||
+ gfc_init_block (&block);
|
||||
|
||||
if (ns->entries && ns->proc_name->ts.type == BT_CHARACTER)
|
||||
{
|
||||
@@ -3886,11 +3890,16 @@ gfc_generate_function_code (gfc_namespac
|
||||
saved_function_decls = NULL_TREE;
|
||||
|
||||
DECL_SAVED_TREE (fndecl) = gfc_finish_block (&block);
|
||||
+ decl = getdecls ();
|
||||
|
||||
/* Finish off this function and send it for code generation. */
|
||||
poplevel (1, 0, 1);
|
||||
BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
|
||||
|
||||
+ DECL_SAVED_TREE (fndecl)
|
||||
+ = build3_v (BIND_EXPR, decl, DECL_SAVED_TREE (fndecl),
|
||||
+ DECL_INITIAL (fndecl));
|
||||
+
|
||||
/* Output the GENERIC tree. */
|
||||
dump_function (TDI_original, fndecl);
|
||||
|
||||
@@ -3969,9 +3978,13 @@ gfc_generate_constructors (void)
|
||||
DECL_SAVED_TREE (fndecl) = build_stmt (EXPR_STMT, tmp);
|
||||
}
|
||||
|
||||
+ decl = getdecls ();
|
||||
poplevel (1, 0, 1);
|
||||
|
||||
BLOCK_SUPERCONTEXT (DECL_INITIAL (fndecl)) = fndecl;
|
||||
+ DECL_SAVED_TREE (fndecl)
|
||||
+ = build3_v (BIND_EXPR, decl, DECL_SAVED_TREE (fndecl),
|
||||
+ DECL_INITIAL (fndecl));
|
||||
|
||||
free_after_parsing (cfun);
|
||||
free_after_compilation (cfun);
|
29
gcc43.spec
29
gcc43.spec
@ -1,9 +1,9 @@
|
||||
%define DATE 20080917
|
||||
%define SVNREV 140410
|
||||
%define DATE 20081008
|
||||
%define SVNREV 140973
|
||||
%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 4
|
||||
%define gcc_release 5
|
||||
%define _unpackaged_files_terminate_build 0
|
||||
%define multilib_64_archs sparc64 ppc64 s390x x86_64
|
||||
%define include_gappletviewer 1
|
||||
@ -156,6 +156,9 @@ Patch19: gcc43-altivec-tests.patch
|
||||
Patch20: gcc43-libtool-no-rpath.patch
|
||||
Patch21: gcc43-pr36741-revert.patch
|
||||
Patch22: gcc43-pr34037.patch
|
||||
Patch23: gcc43-pr37738.patch
|
||||
Patch24: gcc43-pr29609.patch
|
||||
Patch25: gcc43-aes.patch
|
||||
|
||||
# On ARM EABI systems, we do want -gnueabi to be part of the
|
||||
# target triple.
|
||||
@ -462,6 +465,9 @@ which are required to run programs compiled with the GNAT.
|
||||
%patch20 -p0 -b .libtool-no-rpath~
|
||||
%patch21 -p0 -b .pr36741-revert~
|
||||
%patch22 -p0 -b .pr34037~
|
||||
%patch23 -p0 -b .pr37738~
|
||||
%patch24 -p0 -b .pr29609~
|
||||
%patch25 -p0 -b .aes~
|
||||
|
||||
tar xzf %{SOURCE4}
|
||||
|
||||
@ -1284,6 +1290,7 @@ fi
|
||||
%{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/smmintrin.h
|
||||
%{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/nmmintrin.h
|
||||
%{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/bmmintrin.h
|
||||
%{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/wmmintrin.h
|
||||
%{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/mmintrin-common.h
|
||||
%{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/mm_malloc.h
|
||||
%{_prefix}/lib/gcc/%{gcc_target_platform}/%{gcc_version}/include/mm3dnow.h
|
||||
@ -1710,8 +1717,22 @@ fi
|
||||
%doc rpm.doc/changelogs/libmudflap/ChangeLog*
|
||||
|
||||
%changelog
|
||||
* Wed Oct 8 2008 Jakub Jelinek <jakub@redhat.com> 4.3.2-5
|
||||
- update from gcc-4_3-branch
|
||||
- PRs c++/37555, c/35712, c/37645, fortran/35770, fortran/35945,
|
||||
fortran/36374, fortran/36454, fortran/36700, fortran/37274,
|
||||
fortran/37504, fortran/37580, fortran/37583, fortran/37626,
|
||||
fortran/37706, middle-end/36575, middle-end/37236, middle-end/37731,
|
||||
rtl-optimization/37544, target/35620, target/35713, target/37603,
|
||||
tree-opt/35737, tree-optimization/36343, tree-optimization/37539
|
||||
- ensure one can put breakpoints on break, continue and goto statements
|
||||
with -g -O0 (#465824, PRs debug/29609, debug/36690, debug/37616)
|
||||
- emit one DW_TAG_common_block for each common block in each scope, not
|
||||
one for each common block in one CU (#465974, PR debug/37738)
|
||||
- Intel -maes and -mpclmul support
|
||||
|
||||
* Wed Sep 17 2008 Jakub Jelinek <jakub@redhat.com> 4.3.2-4
|
||||
- update from 4.3 branch
|
||||
- update from gcc-4_3-branch
|
||||
- PRs c++/37389, fortran/35837, fortran/36214, fortran/37099, fortran/37199,
|
||||
rtl-optimization/37408, target/37466, tree-optimization/36630
|
||||
- revert PR c++/36741 fix
|
||||
|
Loading…
Reference in New Issue
Block a user