Hi!

Further backported patches, bootstrapped/regtested on x86_64-linux and
i686-linux, committed to 4.6 branch.  It has been a while since 4.6.2
has been released, are there any blockers that should be resolved before
4.6.3-rc1?

        Jakub
2012-02-14  Jakub Jelinek  <ja...@redhat.com>

        PR bootstrap/51969
        Backported from mainline
        2011-11-08  Michael Matz  <m...@suse.de>

        * gengtype.c (write_field_root): Avoid out-of-scope access of newv.

--- gcc/gengtype.c      (revision 181171)
+++ gcc/gengtype.c      (revision 181172)
@@ -3651,14 +3651,13 @@ write_field_root (outf_p f, pair_p v, ty
                  int has_length, struct fileloc *line, const char *if_marked,
                  bool emit_pch, type_p field_type, const char *field_name)
 {
+  struct pair newv;
   /* If the field reference is relative to V, rather than to some
      subcomponent of V, we can mark any subarrays with a single stride.
      We're effectively treating the field as a global variable in its
      own right.  */
   if (v && type == v->type)
     {
-      struct pair newv;
-
       newv = *v;
       newv.type = field_type;
       newv.name = ACONCAT ((v->name, ".", field_name, NULL));
2012-02-14  Jakub Jelinek  <ja...@redhat.com>

        Backported from mainline
        2012-02-13  Jakub Jelinek  <ja...@redhat.com>

        PR middle-end/52230
        * omp-low.c (expand_omp_for): If a static schedule without
        chunk size has NULL region->cont, force fd.chunk_size to be
        integer_zero_node.

--- gcc/omp-low.c       (revision 184164)
+++ gcc/omp-low.c       (revision 184165)
@@ -4664,6 +4664,9 @@ expand_omp_for (struct omp_region *regio
     {
       int fn_index, start_ix, next_ix;
 
+      if (fd.chunk_size == NULL
+         && fd.sched_kind == OMP_CLAUSE_SCHEDULE_STATIC)
+       fd.chunk_size = integer_zero_node;
       gcc_assert (fd.sched_kind != OMP_CLAUSE_SCHEDULE_AUTO);
       fn_index = (fd.sched_kind == OMP_CLAUSE_SCHEDULE_RUNTIME)
                  ? 3 : fd.sched_kind;
2012-02-14  Jakub Jelinek  <ja...@redhat.com>

        Backported from mainline
        2012-02-13  Jakub Jelinek  <ja...@redhat.com>

        * cselib.c (dump_cselib_val): Don't assume l->setting_insn is
        non-NULL.

--- gcc/cselib.c        (revision 184167)
+++ gcc/cselib.c        (revision 184168)
@@ -2688,8 +2688,11 @@ dump_cselib_val (void **x, void *info)
       fputs (" locs:", out);
       do
        {
-         fprintf (out, "\n  from insn %i ",
-                  INSN_UID (l->setting_insn));
+         if (l->setting_insn)
+           fprintf (out, "\n  from insn %i ",
+                    INSN_UID (l->setting_insn));
+         else
+           fprintf (out, "\n   ");
          print_inline_rtx (out, l->loc, 4);
        }
       while ((l = l->next));
2012-02-14  Jakub Jelinek  <ja...@redhat.com>

        Backported from mainline
        2012-02-14  Jakub Jelinek  <ja...@redhat.com>

        PR c/52181
        * c-decl.c (merge_decls): Copy DECL_USER_ALIGN bit from olddecl to
        newdecl.

        * decl.c (duplicate_decls): If olddecl has bigger DECL_ALIGN than
        newdecl, copy DECL_ALIGN to newdecl and or DECL_USER_ALIGN bits.

        * c-c++-common/pr52181.c: New test.

--- gcc/c-decl.c        (revision 184192)
+++ gcc/c-decl.c        (revision 184193)
@@ -2449,6 +2449,7 @@ merge_decls (tree newdecl, tree olddecl,
     memcpy ((char *) olddecl + sizeof (struct tree_common),
            (char *) newdecl + sizeof (struct tree_common),
            sizeof (struct tree_decl_common) - sizeof (struct tree_common));
+    DECL_USER_ALIGN (olddecl) = DECL_USER_ALIGN (newdecl);
     switch (TREE_CODE (olddecl))
       {
       case FUNCTION_DECL:
--- gcc/cp/decl.c       (revision 184192)
+++ gcc/cp/decl.c       (revision 184193)
@@ -2214,7 +2214,12 @@ duplicate_decls (tree newdecl, tree oldd
       SET_DECL_INIT_PRIORITY (olddecl, DECL_INIT_PRIORITY (newdecl));
       DECL_HAS_INIT_PRIORITY_P (olddecl) = 1;
     }
-  /* Likewise for DECL_USER_ALIGN and DECL_PACKED.  */
+  /* Likewise for DECL_ALIGN, DECL_USER_ALIGN and DECL_PACKED.  */
+  if (DECL_ALIGN (olddecl) > DECL_ALIGN (newdecl))
+    {
+      DECL_ALIGN (newdecl) = DECL_ALIGN (olddecl);
+      DECL_USER_ALIGN (newdecl) |= DECL_USER_ALIGN (olddecl);
+    }
   DECL_USER_ALIGN (olddecl) = DECL_USER_ALIGN (newdecl);
   if (TREE_CODE (newdecl) == FIELD_DECL)
     DECL_PACKED (olddecl) = DECL_PACKED (newdecl);
--- gcc/testsuite/c-c++-common/pr52181.c        (revision 0)
+++ gcc/testsuite/c-c++-common/pr52181.c        (revision 184193)
@@ -0,0 +1,13 @@
+/* PR c/52181 */
+/* { dg-do compile } */
+
+extern const int v1[];
+const int __attribute__((aligned(16))) v1[] = { 1 };
+extern const int __attribute__((aligned(16))) v2[];
+const int v2[] = { 1 };
+extern const int __attribute__((aligned(16))) v3[];
+const int __attribute__((aligned(16))) v3[] = { 1 };
+const int __attribute__((aligned(16))) v4[] = { 1 };
+int test[(__alignof__ (v4) != __alignof__ (v1)         /* { dg-bogus "is 
negative" } */
+        || __alignof__ (v4) != __alignof__ (v2)
+        || __alignof__ (v4) != __alignof__ (v3)) ? -1 : 0];
2012-02-14  Jakub Jelinek  <ja...@redhat.com>

        Backported from mainline
        2012-02-14  Jakub Jelinek  <ja...@redhat.com>

        PR debug/51950
        * dwarf2out.c (clone_tree_hash): New function.
        (copy_decls_walk): Use it instead of clone_tree.

--- gcc/dwarf2out.c     (revision 184223)
+++ gcc/dwarf2out.c     (revision 184224)
@@ -7407,6 +7407,32 @@ copy_ancestor_tree (dw_die_ref unit, dw_
   return copy;
 }
 
+/* Like clone_tree, but additionally enter all the children into
+   the hash table decl_table.  */
+
+static dw_die_ref
+clone_tree_hash (dw_die_ref die, htab_t decl_table)
+{
+  dw_die_ref c;
+  dw_die_ref clone = clone_die (die);
+  struct decl_table_entry *entry;
+  void **slot = htab_find_slot_with_hash (decl_table, die,
+                                         htab_hash_pointer (die), INSERT);
+  /* Assert that DIE isn't in the hash table yet.  If it would be there
+     before, the ancestors would be necessarily there as well, therefore
+     clone_tree_hash wouldn't be called.  */
+  gcc_assert (*slot == HTAB_EMPTY_ENTRY);
+  entry = XCNEW (struct decl_table_entry);
+  entry->orig = die;
+  entry->copy = clone;
+  *slot = entry;
+
+  FOR_EACH_CHILD (die, c,
+                 add_child_die (clone, clone_tree_hash (c, decl_table)));
+
+  return clone;
+}
+
 /* Walk the DIE and its children, looking for references to incomplete
    or trivial types that are unmarked (i.e., that are not in the current
    type_unit).  */
@@ -7443,7 +7469,11 @@ copy_decls_walk (dw_die_ref unit, dw_die
           else
             {
               dw_die_ref parent = unit;
-              dw_die_ref copy = clone_tree (targ);
+             dw_die_ref copy = clone_die (targ);
+
+             FOR_EACH_CHILD (targ, c,
+                             add_child_die (copy,
+                                            clone_tree_hash (c, decl_table)));
 
               /* Make sure the cloned tree is marked as part of the
                  type unit.  */
2012-02-14  Jakub Jelinek  <ja...@redhat.com>

        Backported from mainline
        2012-02-14  Jakub Jelinek  <ja...@redhat.com>

        PR c++/52247
        * pt.c (tsubst_copy_asm_operands): For LABEL_DECL values call
        lookup_label on label's name and set TREE_USED.

        * g++.dg/template/asmgoto1.C: New test.

--- gcc/cp/pt.c (revision 184228)
+++ gcc/cp/pt.c (revision 184229)
@@ -12612,8 +12612,17 @@ tsubst_copy_asm_operands (tree t, tree a
   if (purpose)
     purpose = RECUR (purpose);
   value = TREE_VALUE (t);
-  if (value && TREE_CODE (value) != LABEL_DECL)
-    value = RECUR (value);
+  if (value)
+    {
+      if (TREE_CODE (value) != LABEL_DECL)
+       value = RECUR (value);
+      else
+       {
+         value = lookup_label (DECL_NAME (value));
+         gcc_assert (TREE_CODE (value) == LABEL_DECL);
+         TREE_USED (value) = 1;
+       }
+    }
   chain = TREE_CHAIN (t);
   if (chain && chain != void_type_node)
     chain = RECUR (chain);
--- gcc/testsuite/g++.dg/template/asmgoto1.C    (revision 0)
+++ gcc/testsuite/g++.dg/template/asmgoto1.C    (revision 184229)
@@ -0,0 +1,18 @@
+// PR c++/52247
+// { dg-do compile }
+
+template <int N>
+bool
+bar ()
+{
+  __asm goto ("" : : : : lab);
+  return true;
+lab:
+  return false;
+}
+
+bool
+foo ()
+{
+  return bar<0> ();
+}

Reply via email to