This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[mudflap] fix for PR 19266/20831
- From: "Frank Ch. Eigler" <fche at redhat dot com>
- To: gcc-patches at gcc dot gnu dot org
- Date: Tue, 12 Apr 2005 14:07:04 -0400
- Subject: [mudflap] fix for PR 19266/20831
Hi -
The following patch, kindly authored by rth, appears to fix PRs
19266/20831 when the tests are run by hand. The .ii files were too
large and unportable to put into libmudflap testsuite. I'm committing
to mainline; perhaps also to the 4.0.1 branch later.
+2005-04-12 Frank Ch. Eigler <fche@redhat.com>
+
+ PR mudflap/19266
+ From Richard Henderson <rth@redhat.com>:
+ * tree-mudflap.c (mf_build_check_statement_for): Correct block
+ splitting logic.
+
Index: gcc/tree-mudflap.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/tree-mudflap.c,v
retrieving revision 2.36
diff -u -p -r2.36 tree-mudflap.c
--- gcc/tree-mudflap.c 11 Mar 2005 09:05:08 -0000 2.36
+++ gcc/tree-mudflap.c 12 Apr 2005 17:33:23 -0000
@@ -497,40 +497,25 @@ mf_build_check_statement_for (tree base,
block_stmt_iterator bsi;
basic_block cond_bb, then_bb, join_bb;
edge e;
- tree cond, t, u, v, l1, l2;
+ tree cond, t, u, v;
tree mf_base;
tree mf_elem;
tree mf_limit;
/* We first need to split the current basic block, and start altering
the CFG. This allows us to insert the statements we're about to
- construct into the right basic blocks. The label l1 is the label
- of the block for the THEN clause of the conditional jump we're
- about to construct, and l2 is the ELSE clause, which is just the
- continuation of the old statement stream. */
- l1 = create_artificial_label ();
- l2 = create_artificial_label ();
+ construct into the right basic blocks. */
+
cond_bb = bb_for_stmt (bsi_stmt (*instr_bsi));
bsi = *instr_bsi;
bsi_prev (&bsi);
if (! bsi_end_p (bsi))
- {
- /* We're processing a statement in the middle of the block, so
- we need to split the block. This creates a new block and a new
- fallthrough edge. */
- e = split_block (cond_bb, bsi_stmt (bsi));
- cond_bb = e->src;
- join_bb = e->dest;
- }
+ e = split_block (cond_bb, bsi_stmt (bsi));
else
- {
- /* We're processing the first statement in the block, so we need
- to split the incoming edge. This also creates a new block
- and a new fallthrough edge. */
- join_bb = cond_bb;
- cond_bb = split_edge (find_edge (join_bb->prev_bb, join_bb));
- }
-
+ e = split_block_after_labels (cond_bb);
+ cond_bb = e->src;
+ join_bb = e->dest;
+
/* A recap at this point: join_bb is the basic block at whose head
is the gimple statement for which this check expression is being
built. cond_bb is the (possibly new, synthetic) basic block the
@@ -721,7 +706,7 @@ mf_decl_eligible_p (tree decl)
/* The decl must have its address taken. In the case of
arrays, this flag is also set if the indexes are not
compile-time known valid constants. */
- && TREE_ADDRESSABLE (decl)
+ && TREE_ADDRESSABLE (decl) /* XXX: not sufficient: return-by-value structs! */
/* The type of the variable must be complete. */
&& COMPLETE_OR_VOID_TYPE_P (TREE_TYPE (decl))
/* The decl hasn't been decomposed somehow. */
+2005-04-12 Frank Ch. Eigler <fche@redhat.com>
+
+ PR mudflap/19266
+ * testsuite/libmudflap.c++/c++frags.exp: Also test -O permutation.
+ * testsuite/libmudflap.c++/pass57-frag.cxx: New test.
+
Index: libmudflap/testsuite/libmudflap.c++/c++frags.exp
===================================================================
RCS file: /cvs/gcc/gcc/libmudflap/testsuite/libmudflap.c++/c++frags.exp,v
retrieving revision 1.5
diff -u -p -r1.5 c++frags.exp
--- libmudflap/testsuite/libmudflap.c++/c++frags.exp 9 Jul 2004 19:51:51 -0000 1.5
+++ libmudflap/testsuite/libmudflap.c++/c++frags.exp 12 Apr 2005 17:33:56 -0000
@@ -5,7 +5,7 @@ dg-init
global srcdir
-foreach flags [list {} {-static} {-O2} {-O3}] {
+foreach flags [list {} {-static} {-O} {-O2} {-O3}] {
foreach srcfile [lsort [glob -nocomplain ${srcdir}/libmudflap.c++/*frag.cxx]] {
set bsrc [file tail $srcfile]
setenv MUDFLAP_OPTIONS "-viol-segv"
Index: libmudflap/testsuite/libmudflap.c++/pass57-frag.cxx
===================================================================
RCS file: libmudflap/testsuite/libmudflap.c++/pass57-frag.cxx
diff -N libmudflap/testsuite/libmudflap.c++/pass57-frag.cxx
--- /dev/null 1 Jan 1970 00:00:00 -0000
+++ libmudflap/testsuite/libmudflap.c++/pass57-frag.cxx 12 Apr 2005 17:33:56 -0000
@@ -0,0 +1,25 @@
+#include <vector>
+#include <string>
+
+class fitscolumn
+ {
+ private:
+ std::string name_, unit_;
+ int i, t;
+ public:
+ fitscolumn (const std::string &nm, const std::string &un,int i1,int t1)
+ : name_(nm), unit_(un), i(i1), t(t1){}
+ };
+
+void init_bintab(std::vector<fitscolumn> & columns_)
+{
+ char ttype[81], tunit[81], tform[81];
+ long repc;
+ int typecode;
+ columns_.push_back (fitscolumn (ttype,tunit,1,typecode));
+}
+
+int main ()
+{
+ return 0;
+}