From 4d70a242e3be09d7209acd5d95d244d63ad651f4 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Jan 12 2010 19:34:20 +0000 Subject: 4.4.2-24 --- diff --git a/.cvsignore b/.cvsignore index 4c25aba..1f5f3be 100644 --- a/.cvsignore +++ b/.cvsignore @@ -1,2 +1,2 @@ fastjar-0.97.tar.gz -gcc-4.4.2-20100109.tar.bz2 +gcc-4.4.2-20100112.tar.bz2 diff --git a/gcc.spec b/gcc.spec index 83e74c5..684ba82 100644 --- a/gcc.spec +++ b/gcc.spec @@ -1,9 +1,9 @@ -%global DATE 20100109 -%global SVNREV 155777 +%global DATE 20100112 +%global SVNREV 155843 %global gcc_version 4.4.2 # Note, gcc_release must be integer, if you want to add suffixes to # %{release}, append them after %{gcc_release} on Release: line. -%global gcc_release 23 +%global gcc_release 24 %global _unpackaged_files_terminate_build 0 %global multilib_64_archs sparc64 ppc64 s390x x86_64 %if 0%{?fedora} >= 13 @@ -165,8 +165,9 @@ Patch16: gcc44-unwind-debug-hook.patch Patch17: gcc44-pr38757.patch Patch18: gcc44-libstdc++-docs.patch Patch19: gcc44-ppc64-aixdesc.patch -Patch20: gcc44-max-vartrack-size.patch +Patch20: gcc44-pr41371.patch Patch21: gcc44-pr42657.patch +Patch22: gcc44-pr42608.patch Patch1000: fastjar-0.97-segfault.patch Patch1001: fastjar-0.97-len1.patch @@ -475,8 +476,9 @@ which are required to compile with the GNAT. %patch18 -p0 -b .libstdc++-docs~ %endif %patch19 -p0 -b .ppc64-aixdesc~ -%patch20 -p0 -b .max-vartrack-size~ +%patch20 -p0 -b .pr41371~ %patch21 -p0 -b .pr42657~ +%patch22 -p0 -b .pr42608~ # This testcase doesn't compile. rm libjava/testsuite/libjava.lang/PR35020* @@ -1866,6 +1868,16 @@ fi %doc rpm.doc/changelogs/libmudflap/ChangeLog* %changelog +* Mon Jan 12 2010 Jakub Jelinek 4.4.2-24 +- update from gcc-4_4-branch + - PRs debug/42662, libjava/40859 +- speed up var-tracking on various KDE sources (PR debug/41371) +- revert --param max-vartrack-size=NNNN hack +- fix up epilogue unwinding with -fsched2-use-superblocks (PR middle-end/41883) +- fix a -fcompare-debug failure (PR tree-optimization/42645) +- don't make undef symbols weak just because they are known to have C++ vague + linkage (PR c++/42608) + * Sat Jan 9 2010 Jakub Jelinek 4.4.2-23 - update from gcc-4_4-branch - PRs target/42511, target/42542, target/42564 diff --git a/gcc44-max-vartrack-size.patch b/gcc44-max-vartrack-size.patch deleted file mode 100644 index 9ac3355..0000000 --- a/gcc44-max-vartrack-size.patch +++ /dev/null @@ -1,230 +0,0 @@ -2010-01-05 Alexandre Oliva - - * params.def (PARAM_MAX_VARTRACK_SIZE): New. - * doc/invoke.texi: Document it. - * var-tracking.c: Include toplev.h and params.h. - (vt_find_locations): Return bool indicating success. Compute - hash sizes unconditionally. Check new parameter, report. - (variable_tracking_main_1): Check vt_find_locations results and - retry. Renamed from... - (variable_tracking_main): ... this. New wrapper to preserve - flag_var_tracking_assignments. - * Makefile.in (var-tracking.o): Adjust dependencies. - ---- gcc/doc/invoke.texi.jj 2009-12-09 00:36:51.000000000 +0100 -+++ gcc/doc/invoke.texi 2010-01-05 10:23:34.000000000 +0100 -@@ -7937,6 +7937,15 @@ with more basic blocks than this paramet - motion optimization performed on them. The default value of the - parameter is 1000 for -O1 and 10000 for -O2 and above. - -+@item max-vartrack-size -+Sets a maximum number of hash table slots to use during variable -+tracking dataflow analysis of any function. If this limit is exceeded -+with variable tracking at assignments enabled, analysis for that -+function is retried without it, after removing all debug insns from -+the function. If the limit is exceeded even without debug insns, var -+tracking analysis is completely disabled for the function. Setting -+the parameter to zero makes it unlimited. -+ - @item min-nondebug-insn-uid - Use uids starting at this parameter for nondebug insns. The range below - the parameter is reserved exclusively for debug insns created by ---- gcc/params.def.jj 2009-09-16 21:35:17.000000000 +0200 -+++ gcc/params.def 2010-01-06 10:18:04.000000000 +0100 -@@ -771,6 +771,13 @@ DEFPARAM (PARAM_LOOP_INVARIANT_MAX_BBS_I - "max basic blocks number in loop for loop invariant motion", - 10000, 0, 0) - -+/* Set maximum hash table size for var tracking. */ -+ -+DEFPARAM (PARAM_MAX_VARTRACK_SIZE, -+ "max-vartrack-size", -+ "Max. size of var tracking hash tables", -+ 5000000, 0, 0) -+ - /* Set minimum insn uid for non-debug insns. */ - - DEFPARAM (PARAM_MIN_NONDEBUG_INSN_UID, ---- gcc/var-tracking.c.jj 2009-12-17 20:42:04.000000000 +0100 -+++ gcc/var-tracking.c 2010-01-06 10:17:28.000000000 +0100 -@@ -108,6 +108,8 @@ - #include "tree-pass.h" - #include "cselib.h" - #include "target.h" -+#include "toplev.h" -+#include "params.h" - - /* Type of micro operation. */ - enum micro_operation_type -@@ -443,7 +445,7 @@ static int add_uses (rtx *, void *); - static void add_uses_1 (rtx *, void *); - static void add_stores (rtx, const_rtx, void *); - static bool compute_bb_dataflow (basic_block); --static void vt_find_locations (void); -+static bool vt_find_locations (void); - - static void dump_attrs_list (attrs); - static int dump_variable_slot (void **, void *); -@@ -5454,7 +5456,7 @@ compute_bb_dataflow (basic_block bb) - - /* Find the locations of variables in the whole function. */ - --static void -+static bool - vt_find_locations (void) - { - fibheap_t worklist, pending, fibheap_swap; -@@ -5465,6 +5467,8 @@ vt_find_locations (void) - int *rc_order; - int i; - int htabsz = 0; -+ int htabmax = PARAM_VALUE (PARAM_MAX_VARTRACK_SIZE); -+ bool success = true; - - /* Compute reverse completion order of depth first search of the CFG - so that the data-flow runs faster. */ -@@ -5486,7 +5490,7 @@ vt_find_locations (void) - fibheap_insert (pending, bb_order[bb->index], bb); - sbitmap_ones (in_pending); - -- while (!fibheap_empty (pending)) -+ while (success && !fibheap_empty (pending)) - { - fibheap_swap = pending; - pending = worklist; -@@ -5509,11 +5513,11 @@ vt_find_locations (void) - - SET_BIT (visited, bb->index); - -- if (dump_file && VTI (bb)->in.vars) -+ if (VTI (bb)->in.vars) - { - htabsz -- -= htab_size (shared_hash_htab (VTI (bb)->in.vars)) -- + htab_size (shared_hash_htab (VTI (bb)->out.vars)); -+ -= (htab_size (shared_hash_htab (VTI (bb)->in.vars)) -+ + htab_size (shared_hash_htab (VTI (bb)->out.vars))); - oldinsz - = htab_elements (shared_hash_htab (VTI (bb)->in.vars)); - oldoutsz -@@ -5577,9 +5581,20 @@ vt_find_locations (void) - } - - changed = compute_bb_dataflow (bb); -- if (dump_file) -- htabsz += htab_size (shared_hash_htab (VTI (bb)->in.vars)) -- + htab_size (shared_hash_htab (VTI (bb)->out.vars)); -+ htabsz += (htab_size (shared_hash_htab (VTI (bb)->in.vars)) -+ + htab_size (shared_hash_htab (VTI (bb)->out.vars))); -+ -+ if (htabmax && htabsz > htabmax) -+ { -+ if (MAY_HAVE_DEBUG_INSNS) -+ inform (DECL_SOURCE_LOCATION (cfun->decl), -+ "variable tracking size limit exceeded with debug insns, retrying without"); -+ else -+ inform (DECL_SOURCE_LOCATION (cfun->decl), -+ "variable tracking size limit exceeded"); -+ success = false; -+ break; -+ } - - if (changed) - { -@@ -5630,7 +5645,7 @@ vt_find_locations (void) - } - } - -- if (MAY_HAVE_DEBUG_INSNS) -+ if (success && MAY_HAVE_DEBUG_INSNS) - FOR_EACH_BB (bb) - gcc_assert (VTI (bb)->flooded); - -@@ -5640,6 +5655,8 @@ vt_find_locations (void) - sbitmap_free (visited); - sbitmap_free (in_worklist); - sbitmap_free (in_pending); -+ -+ return success; - } - - /* Print the content of the LIST to dump file. */ -@@ -7542,9 +7558,11 @@ vt_finalize (void) - - /* The entry point to variable tracking pass. */ - --unsigned int --variable_tracking_main (void) -+static inline unsigned int -+variable_tracking_main_1 (void) - { -+ bool success; -+ - if (flag_var_tracking_assignments < 0) - { - delete_debug_insns (); -@@ -7569,7 +7587,31 @@ variable_tracking_main (void) - } - } - -- vt_find_locations (); -+ success = vt_find_locations (); -+ -+ if (!success && flag_var_tracking_assignments > 0) -+ { -+ vt_finalize (); -+ -+ delete_debug_insns (); -+ -+ /* This is later restored by our caller. */ -+ flag_var_tracking_assignments = 0; -+ -+ vt_initialize (); -+ -+ if (!frame_pointer_needed && !vt_stack_adjustments ()) -+ gcc_unreachable (); -+ -+ success = vt_find_locations (); -+ } -+ -+ if (!success) -+ { -+ vt_finalize (); -+ vt_debug_insns_local (false); -+ return 0; -+ } - - if (dump_file && (dump_flags & TDF_DETAILS)) - { -@@ -7583,6 +7625,19 @@ variable_tracking_main (void) - vt_debug_insns_local (false); - return 0; - } -+ -+unsigned int -+variable_tracking_main (void) -+{ -+ unsigned int ret; -+ int save = flag_var_tracking_assignments; -+ -+ ret = variable_tracking_main_1 (); -+ -+ flag_var_tracking_assignments = save; -+ -+ return ret; -+} - - static bool - gate_handle_var_tracking (void) ---- gcc/Makefile.in.jj 2010-01-04 10:07:40.000000000 +0100 -+++ gcc/Makefile.in 2010-01-05 10:24:39.000000000 +0100 -@@ -2750,7 +2750,8 @@ regstat.o : regstat.c $(CONFIG_H) $(SYST - var-tracking.o : var-tracking.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) \ - $(RTL_H) $(TREE_H) hard-reg-set.h insn-config.h reload.h $(FLAGS_H) \ - $(BASIC_BLOCK_H) output.h sbitmap.h alloc-pool.h $(FIBHEAP_H) $(HASHTAB_H) \ -- $(REGS_H) $(EXPR_H) $(TIMEVAR_H) tree-pass.h cselib.h $(TARGET_H) -+ $(REGS_H) $(EXPR_H) $(TIMEVAR_H) tree-pass.h cselib.h $(TARGET_H) \ -+ $(TOPLEV_H) $(PARAMS_H) - profile.o : profile.c $(CONFIG_H) $(SYSTEM_H) coretypes.h $(TM_H) $(RTL_H) \ - $(TREE_H) $(FLAGS_H) output.h $(REGS_H) $(EXPR_H) $(FUNCTION_H) \ - $(TOPLEV_H) $(COVERAGE_H) $(TREE_FLOW_H) value-prof.h cfghooks.h \ diff --git a/gcc44-pr41371.patch b/gcc44-pr41371.patch new file mode 100644 index 0000000..0f3c48a --- /dev/null +++ b/gcc44-pr41371.patch @@ -0,0 +1,81 @@ +2010-01-12 Jakub Jelinek + + PR debug/41371 + * var-tracking.c (values_to_unmark): New variable. + (find_loc_in_1pdv): Clear VALUE_RECURSED_INTO of values in + values_to_unmark vector. Moved body to... + (find_loc_in_1pdv_1): ... this. Don't clear VALUE_RECRUSED_INTO, + instead queue it into values_to_unmark vector. + (vt_find_locations): Free values_to_unmark vector. + +--- gcc/var-tracking.c.jj 2010-01-12 10:37:30.000000000 +0100 ++++ gcc/var-tracking.c 2010-01-12 17:41:39.000000000 +0100 +@@ -2252,12 +2252,18 @@ dv_changed_p (decl_or_value dv) + : DECL_CHANGED (dv_as_decl (dv))); + } + +-/* Return a location list node whose loc is rtx_equal to LOC, in the ++/* Vector of VALUEs that should have VALUE_RECURSED_INTO bit cleared ++ at the end of find_loc_in_1pdv. Not a static variable in find_loc_in_1pdv ++ to avoid constant allocation/freeing of it. */ ++static VEC(rtx, heap) *values_to_unmark; ++ ++/* Helper function for find_loc_in_1pdv. ++ Return a location list node whose loc is rtx_equal to LOC, in the + location list of a one-part variable or value VAR, or in that of + any values recursively mentioned in the location lists. */ + + static location_chain +-find_loc_in_1pdv (rtx loc, variable var, htab_t vars) ++find_loc_in_1pdv_1 (rtx loc, variable var, htab_t vars) + { + location_chain node; + +@@ -2285,18 +2291,33 @@ find_loc_in_1pdv (rtx loc, variable var, + { + location_chain where; + VALUE_RECURSED_INTO (node->loc) = true; +- if ((where = find_loc_in_1pdv (loc, var, vars))) +- { +- VALUE_RECURSED_INTO (node->loc) = false; +- return where; +- } +- VALUE_RECURSED_INTO (node->loc) = false; ++ VEC_safe_push (rtx, heap, values_to_unmark, node->loc); ++ if ((where = find_loc_in_1pdv_1 (loc, var, vars))) ++ return where; + } + } + + return NULL; + } + ++/* Return a location list node whose loc is rtx_equal to LOC, in the ++ location list of a one-part variable or value VAR, or in that of ++ any values recursively mentioned in the location lists. */ ++ ++static location_chain ++find_loc_in_1pdv (rtx loc, variable var, htab_t vars) ++{ ++ location_chain ret; ++ unsigned int i; ++ rtx value; ++ ++ ret = find_loc_in_1pdv_1 (loc, var, vars); ++ for (i = 0; VEC_iterate (rtx, values_to_unmark, i, value); i++) ++ VALUE_RECURSED_INTO (value) = false; ++ VEC_truncate (rtx, values_to_unmark, 0); ++ return ret; ++} ++ + /* Hash table iteration argument passed to variable_merge. */ + struct dfset_merge + { +@@ -5648,6 +5669,7 @@ vt_find_locations (void) + FOR_EACH_BB (bb) + gcc_assert (VTI (bb)->flooded); + ++ VEC_free (rtx, heap, values_to_unmark); + free (bb_order); + fibheap_delete (worklist); + fibheap_delete (pending); diff --git a/gcc44-pr42608.patch b/gcc44-pr42608.patch new file mode 100644 index 0000000..6002f21 --- /dev/null +++ b/gcc44-pr42608.patch @@ -0,0 +1,68 @@ +2010-01-09 Jakub Jelinek + + PR c++/42608 + * varasm.c (declare_weak): Add weak attribute to decl if it + doesn't have one already. + (assemble_external): Only add decls to weak_decls if they also + have weak attribute. + + * g++.dg/template/instantiate11.C: New test. + +--- gcc/varasm.c.jj 2009-11-09 16:38:29.000000000 +0100 ++++ gcc/varasm.c 2010-01-08 13:30:12.000000000 +0100 +@@ -2309,13 +2309,15 @@ assemble_external (tree decl ATTRIBUTE_U + /* We want to output annotation for weak and external symbols at + very last to check if they are references or not. */ + +- if (SUPPORTS_WEAK && DECL_WEAK (decl) ++ if (SUPPORTS_WEAK ++ && DECL_WEAK (decl) + /* TREE_STATIC is a weird and abused creature which is not + generally the right test for whether an entity has been + locally emitted, inlined or otherwise not-really-extern, but + for declarations that can be weak, it happens to be + match. */ +- && !TREE_STATIC (decl)) ++ && !TREE_STATIC (decl) ++ && lookup_attribute ("weak", DECL_ATTRIBUTES (decl))) + weak_decls = tree_cons (NULL, decl, weak_decls); + + #ifdef ASM_OUTPUT_EXTERNAL +@@ -5008,6 +5010,9 @@ declare_weak (tree decl) + warning (0, "weak declaration of %q+D not supported", decl); + + mark_weak (decl); ++ if (!lookup_attribute ("weak", DECL_ATTRIBUTES (decl))) ++ DECL_ATTRIBUTES (decl) ++ = tree_cons (get_identifier ("weak"), NULL, DECL_ATTRIBUTES (decl)); + } + + static void +--- gcc/testsuite/g++.dg/template/instantiate11.C.jj 2010-01-08 13:48:58.000000000 +0100 ++++ gcc/testsuite/g++.dg/template/instantiate11.C 2010-01-08 14:18:44.000000000 +0100 +@@ -0,0 +1,25 @@ ++// PR c++/42608 ++// { dg-do compile } ++ ++template ++struct A; ++ ++template ++struct A ++{ ++ void f (); ++}; ++ ++template struct A; ++ ++int ++main () ++{ ++ A a; ++ a.f (); ++ return 0; ++} ++ ++// Make sure we get undefined reference error if ++// A::f () isn't instantiated elsewhere. ++// { dg-final { scan-assembler-not "weak\[\n\t\]*_ZN1AIiiE1fEv" } } diff --git a/sources b/sources index 2a741a8..def9ab5 100644 --- a/sources +++ b/sources @@ -1,2 +1,2 @@ 2659f09c2e43ef8b7d4406321753f1b2 fastjar-0.97.tar.gz -8f96c4b6c1ee1928dd5c30f999bf6d86 gcc-4.4.2-20100109.tar.bz2 +9f5b52cba2b186e3e496531b8855f060 gcc-4.4.2-20100112.tar.bz2