Changeset 1864309 for patches


Ignore:
Timestamp:
Oct 1, 2013, 9:38:35 AM (6 years ago)
Author:
William Harrington <kb0iic@…>
Branches:
clfs-2.1, clfs-3.0.0-systemd, clfs-3.0.0-sysvinit, master, systemd, sysvinit
Children:
e53d8f54
Parents:
23a1e45
Message:

Update GCC Branch update patch.

File:
1 moved

Legend:

Unmodified
Added
Removed
  • patches/gcc-4.8.1-branch_update-3.patch

    r23a1e45 r1864309  
    11Submitted By: William Harrington (kb0iic at cross-lfs dot org)
    2 Date: 09-19-2013
     2Date: 10-01-2013
    33Initial Package Version: 4.8.1
    44Origin: Upstream
     
    77             rechecked periodically.
    88
    9 This patch was made from Revision # 202050.
    10 Added fix for BUILD¿CXXFLAGS.
    11 Added fix for ISL.
     9This patch was made from Revision # 203062.
    1210
    13 diff -Naur gcc-4.8.1.orig/ChangeLog gcc-4.8.1/ChangeLog
    14 --- gcc-4.8.1.orig/ChangeLog    2013-05-31 09:00:41.000000000 +0000
    15 +++ gcc-4.8.1/ChangeLog 2013-09-13 19:01:43.959862879 +0000
    16 @@ -1,3 +1,12 @@
    17 +2013-07-13  Tobias Grosser  <tobias@grosser.es>
    18 +
    19 +       PR tree-optimization/54094
    20 +       * graphite-clast-to-gimple.c (translate_clast_for_loop): Derive the
    21 +         scheduling dimension for the parallelism check from the polyhedral
    22 +         information in the AST.
    23 +       * graphite-dependences.c (carries_deps): Do not assume the schedule is
    24 +         in 2D + 1 form.
    25 +
    26  2013-05-31  Release Manager
    27  
    28         * GCC 4.8.1 released.
     11Added fix for BUILD_CXXFLAGS during crosscompile.
     12Added fix for ISL 2D + 1 form in parallelism check.
     13
     14diff -Naur gcc-4.8.1.orig/boehm-gc/Makefile.am gcc-4.8.1/boehm-gc/Makefile.am
     15--- gcc-4.8.1.orig/boehm-gc/Makefile.am 2013-03-22 14:19:12.000000000 +0000
     16+++ gcc-4.8.1/boehm-gc/Makefile.am      2013-10-01 16:06:43.760554292 +0000
     17@@ -35,7 +35,7 @@
     18 
     19 # Include THREADLIBS here to ensure that the correct versions of
     20 # linuxthread semaphore functions get linked:
     21-libgcjgc_la_LIBADD = $(addobjs) $(THREADLIBS)
     22+libgcjgc_la_LIBADD = $(addobjs) $(THREADLIBS) $(EXTRA_TEST_LIBS)
     23 libgcjgc_la_DEPENDENCIES = $(addobjs)
     24 libgcjgc_la_LDFLAGS = $(extra_ldflags_libgc) -version-info 1:2:0 -rpath $(toolexeclibdir)
     25 libgcjgc_la_LINK = $(LINK) $(libgcjgc_la_LDFLAGS)
     26diff -Naur gcc-4.8.1.orig/boehm-gc/Makefile.in gcc-4.8.1/boehm-gc/Makefile.in
     27--- gcc-4.8.1.orig/boehm-gc/Makefile.in 2013-05-31 09:09:26.000000000 +0000
     28+++ gcc-4.8.1/boehm-gc/Makefile.in      2013-10-01 16:06:43.760554292 +0000
     29@@ -280,7 +280,7 @@
     30 
     31 # Include THREADLIBS here to ensure that the correct versions of
     32 # linuxthread semaphore functions get linked:
     33-libgcjgc_la_LIBADD = $(addobjs) $(THREADLIBS)
     34+libgcjgc_la_LIBADD = $(addobjs) $(THREADLIBS) $(EXTRA_TEST_LIBS)
     35 libgcjgc_la_DEPENDENCIES = $(addobjs)
     36 libgcjgc_la_LDFLAGS = $(extra_ldflags_libgc) -version-info 1:2:0 -rpath $(toolexeclibdir)
     37 libgcjgc_la_LINK = $(LINK) $(libgcjgc_la_LDFLAGS)
     38diff -Naur gcc-4.8.1.orig/configure gcc-4.8.1/configure
     39--- gcc-4.8.1.orig/configure    2013-02-15 17:45:54.000000000 +0000
     40+++ gcc-4.8.1/configure 2013-10-01 16:06:43.764554292 +0000
     41@@ -5939,6 +5939,55 @@
     42   fi
     43 
     44 
     45+    if test "${gcc_cv_isl}" = no ; then
     46+
     47+  if test "${ENABLE_ISL_CHECK}" = yes ; then
     48+    _isl_saved_CFLAGS=$CFLAGS
     49+    _isl_saved_LDFLAGS=$LDFLAGS
     50+    _isl_saved_LIBS=$LIBS
     51+
     52+    CFLAGS="${_isl_saved_CFLAGS} ${islinc} ${gmpinc}"
     53+    LDFLAGS="${_isl_saved_LDFLAGS} ${isllibs}"
     54+    LIBS="${_isl_saved_LIBS} -lisl"
     55+
     56+    { $as_echo "$as_me:${as_lineno-$LINENO}: checking for version 0.12 of ISL" >&5
     57+$as_echo_n "checking for version 0.12 of ISL... " >&6; }
     58+    if test "$cross_compiling" = yes; then :
     59+  gcc_cv_isl=yes
     60+else
     61+  cat confdefs.h - <<_ACEOF >conftest.$ac_ext
     62+/* end confdefs.h.  */
     63+#include <isl/version.h>
     64+   #include <string.h>
     65+int
     66+main ()
     67+{
     68+if (strncmp (isl_version (), "isl-0.12", strlen ("isl-0.12")) != 0)
     69+     return 1;
     70+
     71+  ;
     72+  return 0;
     73+}
     74+_ACEOF
     75+if ac_fn_c_try_run "$LINENO"; then :
     76+  gcc_cv_isl=yes
     77+else
     78+  gcc_cv_isl=no
     79+fi
     80+rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \
     81+  conftest.$ac_objext conftest.beam conftest.$ac_ext
     82+fi
     83+
     84+    { $as_echo "$as_me:${as_lineno-$LINENO}: result: $gcc_cv_isl" >&5
     85+$as_echo "$gcc_cv_isl" >&6; }
     86+
     87+    CFLAGS=$_isl_saved_CFLAGS
     88+    LDFLAGS=$_isl_saved_LDFLAGS
     89+    LIBS=$_isl_saved_LIBS
     90+  fi
     91+
     92+
     93+    fi
     94   fi
     95 
     96 
     97diff -Naur gcc-4.8.1.orig/configure.ac gcc-4.8.1/configure.ac
     98--- gcc-4.8.1.orig/configure.ac 2013-02-15 17:45:54.000000000 +0000
     99+++ gcc-4.8.1/configure.ac      2013-10-01 16:06:43.764554292 +0000
     100@@ -1630,6 +1630,9 @@
     101   ISL_CHECK_VERSION(0,10)
     102   if test "${gcc_cv_isl}" = no ; then
     103     ISL_CHECK_VERSION(0,11)
     104+    if test "${gcc_cv_isl}" = no ; then
     105+      ISL_CHECK_VERSION(0,12)
     106+    fi
     107   fi
     108   dnl Only execute fail-action, if ISL has been requested.
     109   ISL_IF_FAILED([
    29110diff -Naur gcc-4.8.1.orig/fixincludes/fixincl.x gcc-4.8.1/fixincludes/fixincl.x
    30111--- gcc-4.8.1.orig/fixincludes/fixincl.x        2013-01-16 04:07:20.000000000 +0000
    31 +++ gcc-4.8.1/fixincludes/fixincl.x     2013-09-13 19:01:42.876532387 +0000
     112+++ gcc-4.8.1/fixincludes/fixincl.x     2013-10-01 16:06:43.764554292 +0000
    32113@@ -2,11 +2,11 @@
    33114  *
     
    55136diff -Naur gcc-4.8.1.orig/fixincludes/inclhack.def gcc-4.8.1/fixincludes/inclhack.def
    56137--- gcc-4.8.1.orig/fixincludes/inclhack.def     2013-01-16 04:07:20.000000000 +0000
    57 +++ gcc-4.8.1/fixincludes/inclhack.def  2013-09-13 19:01:42.879865711 +0000
     138+++ gcc-4.8.1/fixincludes/inclhack.def  2013-10-01 16:06:43.764554292 +0000
    58139@@ -3447,7 +3447,7 @@
    59140 
     
    76157diff -Naur gcc-4.8.1.orig/fixincludes/tests/base/iso/math_iso.h gcc-4.8.1/fixincludes/tests/base/iso/math_iso.h
    77158--- gcc-4.8.1.orig/fixincludes/tests/base/iso/math_iso.h        2011-08-10 08:43:38.000000000 +0000
    78 +++ gcc-4.8.1/fixincludes/tests/base/iso/math_iso.h     2013-09-13 19:01:42.879865711 +0000
     159+++ gcc-4.8.1/fixincludes/tests/base/iso/math_iso.h     2013-10-01 16:06:43.764554292 +0000
    79160@@ -10,7 +10,7 @@
    80161 
     
    86167                __powl(__X, (long double) (__Y)); }
    87168 #endif
     169diff -Naur gcc-4.8.1.orig/gcc/ChangeLog gcc-4.8.1/gcc/ChangeLog
     170--- gcc-4.8.1.orig/gcc/ChangeLog        2013-05-31 09:02:05.000000000 +0000
     171+++ gcc-4.8.1/gcc/ChangeLog     2013-10-01 16:08:15.584551652 +0000
     172@@ -1,3 +1,12 @@
     173+2013-07-13  Tobias Grosser  <tobias@grosser.es>
     174+
     175+       PR tree-optimization/54094
     176+       * graphite-clast-to-gimple.c (translate_clast_for_loop): Derive the
     177+         scheduling dimension for the parallelism check from the polyhedral
     178+         information in the AST.
     179+       * graphite-dependences.c (carries_deps): Do not assume the schedule is
     180+         in 2D + 1 form.
     181+
     182 2013-05-31  Release Manager
     183 
     184        * GCC 4.8.1 released.
    88185diff -Naur gcc-4.8.1.orig/gcc/DATESTAMP gcc-4.8.1/gcc/DATESTAMP
    89186--- gcc-4.8.1.orig/gcc/DATESTAMP        2013-05-31 00:16:35.000000000 +0000
    90 +++ gcc-4.8.1/gcc/DATESTAMP     2013-09-13 19:01:43.079865187 +0000
     187+++ gcc-4.8.1/gcc/DATESTAMP     2013-10-01 16:06:43.968554286 +0000
    91188@@ -1 +1 @@
    92189-20130531
    93 +20130828
     190+20131001
    94191diff -Naur gcc-4.8.1.orig/gcc/Makefile.in gcc-4.8.1/gcc/Makefile.in
    95192--- gcc-4.8.1.orig/gcc/Makefile.in      2013-05-21 16:00:49.000000000 +0000
    96 +++ gcc-4.8.1/gcc/Makefile.in   2013-09-13 19:01:43.176531600 +0000
     193+++ gcc-4.8.1/gcc/Makefile.in   2013-10-01 16:06:43.996554285 +0000
    97194@@ -2505,7 +2505,7 @@
    98195    $(TM_H) coretypes.h $(TREE_PASS_H) $(FLAGS_H) \
     
    106203diff -Naur gcc-4.8.1.orig/gcc/ada/gcc-interface/ada-tree.h gcc-4.8.1/gcc/ada/gcc-interface/ada-tree.h
    107204--- gcc-4.8.1.orig/gcc/ada/gcc-interface/ada-tree.h     2013-02-25 19:08:51.000000000 +0000
    108 +++ gcc-4.8.1/gcc/ada/gcc-interface/ada-tree.h  2013-09-13 19:01:42.883199036 +0000
     205+++ gcc-4.8.1/gcc/ada/gcc-interface/ada-tree.h  2013-10-01 16:06:43.764554292 +0000
    109206@@ -360,10 +360,6 @@
    110207    constant CONSTRUCTOR.  */
     
    120217diff -Naur gcc-4.8.1.orig/gcc/ada/gcc-interface/decl.c gcc-4.8.1/gcc/ada/gcc-interface/decl.c
    121218--- gcc-4.8.1.orig/gcc/ada/gcc-interface/decl.c 2013-05-07 08:03:15.000000000 +0000
    122 +++ gcc-4.8.1/gcc/ada/gcc-interface/decl.c      2013-09-13 19:01:42.886532361 +0000
     219+++ gcc-4.8.1/gcc/ada/gcc-interface/decl.c      2013-10-01 16:06:43.764554292 +0000
    123220@@ -1019,7 +1019,7 @@
    124221                        save_gnu_tree (gnat_entity, gnu_decl, true);
     
    199296diff -Naur gcc-4.8.1.orig/gcc/ada/gcc-interface/gigi.h gcc-4.8.1/gcc/ada/gcc-interface/gigi.h
    200297--- gcc-4.8.1.orig/gcc/ada/gcc-interface/gigi.h 2013-02-06 13:19:20.000000000 +0000
    201 +++ gcc-4.8.1/gcc/ada/gcc-interface/gigi.h      2013-09-13 19:01:42.886532361 +0000
     298+++ gcc-4.8.1/gcc/ada/gcc-interface/gigi.h      2013-10-01 16:06:43.768554292 +0000
    202299@@ -177,10 +177,9 @@
    203300 /* Given GNAT_ENTITY, an object (constant, variable, parameter, exception)
     
    230327diff -Naur gcc-4.8.1.orig/gcc/ada/gcc-interface/trans.c gcc-4.8.1/gcc/ada/gcc-interface/trans.c
    231328--- gcc-4.8.1.orig/gcc/ada/gcc-interface/trans.c        2013-05-26 10:04:50.000000000 +0000
    232 +++ gcc-4.8.1/gcc/ada/gcc-interface/trans.c     2013-09-13 19:01:42.889865685 +0000
    233 @@ -1075,19 +1075,6 @@
     329+++ gcc-4.8.1/gcc/ada/gcc-interface/trans.c     2013-10-01 16:06:43.768554292 +0000
     330@@ -286,9 +286,6 @@
     331   tree int64_type = gnat_type_for_size (64, 0);
     332   struct elab_info *info;
     333   int i;
     334-#ifdef ORDINARY_MAP_INSTANCE
     335-  struct line_map *map;
     336-#endif
     337 
     338   max_gnat_nodes = max_gnat_node;
     339 
     340@@ -303,10 +300,6 @@
     341 
     342   type_annotate_only = (gigi_operating_mode == 1);
     343 
     344-  /* ??? Disable the generation of the SCO instance table until after the
     345-     back-end supports instance based debug info discriminators.  */
     346-  Generate_SCO_Instance_Table = False;
     347-
     348   for (i = 0; i < number_file; i++)
     349     {
     350       /* Use the identifier table to make a permanent copy of the filename as
     351@@ -326,11 +319,6 @@
     352       /* We create the line map for a source file at once, with a fixed number
     353         of columns chosen to avoid jumping over the next power of 2.  */
     354       linemap_add (line_table, LC_ENTER, 0, filename, 1);
     355-#ifdef ORDINARY_MAP_INSTANCE
     356-      map = LINEMAPS_ORDINARY_MAP_AT (line_table, i);
     357-      if (flag_debug_instances)
     358-       ORDINARY_MAP_INSTANCE (map) = file_info_ptr[i].Instance;
     359-#endif
     360       linemap_line_start (line_table, file_info_ptr[i].Num_Source_Lines, 252);
     361       linemap_position_for_column (line_table, 252 - 1);
     362       linemap_add (line_table, LC_LEAVE, 0, NULL, 0);
     363@@ -1075,19 +1063,6 @@
    234364     {
    235365       const bool read_only = DECL_POINTS_TO_READONLY_P (gnu_result);
     
    251381       if (TREE_CODE (gnu_result) == PARM_DECL
    252382          && DECL_BY_COMPONENT_PTR_P (gnu_result))
    253 @@ -2280,7 +2267,10 @@
     383@@ -1290,6 +1265,7 @@
     384 static tree
     385 Attribute_to_gnu (Node_Id gnat_node, tree *gnu_result_type_p, int attribute)
     386 {
     387+  const Node_Id gnat_prefix = Prefix (gnat_node);
     388   tree gnu_prefix, gnu_type, gnu_expr;
     389   tree gnu_result_type, gnu_result = error_mark_node;
     390   bool prefix_unused = false;
     391@@ -1299,13 +1275,13 @@
     392      parameter types might be incomplete types coming from a limited with.  */
     393   if (Ekind (Etype (gnat_node)) == E_Access_Subprogram_Type
     394       && Is_Dispatch_Table_Entity (Etype (gnat_node))
     395-      && Nkind (Prefix (gnat_node)) == N_Identifier
     396-      && Is_Subprogram (Entity (Prefix (gnat_node)))
     397-      && Is_Public (Entity (Prefix (gnat_node)))
     398-      && !present_gnu_tree (Entity (Prefix (gnat_node))))
     399-    gnu_prefix = get_minimal_subprog_decl (Entity (Prefix (gnat_node)));
     400+      && Nkind (gnat_prefix) == N_Identifier
     401+      && Is_Subprogram (Entity (gnat_prefix))
     402+      && Is_Public (Entity (gnat_prefix))
     403+      && !present_gnu_tree (Entity (gnat_prefix)))
     404+    gnu_prefix = get_minimal_subprog_decl (Entity (gnat_prefix));
     405   else
     406-    gnu_prefix = gnat_to_gnu (Prefix (gnat_node));
     407+    gnu_prefix = gnat_to_gnu (gnat_prefix);
     408   gnu_type = TREE_TYPE (gnu_prefix);
     409 
     410   /* If the input is a NULL_EXPR, make a new one.  */
     411@@ -1448,8 +1424,8 @@
     412         since it can use a special calling convention on some platforms,
     413         which cannot be propagated to the access type.  */
     414       else if (attribute == Attr_Access
     415-              && Nkind (Prefix (gnat_node)) == N_Identifier
     416-              && is_cplusplus_method (Entity (Prefix (gnat_node))))
     417+              && Nkind (gnat_prefix) == N_Identifier
     418+              && is_cplusplus_method (Entity (gnat_prefix)))
     419        post_error ("access to C++ constructor or member function not allowed",
     420                    gnat_node);
     421 
     422@@ -1560,13 +1536,12 @@
     423          /* If this is a dereference and we have a special dynamic constrained
     424             subtype on the prefix, use it to compute the size; otherwise, use
     425             the designated subtype.  */
     426-         if (Nkind (Prefix (gnat_node)) == N_Explicit_Dereference)
     427+         if (Nkind (gnat_prefix) == N_Explicit_Dereference)
     428            {
     429-             Node_Id gnat_deref = Prefix (gnat_node);
     430              Node_Id gnat_actual_subtype
     431-               = Actual_Designated_Subtype (gnat_deref);
     432+               = Actual_Designated_Subtype (gnat_prefix);
     433              tree gnu_ptr_type
     434-               = TREE_TYPE (gnat_to_gnu (Prefix (gnat_deref)));
     435+               = TREE_TYPE (gnat_to_gnu (Prefix (gnat_prefix)));
     436 
     437              if (TYPE_IS_FAT_OR_THIN_POINTER_P (gnu_ptr_type)
     438                  && Present (gnat_actual_subtype))
     439@@ -1627,7 +1602,6 @@
     440          align = DECL_ALIGN (TREE_OPERAND (gnu_prefix, 1)) / BITS_PER_UNIT;
     441        else
     442          {
     443-           Node_Id gnat_prefix = Prefix (gnat_node);
     444            Entity_Id gnat_type = Etype (gnat_prefix);
     445            unsigned int double_align;
     446            bool is_capped_double, align_clause;
     447@@ -1699,28 +1673,38 @@
     448                         : 1), i;
     449        struct parm_attr_d *pa = NULL;
     450        Entity_Id gnat_param = Empty;
     451+       bool unconstrained_ptr_deref = false;
     452 
     453        /* Make sure any implicit dereference gets done.  */
     454        gnu_prefix = maybe_implicit_deref (gnu_prefix);
     455        gnu_prefix = maybe_unconstrained_array (gnu_prefix);
     456 
     457-       /* We treat unconstrained array In parameters specially.  */
     458-       if (!Is_Constrained (Etype (Prefix (gnat_node))))
     459-         {
     460-           Node_Id gnat_prefix = Prefix (gnat_node);
     461+       /* We treat unconstrained array In parameters specially.  We also note
     462+          whether we are dereferencing a pointer to unconstrained array.  */
     463+       if (!Is_Constrained (Etype (gnat_prefix)))
     464+         switch (Nkind (gnat_prefix))
     465+           {
     466+           case N_Identifier:
     467+             /* This is the direct case.  */
     468+             if (Ekind (Entity (gnat_prefix)) == E_In_Parameter)
     469+               gnat_param = Entity (gnat_prefix);
     470+             break;
     471 
     472-           /* This is the direct case.  */
     473-           if (Nkind (gnat_prefix) == N_Identifier
     474-               && Ekind (Entity (gnat_prefix)) == E_In_Parameter)
     475-             gnat_param = Entity (gnat_prefix);
     476-
     477-           /* This is the indirect case.  Note that we need to be sure that
     478-              the access value cannot be null as we'll hoist the load.  */
     479-           if (Nkind (gnat_prefix) == N_Explicit_Dereference
     480-               && Nkind (Prefix (gnat_prefix)) == N_Identifier
     481-               && Ekind (Entity (Prefix (gnat_prefix))) == E_In_Parameter
     482-               && Can_Never_Be_Null (Entity (Prefix (gnat_prefix))))
     483-             gnat_param = Entity (Prefix (gnat_prefix));
     484+           case N_Explicit_Dereference:
     485+             /* This is the indirect case.  Note that we need to be sure that
     486+                the access value cannot be null as we'll hoist the load.  */
     487+             if (Nkind (Prefix (gnat_prefix)) == N_Identifier
     488+                 && Ekind (Entity (Prefix (gnat_prefix))) == E_In_Parameter)
     489+               {
     490+                 if (Can_Never_Be_Null (Entity (Prefix (gnat_prefix))))
     491+                   gnat_param = Entity (Prefix (gnat_prefix));
     492+               }
     493+             else
     494+               unconstrained_ptr_deref = true;
     495+             break;
     496+
     497+           default:
     498+             break;
     499          }
     500 
     501        /* If the prefix is the view conversion of a constrained array to an
     502@@ -1855,22 +1839,54 @@
     503          {
     504            gnu_result
     505              = build1 (SAVE_EXPR, TREE_TYPE (gnu_result), gnu_result);
     506-           if (attribute == Attr_First)
     507-             pa->first = gnu_result;
     508-           else if (attribute == Attr_Last)
     509-             pa->last = gnu_result;
     510-           else
     511-             pa->length = gnu_result;
     512+           switch (attribute)
     513+             {
     514+             case Attr_First:
     515+               pa->first = gnu_result;
     516+               break;
     517+
     518+             case Attr_Last:
     519+               pa->last = gnu_result;
     520+               break;
     521+
     522+             case Attr_Length:
     523+             case Attr_Range_Length:
     524+               pa->length = gnu_result;
     525+               break;
     526+
     527+             default:
     528+               gcc_unreachable ();
     529+             }
     530          }
     531 
     532-       /* Set the source location onto the predicate of the condition in the
     533-          'Length case but do not do it if the expression is cached to avoid
     534-          messing up the debug info.  */
     535-       else if ((attribute == Attr_Range_Length || attribute == Attr_Length)
     536-                && TREE_CODE (gnu_result) == COND_EXPR
     537-                && EXPR_P (TREE_OPERAND (gnu_result, 0)))
     538-         set_expr_location_from_node (TREE_OPERAND (gnu_result, 0),
     539-                                      gnat_node);
     540+       /* Otherwise, evaluate it each time it is referenced.  */
     541+       else
     542+         switch (attribute)
     543+           {
     544+           case Attr_First:
     545+           case Attr_Last:
     546+             /* If we are dereferencing a pointer to unconstrained array, we
     547+                need to capture the value because the pointed-to bounds may
     548+                subsequently be released.  */
     549+             if (unconstrained_ptr_deref)
     550+               gnu_result
     551+                 = build1 (SAVE_EXPR, TREE_TYPE (gnu_result), gnu_result);
     552+             break;
     553+
     554+           case Attr_Length:
     555+           case Attr_Range_Length:
     556+             /* Set the source location onto the predicate of the condition
     557+                but not if the expression is cached to avoid messing up the
     558+                debug info.  */
     559+             if (TREE_CODE (gnu_result) == COND_EXPR
     560+                 && EXPR_P (TREE_OPERAND (gnu_result, 0)))
     561+               set_expr_location_from_node (TREE_OPERAND (gnu_result, 0),
     562+                                            gnat_node);
     563+             break;
     564+
     565+           default:
     566+             gcc_unreachable ();
     567+           }
     568 
     569        break;
     570       }
     571@@ -2043,8 +2059,8 @@
     572 
     573     case Attr_Mechanism_Code:
     574       {
     575+       Entity_Id gnat_obj = Entity (gnat_prefix);
     576        int code;
     577-       Entity_Id gnat_obj = Entity (Prefix (gnat_node));
     578 
     579        prefix_unused = true;
     580        gnu_result_type = get_unpadded_type (Etype (gnat_node));
     581@@ -2079,10 +2095,11 @@
     582      it has a side-effect.  But don't do it if the prefix is just an entity
     583      name.  However, if an access check is needed, we must do it.  See second
     584      example in AARM 11.6(5.e).  */
     585-  if (prefix_unused && TREE_SIDE_EFFECTS (gnu_prefix)
     586-      && !Is_Entity_Name (Prefix (gnat_node)))
     587-    gnu_result = build_compound_expr  (TREE_TYPE (gnu_result), gnu_prefix,
     588-                                      gnu_result);
     589+  if (prefix_unused
     590+      && TREE_SIDE_EFFECTS (gnu_prefix)
     591+      && !Is_Entity_Name (gnat_prefix))
     592+    gnu_result
     593+      = build_compound_expr  (TREE_TYPE (gnu_result), gnu_prefix, gnu_result);
     594 
     595   *gnu_result_type_p = gnu_result_type;
     596   return gnu_result;
     597@@ -2280,7 +2297,10 @@
    254598   if (TREE_CODE (val) != INTEGER_CST)
    255599     return true;
     
    263607 
    264608 /* Return true if VAL (of type TYPE) can equal the minimum value of TYPE.
    265 @@ -3251,7 +3241,6 @@
     609@@ -3251,7 +3271,6 @@
    266610            = convert_vms_descriptor (TREE_TYPE (gnu_subprog_param),
    267611                                      gnu_stub_param,
     
    271615        }
    272616       else
    273 @@ -3546,8 +3535,7 @@
     617@@ -3490,6 +3509,8 @@
     618     {
     619       tree gnu_retval;
     620 
     621+      gnu_return_var_stack->pop ();
     622+
     623       add_stmt (gnu_result);
     624       add_stmt (build1 (LABEL_EXPR, void_type_node,
     625                        gnu_return_label_stack->last ()));
     626@@ -3546,8 +3567,7 @@
    274627       bool is_var_decl = (TREE_CODE (gnu_param) == VAR_DECL);
    275628 
     
    281634       if (is_var_decl)
    282635        save_gnu_tree (gnat_param, NULL_TREE, false);
    283 @@ -4009,12 +3997,6 @@
     636@@ -4009,12 +4029,6 @@
    284637          /* The symmetry of the paths to the type of an entity is broken here
    285638             since arguments don't know that they will be passed by ref.  */
     
    296649diff -Naur gcc-4.8.1.orig/gcc/ada/gcc-interface/utils.c gcc-4.8.1/gcc/ada/gcc-interface/utils.c
    297650--- gcc-4.8.1.orig/gcc/ada/gcc-interface/utils.c        2013-02-06 13:19:20.000000000 +0000
    298 +++ gcc-4.8.1/gcc/ada/gcc-interface/utils.c     2013-09-13 19:01:42.893199010 +0000
     651+++ gcc-4.8.1/gcc/ada/gcc-interface/utils.c     2013-10-01 16:06:43.768554292 +0000
    299652@@ -4073,33 +4073,25 @@
    300653 
     
    356709diff -Naur gcc-4.8.1.orig/gcc/ada/targparm.ads gcc-4.8.1/gcc/ada/targparm.ads
    357710--- gcc-4.8.1.orig/gcc/ada/targparm.ads 2013-02-06 10:35:52.000000000 +0000
    358 +++ gcc-4.8.1/gcc/ada/targparm.ads      2013-09-13 19:01:42.893199010 +0000
     711+++ gcc-4.8.1/gcc/ada/targparm.ads      2013-10-01 16:06:43.768554292 +0000
    359712@@ -436,7 +436,7 @@
    360713    --  the source program may not contain explicit 64-bit shifts. In addition,
     
    368721diff -Naur gcc-4.8.1.orig/gcc/asan.c gcc-4.8.1/gcc/asan.c
    369722--- gcc-4.8.1.orig/gcc/asan.c   2013-02-28 21:23:23.000000000 +0000
    370 +++ gcc-4.8.1/gcc/asan.c        2013-09-13 19:01:42.896532334 +0000
     723+++ gcc-4.8.1/gcc/asan.c        2013-10-01 16:06:43.768554292 +0000
    371724@@ -1675,7 +1675,7 @@
    372725    access to the last byte of the argument; it uses the result of the
     
    403756diff -Naur gcc-4.8.1.orig/gcc/c-family/c-ada-spec.c gcc-4.8.1/gcc/c-family/c-ada-spec.c
    404757--- gcc-4.8.1.orig/gcc/c-family/c-ada-spec.c    2013-01-10 20:38:27.000000000 +0000
    405 +++ gcc-4.8.1/gcc/c-family/c-ada-spec.c 2013-09-13 19:01:42.896532334 +0000
     758+++ gcc-4.8.1/gcc/c-family/c-ada-spec.c 2013-10-01 16:06:43.768554292 +0000
    406759@@ -2900,7 +2900,7 @@
    407760       pp_string (buffer, "  -- ");
     
    413766 
    414767       newline_and_indent (buffer, spc);
     768diff -Naur gcc-4.8.1.orig/gcc/cfgcleanup.c gcc-4.8.1/gcc/cfgcleanup.c
     769--- gcc-4.8.1.orig/gcc/cfgcleanup.c     2013-01-30 11:53:28.000000000 +0000
     770+++ gcc-4.8.1/gcc/cfgcleanup.c  2013-10-01 16:06:43.772554291 +0000
     771@@ -927,6 +927,24 @@
     772          set_mem_align (y, MEM_ALIGN (x));
     773        }
     774     }
     775+  if (code == MEM)
     776+    {
     777+      if (MEM_READONLY_P (x) != MEM_READONLY_P (y))
     778+       {
     779+         MEM_READONLY_P (x) = 0;
     780+         MEM_READONLY_P (y) = 0;
     781+       }
     782+      if (MEM_NOTRAP_P (x) != MEM_NOTRAP_P (y))
     783+       {
     784+         MEM_NOTRAP_P (x) = 0;
     785+         MEM_NOTRAP_P (y) = 0;
     786+       }
     787+      if (MEM_VOLATILE_P (x) != MEM_VOLATILE_P (y))
     788+       {
     789+         MEM_VOLATILE_P (x) = 1;
     790+         MEM_VOLATILE_P (y) = 1;
     791+       }
     792+    }
     793 
     794   fmt = GET_RTX_FORMAT (code);
     795   for (i = GET_RTX_LENGTH (code) - 1; i >= 0; i--)
    415796diff -Naur gcc-4.8.1.orig/gcc/collect2.c gcc-4.8.1/gcc/collect2.c
    416797--- gcc-4.8.1.orig/gcc/collect2.c       2013-02-07 02:53:13.000000000 +0000
    417 +++ gcc-4.8.1/gcc/collect2.c    2013-09-13 19:01:42.899865659 +0000
     798+++ gcc-4.8.1/gcc/collect2.c    2013-10-01 16:06:43.772554291 +0000
    418799@@ -366,8 +366,8 @@
    419800 
     
    561942diff -Naur gcc-4.8.1.orig/gcc/collect2.h gcc-4.8.1/gcc/collect2.h
    562943--- gcc-4.8.1.orig/gcc/collect2.h       2013-01-10 20:38:27.000000000 +0000
    563 +++ gcc-4.8.1/gcc/collect2.h    2013-09-13 19:01:42.899865659 +0000
     944+++ gcc-4.8.1/gcc/collect2.h    2013-10-01 16:06:43.772554291 +0000
    564945@@ -25,8 +25,6 @@
    565946 extern struct pex_obj *collect_execute (const char *, char **, const char *,
     
    573954diff -Naur gcc-4.8.1.orig/gcc/common/config/s390/s390-common.c gcc-4.8.1/gcc/common/config/s390/s390-common.c
    574955--- gcc-4.8.1.orig/gcc/common/config/s390/s390-common.c 2013-01-10 20:38:27.000000000 +0000
    575 +++ gcc-4.8.1/gcc/common/config/s390/s390-common.c      2013-09-13 19:01:42.899865659 +0000
     956+++ gcc-4.8.1/gcc/common/config/s390/s390-common.c      2013-10-01 16:06:43.772554291 +0000
    576957@@ -42,7 +42,7 @@
    577958     /* z196 */   PF_IEEE_FLOAT | PF_ZARCH | PF_LONG_DISPLACEMENT
     
    585966diff -Naur gcc-4.8.1.orig/gcc/config/aarch64/aarch64-builtins.c gcc-4.8.1/gcc/config/aarch64/aarch64-builtins.c
    586967--- gcc-4.8.1.orig/gcc/config/aarch64/aarch64-builtins.c        2013-02-28 17:19:33.000000000 +0000
    587 +++ gcc-4.8.1/gcc/config/aarch64/aarch64-builtins.c     2013-09-13 19:01:42.899865659 +0000
     968+++ gcc-4.8.1/gcc/config/aarch64/aarch64-builtins.c     2013-10-01 16:06:43.772554291 +0000
    588969@@ -1154,6 +1154,7 @@
    589970       return aarch64_simd_expand_args (target, icode, 1, exp,
     
    596977diff -Naur gcc-4.8.1.orig/gcc/config/aarch64/aarch64-linux.h gcc-4.8.1/gcc/config/aarch64/aarch64-linux.h
    597978--- gcc-4.8.1.orig/gcc/config/aarch64/aarch64-linux.h   2013-01-10 20:38:27.000000000 +0000
    598 +++ gcc-4.8.1/gcc/config/aarch64/aarch64-linux.h        2013-09-13 19:01:42.903198984 +0000
     979+++ gcc-4.8.1/gcc/config/aarch64/aarch64-linux.h        2013-10-01 16:06:43.772554291 +0000
    599980@@ -23,6 +23,8 @@
    600981 
     
    608989diff -Naur gcc-4.8.1.orig/gcc/config/aarch64/aarch64-simd-builtins.def gcc-4.8.1/gcc/config/aarch64/aarch64-simd-builtins.def
    609990--- gcc-4.8.1.orig/gcc/config/aarch64/aarch64-simd-builtins.def 2013-02-22 16:39:45.000000000 +0000
    610 +++ gcc-4.8.1/gcc/config/aarch64/aarch64-simd-builtins.def      2013-09-13 19:01:42.906532308 +0000
     991+++ gcc-4.8.1/gcc/config/aarch64/aarch64-simd-builtins.def      2013-10-01 16:06:43.776554291 +0000
    611992@@ -256,3 +256,10 @@
    612993   BUILTIN_VALL (BINOP, uzp2)
     
    6221003diff -Naur gcc-4.8.1.orig/gcc/config/aarch64/aarch64-simd.md gcc-4.8.1/gcc/config/aarch64/aarch64-simd.md
    6231004--- gcc-4.8.1.orig/gcc/config/aarch64/aarch64-simd.md   2013-04-11 14:14:56.000000000 +0000
    624 +++ gcc-4.8.1/gcc/config/aarch64/aarch64-simd.md        2013-09-13 19:01:42.906532308 +0000
     1005+++ gcc-4.8.1/gcc/config/aarch64/aarch64-simd.md        2013-10-01 16:06:43.776554291 +0000
    6251006@@ -3457,6 +3457,17 @@
    6261007   DONE;
     
    6611042diff -Naur gcc-4.8.1.orig/gcc/config/aarch64/aarch64.c gcc-4.8.1/gcc/config/aarch64/aarch64.c
    6621043--- gcc-4.8.1.orig/gcc/config/aarch64/aarch64.c 2013-05-02 17:00:00.000000000 +0000
    663 +++ gcc-4.8.1/gcc/config/aarch64/aarch64.c      2013-09-13 19:01:42.903198984 +0000
     1044+++ gcc-4.8.1/gcc/config/aarch64/aarch64.c      2013-10-01 16:06:43.772554291 +0000
    6641045@@ -3373,7 +3373,7 @@
    6651046          output_operand_lossage ("invalid operand for '%%%c'", code);
     
    6731054diff -Naur gcc-4.8.1.orig/gcc/config/aarch64/aarch64.md gcc-4.8.1/gcc/config/aarch64/aarch64.md
    6741055--- gcc-4.8.1.orig/gcc/config/aarch64/aarch64.md        2013-04-25 17:00:44.000000000 +0000
    675 +++ gcc-4.8.1/gcc/config/aarch64/aarch64.md     2013-09-13 19:01:42.906532308 +0000
     1056+++ gcc-4.8.1/gcc/config/aarch64/aarch64.md     2013-10-01 16:06:43.772554291 +0000
    6761057@@ -834,7 +834,8 @@
    6771058    movi\\t%d0, %1"
     
    6861067diff -Naur gcc-4.8.1.orig/gcc/config/aarch64/arm_neon.h gcc-4.8.1/gcc/config/aarch64/arm_neon.h
    6871068--- gcc-4.8.1.orig/gcc/config/aarch64/arm_neon.h        2013-04-24 15:47:21.000000000 +0000
    688 +++ gcc-4.8.1/gcc/config/aarch64/arm_neon.h     2013-09-13 19:01:42.916532282 +0000
     1069+++ gcc-4.8.1/gcc/config/aarch64/arm_neon.h     2013-10-01 16:06:43.776554291 +0000
    6891070@@ -8518,28 +8518,6 @@
    6901071   return result;
     
    15491930diff -Naur gcc-4.8.1.orig/gcc/config/alpha/alpha.c gcc-4.8.1/gcc/config/alpha/alpha.c
    15501931--- gcc-4.8.1.orig/gcc/config/alpha/alpha.c     2013-01-10 20:38:27.000000000 +0000
    1551 +++ gcc-4.8.1/gcc/config/alpha/alpha.c  2013-09-13 19:01:42.919865606 +0000
    1552 @@ -2700,12 +2700,12 @@
     1932+++ gcc-4.8.1/gcc/config/alpha/alpha.c  2013-10-01 16:06:43.780554291 +0000
     1933@@ -2659,6 +2659,7 @@
     1934       cmp_mode = cmp_mode == DImode ? DFmode : DImode;
     1935       op0 = gen_lowpart (cmp_mode, tem);
     1936       op1 = CONST0_RTX (cmp_mode);
     1937+      cmp = gen_rtx_fmt_ee (code, VOIDmode, op0, op1);
     1938       local_fast_math = 1;
     1939     }
     1940 
     1941@@ -2700,12 +2701,12 @@
    15531942       break;
    15541943 
     
    15691958 
    15701959     default:
    1571 @@ -3067,12 +3067,9 @@
     1960@@ -3067,12 +3068,9 @@
    15721961   operands[1] = op1;
    15731962   out = gen_reg_rtx (DImode);
     
    15871976diff -Naur gcc-4.8.1.orig/gcc/config/alpha/alpha.md gcc-4.8.1/gcc/config/alpha/alpha.md
    15881977--- gcc-4.8.1.orig/gcc/config/alpha/alpha.md    2013-02-01 16:34:28.000000000 +0000
    1589 +++ gcc-4.8.1/gcc/config/alpha/alpha.md 2013-09-13 19:01:42.923198931 +0000
     1978+++ gcc-4.8.1/gcc/config/alpha/alpha.md 2013-10-01 16:06:43.780554291 +0000
    15901979@@ -23,6 +23,7 @@
    15911980 ;; Uses of UNSPEC in this file:
     
    15981987diff -Naur gcc-4.8.1.orig/gcc/config/arm/arm.c gcc-4.8.1/gcc/config/arm/arm.c
    15991988--- gcc-4.8.1.orig/gcc/config/arm/arm.c 2013-05-24 15:15:44.000000000 +0000
    1600 +++ gcc-4.8.1/gcc/config/arm/arm.c      2013-09-13 19:01:42.933198905 +0000
     1989+++ gcc-4.8.1/gcc/config/arm/arm.c      2013-10-01 16:06:43.784554291 +0000
    16011990@@ -4459,7 +4459,9 @@
    16021991     if (((pcum->aapcs_vfp_regs_free >> regno) & mask) == mask)
     
    16802069                      + MEM_P (SET_DEST (x))));
    16812070 
     2071@@ -17453,7 +17475,8 @@
     2072            }
     2073        }
     2074 
     2075-      if (current_tune->prefer_ldrd_strd
     2076+      if (TARGET_LDRD
     2077+         && current_tune->prefer_ldrd_strd
     2078           && !optimize_function_for_size_p (cfun))
     2079         {
     2080           if (TARGET_THUMB2)
     2081@@ -23767,7 +23790,8 @@
     2082         }
     2083       else
     2084         {
     2085-          if (current_tune->prefer_ldrd_strd
     2086+          if (TARGET_LDRD
     2087+             && current_tune->prefer_ldrd_strd
     2088               && !optimize_function_for_size_p (cfun))
     2089             {
     2090               if (TARGET_THUMB2)
    16822091diff -Naur gcc-4.8.1.orig/gcc/config/arm/neon.md gcc-4.8.1/gcc/config/arm/neon.md
    16832092--- gcc-4.8.1.orig/gcc/config/arm/neon.md       2013-04-04 14:34:01.000000000 +0000
    1684 +++ gcc-4.8.1/gcc/config/arm/neon.md    2013-09-13 19:01:42.936532229 +0000
     2093+++ gcc-4.8.1/gcc/config/arm/neon.md    2013-10-01 16:06:43.784554291 +0000
    16852094@@ -244,7 +244,7 @@
    16862095   [(set (match_operand:VDQX 0 "neon_struct_or_register_operand")
     
    17852194       if (!inverse)
    17862195        emit_insn (base_comparison (mask, operands[4], operands[5], magic_rtx));
     2196diff -Naur gcc-4.8.1.orig/gcc/config/arm/vfp.md gcc-4.8.1/gcc/config/arm/vfp.md
     2197--- gcc-4.8.1.orig/gcc/config/arm/vfp.md        2013-01-29 18:34:12.000000000 +0000
     2198+++ gcc-4.8.1/gcc/config/arm/vfp.md     2013-10-01 16:06:43.784554291 +0000
     2199@@ -1207,18 +1207,18 @@
     2200    (set_attr "type" "fcmpd")]
     2201 )
     2202 
     2203-;; Fixed point to floating point conversions.
     2204+;; Fixed point to floating point conversions.
     2205 (define_code_iterator FCVT [unsigned_float float])
     2206 (define_code_attr FCVTI32typename [(unsigned_float "u32") (float "s32")])
     2207 
     2208 (define_insn "*combine_vcvt_f32_<FCVTI32typename>"
     2209   [(set (match_operand:SF 0 "s_register_operand" "=t")
     2210        (mult:SF (FCVT:SF (match_operand:SI 1 "s_register_operand" "0"))
     2211-                (match_operand 2
     2212+                (match_operand 2
     2213                        "const_double_vcvt_power_of_two_reciprocal" "Dt")))]
     2214   "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP3 && !flag_rounding_math"
     2215-  "vcvt.f32.<FCVTI32typename>\\t%0, %1, %v2"
     2216- [(set_attr "predicable" "no")
     2217+  "vcvt%?.f32.<FCVTI32typename>\\t%0, %1, %v2"
     2218+ [(set_attr "predicable" "yes")
     2219   (set_attr "type" "f_cvt")]
     2220 )
     2221 
     2222@@ -1227,15 +1227,16 @@
     2223 (define_insn "*combine_vcvt_f64_<FCVTI32typename>"
     2224   [(set (match_operand:DF 0 "s_register_operand" "=x,x,w")
     2225        (mult:DF (FCVT:DF (match_operand:SI 1 "s_register_operand" "r,t,r"))
     2226-                (match_operand 2
     2227+                (match_operand 2
     2228                     "const_double_vcvt_power_of_two_reciprocal" "Dt,Dt,Dt")))]
     2229-  "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP3 && !flag_rounding_math
     2230+  "TARGET_32BIT && TARGET_HARD_FLOAT && TARGET_VFP3 && !flag_rounding_math
     2231   && !TARGET_VFP_SINGLE"
     2232   "@
     2233-  vmov.f32\\t%0, %1\;vcvt.f64.<FCVTI32typename>\\t%P0, %P0, %v2
     2234-  vmov.f32\\t%0, %1\;vcvt.f64.<FCVTI32typename>\\t%P0, %P0, %v2
     2235-  vmov.f64\\t%P0, %1, %1\;vcvt.f64.<FCVTI32typename>\\t%P0, %P0, %v2"
     2236- [(set_attr "predicable" "no")
     2237+  vmov%?.f32\\t%0, %1\;vcvt%?.f64.<FCVTI32typename>\\t%P0, %P0, %v2
     2238+  vmov%?.f32\\t%0, %1\;vcvt%?.f64.<FCVTI32typename>\\t%P0, %P0, %v2
     2239+  vmov%?.f64\\t%P0, %1, %1\;vcvt%?.f64.<FCVTI32typename>\\t%P0, %P0, %v2"
     2240+ [(set_attr "predicable" "yes")
     2241+  (set_attr "ce_count" "2")
     2242   (set_attr "type" "f_cvt")
     2243   (set_attr "length" "8")]
     2244 )
    17872245diff -Naur gcc-4.8.1.orig/gcc/config/avr/avr-fixed.md gcc-4.8.1/gcc/config/avr/avr-fixed.md
    17882246--- gcc-4.8.1.orig/gcc/config/avr/avr-fixed.md  2013-02-08 10:13:37.000000000 +0000
    1789 +++ gcc-4.8.1/gcc/config/avr/avr-fixed.md       2013-09-13 19:01:42.939865554 +0000
     2247+++ gcc-4.8.1/gcc/config/avr/avr-fixed.md       2013-10-01 16:06:43.792554291 +0000
    17902248@@ -447,49 +447,18 @@
    17912249 ;; "roundqq3_const"  "rounduqq3_const"
     
    18502308diff -Naur gcc-4.8.1.orig/gcc/config/avr/avr-mcus.def gcc-4.8.1/gcc/config/avr/avr-mcus.def
    18512309--- gcc-4.8.1.orig/gcc/config/avr/avr-mcus.def  2013-02-28 09:03:09.000000000 +0000
    1852 +++ gcc-4.8.1/gcc/config/avr/avr-mcus.def       2013-09-13 19:01:42.939865554 +0000
     2310+++ gcc-4.8.1/gcc/config/avr/avr-mcus.def       2013-10-01 16:06:43.792554291 +0000
    18532311@@ -168,7 +168,6 @@
    18542312 AVR_MCU ("atmega169a",           ARCH_AVR5, "__AVR_ATmega169A__",        0, 0, 0x0100, 1, "m169a")
     
    19012359diff -Naur gcc-4.8.1.orig/gcc/config/avr/avr-protos.h gcc-4.8.1/gcc/config/avr/avr-protos.h
    19022360--- gcc-4.8.1.orig/gcc/config/avr/avr-protos.h  2013-01-14 15:08:45.000000000 +0000
    1903 +++ gcc-4.8.1/gcc/config/avr/avr-protos.h       2013-09-13 19:01:42.943198879 +0000
     2361+++ gcc-4.8.1/gcc/config/avr/avr-protos.h       2013-10-01 16:06:43.792554291 +0000
    19042362@@ -86,7 +86,8 @@
    19052363 extern void avr_output_addr_vec_elt (FILE *stream, int value);
     
    19142372diff -Naur gcc-4.8.1.orig/gcc/config/avr/avr-tables.opt gcc-4.8.1/gcc/config/avr/avr-tables.opt
    19152373--- gcc-4.8.1.orig/gcc/config/avr/avr-tables.opt        2013-02-28 09:03:09.000000000 +0000
    1916 +++ gcc-4.8.1/gcc/config/avr/avr-tables.opt     2013-09-13 19:01:42.946532203 +0000
     2374+++ gcc-4.8.1/gcc/config/avr/avr-tables.opt     2013-10-01 16:06:43.792554291 +0000
    19172375@@ -330,479 +330,440 @@
    19182376 Enum(avr_mcu) String(atmega169pa) Value(101)
     
    25433001diff -Naur gcc-4.8.1.orig/gcc/config/avr/avr.c gcc-4.8.1/gcc/config/avr/avr.c
    25443002--- gcc-4.8.1.orig/gcc/config/avr/avr.c 2013-03-12 11:42:26.000000000 +0000
    2545 +++ gcc-4.8.1/gcc/config/avr/avr.c      2013-09-13 19:01:42.939865554 +0000
     3003+++ gcc-4.8.1/gcc/config/avr/avr.c      2013-10-01 16:06:43.784554291 +0000
    25463004@@ -584,7 +584,12 @@
    25473005     {
     
    27873245diff -Naur gcc-4.8.1.orig/gcc/config/avr/avr.md gcc-4.8.1/gcc/config/avr/avr.md
    27883246--- gcc-4.8.1.orig/gcc/config/avr/avr.md        2013-02-08 10:13:37.000000000 +0000
    2789 +++ gcc-4.8.1/gcc/config/avr/avr.md     2013-09-13 19:01:42.943198879 +0000
     3247+++ gcc-4.8.1/gcc/config/avr/avr.md     2013-10-01 16:06:43.792554291 +0000
    27903248@@ -140,7 +140,7 @@
    27913249   "out_bitop, plus, addto_sp,
     
    27993257diff -Naur gcc-4.8.1.orig/gcc/config/avr/avr.opt gcc-4.8.1/gcc/config/avr/avr.opt
    28003258--- gcc-4.8.1.orig/gcc/config/avr/avr.opt       2013-03-12 11:42:26.000000000 +0000
    2801 +++ gcc-4.8.1/gcc/config/avr/avr.opt    2013-09-13 19:01:42.943198879 +0000
     3259+++ gcc-4.8.1/gcc/config/avr/avr.opt    2013-10-01 16:06:43.792554291 +0000
    28023260@@ -77,4 +77,4 @@
    28033261 
     
    28083266diff -Naur gcc-4.8.1.orig/gcc/config/avr/gen-avr-mmcu-texi.c gcc-4.8.1/gcc/config/avr/gen-avr-mmcu-texi.c
    28093267--- gcc-4.8.1.orig/gcc/config/avr/gen-avr-mmcu-texi.c   2013-01-14 18:09:34.000000000 +0000
    2810 +++ gcc-4.8.1/gcc/config/avr/gen-avr-mmcu-texi.c        2013-09-13 19:01:42.946532203 +0000
     3268+++ gcc-4.8.1/gcc/config/avr/gen-avr-mmcu-texi.c        2013-10-01 16:06:43.792554291 +0000
    28113269@@ -68,6 +68,7 @@
    28123270 static void
     
    28413299diff -Naur gcc-4.8.1.orig/gcc/config/avr/t-multilib gcc-4.8.1/gcc/config/avr/t-multilib
    28423300--- gcc-4.8.1.orig/gcc/config/avr/t-multilib    2013-02-28 09:03:09.000000000 +0000
    2843 +++ gcc-4.8.1/gcc/config/avr/t-multilib 2013-09-13 19:01:42.946532203 +0000
     3301+++ gcc-4.8.1/gcc/config/avr/t-multilib 2013-10-01 16:06:43.792554291 +0000
    28443302@@ -135,7 +135,6 @@
    28453303        mmcu?avr5=mmcu?atmega169a \
     
    28923350diff -Naur gcc-4.8.1.orig/gcc/config/darwin-protos.h gcc-4.8.1/gcc/config/darwin-protos.h
    28933351--- gcc-4.8.1.orig/gcc/config/darwin-protos.h   2013-01-10 20:38:27.000000000 +0000
    2894 +++ gcc-4.8.1/gcc/config/darwin-protos.h        2013-09-13 19:01:42.949865528 +0000
     3352+++ gcc-4.8.1/gcc/config/darwin-protos.h        2013-10-01 16:06:43.792554291 +0000
    28953353@@ -25,6 +25,7 @@
    28963354 extern void machopic_output_function_base_name (FILE *);
     
    29033361diff -Naur gcc-4.8.1.orig/gcc/config/darwin.c gcc-4.8.1/gcc/config/darwin.c
    29043362--- gcc-4.8.1.orig/gcc/config/darwin.c  2013-02-11 22:36:23.000000000 +0000
    2905 +++ gcc-4.8.1/gcc/config/darwin.c       2013-09-13 19:01:42.946532203 +0000
     3363+++ gcc-4.8.1/gcc/config/darwin.c       2013-10-01 16:06:43.792554291 +0000
    29063364@@ -369,14 +369,13 @@
    29073365 
     
    29543412diff -Naur gcc-4.8.1.orig/gcc/config/i386/bmiintrin.h gcc-4.8.1/gcc/config/i386/bmiintrin.h
    29553413--- gcc-4.8.1.orig/gcc/config/i386/bmiintrin.h  2013-01-10 20:38:27.000000000 +0000
    2956 +++ gcc-4.8.1/gcc/config/i386/bmiintrin.h       2013-09-13 19:01:42.949865528 +0000
     3414+++ gcc-4.8.1/gcc/config/i386/bmiintrin.h       2013-10-01 16:06:43.792554291 +0000
    29573415@@ -38,7 +38,6 @@
    29583416   return __builtin_ctzs (__X);
     
    30843542diff -Naur gcc-4.8.1.orig/gcc/config/i386/driver-i386.c gcc-4.8.1/gcc/config/i386/driver-i386.c
    30853543--- gcc-4.8.1.orig/gcc/config/i386/driver-i386.c        2013-05-17 15:06:36.000000000 +0000
    3086 +++ gcc-4.8.1/gcc/config/i386/driver-i386.c     2013-09-13 19:01:42.949865528 +0000
     3544+++ gcc-4.8.1/gcc/config/i386/driver-i386.c     2013-10-01 16:06:43.792554291 +0000
    30873545@@ -520,8 +520,7 @@
    30883546       if (vendor == signature_AMD_ebx
     
    31533611diff -Naur gcc-4.8.1.orig/gcc/config/i386/i386.c gcc-4.8.1/gcc/config/i386/i386.c
    31543612--- gcc-4.8.1.orig/gcc/config/i386/i386.c       2013-05-17 15:06:36.000000000 +0000
    3155 +++ gcc-4.8.1/gcc/config/i386/i386.c    2013-09-13 19:01:42.963198826 +0000
     3613+++ gcc-4.8.1/gcc/config/i386/i386.c    2013-10-01 16:06:43.796554291 +0000
    31563614@@ -2438,11 +2438,11 @@
    31573615   {&generic32_cost, 16, 7, 16, 7, 16},
     
    34633921diff -Naur gcc-4.8.1.orig/gcc/config/i386/i386.md gcc-4.8.1/gcc/config/i386/i386.md
    34643922--- gcc-4.8.1.orig/gcc/config/i386/i386.md      2013-05-22 12:16:41.000000000 +0000
    3465 +++ gcc-4.8.1/gcc/config/i386/i386.md   2013-09-13 19:01:42.969865475 +0000
     3923+++ gcc-4.8.1/gcc/config/i386/i386.md   2013-10-01 16:06:43.928554287 +0000
    34663924@@ -222,6 +222,8 @@
    34673925   UNSPECV_XEND
     
    35734031diff -Naur gcc-4.8.1.orig/gcc/config/i386/predicates.md gcc-4.8.1/gcc/config/i386/predicates.md
    35744032--- gcc-4.8.1.orig/gcc/config/i386/predicates.md        2013-01-10 20:38:27.000000000 +0000
    3575 +++ gcc-4.8.1/gcc/config/i386/predicates.md     2013-09-13 19:01:42.969865475 +0000
     4033+++ gcc-4.8.1/gcc/config/i386/predicates.md     2013-10-01 16:06:43.928554287 +0000
    35764034@@ -835,19 +835,28 @@
    35774035     return false;
     
    36174075diff -Naur gcc-4.8.1.orig/gcc/config/i386/sse.md gcc-4.8.1/gcc/config/i386/sse.md
    36184076--- gcc-4.8.1.orig/gcc/config/i386/sse.md       2013-04-29 22:16:04.000000000 +0000
    3619 +++ gcc-4.8.1/gcc/config/i386/sse.md    2013-09-13 19:01:42.976532125 +0000
     4077+++ gcc-4.8.1/gcc/config/i386/sse.md    2013-10-01 16:06:43.928554287 +0000
    36204078@@ -3603,7 +3603,7 @@
    36214079        (vec_select:V4SF
     
    36804138diff -Naur gcc-4.8.1.orig/gcc/config/i386/x86-64.h gcc-4.8.1/gcc/config/i386/x86-64.h
    36814139--- gcc-4.8.1.orig/gcc/config/i386/x86-64.h     2013-01-10 20:38:27.000000000 +0000
    3682 +++ gcc-4.8.1/gcc/config/i386/x86-64.h  2013-09-13 19:01:42.976532125 +0000
     4140+++ gcc-4.8.1/gcc/config/i386/x86-64.h  2013-10-01 16:06:43.928554287 +0000
    36834141@@ -103,3 +103,6 @@
    36844142 
     
    36884146+#undef TARGET_SECTION_TYPE_FLAGS
    36894147+#define TARGET_SECTION_TYPE_FLAGS  x86_64_elf_section_type_flags
     4148diff -Naur gcc-4.8.1.orig/gcc/config/pa/pa.c gcc-4.8.1/gcc/config/pa/pa.c
     4149--- gcc-4.8.1.orig/gcc/config/pa/pa.c   2013-04-06 17:46:50.000000000 +0000
     4150+++ gcc-4.8.1/gcc/config/pa/pa.c        2013-10-01 16:06:43.928554287 +0000
     4151@@ -513,6 +513,12 @@
     4152       write_symbols = NO_DEBUG;
     4153     }
     4154 
     4155+#ifdef AUTO_INC_DEC
     4156+  /* FIXME: Disable auto increment and decrement processing until reload
     4157+     is completed.  See PR middle-end 56791.  */
     4158+  flag_auto_inc_dec = reload_completed;
     4159+#endif
     4160+
     4161   /* We only support the "big PIC" model now.  And we always generate PIC
     4162      code when in 64bit mode.  */
     4163   if (flag_pic == 1 || TARGET_64BIT)
     4164@@ -4038,7 +4044,8 @@
     4165              || (! TARGET_64BIT && df_regs_ever_live_p (i + 1)))
     4166            {
     4167              rtx addr, insn, reg;
     4168-             addr = gen_rtx_MEM (DFmode, gen_rtx_POST_INC (DFmode, tmpreg));
     4169+             addr = gen_rtx_MEM (DFmode,
     4170+                                 gen_rtx_POST_INC (word_mode, tmpreg));
     4171              reg = gen_rtx_REG (DFmode, i);
     4172              insn = emit_move_insn (addr, reg);
     4173              if (DO_FRAME_NOTES)
     4174@@ -4331,7 +4338,8 @@
     4175        if (df_regs_ever_live_p (i)
     4176            || (! TARGET_64BIT && df_regs_ever_live_p (i + 1)))
     4177          {
     4178-           rtx src = gen_rtx_MEM (DFmode, gen_rtx_POST_INC (DFmode, tmpreg));
     4179+           rtx src = gen_rtx_MEM (DFmode,
     4180+                                  gen_rtx_POST_INC (word_mode, tmpreg));
     4181            rtx dest = gen_rtx_REG (DFmode, i);
     4182            emit_move_insn (dest, src);
     4183          }
     4184diff -Naur gcc-4.8.1.orig/gcc/config/pa/pa.md gcc-4.8.1/gcc/config/pa/pa.md
     4185--- gcc-4.8.1.orig/gcc/config/pa/pa.md  2013-03-11 00:44:28.000000000 +0000
     4186+++ gcc-4.8.1/gcc/config/pa/pa.md       2013-10-01 16:06:43.932554287 +0000
     4187@@ -833,46 +833,46 @@
     4188 (define_insn "scc"
     4189   [(set (match_operand:SI 0 "register_operand" "=r")
     4190        (match_operator:SI 3 "comparison_operator"
     4191-                          [(match_operand:SI 1 "register_operand" "r")
     4192+                          [(match_operand:SI 1 "reg_or_0_operand" "rM")
     4193                            (match_operand:SI 2 "arith11_operand" "rI")]))]
     4194   ""
     4195-  "{com%I2clr|cmp%I2clr},%B3 %2,%1,%0\;ldi 1,%0"
     4196+  "{com%I2clr|cmp%I2clr},%B3 %2,%r1,%0\;ldi 1,%0"
     4197   [(set_attr "type" "binary")
     4198    (set_attr "length" "8")])
     4199 
     4200 (define_insn ""
     4201   [(set (match_operand:DI 0 "register_operand" "=r")
     4202        (match_operator:DI 3 "comparison_operator"
     4203-                          [(match_operand:DI 1 "register_operand" "r")
     4204+                          [(match_operand:DI 1 "reg_or_0_operand" "rM")
     4205                            (match_operand:DI 2 "arith11_operand" "rI")]))]
     4206   "TARGET_64BIT"
     4207-  "cmp%I2clr,*%B3 %2,%1,%0\;ldi 1,%0"
     4208+  "cmp%I2clr,*%B3 %2,%r1,%0\;ldi 1,%0"
     4209   [(set_attr "type" "binary")
     4210    (set_attr "length" "8")])
     4211 
     4212 (define_insn "iorscc"
     4213   [(set (match_operand:SI 0 "register_operand" "=r")
     4214        (ior:SI (match_operator:SI 3 "comparison_operator"
     4215-                                  [(match_operand:SI 1 "register_operand" "r")
     4216+                                  [(match_operand:SI 1 "reg_or_0_operand" "rM")
     4217                                    (match_operand:SI 2 "arith11_operand" "rI")])
     4218                (match_operator:SI 6 "comparison_operator"
     4219-                                  [(match_operand:SI 4 "register_operand" "r")
     4220+                                  [(match_operand:SI 4 "reg_or_0_operand" "rM")
     4221                                    (match_operand:SI 5 "arith11_operand" "rI")])))]
     4222   ""
     4223-  "{com%I2clr|cmp%I2clr},%S3 %2,%1,%%r0\;{com%I5clr|cmp%I5clr},%B6 %5,%4,%0\;ldi 1,%0"
     4224+  "{com%I2clr|cmp%I2clr},%S3 %2,%r1,%%r0\;{com%I5clr|cmp%I5clr},%B6 %5,%r4,%0\;ldi 1,%0"
     4225   [(set_attr "type" "binary")
     4226    (set_attr "length" "12")])
     4227 
     4228 (define_insn ""
     4229   [(set (match_operand:DI 0 "register_operand" "=r")
     4230        (ior:DI (match_operator:DI 3 "comparison_operator"
     4231-                                  [(match_operand:DI 1 "register_operand" "r")
     4232+                                  [(match_operand:DI 1 "reg_or_0_operand" "rM")
     4233                                    (match_operand:DI 2 "arith11_operand" "rI")])
     4234                (match_operator:DI 6 "comparison_operator"
     4235-                                  [(match_operand:DI 4 "register_operand" "r")
     4236+                                  [(match_operand:DI 4 "reg_or_0_operand" "rM")
     4237                                    (match_operand:DI 5 "arith11_operand" "rI")])))]
     4238   "TARGET_64BIT"
     4239-  "cmp%I2clr,*%S3 %2,%1,%%r0\;cmp%I5clr,*%B6 %5,%4,%0\;ldi 1,%0"
     4240+  "cmp%I2clr,*%S3 %2,%r1,%%r0\;cmp%I5clr,*%B6 %5,%r4,%0\;ldi 1,%0"
     4241   [(set_attr "type" "binary")
     4242    (set_attr "length" "12")])
     4243 
     4244@@ -881,20 +881,20 @@
     4245 (define_insn "negscc"
     4246   [(set (match_operand:SI 0 "register_operand" "=r")
     4247        (neg:SI (match_operator:SI 3 "comparison_operator"
     4248-              [(match_operand:SI 1 "register_operand" "r")
     4249+              [(match_operand:SI 1 "reg_or_0_operand" "rM")
     4250                (match_operand:SI 2 "arith11_operand" "rI")])))]
     4251   ""
     4252-  "{com%I2clr|cmp%I2clr},%B3 %2,%1,%0\;ldi -1,%0"
     4253+  "{com%I2clr|cmp%I2clr},%B3 %2,%r1,%0\;ldi -1,%0"
     4254   [(set_attr "type" "binary")
     4255    (set_attr "length" "8")])
     4256 
     4257 (define_insn ""
     4258   [(set (match_operand:DI 0 "register_operand" "=r")
     4259        (neg:DI (match_operator:DI 3 "comparison_operator"
     4260-              [(match_operand:DI 1 "register_operand" "r")
     4261+              [(match_operand:DI 1 "reg_or_0_operand" "rM")
     4262                (match_operand:DI 2 "arith11_operand" "rI")])))]
     4263   "TARGET_64BIT"
     4264-  "cmp%I2clr,*%B3 %2,%1,%0\;ldi -1,%0"
     4265+  "cmp%I2clr,*%B3 %2,%r1,%0\;ldi -1,%0"
     4266   [(set_attr "type" "binary")
     4267    (set_attr "length" "8")])
     4268 
    36904269diff -Naur gcc-4.8.1.orig/gcc/config/rs6000/default64.h gcc-4.8.1/gcc/config/rs6000/default64.h
    36914270--- gcc-4.8.1.orig/gcc/config/rs6000/default64.h        2013-01-10 20:38:27.000000000 +0000
    3692 +++ gcc-4.8.1/gcc/config/rs6000/default64.h     2013-09-13 19:01:42.976532125 +0000
     4271+++ gcc-4.8.1/gcc/config/rs6000/default64.h     2013-10-01 16:06:43.932554287 +0000
    36934272@@ -18,5 +18,10 @@
    36944273 along with GCC; see the file COPYING3.  If not see
     
    37044283diff -Naur gcc-4.8.1.orig/gcc/config/rs6000/dfp.md gcc-4.8.1/gcc/config/rs6000/dfp.md
    37054284--- gcc-4.8.1.orig/gcc/config/rs6000/dfp.md     2013-01-10 20:38:27.000000000 +0000
    3706 +++ gcc-4.8.1/gcc/config/rs6000/dfp.md  2013-09-13 19:01:42.976532125 +0000
     4285+++ gcc-4.8.1/gcc/config/rs6000/dfp.md  2013-10-01 16:06:43.932554287 +0000
    37074286@@ -394,11 +394,14 @@
    37084287   "")
     
    37264305diff -Naur gcc-4.8.1.orig/gcc/config/rs6000/linux.h gcc-4.8.1/gcc/config/rs6000/linux.h
    37274306--- gcc-4.8.1.orig/gcc/config/rs6000/linux.h    2013-01-10 20:38:27.000000000 +0000
    3728 +++ gcc-4.8.1/gcc/config/rs6000/linux.h 2013-09-13 19:01:42.979865449 +0000
     4307+++ gcc-4.8.1/gcc/config/rs6000/linux.h 2013-10-01 16:06:43.932554287 +0000
    37294308@@ -79,6 +79,24 @@
    37304309 #undef LINK_OS_DEFAULT_SPEC
     
    37544333diff -Naur gcc-4.8.1.orig/gcc/config/rs6000/linux64.h gcc-4.8.1/gcc/config/rs6000/linux64.h
    37554334--- gcc-4.8.1.orig/gcc/config/rs6000/linux64.h  2013-01-10 20:38:27.000000000 +0000
    3756 +++ gcc-4.8.1/gcc/config/rs6000/linux64.h       2013-09-13 19:01:42.976532125 +0000
     4335+++ gcc-4.8.1/gcc/config/rs6000/linux64.h       2013-10-01 16:06:43.932554287 +0000
    37574336@@ -180,20 +180,14 @@
    37584337 #endif
     
    38264405diff -Naur gcc-4.8.1.orig/gcc/config/rs6000/linuxaltivec.h gcc-4.8.1/gcc/config/rs6000/linuxaltivec.h
    38274406--- gcc-4.8.1.orig/gcc/config/rs6000/linuxaltivec.h     2013-01-10 20:38:27.000000000 +0000
    3828 +++ gcc-4.8.1/gcc/config/rs6000/linuxaltivec.h  2013-09-13 19:01:42.976532125 +0000
     4407+++ gcc-4.8.1/gcc/config/rs6000/linuxaltivec.h  2013-10-01 16:06:43.932554287 +0000
    38294408@@ -20,8 +20,13 @@
    38304409    <http://www.gnu.org/licenses/>.  */
     
    38434422diff -Naur gcc-4.8.1.orig/gcc/config/rs6000/linuxspe.h gcc-4.8.1/gcc/config/rs6000/linuxspe.h
    38444423--- gcc-4.8.1.orig/gcc/config/rs6000/linuxspe.h 2013-01-10 20:38:27.000000000 +0000
    3845 +++ gcc-4.8.1/gcc/config/rs6000/linuxspe.h      2013-09-13 19:01:42.979865449 +0000
     4424+++ gcc-4.8.1/gcc/config/rs6000/linuxspe.h      2013-10-01 16:06:43.932554287 +0000
    38464425@@ -20,8 +20,13 @@
    38474426    <http://www.gnu.org/licenses/>.  */
     
    38604439diff -Naur gcc-4.8.1.orig/gcc/config/rs6000/predicates.md gcc-4.8.1/gcc/config/rs6000/predicates.md
    38614440--- gcc-4.8.1.orig/gcc/config/rs6000/predicates.md      2013-01-10 20:38:27.000000000 +0000
    3862 +++ gcc-4.8.1/gcc/config/rs6000/predicates.md   2013-09-13 19:01:42.979865449 +0000
    3863 @@ -464,9 +464,11 @@
     4441+++ gcc-4.8.1/gcc/config/rs6000/predicates.md   2013-10-01 16:06:43.932554287 +0000
     4442@@ -275,14 +275,18 @@
     4443   (ior (match_code "const_int")
     4444        (match_operand 0 "gpc_reg_operand")))
     4445 
     4446+;; Return 1 if op is a constant integer valid for addition with addis, addi.
     4447+(define_predicate "add_cint_operand"
     4448+  (and (match_code "const_int")
     4449+       (match_test "(unsigned HOST_WIDE_INT)
     4450+                     (INTVAL (op) + (mode == SImode ? 0x80000000 : 0x80008000))
     4451+                   < (unsigned HOST_WIDE_INT) 0x100000000ll")))
     4452+
     4453 ;; Return 1 if op is a constant integer valid for addition
     4454 ;; or non-special register.
     4455 (define_predicate "reg_or_add_cint_operand"
     4456   (if_then_else (match_code "const_int")
     4457-    (match_test "(HOST_BITS_PER_WIDE_INT == 32
     4458-                 && (mode == SImode || INTVAL (op) < 0x7fff8000))
     4459-                || ((unsigned HOST_WIDE_INT) (INTVAL (op) + 0x80008000)
     4460-                    < (unsigned HOST_WIDE_INT) 0x100000000ll)")
     4461+    (match_operand 0 "add_cint_operand")
     4462     (match_operand 0 "gpc_reg_operand")))
     4463 
     4464 ;; Return 1 if op is a constant integer valid for subtraction
     4465@@ -464,9 +468,11 @@
    38644466            (match_test "easy_altivec_constant (op, mode)")))
    38654467 {
     
    38744476   return EASY_VECTOR_15_ADD_SELF (val);
    38754477 })
    3876 @@ -478,9 +480,11 @@
     4478@@ -478,9 +484,11 @@
    38774479            (match_test "easy_altivec_constant (op, mode)")))
    38784480 {
     
    38874489 })
    38884490 
     4491@@ -1521,7 +1529,7 @@
     4492 (define_predicate "small_toc_ref"
     4493   (match_code "unspec,plus")
     4494 {
     4495-  if (GET_CODE (op) == PLUS && CONST_INT_P (XEXP (op, 1)))
     4496+  if (GET_CODE (op) == PLUS && add_cint_operand (XEXP (op, 1), mode))
     4497     op = XEXP (op, 0);
     4498 
     4499   return GET_CODE (op) == UNSPEC && XINT (op, 1) == UNSPEC_TOCREL;
    38894500diff -Naur gcc-4.8.1.orig/gcc/config/rs6000/rs6000.c gcc-4.8.1/gcc/config/rs6000/rs6000.c
    38904501--- gcc-4.8.1.orig/gcc/config/rs6000/rs6000.c   2013-05-10 01:54:06.000000000 +0000
    3891 +++ gcc-4.8.1/gcc/config/rs6000/rs6000.c        2013-09-13 19:01:42.986532098 +0000
    3892 @@ -2190,7 +2190,8 @@
     4502+++ gcc-4.8.1/gcc/config/rs6000/rs6000.c        2013-10-01 16:06:43.936554287 +0000
     4503@@ -284,9 +284,6 @@
     4504   { "rsqrtd",   (RECIP_DF_RSQRT | RECIP_V2DF_RSQRT) },
     4505 };
     4506 
     4507-/* 2 argument gen function typedef.  */
     4508-typedef rtx (*gen_2arg_fn_t) (rtx, rtx, rtx);
     4509-
     4510 /* Pointer to function (in rs6000-c.c) that can define or undefine target
     4511    macros that have changed.  Languages that don't support the preprocessor
     4512    don't link in rs6000-c.c, so we can't call it directly.  */
     4513@@ -2190,7 +2187,8 @@
    38934514          int reg_size2 = reg_size;
    38944515 
     
    39004521 
    39014522          rs6000_class_max_nregs[m][c]
    3902 @@ -4239,7 +4240,7 @@
     4523@@ -4239,7 +4237,7 @@
    39034524   bitsize = GET_MODE_BITSIZE (inner);
    39044525   mask = GET_MODE_MASK (inner);
     
    39094530   msb_val = val > 0 ? 0 : -1;
    39104531 
    3911 @@ -4279,7 +4280,7 @@
     4532@@ -4279,7 +4277,7 @@
    39124533   for (i = 0; i < nunits - 1; ++i)
    39134534     {
     
    39184539       else
    39194540        desired_val = msb_val;
    3920 @@ -4364,13 +4365,13 @@
     4541@@ -4364,13 +4362,13 @@
    39214542 {
    39224543   enum machine_mode mode = GET_MODE (op);
     
    39344555   /* Then try with a vspltish.  */
    39354556   if (step == 1)
    3936 @@ -4379,7 +4380,7 @@
     4557@@ -4379,7 +4377,7 @@
    39374558     step >>= 1;
    39384559 
     
    39434564   /* And finally a vspltisb.  */
    39444565   if (step == 1)
    3945 @@ -4388,7 +4389,7 @@
     4566@@ -4388,7 +4386,7 @@
    39464567     step >>= 1;
    39474568 
     
    39524573   gcc_unreachable ();
    39534574 }
    3954 @@ -9066,19 +9067,20 @@
     4575@@ -5337,7 +5335,7 @@
     4576 
     4577   tocrel_base = op;
     4578   tocrel_offset = const0_rtx;
     4579-  if (GET_CODE (op) == PLUS && CONST_INT_P (XEXP (op, 1)))
     4580+  if (GET_CODE (op) == PLUS && add_cint_operand (XEXP (op, 1), GET_MODE (op)))
     4581     {
     4582       tocrel_base = XEXP (op, 0);
     4583       tocrel_offset = XEXP (op, 1);
     4584@@ -9066,19 +9064,20 @@
    39554585       && cfun->va_list_gpr_size)
    39564586     {
     
    39774607       mem = gen_rtx_MEM (BLKmode,
    39784608                         plus_constant (Pmode, save_area,
    3979 @@ -16900,8 +16902,9 @@
     4609@@ -16900,8 +16899,9 @@
    39804610   shift = gen_reg_rtx (SImode);
    39814611   addr = gen_lowpart (SImode, addr);
     
    39894619 
    39904620   /* Mask for insertion.  */
    3991 @@ -19957,8 +19960,7 @@
     4621@@ -19957,8 +19957,7 @@
    39924622          HOST_WIDE_INT offset;
    39934623 
     
    39994629          spe_save_area_ptr = gen_rtx_REG (Pmode, 11);
    40004630          save_off = frame_off - offset;
    4001 @@ -21200,8 +21202,7 @@
     4631@@ -21200,8 +21199,7 @@
    40024632             anew to every function.  */
    40034633 
     
    40094639          emit_insn (gen_addsi3 (frame_reg_rtx, old_frame_reg_rtx,
    40104640                                 GEN_INT (info->spe_gp_save_offset
    4011 @@ -22151,20 +22152,22 @@
     4641@@ -22151,20 +22149,22 @@
    40124642 
    40134643       if (TARGET_64BIT)
     
    40364666          else
    40374667            fprintf (file, "\t.tc FT_%lx_%lx_%lx_%lx[TC],",
    4038 @@ -22191,18 +22194,19 @@
     4668@@ -22191,18 +22191,19 @@
    40394669 
    40404670       if (TARGET_64BIT)
     
    40594689          else
    40604690            fprintf (file, "\t.tc FD_%lx_%lx[TC],",
    4061 @@ -22226,16 +22230,19 @@
     4691@@ -22226,16 +22227,19 @@
    40624692 
    40634693       if (TARGET_64BIT)
     
    40824712          else
    40834713            fprintf (file, "\t.tc FS_%lx[TC],", l & 0xffffffff);
    4084 @@ -22267,9 +22274,8 @@
     4714@@ -22267,9 +22271,8 @@
    40854715        }
    40864716 #endif
     
    40944724         a separate constant pool, because then we'd have
    40954725         to have both a TOC entry _and_ the actual constant.)
    4096 @@ -22280,7 +22286,7 @@
     4726@@ -22280,7 +22283,7 @@
    40974727       /* It would be easy to make this work, but it doesn't now.  */
    40984728       gcc_assert (!TARGET_64BIT || POINTER_SIZE >= GET_MODE_BITSIZE (mode));
     
    41034733 #if HOST_BITS_PER_WIDE_INT == 32
    41044734          lshift_double (low, high, POINTER_SIZE - GET_MODE_BITSIZE (mode),
    4105 @@ -22295,7 +22301,7 @@
     4735@@ -22295,7 +22298,7 @@
    41064736 
    41074737       if (TARGET_64BIT)
     
    41124742          else
    41134743            fprintf (file, "\t.tc ID_%lx_%lx[TC],",
    4114 @@ -22308,7 +22314,7 @@
     4744@@ -22308,7 +22311,7 @@
    41154745        {
    41164746          if (POINTER_SIZE < GET_MODE_BITSIZE (mode))
     
    41214751              else
    41224752                fprintf (file, "\t.tc ID_%lx_%lx[TC],",
    4123 @@ -22318,7 +22324,7 @@
     4753@@ -22318,7 +22321,7 @@
    41244754            }
    41254755          else
     
    41304760              else
    41314761                fprintf (file, "\t.tc IS_%lx[TC],", (long) low & 0xffffffff);
    4132 @@ -22356,7 +22362,7 @@
     4762@@ -22356,7 +22359,7 @@
    41334763       gcc_unreachable ();
    41344764     }
     
    41394769   else
    41404770     {
     4771@@ -26651,7 +26654,7 @@
     4772   enum machine_mode mode = GET_MODE (dst);
     4773   rtx x0, e0, e1, y1, u0, v0;
     4774   enum insn_code code = optab_handler (smul_optab, mode);
     4775-  gen_2arg_fn_t gen_mul = (gen_2arg_fn_t) GEN_FCN (code);
     4776+  insn_gen_fn gen_mul = GEN_FCN (code);
     4777   rtx one = rs6000_load_constant_and_splat (mode, dconst1);
     4778 
     4779   gcc_assert (code != CODE_FOR_nothing);
     4780@@ -26689,7 +26692,7 @@
     4781   enum machine_mode mode = GET_MODE (dst);
     4782   rtx x0, e0, e1, e2, y1, y2, y3, u0, v0, one;
     4783   enum insn_code code = optab_handler (smul_optab, mode);
     4784-  gen_2arg_fn_t gen_mul = (gen_2arg_fn_t) GEN_FCN (code);
     4785+  insn_gen_fn gen_mul = GEN_FCN (code);
     4786 
     4787   gcc_assert (code != CODE_FOR_nothing);
     4788 
     4789@@ -26760,7 +26763,7 @@
     4790   int i;
     4791   rtx halfthree;
     4792   enum insn_code code = optab_handler (smul_optab, mode);
     4793-  gen_2arg_fn_t gen_mul = (gen_2arg_fn_t) GEN_FCN (code);
     4794+  insn_gen_fn gen_mul = GEN_FCN (code);
     4795 
     4796   gcc_assert (code != CODE_FOR_nothing);
     4797 
    41414798diff -Naur gcc-4.8.1.orig/gcc/config/rs6000/rs6000.h gcc-4.8.1/gcc/config/rs6000/rs6000.h
    41424799--- gcc-4.8.1.orig/gcc/config/rs6000/rs6000.h   2013-05-06 23:33:49.000000000 +0000
    4143 +++ gcc-4.8.1/gcc/config/rs6000/rs6000.h        2013-09-13 19:01:42.989865423 +0000
     4800+++ gcc-4.8.1/gcc/config/rs6000/rs6000.h        2013-10-01 16:06:43.936554287 +0000
    41444801@@ -662,6 +662,11 @@
    41454802    instructions for them.  Might as well be consistent with bits and bytes.  */
     
    41704827diff -Naur gcc-4.8.1.orig/gcc/config/rs6000/rs6000.md gcc-4.8.1/gcc/config/rs6000/rs6000.md
    41714828--- gcc-4.8.1.orig/gcc/config/rs6000/rs6000.md  2013-02-07 08:04:58.000000000 +0000
    4172 +++ gcc-4.8.1/gcc/config/rs6000/rs6000.md       2013-09-13 19:01:42.993198747 +0000
     4829+++ gcc-4.8.1/gcc/config/rs6000/rs6000.md       2013-10-01 16:06:43.936554287 +0000
    41734830@@ -1990,6 +1990,8 @@
    41744831   [(set_attr "length" "4,4,12")
     
    41894846   [(set (match_operand:SI 0 "gpc_reg_operand" "")
    41904847        (bswap:SI (match_operand:SI 1 "gpc_reg_operand" "")))]
    4191 @@ -2125,8 +2129,10 @@
     4848@@ -2106,7 +2110,9 @@
     4849    (clobber (match_scratch:DI 3 "=&r,&r,&r"))
     4850    (clobber (match_scratch:DI 4 "=&r,X,&r"))]
     4851   "TARGET_POWERPC64 && !TARGET_LDBRX
     4852-   && (REG_P (operands[0]) || REG_P (operands[1]))"
     4853+   && (REG_P (operands[0]) || REG_P (operands[1]))
     4854+   && !(MEM_P (operands[0]) && MEM_VOLATILE_P (operands[0]))
     4855+   && !(MEM_P (operands[1]) && MEM_VOLATILE_P (operands[1]))"
     4856   "#"
     4857   [(set_attr "length" "16,12,36")])
     4858 
     4859@@ -2125,8 +2131,10 @@
    41924860   rtx op2    = operands[2];
    41934861   rtx op3    = operands[3];
     
    42024870   rtx addr2;
    42034871   rtx word_high;
    4204 @@ -2186,8 +2192,10 @@
     4872@@ -2186,8 +2194,10 @@
    42054873   rtx src    = operands[1];
    42064874   rtx op2    = operands[2];
     
    42154883   rtx addr2;
    42164884   rtx word_high;
    4217 @@ -2221,16 +2229,14 @@
     4885@@ -2221,16 +2231,14 @@
    42184886     {
    42194887       word_high = change_address (dest, SImode, addr1);
     
    42344902 
    42354903 (define_split
    4236 @@ -2247,10 +2253,11 @@
     4904@@ -2247,10 +2255,11 @@
    42374905   rtx src     = operands[1];
    42384906   rtx op2     = operands[2];
     
    42504918   emit_insn (gen_lshrdi3 (op2, src, GEN_INT (32)));
    42514919   emit_insn (gen_bswapsi2 (dest_si, src_si));
    4252 @@ -2275,15 +2282,15 @@
     4920@@ -2275,15 +2284,15 @@
    42534921   [(const_int 0)]
    42544922   "
     
    42734941   addr1 = XEXP (src, 0);
    42744942   if (GET_CODE (addr1) == PLUS)
    4275 @@ -2308,19 +2315,11 @@
     4943@@ -2308,19 +2317,11 @@
    42764944       addr2 = gen_rtx_PLUS (SImode, op2, addr1);
    42774945     }
     
    42974965 
    42984966 (define_split
    4299 @@ -2331,15 +2330,15 @@
     4967@@ -2331,15 +2332,15 @@
    43004968   [(const_int 0)]
    43014969   "
     
    43204988   addr1 = XEXP (dest, 0);
    43214989   if (GET_CODE (addr1) == PLUS)
    4322 @@ -2364,19 +2363,11 @@
     4990@@ -2364,19 +2365,11 @@
    43234991       addr2 = gen_rtx_PLUS (SImode, op2, addr1);
    43244992     }
     
    43445012 
    43455013 (define_split
    4346 @@ -2387,15 +2378,15 @@
     5014@@ -2387,15 +2380,15 @@
    43475015   [(const_int 0)]
    43485016   "
     
    43685036 
    43695037 (define_insn "mulsi3"
    4370 @@ -4682,6 +4673,41 @@
     5038@@ -4682,6 +4675,41 @@
    43715039   "frsqrtes %0,%1"
    43725040   [(set_attr "type" "fp")])
     
    44105078   [(set (match_dup 3)
    44115079         (abs:SFDF (match_operand:SFDF 1 "gpc_reg_operand" "")))
    4412 @@ -6210,10 +6236,25 @@
     5080@@ -6210,10 +6238,25 @@
    44135081   [(set (match_operand:DI 0 "gpc_reg_operand" "=&r,&r")
    44145082        (ashiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "r,r")
     
    44405108    (set_attr "length" "8,12")])
    44415109 
    4442 @@ -7064,13 +7105,12 @@
     5110@@ -7064,13 +7107,12 @@
    44435111   [(set (match_operand:DI 0 "gpc_reg_operand" "")
    44445112        (ashiftrt:DI (match_operand:DI 1 "gpc_reg_operand" "")
     
    44565124       emit_insn (gen_ashrdi3_no_power (operands[0], operands[1], operands[2]));
    44575125       DONE;
    4458 @@ -8277,8 +8317,8 @@
     5126@@ -8277,8 +8319,8 @@
    44595127   "&& reload_completed"
    44605128   [(pc)]
     
    44675135                  operands[1]);
    44685136   emit_move_insn (simplify_gen_subreg (DFmode, operands[0], TFmode, lo_word),
    4469 @@ -8507,8 +8547,8 @@
     5137@@ -8507,8 +8549,8 @@
    44705138    && TARGET_LONG_DOUBLE_128"
    44715139   "
     
    44785146   operands[4] = gen_reg_rtx (CCFPmode);
    44795147   operands[5] = simplify_gen_subreg (DFmode, operands[0], TFmode, hi_word);
    4480 @@ -11609,8 +11649,8 @@
     5148@@ -10422,7 +10464,7 @@
     5149            (unspec [(match_operand:DI 1 "" "")
     5150                     (match_operand:DI 2 "gpc_reg_operand" "b")]
     5151                    UNSPEC_TOCREL)
     5152-           (match_operand 3 "const_int_operand" "n"))))]
     5153+           (match_operand:DI 3 "add_cint_operand" "n"))))]
     5154    "TARGET_ELF && TARGET_CMODEL != CMODEL_SMALL"
     5155    "addis %0,%2,%1+%3@toc@ha")
     5156 
     5157@@ -10433,7 +10475,7 @@
     5158            (unspec [(match_operand:P 1 "" "")
     5159                     (match_operand:P 2 "gpc_reg_operand" "b")]
     5160                    UNSPEC_TOCREL)
     5161-           (match_operand 3 "const_int_operand" "n"))))]
     5162+           (match_operand:P 3 "add_cint_operand" "n"))))]
     5163    "TARGET_XCOFF && TARGET_CMODEL != CMODEL_SMALL"
     5164    "addis %0,%1+%3@u(%2)")
     5165 
     5166@@ -11609,8 +11651,8 @@
    44815167    (match_dup 13)]
    44825168 {
     
    44915177diff -Naur gcc-4.8.1.orig/gcc/config/rs6000/rtems.h gcc-4.8.1/gcc/config/rs6000/rtems.h
    44925178--- gcc-4.8.1.orig/gcc/config/rs6000/rtems.h    2013-01-10 20:38:27.000000000 +0000
    4493 +++ gcc-4.8.1/gcc/config/rs6000/rtems.h 2013-09-13 19:01:42.996532072 +0000
     5179+++ gcc-4.8.1/gcc/config/rs6000/rtems.h 2013-10-01 16:06:43.936554287 +0000
    44945180@@ -34,6 +34,9 @@
    44955181     }                                     \
     
    45045190diff -Naur gcc-4.8.1.orig/gcc/config/rs6000/spe.md gcc-4.8.1/gcc/config/rs6000/spe.md
    45055191--- gcc-4.8.1.orig/gcc/config/rs6000/spe.md     2013-01-10 20:38:27.000000000 +0000
    4506 +++ gcc-4.8.1/gcc/config/rs6000/spe.md  2013-09-13 19:01:42.996532072 +0000
     5192+++ gcc-4.8.1/gcc/config/rs6000/spe.md  2013-10-01 16:06:43.940554287 +0000
    45075193@@ -2604,8 +2604,8 @@
    45085194    && TARGET_HARD_FLOAT && TARGET_E500_DOUBLE && TARGET_LONG_DOUBLE_128"
     
    45295215diff -Naur gcc-4.8.1.orig/gcc/config/rs6000/sysv4.h gcc-4.8.1/gcc/config/rs6000/sysv4.h
    45305216--- gcc-4.8.1.orig/gcc/config/rs6000/sysv4.h    2013-01-10 20:38:27.000000000 +0000
    4531 +++ gcc-4.8.1/gcc/config/rs6000/sysv4.h 2013-09-13 19:01:42.996532072 +0000
     5217+++ gcc-4.8.1/gcc/config/rs6000/sysv4.h 2013-10-01 16:06:43.940554287 +0000
    45325218@@ -187,12 +187,6 @@
    45335219             rs6000_abi_name);                                          \
     
    46155301diff -Naur gcc-4.8.1.orig/gcc/config/rs6000/sysv4le.h gcc-4.8.1/gcc/config/rs6000/sysv4le.h
    46165302--- gcc-4.8.1.orig/gcc/config/rs6000/sysv4le.h  2013-01-10 20:38:27.000000000 +0000
    4617 +++ gcc-4.8.1/gcc/config/rs6000/sysv4le.h       2013-09-13 19:01:42.999865397 +0000
     5303+++ gcc-4.8.1/gcc/config/rs6000/sysv4le.h       2013-10-01 16:06:43.940554287 +0000
    46185304@@ -25,12 +25,12 @@
    46195305 #undef CC1_ENDIAN_DEFAULT_SPEC
     
    46365322diff -Naur gcc-4.8.1.orig/gcc/config/s390/htmintrin.h gcc-4.8.1/gcc/config/s390/htmintrin.h
    46375323--- gcc-4.8.1.orig/gcc/config/s390/htmintrin.h  1970-01-01 00:00:00.000000000 +0000
    4638 +++ gcc-4.8.1/gcc/config/s390/htmintrin.h       2013-09-13 19:01:42.999865397 +0000
     5324+++ gcc-4.8.1/gcc/config/s390/htmintrin.h       2013-10-01 16:06:43.940554287 +0000
    46395325@@ -0,0 +1,57 @@
    46405326+/* GNU compiler hardware transactional execution intrinsics
     
    46975383diff -Naur gcc-4.8.1.orig/gcc/config/s390/htmxlintrin.h gcc-4.8.1/gcc/config/s390/htmxlintrin.h
    46985384--- gcc-4.8.1.orig/gcc/config/s390/htmxlintrin.h        1970-01-01 00:00:00.000000000 +0000
    4699 +++ gcc-4.8.1/gcc/config/s390/htmxlintrin.h     2013-09-13 19:01:42.999865397 +0000
     5385+++ gcc-4.8.1/gcc/config/s390/htmxlintrin.h     2013-10-01 16:06:43.940554287 +0000
    47005386@@ -0,0 +1,182 @@
    47015387+/* XL compiler hardware transactional execution intrinsics
     
    48835569diff -Naur gcc-4.8.1.orig/gcc/config/s390/predicates.md gcc-4.8.1/gcc/config/s390/predicates.md
    48845570--- gcc-4.8.1.orig/gcc/config/s390/predicates.md        2013-01-10 20:38:27.000000000 +0000
    4885 +++ gcc-4.8.1/gcc/config/s390/predicates.md     2013-09-13 19:01:42.999865397 +0000
     5571+++ gcc-4.8.1/gcc/config/s390/predicates.md     2013-10-01 16:06:43.940554287 +0000
    48865572@@ -176,7 +176,11 @@
    48875573 {
     
    49125598diff -Naur gcc-4.8.1.orig/gcc/config/s390/s390-modes.def gcc-4.8.1/gcc/config/s390/s390-modes.def
    49135599--- gcc-4.8.1.orig/gcc/config/s390/s390-modes.def       2013-01-10 20:38:27.000000000 +0000
    4914 +++ gcc-4.8.1/gcc/config/s390/s390-modes.def    2013-09-13 19:01:43.009865370 +0000
     5600+++ gcc-4.8.1/gcc/config/s390/s390-modes.def    2013-10-01 16:06:43.944554286 +0000
    49155601@@ -152,6 +152,14 @@
    49165602 operands were equal/unequal. The CCZ1 mode ensures the result can be
     
    49355621diff -Naur gcc-4.8.1.orig/gcc/config/s390/s390-protos.h gcc-4.8.1/gcc/config/s390/s390-protos.h
    49365622--- gcc-4.8.1.orig/gcc/config/s390/s390-protos.h        2013-01-10 20:38:27.000000000 +0000
    4937 +++ gcc-4.8.1/gcc/config/s390/s390-protos.h     2013-09-13 19:01:43.009865370 +0000
     5623+++ gcc-4.8.1/gcc/config/s390/s390-protos.h     2013-10-01 16:06:43.944554286 +0000
    49385624@@ -58,7 +58,7 @@
    49395625 extern enum machine_mode s390_tm_ccmode (rtx, rtx, bool);
     
    49555641diff -Naur gcc-4.8.1.orig/gcc/config/s390/s390.c gcc-4.8.1/gcc/config/s390/s390.c
    49565642--- gcc-4.8.1.orig/gcc/config/s390/s390.c       2013-04-08 07:55:57.000000000 +0000
    4957 +++ gcc-4.8.1/gcc/config/s390/s390.c    2013-09-13 19:01:43.003198721 +0000
     5643+++ gcc-4.8.1/gcc/config/s390/s390.c    2013-10-01 16:06:43.940554287 +0000
    49585644@@ -367,6 +367,10 @@
    49595645   const char *some_ld_name;
     
    51005786     {
    51015787       if (target_flags_explicit & MASK_HARD_DFP)
    5102 @@ -7341,11 +7377,11 @@
     5788@@ -7028,25 +7064,12 @@
     5789         or a casesi jump, check all potential targets.  */
     5790       else if (GET_CODE (insn) == JUMP_INSN)
     5791        {
     5792-          rtx pat = PATTERN (insn);
     5793-         if (GET_CODE (pat) == PARALLEL && XVECLEN (pat, 0) > 2)
     5794-           pat = XVECEXP (pat, 0, 0);
     5795-
     5796-          if (GET_CODE (pat) == SET)
     5797-            {
     5798-             rtx label = JUMP_LABEL (insn);
     5799-             if (label)
     5800-               {
     5801-                 if (s390_find_pool (pool_list, label)
     5802-                     != s390_find_pool (pool_list, insn))
     5803-                   bitmap_set_bit (far_labels, CODE_LABEL_NUMBER (label));
     5804-               }
     5805-            }
     5806-         else if (GET_CODE (pat) == PARALLEL
     5807-                  && XVECLEN (pat, 0) == 2
     5808-                  && GET_CODE (XVECEXP (pat, 0, 0)) == SET
     5809-                  && GET_CODE (XVECEXP (pat, 0, 1)) == USE
     5810-                  && GET_CODE (XEXP (XVECEXP (pat, 0, 1), 0)) == LABEL_REF)
     5811+         rtx pat = PATTERN (insn);
     5812+         if (GET_CODE (pat) == PARALLEL
     5813+             && XVECLEN (pat, 0) == 2
     5814+             && GET_CODE (XVECEXP (pat, 0, 0)) == SET
     5815+             && GET_CODE (XVECEXP (pat, 0, 1)) == USE
     5816+             && GET_CODE (XEXP (XVECEXP (pat, 0, 1), 0)) == LABEL_REF)
     5817            {
     5818              /* Find the jump table used by this casesi jump.  */
     5819              rtx vec_label = XEXP (XEXP (XVECEXP (pat, 0, 1), 0), 0);
     5820@@ -7068,8 +7091,23 @@
     5821                        bitmap_set_bit (far_labels, CODE_LABEL_NUMBER (label));
     5822                    }
     5823                }
     5824+             continue;
     5825            }
     5826-        }
     5827+
     5828+         if (GET_CODE (pat) == PARALLEL)
     5829+           pat = XVECEXP (pat, 0, 0);
     5830+
     5831+         if (GET_CODE (pat) == SET)
     5832+           {
     5833+             rtx label = JUMP_LABEL (insn);
     5834+             if (label)
     5835+               {
     5836+                 if (s390_find_pool (pool_list, label)
     5837+                     != s390_find_pool (pool_list, insn))
     5838+                   bitmap_set_bit (far_labels, CODE_LABEL_NUMBER (label));
     5839+               }
     5840+           }
     5841+       }
     5842     }
     5843 
     5844   /* Insert base register reload insns before every pool.  */
     5845@@ -7341,11 +7379,11 @@
    51035846   if (GET_CODE (setreg) == SUBREG)
    51045847     {
     
    51145857   else
    51155858     return;
    5116 @@ -7368,13 +7404,13 @@
     5859@@ -7368,13 +7406,13 @@
    51175860   rtx cur_insn;
    51185861   unsigned int i;
     
    51305873     }
    51315874 
    5132 @@ -7396,7 +7432,7 @@
     5875@@ -7396,7 +7434,7 @@
    51335876      See expand_builtin_unwind_init.  For regs_ever_live this is done by
    51345877      reload.  */
     
    51395882        regs_ever_clobbered[i] = 1;
    51405883 
    5141 @@ -7462,17 +7498,6 @@
     5884@@ -7462,17 +7500,6 @@
    51425885 {
    51435886   int i, j;
     
    51575900      data, except that we don't save and restore global registers.
    51585901 
    5159 @@ -7481,6 +7506,28 @@
     5902@@ -7481,6 +7508,28 @@
    51605903 
    51615904   s390_regs_ever_clobbered (clobbered_regs);
     
    51865929     clobbered_regs[i] = clobbered_regs[i] && !global_regs[i] && !fixed_regs[i];
    51875930 
    5188 @@ -7731,7 +7778,7 @@
     5931@@ -7731,7 +7780,7 @@
    51895932 {
    51905933   HOST_WIDE_INT frame_size;
     
    51955938   /* On S/390 machines, we may need to perform branch splitting, which
    51965939      will require both base and return address register.  We have no
    5197 @@ -7766,6 +7813,157 @@
     5940@@ -7766,6 +7815,157 @@
    51985941   while (frame_size != cfun_frame_layout.frame_size);
    51995942 }
     
    53536096    current info and update regs_ever_live for the special registers.
    53546097    May be called multiple times, but may never cause *more* registers
    5355 @@ -7774,7 +7972,7 @@
     6098@@ -7774,7 +7974,7 @@
    53566099 static void
    53576100 s390_update_frame_layout (void)
     
    53626105   s390_register_info (clobbered_regs);
    53636106 
    5364 @@ -8204,8 +8402,10 @@
     6107@@ -8204,8 +8404,10 @@
    53656108   int offset;
    53666109   int next_fpr = 0;
     
    53746117 
    53756118   /* Annotate all constant pool references to let the scheduler know
    5376 @@ -9353,6 +9553,291 @@
     6119@@ -9353,6 +9555,291 @@
    53776120   return build_va_arg_indirect_ref (addr);
    53786121 }
     
    56666409    stdio stream FILE.
    56676410 
    5668 @@ -11008,6 +11493,11 @@
     6411@@ -11008,6 +11495,11 @@
    56696412 #undef TARGET_RETURN_IN_MEMORY
    56706413 #define TARGET_RETURN_IN_MEMORY s390_return_in_memory
     
    56806423diff -Naur gcc-4.8.1.orig/gcc/config/s390/s390.h gcc-4.8.1/gcc/config/s390/s390.h
    56816424--- gcc-4.8.1.orig/gcc/config/s390/s390.h       2013-03-05 12:02:06.000000000 +0000
    5682 +++ gcc-4.8.1/gcc/config/s390/s390.h    2013-09-13 19:01:43.003198721 +0000
     6425+++ gcc-4.8.1/gcc/config/s390/s390.h    2013-10-01 16:06:43.940554287 +0000
    56836426@@ -34,7 +34,8 @@
    56846427   PF_DFP = 16,
     
    57626505diff -Naur gcc-4.8.1.orig/gcc/config/s390/s390.md gcc-4.8.1/gcc/config/s390/s390.md
    57636506--- gcc-4.8.1.orig/gcc/config/s390/s390.md      2013-01-10 20:38:27.000000000 +0000
    5764 +++ gcc-4.8.1/gcc/config/s390/s390.md   2013-09-13 19:01:43.009865370 +0000
     6507+++ gcc-4.8.1/gcc/config/s390/s390.md   2013-10-01 16:06:43.944554286 +0000
    57656508@@ -59,11 +59,17 @@
    57666509 (define_c_enum "unspec" [
     
    61866929diff -Naur gcc-4.8.1.orig/gcc/config/s390/s390.opt gcc-4.8.1/gcc/config/s390/s390.opt
    61876930--- gcc-4.8.1.orig/gcc/config/s390/s390.opt     2013-01-10 20:38:27.000000000 +0000
    6188 +++ gcc-4.8.1/gcc/config/s390/s390.opt  2013-09-13 19:01:43.009865370 +0000
     6931+++ gcc-4.8.1/gcc/config/s390/s390.opt  2013-10-01 16:06:43.944554286 +0000
    61896932@@ -104,6 +104,10 @@
    61906933 Target Report RejectNegative Negative(mlong-double-128) InverseMask(LONG_DOUBLE_128)
     
    62006943diff -Naur gcc-4.8.1.orig/gcc/config/s390/s390intrin.h gcc-4.8.1/gcc/config/s390/s390intrin.h
    62016944--- gcc-4.8.1.orig/gcc/config/s390/s390intrin.h 1970-01-01 00:00:00.000000000 +0000
    6202 +++ gcc-4.8.1/gcc/config/s390/s390intrin.h      2013-09-13 19:01:43.006532046 +0000
     6945+++ gcc-4.8.1/gcc/config/s390/s390intrin.h      2013-10-01 16:06:43.940554287 +0000
    62036946@@ -0,0 +1,33 @@
    62046947+/* S/390 System z specific intrinsics
     
    62376980diff -Naur gcc-4.8.1.orig/gcc/config/sh/sh.md gcc-4.8.1/gcc/config/sh/sh.md
    62386981--- gcc-4.8.1.orig/gcc/config/sh/sh.md  2013-05-06 19:53:56.000000000 +0000
    6239 +++ gcc-4.8.1/gcc/config/sh/sh.md       2013-09-13 19:01:43.016532020 +0000
    6240 @@ -12073,10 +12073,10 @@
     6982+++ gcc-4.8.1/gcc/config/sh/sh.md       2013-10-01 16:06:43.944554286 +0000
     6983@@ -6834,10 +6834,11 @@
     6984 ;; If movqi_reg_reg is specified as an alternative of movqi, movqi will be
     6985 ;; selected to copy QImode regs.  If one of them happens to be allocated
     6986 ;; on the stack, reload will stick to movqi insn and generate wrong
     6987-;; displacement addressing because of the generic m alternatives. 
     6988-;; With the movqi_reg_reg being specified before movqi it will be initially
     6989-;; picked to load/store regs.  If the regs regs are on the stack reload will
     6990-;; try other insns and not stick to movqi_reg_reg.
     6991+;; displacement addressing because of the generic m alternatives.
     6992+;; With the movqi_reg_reg being specified before movqi it will be initially
     6993+;; picked to load/store regs.  If the regs regs are on the stack reload
     6994+;; try other insns and not stick to movqi_reg_reg, unless there were spilled
     6995+;; pseudos in which case 'm' constraints pertain.
     6996 ;; The same applies to the movhi variants.
     6997 ;;
     6998 ;; Notice, that T bit is not allowed as a mov src operand here.  This is to
     6999@@ -6849,11 +6850,14 @@
     7000 ;; reloading MAC subregs otherwise.  For that probably special patterns
     7001 ;; would be required.
     7002 (define_insn "*mov<mode>_reg_reg"
     7003-  [(set (match_operand:QIHI 0 "arith_reg_dest" "=r")
     7004-       (match_operand:QIHI 1 "register_operand" "r"))]
     7005+  [(set (match_operand:QIHI 0 "arith_reg_dest" "=r,m,*z")
     7006+       (match_operand:QIHI 1 "register_operand" "r,*z,m"))]
     7007   "TARGET_SH1 && !t_reg_operand (operands[1], VOIDmode)"
     7008-  "mov %1,%0"
     7009-  [(set_attr "type" "move")])
     7010+  "@
     7011+    mov                %1,%0
     7012+    mov.<bw>   %1,%0
     7013+    mov.<bw>   %1,%0"
     7014+  [(set_attr "type" "move,store,load")])
     7015 
     7016 ;; FIXME: The non-SH2A and SH2A variants should be combined by adding
     7017 ;; "enabled" attribute as it is done in other targets.
     7018@@ -12073,10 +12077,10 @@
    62417019 
    62427020 ;; FMA (fused multiply-add) patterns
     
    62537031 {
    62547032   if (TARGET_SH2E)
    6255 @@ -12107,6 +12107,43 @@
     7033@@ -12107,6 +12111,43 @@
    62567034   "fmac.s %1, %2, %0"
    62577035   [(set_attr "type" "fparith_media")])
     
    62997077diff -Naur gcc-4.8.1.orig/gcc/config/sparc/sparc.c gcc-4.8.1/gcc/config/sparc/sparc.c
    63007078--- gcc-4.8.1.orig/gcc/config/sparc/sparc.c     2013-04-15 08:31:12.000000000 +0000
    6301 +++ gcc-4.8.1/gcc/config/sparc/sparc.c  2013-09-13 19:01:43.019865344 +0000
     7079+++ gcc-4.8.1/gcc/config/sparc/sparc.c  2013-10-01 16:06:43.944554286 +0000
    63027080@@ -11174,6 +11174,11 @@
    63037081       /* Total Store Ordering: all memory transactions with store semantics
     
    63147092diff -Naur gcc-4.8.1.orig/gcc/config.gcc gcc-4.8.1/gcc/config.gcc
    63157093--- gcc-4.8.1.orig/gcc/config.gcc       2013-03-13 09:47:41.000000000 +0000
    6316 +++ gcc-4.8.1/gcc/config.gcc    2013-09-13 19:01:43.023198669 +0000
     7094+++ gcc-4.8.1/gcc/config.gcc    2013-10-01 16:06:43.948554286 +0000
    63177095@@ -452,6 +452,7 @@
    63187096        cpu_type=s390
     
    63627140diff -Naur gcc-4.8.1.orig/gcc/config.in gcc-4.8.1/gcc/config.in
    63637141--- gcc-4.8.1.orig/gcc/config.in        2013-05-31 09:09:26.000000000 +0000
    6364 +++ gcc-4.8.1/gcc/config.in     2013-09-13 19:01:43.023198669 +0000
     7142+++ gcc-4.8.1/gcc/config.in     2013-10-01 16:06:43.948554286 +0000
    63657143@@ -1228,7 +1228,7 @@
    63667144 #endif
     
    63747152diff -Naur gcc-4.8.1.orig/gcc/configure gcc-4.8.1/gcc/configure
    63757153--- gcc-4.8.1.orig/gcc/configure        2013-05-08 11:36:36.000000000 +0000
    6376 +++ gcc-4.8.1/gcc/configure     2013-09-13 19:01:43.973196178 +0000
     7154+++ gcc-4.8.1/gcc/configure     2013-10-01 16:06:55.812553945 +0000
    63777155@@ -11703,6 +11703,7 @@
    63787156 if test x$build != x$host || test "x$coverage_flags" != x
     
    64637241diff -Naur gcc-4.8.1.orig/gcc/configure.ac gcc-4.8.1/gcc/configure.ac
    64647242--- gcc-4.8.1.orig/gcc/configure.ac     2013-05-08 11:36:36.000000000 +0000
    6465 +++ gcc-4.8.1/gcc/configure.ac  2013-09-13 19:01:43.976529502 +0000
     7243+++ gcc-4.8.1/gcc/configure.ac  2013-10-01 16:06:55.816553945 +0000
    64667244@@ -1887,6 +1887,7 @@
    64677245 if test x$build != x$host || test "x$coverage_flags" != x
     
    65617339diff -Naur gcc-4.8.1.orig/gcc/cp/call.c gcc-4.8.1/gcc/cp/call.c
    65627340--- gcc-4.8.1.orig/gcc/cp/call.c        2013-05-14 12:51:17.000000000 +0000
    6563 +++ gcc-4.8.1/gcc/cp/call.c     2013-09-13 19:01:43.036531967 +0000
     7341+++ gcc-4.8.1/gcc/cp/call.c     2013-10-01 16:06:43.952554286 +0000
    65647342@@ -6195,8 +6195,8 @@
    65657343   if (convs->check_narrowing)
     
    65847362diff -Naur gcc-4.8.1.orig/gcc/cp/class.c gcc-4.8.1/gcc/cp/class.c
    65857363--- gcc-4.8.1.orig/gcc/cp/class.c       2013-04-01 19:05:21.000000000 +0000
    6586 +++ gcc-4.8.1/gcc/cp/class.c    2013-09-13 19:01:43.039865292 +0000
     7364+++ gcc-4.8.1/gcc/cp/class.c    2013-10-01 16:06:43.952554286 +0000
    65877365@@ -4574,15 +4574,20 @@
    65887366 static void
     
    66547432    a DECL for the field or TYPE itself (DR 253).  */
    66557433 
     7434@@ -7465,7 +7508,7 @@
     7435      dependent on overload resolution.  */
     7436   gcc_assert (TREE_CODE (rhs) == ADDR_EXPR
     7437              || TREE_CODE (rhs) == COMPONENT_REF
     7438-             || really_overloaded_fn (rhs)
     7439+             || is_overloaded_fn (rhs)
     7440              || (flag_ms_extensions && TREE_CODE (rhs) == FUNCTION_DECL));
     7441 
     7442   /* This should really only be used when attempting to distinguish
    66567443diff -Naur gcc-4.8.1.orig/gcc/cp/cp-tree.h gcc-4.8.1/gcc/cp/cp-tree.h
    66577444--- gcc-4.8.1.orig/gcc/cp/cp-tree.h     2013-04-24 15:42:20.000000000 +0000
    6658 +++ gcc-4.8.1/gcc/cp/cp-tree.h  2013-09-13 19:01:43.043198616 +0000
     7445+++ gcc-4.8.1/gcc/cp/cp-tree.h  2013-10-01 16:06:43.956554286 +0000
    66597446@@ -1211,17 +1211,20 @@
    66607447 /* The _DECL for this _TYPE.  */
     
    67227509diff -Naur gcc-4.8.1.orig/gcc/cp/cvt.c gcc-4.8.1/gcc/cp/cvt.c
    67237510--- gcc-4.8.1.orig/gcc/cp/cvt.c 2013-02-20 09:02:35.000000000 +0000
    6724 +++ gcc-4.8.1/gcc/cp/cvt.c      2013-09-13 19:01:43.043198616 +0000
     7511+++ gcc-4.8.1/gcc/cp/cvt.c      2013-10-01 16:06:43.956554286 +0000
    67257512@@ -620,6 +620,9 @@
    67267513 
     
    67777564diff -Naur gcc-4.8.1.orig/gcc/cp/decl.c gcc-4.8.1/gcc/cp/decl.c
    67787565--- gcc-4.8.1.orig/gcc/cp/decl.c        2013-05-16 15:09:07.000000000 +0000
    6779 +++ gcc-4.8.1/gcc/cp/decl.c     2013-09-13 19:01:43.049865266 +0000
     7566+++ gcc-4.8.1/gcc/cp/decl.c     2013-10-01 16:06:43.956554286 +0000
    67807567@@ -10878,7 +10878,7 @@
    67817568    DECL, if there is no DECL available.  */
     
    68337620diff -Naur gcc-4.8.1.orig/gcc/cp/init.c gcc-4.8.1/gcc/cp/init.c
    68347621--- gcc-4.8.1.orig/gcc/cp/init.c        2013-04-25 16:25:04.000000000 +0000
    6835 +++ gcc-4.8.1/gcc/cp/init.c     2013-09-13 19:01:43.049865266 +0000
     7622+++ gcc-4.8.1/gcc/cp/init.c     2013-10-01 16:06:43.956554286 +0000
    68367623@@ -3524,6 +3524,8 @@
    68377624 
     
    68437630   else if (from_array)
    68447631     {
     7632@@ -4062,6 +4064,7 @@
     7633       tree cookie_addr;
     7634       tree size_ptr_type = build_pointer_type (sizetype);
     7635 
     7636+      base = mark_rvalue_use (base);
     7637       if (TREE_SIDE_EFFECTS (base))
     7638        {
     7639          base_init = get_target_expr (base);
    68457640diff -Naur gcc-4.8.1.orig/gcc/cp/method.c gcc-4.8.1/gcc/cp/method.c
    68467641--- gcc-4.8.1.orig/gcc/cp/method.c      2013-02-12 20:47:15.000000000 +0000
    6847 +++ gcc-4.8.1/gcc/cp/method.c   2013-09-13 19:01:43.053198590 +0000
     7642+++ gcc-4.8.1/gcc/cp/method.c   2013-10-01 16:06:43.956554286 +0000
    68487643@@ -1340,7 +1340,8 @@
    68497644       if (diag && assign_p && move_p
     
    68587653diff -Naur gcc-4.8.1.orig/gcc/cp/name-lookup.c gcc-4.8.1/gcc/cp/name-lookup.c
    68597654--- gcc-4.8.1.orig/gcc/cp/name-lookup.c 2013-02-27 18:13:24.000000000 +0000
    6860 +++ gcc-4.8.1/gcc/cp/name-lookup.c      2013-09-13 19:01:43.053198590 +0000
     7655+++ gcc-4.8.1/gcc/cp/name-lookup.c      2013-10-01 16:06:43.956554286 +0000
    68617656@@ -3015,8 +3015,10 @@
    68627657   if (name == error_mark_node)
     
    68747669diff -Naur gcc-4.8.1.orig/gcc/cp/parser.c gcc-4.8.1/gcc/cp/parser.c
    68757670--- gcc-4.8.1.orig/gcc/cp/parser.c      2013-05-14 20:37:48.000000000 +0000
    6876 +++ gcc-4.8.1/gcc/cp/parser.c   2013-09-13 19:01:43.063198564 +0000
     7671+++ gcc-4.8.1/gcc/cp/parser.c   2013-10-01 16:06:43.960554286 +0000
    68777672@@ -5438,11 +5438,18 @@
    68787673        /* Restore the old message.  */
     
    69307725diff -Naur gcc-4.8.1.orig/gcc/cp/pt.c gcc-4.8.1/gcc/cp/pt.c
    69317726--- gcc-4.8.1.orig/gcc/cp/pt.c  2013-05-24 13:25:44.000000000 +0000
    6932 +++ gcc-4.8.1/gcc/cp/pt.c       2013-09-13 19:01:43.069865213 +0000
     7727+++ gcc-4.8.1/gcc/cp/pt.c       2013-10-01 16:06:43.964554286 +0000
    69337728@@ -138,6 +138,7 @@
    69347729                                             tree);
     
    71947989     {
    71957990       if (TREE_CODE (expression) == ADDR_EXPR)
     7991@@ -20077,7 +20127,7 @@
     7992 any_type_dependent_elements_p (const_tree list)
     7993 {
     7994   for (; list; list = TREE_CHAIN (list))
     7995-    if (value_dependent_expression_p (TREE_VALUE (list)))
     7996+    if (type_dependent_expression_p (TREE_VALUE (list)))
     7997       return true;
     7998 
     7999   return false;
    71968000@@ -20626,7 +20676,7 @@
    71978001     = build_tree_list (NULL_TREE, TYPE_NAME (auto_node));
     
    72058009diff -Naur gcc-4.8.1.orig/gcc/cp/semantics.c gcc-4.8.1/gcc/cp/semantics.c
    72068010--- gcc-4.8.1.orig/gcc/cp/semantics.c   2013-05-14 12:51:17.000000000 +0000
    7207 +++ gcc-4.8.1/gcc/cp/semantics.c        2013-09-13 19:01:43.073198538 +0000
     8011+++ gcc-4.8.1/gcc/cp/semantics.c        2013-10-01 16:06:43.964554286 +0000
    72088012@@ -155,6 +155,17 @@
    72098013     }
     
    72968100diff -Naur gcc-4.8.1.orig/gcc/cp/tree.c gcc-4.8.1/gcc/cp/tree.c
    72978101--- gcc-4.8.1.orig/gcc/cp/tree.c        2013-05-24 13:25:51.000000000 +0000
    7298 +++ gcc-4.8.1/gcc/cp/tree.c     2013-09-13 19:01:43.073198538 +0000
     8102+++ gcc-4.8.1/gcc/cp/tree.c     2013-10-01 16:06:43.964554286 +0000
    72998103@@ -1220,6 +1220,8 @@
    73008104            result =
     
    73088112diff -Naur gcc-4.8.1.orig/gcc/cp/typeck.c gcc-4.8.1/gcc/cp/typeck.c
    73098113--- gcc-4.8.1.orig/gcc/cp/typeck.c      2013-05-13 19:34:15.000000000 +0000
    7310 +++ gcc-4.8.1/gcc/cp/typeck.c   2013-09-13 19:01:43.079865187 +0000
     8114+++ gcc-4.8.1/gcc/cp/typeck.c   2013-10-01 16:06:43.968554286 +0000
    73118115@@ -8307,7 +8307,8 @@
    73128116      && TREE_CODE (retval) == VAR_DECL
     
    73318135diff -Naur gcc-4.8.1.orig/gcc/cp/typeck2.c gcc-4.8.1/gcc/cp/typeck2.c
    73328136--- gcc-4.8.1.orig/gcc/cp/typeck2.c     2013-04-11 16:05:02.000000000 +0000
    7333 +++ gcc-4.8.1/gcc/cp/typeck2.c  2013-09-13 19:01:43.076531862 +0000
     8137+++ gcc-4.8.1/gcc/cp/typeck2.c  2013-10-01 16:06:43.964554286 +0000
    73348138@@ -262,7 +262,7 @@
    73358139      so that we can check again once it is completed. This makes sense
     
    73438147diff -Naur gcc-4.8.1.orig/gcc/doc/avr-mmcu.texi gcc-4.8.1/gcc/doc/avr-mmcu.texi
    73448148--- gcc-4.8.1.orig/gcc/doc/avr-mmcu.texi        2013-02-28 09:03:09.000000000 +0000
    7345 +++ gcc-4.8.1/gcc/doc/avr-mmcu.texi     2013-09-13 19:01:43.079865187 +0000
     8149+++ gcc-4.8.1/gcc/doc/avr-mmcu.texi     2013-10-01 16:06:43.968554286 +0000
    73468150@@ -38,7 +38,7 @@
    73478151 
     
    73558159diff -Naur gcc-4.8.1.orig/gcc/doc/cpp.texi gcc-4.8.1/gcc/doc/cpp.texi
    73568160--- gcc-4.8.1.orig/gcc/doc/cpp.texi     2013-01-10 20:38:27.000000000 +0000
    7357 +++ gcc-4.8.1/gcc/doc/cpp.texi  2013-09-13 19:01:43.083198511 +0000
     8161+++ gcc-4.8.1/gcc/doc/cpp.texi  2013-10-01 16:06:43.968554286 +0000
    73588162@@ -1926,11 +1926,9 @@
    73598163 This macro is defined when the C++ compiler is in use.  You can use
     
    73738177diff -Naur gcc-4.8.1.orig/gcc/doc/extend.texi gcc-4.8.1/gcc/doc/extend.texi
    73748178--- gcc-4.8.1.orig/gcc/doc/extend.texi  2013-03-28 14:07:55.000000000 +0000
    7375 +++ gcc-4.8.1/gcc/doc/extend.texi       2013-09-13 19:01:43.086531836 +0000
    7376 @@ -8786,6 +8786,7 @@
     8179+++ gcc-4.8.1/gcc/doc/extend.texi       2013-10-01 16:06:43.968554286 +0000
     8180@@ -7412,6 +7412,8 @@
     8181 the byte at @code{*@var{ptr}}.  The byte is set to some implementation
     8182 defined nonzero ``set'' value and the return value is @code{true} if and only
     8183 if the previous contents were ``set''.
     8184+It should be only used for operands of type @code{bool} or @code{char}. For
     8185+other types only part of the value may be set.
     8186 
     8187 All memory models are valid.
     8188 
     8189@@ -7421,6 +7423,10 @@
     8190 
     8191 This built-in function performs an atomic clear operation on
     8192 @code{*@var{ptr}}.  After the operation, @code{*@var{ptr}} contains 0.
     8193+It should be only used for operands of type @code{bool} or @code{char} and
     8194+in conjunction with @code{__atomic_test_and_set}.
     8195+For other types it may only clear partially. If the type is not @code{bool}
     8196+prefer using @code{__atomic_store}.
     8197 
     8198 The valid memory model variants are
     8199 @code{__ATOMIC_RELAXED}, @code{__ATOMIC_SEQ_CST}, and
     8200@@ -7492,18 +7498,20 @@
     8201 Memory model must be @code{__ATOMIC_RELEASE} or stronger.
     8202 @end table
     8203 
     8204-When a lock acquire fails it's required for good performance to abort
     8205+When a lock acquire fails it is required for good performance to abort
     8206 the transaction quickly. This can be done with a @code{_mm_pause}
     8207 
     8208 @smallexample
     8209 #include <immintrin.h> // For _mm_pause
     8210 
     8211+int lockvar;
     8212+
     8213 /* Acquire lock with lock elision */
     8214 while (__atomic_exchange_n(&lockvar, 1, __ATOMIC_ACQUIRE|__ATOMIC_HLE_ACQUIRE))
     8215     _mm_pause(); /* Abort failed transaction */
     8216 ...
     8217 /* Free lock with lock elision */
     8218-__atomic_clear(&lockvar, __ATOMIC_RELEASE|__ATOMIC_HLE_RELEASE);
     8219+__atomic_store_n(&lockvar, 0, __ATOMIC_RELEASE|__ATOMIC_HLE_RELEASE);
     8220 @end smallexample
     8221 
     8222 @node Object Size Checking
     8223@@ -8786,6 +8794,7 @@
    73778224 * PowerPC Built-in Functions::
    73788225 * PowerPC AltiVec/VSX Built-in Functions::
     
    73828229 * SPARC VIS Built-in Functions::
    73838230 * SPU Built-in Functions::
    7384 @@ -14026,6 +14027,120 @@
     8231@@ -14026,6 +14035,120 @@
    73858232 Generates the @code{wait} machine instruction.
    73868233 @end deftypefn
     
    75038350 @subsection SH Built-in Functions
    75048351 The following built-in functions are supported on the SH1, SH2, SH3 and SH4
     8352diff -Naur gcc-4.8.1.orig/gcc/doc/implement-cxx.texi gcc-4.8.1/gcc/doc/implement-cxx.texi
     8353--- gcc-4.8.1.orig/gcc/doc/implement-cxx.texi   2013-01-10 20:38:27.000000000 +0000
     8354+++ gcc-4.8.1/gcc/doc/implement-cxx.texi        2013-10-01 16:06:43.968554286 +0000
     8355@@ -9,8 +9,8 @@
     8356 A conforming implementation of ISO C++ is required to document its
     8357 choice of behavior in each of the areas that are designated
     8358 ``implementation defined''.  The following lists all such areas,
     8359-along with the section numbers from the ISO/IEC 14822:1998 and ISO/IEC
     8360-14822:2003 standards.  Some areas are only implementation-defined in
     8361+along with the section numbers from the ISO/IEC 14882:1998 and ISO/IEC
     8362+14882:2003 standards.  Some areas are only implementation-defined in
     8363 one version of the standard.
     8364 
     8365 Some choices depend on the externally determined ABI for the platform
    75058366diff -Naur gcc-4.8.1.orig/gcc/doc/invoke.texi gcc-4.8.1/gcc/doc/invoke.texi
    75068367--- gcc-4.8.1.orig/gcc/doc/invoke.texi  2013-03-29 13:41:29.000000000 +0000
    7507 +++ gcc-4.8.1/gcc/doc/invoke.texi       2013-09-13 19:01:43.093198485 +0000
     8368+++ gcc-4.8.1/gcc/doc/invoke.texi       2013-10-01 16:06:43.972554286 +0000
    75088369@@ -13726,8 +13726,13 @@
    75098370 SSE4.1, SSE4.2, AVX, AES, PCLMUL, FSGSBASE, RDRND and F16C instruction
     
    75218382 
    75228383 @item k6
     8384diff -Naur gcc-4.8.1.orig/gcc/explow.c gcc-4.8.1/gcc/explow.c
     8385--- gcc-4.8.1.orig/gcc/explow.c 2013-01-10 20:38:27.000000000 +0000
     8386+++ gcc-4.8.1/gcc/explow.c      2013-10-01 16:06:43.972554286 +0000
     8387@@ -106,10 +106,10 @@
     8388          if (overflow)
     8389            gcc_unreachable ();
     8390 
     8391-         return immed_double_int_const (v, VOIDmode);
     8392+         return immed_double_int_const (v, mode);
     8393        }
     8394 
     8395-      return GEN_INT (INTVAL (x) + c);
     8396+      return gen_int_mode (INTVAL (x) + c, mode);
     8397 
     8398     case CONST_DOUBLE:
     8399       {
     8400@@ -124,7 +124,7 @@
     8401             To fix, add constant support wider than CONST_DOUBLE.  */
     8402          gcc_assert (GET_MODE_BITSIZE (mode) <= HOST_BITS_PER_DOUBLE_INT);
     8403 
     8404-       return immed_double_int_const (v, VOIDmode);
     8405+       return immed_double_int_const (v, mode);
     8406       }
     8407 
     8408     case MEM:
     8409diff -Naur gcc-4.8.1.orig/gcc/expr.c gcc-4.8.1/gcc/expr.c
     8410--- gcc-4.8.1.orig/gcc/expr.c   2013-05-14 06:28:12.000000000 +0000
     8411+++ gcc-4.8.1/gcc/expr.c        2013-10-01 16:06:43.976554286 +0000
     8412@@ -119,7 +119,7 @@
     8413   int reverse;
     8414 };
     8415 
     8416-static void move_by_pieces_1 (rtx (*) (rtx, ...), enum machine_mode,
     8417+static void move_by_pieces_1 (insn_gen_fn, machine_mode,
     8418                              struct move_by_pieces_d *);
     8419 static bool block_move_libcall_safe_for_call_parm (void);
     8420 static bool emit_block_move_via_movmem (rtx, rtx, rtx, unsigned, unsigned, HOST_WIDE_INT);
     8421@@ -128,7 +128,7 @@
     8422 static rtx clear_by_pieces_1 (void *, HOST_WIDE_INT, enum machine_mode);
     8423 static void clear_by_pieces (rtx, unsigned HOST_WIDE_INT, unsigned int);
     8424 static void store_by_pieces_1 (struct store_by_pieces_d *, unsigned int);
     8425-static void store_by_pieces_2 (rtx (*) (rtx, ...), enum machine_mode,
     8426+static void store_by_pieces_2 (insn_gen_fn, machine_mode,
     8427                               struct store_by_pieces_d *);
     8428 static tree clear_storage_libcall_fn (int);
     8429 static rtx compress_float_constant (rtx, rtx);
     8430@@ -1043,7 +1043,7 @@
     8431    to make a move insn for that mode.  DATA has all the other info.  */
     8432 
     8433 static void
     8434-move_by_pieces_1 (rtx (*genfun) (rtx, ...), enum machine_mode mode,
     8435+move_by_pieces_1 (insn_gen_fn genfun, machine_mode mode,
     8436                  struct move_by_pieces_d *data)
     8437 {
     8438   unsigned int size = GET_MODE_SIZE (mode);
     8439@@ -2657,7 +2657,7 @@
     8440    to make a move insn for that mode.  DATA has all the other info.  */
     8441 
     8442 static void
     8443-store_by_pieces_2 (rtx (*genfun) (rtx, ...), enum machine_mode mode,
     8444+store_by_pieces_2 (insn_gen_fn genfun, machine_mode mode,
     8445                   struct store_by_pieces_d *data)
     8446 {
     8447   unsigned int size = GET_MODE_SIZE (mode);
    75238448diff -Naur gcc-4.8.1.orig/gcc/file-find.c gcc-4.8.1/gcc/file-find.c
    75248449--- gcc-4.8.1.orig/gcc/file-find.c      2013-01-10 20:38:27.000000000 +0000
    7525 +++ gcc-4.8.1/gcc/file-find.c   2013-09-13 19:01:43.093198485 +0000
     8450+++ gcc-4.8.1/gcc/file-find.c   2013-10-01 16:06:43.976554286 +0000
    75268451@@ -31,7 +31,7 @@
    75278452 }
     
    75718496diff -Naur gcc-4.8.1.orig/gcc/file-find.h gcc-4.8.1/gcc/file-find.h
    75728497--- gcc-4.8.1.orig/gcc/file-find.h      2013-01-10 20:38:27.000000000 +0000
    7573 +++ gcc-4.8.1/gcc/file-find.h   2013-09-13 19:01:43.096531810 +0000
     8498+++ gcc-4.8.1/gcc/file-find.h   2013-10-01 16:06:43.976554286 +0000
    75748499@@ -38,7 +38,7 @@
    75758500 };
     
    75818506 extern void prefix_from_env (const char *, struct path_prefix *);
    75828507 extern void prefix_from_string (const char *, struct path_prefix *);
     8508diff -Naur gcc-4.8.1.orig/gcc/fold-const.c gcc-4.8.1/gcc/fold-const.c
     8509--- gcc-4.8.1.orig/gcc/fold-const.c     2013-05-17 08:52:36.000000000 +0000
     8510+++ gcc-4.8.1/gcc/fold-const.c  2013-10-01 16:06:43.976554286 +0000
     8511@@ -469,11 +469,24 @@
     8512         and actually traps on some architectures.  But if overflow is
     8513         undefined, we can negate, because - (INT_MIN / 1) is an
     8514         overflow.  */
     8515-      if (INTEGRAL_TYPE_P (TREE_TYPE (t))
     8516-         && !TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (t)))
     8517-        break;
     8518-      return negate_expr_p (TREE_OPERAND (t, 1))
     8519-             || negate_expr_p (TREE_OPERAND (t, 0));
     8520+      if (INTEGRAL_TYPE_P (TREE_TYPE (t)))
     8521+       {
     8522+         if (!TYPE_OVERFLOW_UNDEFINED (TREE_TYPE (t)))
     8523+           break;
     8524+         /* If overflow is undefined then we have to be careful because
     8525+            we ask whether it's ok to associate the negate with the
     8526+            division which is not ok for example for
     8527+            -((a - b) / c) where (-(a - b)) / c may invoke undefined
     8528+            overflow because of negating INT_MIN.  So do not use
     8529+            negate_expr_p here but open-code the two important cases.  */
     8530+         if (TREE_CODE (TREE_OPERAND (t, 0)) == NEGATE_EXPR
     8531+             || (TREE_CODE (TREE_OPERAND (t, 0)) == INTEGER_CST
     8532+                 && may_negate_without_overflow_p (TREE_OPERAND (t, 0))))
     8533+           return true;
     8534+       }
     8535+      else if (negate_expr_p (TREE_OPERAND (t, 0)))
     8536+       return true;
     8537+      return negate_expr_p (TREE_OPERAND (t, 1));
     8538 
     8539     case NOP_EXPR:
     8540       /* Negate -((double)float) as (double)(-float).  */
     8541@@ -653,16 +666,20 @@
     8542              return fold_build2_loc (loc, TREE_CODE (t), type,
     8543                                  TREE_OPERAND (t, 0), negate_expr (tem));
     8544            }
     8545+         /* If overflow is undefined then we have to be careful because
     8546+            we ask whether it's ok to associate the negate with the
     8547+            division which is not ok for example for
     8548+            -((a - b) / c) where (-(a - b)) / c may invoke undefined
     8549+            overflow because of negating INT_MIN.  So do not use
     8550+            negate_expr_p here but open-code the two important cases.  */
     8551           tem = TREE_OPERAND (t, 0);
     8552-          if (negate_expr_p (tem))
     8553-           {
     8554-             if (INTEGRAL_TYPE_P (type)
     8555-                 && (TREE_CODE (tem) != INTEGER_CST
     8556-                     || tree_int_cst_equal (tem, TYPE_MIN_VALUE (type))))
     8557-               fold_overflow_warning (warnmsg, WARN_STRICT_OVERFLOW_MISC);
     8558-             return fold_build2_loc (loc, TREE_CODE (t), type,
     8559-                                 negate_expr (tem), TREE_OPERAND (t, 1));
     8560-           }
     8561+         if ((INTEGRAL_TYPE_P (type)
     8562+              && (TREE_CODE (tem) == NEGATE_EXPR
     8563+                  || (TREE_CODE (tem) == INTEGER_CST
     8564+                      && may_negate_without_overflow_p (tem))))
     8565+             || !INTEGRAL_TYPE_P (type))
     8566+           return fold_build2_loc (loc, TREE_CODE (t), type,
     8567+                                   negate_expr (tem), TREE_OPERAND (t, 1));
     8568         }
     8569       break;
     8570 
     8571@@ -4220,7 +4237,7 @@
     8572     }
     8573 
     8574   if (low == 0 && high == 0)
     8575-    return build_int_cst (type, 1);
     8576+    return omit_one_operand_loc (loc, type, build_int_cst (type, 1), exp);
     8577 
     8578   if (low == 0)
     8579     return fold_build2_loc (loc, LE_EXPR, type, exp,
     8580@@ -9851,6 +9868,24 @@
     8581     }
     8582 }
     8583 
     8584+/*  Mask out the tz least significant bits of X of type TYPE where
     8585+    tz is the number of trailing zeroes in Y.  */
     8586+static double_int
     8587+mask_with_tz (tree type, double_int x, double_int y)
     8588+{
     8589+  int tz = y.trailing_zeros ();
     8590+
     8591+  if (tz > 0)
     8592+    {
     8593+      double_int mask;
     8594+
     8595+      mask = ~double_int::mask (tz);
     8596+      mask = mask.ext (TYPE_PRECISION (type), TYPE_UNSIGNED (type));
     8597+      return mask & x;
     8598+    }
     8599+  return x;
     8600+}
     8601+
     8602 /* Fold a binary expression of code CODE and type TYPE with operands
     8603    OP0 and OP1.  LOC is the location of the resulting expression.
     8604    Return the folded expression if folding is successful.  Otherwise,
     8605@@ -11175,6 +11210,8 @@
     8606        {
     8607          double_int c1, c2, c3, msk;
     8608          int width = TYPE_PRECISION (type), w;
     8609+         bool try_simplify = true;
     8610+
     8611          c1 = tree_to_double_int (TREE_OPERAND (arg0, 1));
     8612          c2 = tree_to_double_int (arg1);
     8613 
     8614@@ -11209,7 +11246,21 @@
     8615                  break;
     8616                }
     8617            }
     8618-         if (c3 != c1)
     8619+
     8620+         /* If X is a tree of the form (Y * K1) & K2, this might conflict
     8621+            with that optimization from the BIT_AND_EXPR optimizations.
     8622+            This could end up in an infinite recursion.  */
     8623+         if (TREE_CODE (TREE_OPERAND (arg0, 0)) == MULT_EXPR
     8624+             && TREE_CODE (TREE_OPERAND (TREE_OPERAND (arg0, 0), 1))
     8625+                           == INTEGER_CST)
     8626+         {
     8627+           tree t = TREE_OPERAND (TREE_OPERAND (arg0, 0), 1);
     8628+           double_int masked = mask_with_tz (type, c3, tree_to_double_int (t));
     8629+
     8630+           try_simplify = (masked != c1);
     8631+         }
     8632+
     8633+         if (try_simplify && c3 != c1)
     8634            return fold_build2_loc (loc, BIT_IOR_EXPR, type,
     8635                                    fold_build2_loc (loc, BIT_AND_EXPR, type,
     8636                                                     TREE_OPERAND (arg0, 0),
     8637@@ -11599,22 +11650,16 @@
     8638          && TREE_CODE (arg0) == MULT_EXPR
     8639          && TREE_CODE (TREE_OPERAND (arg0, 1)) == INTEGER_CST)
     8640        {
     8641-         int arg1tz
     8642-           = tree_to_double_int (TREE_OPERAND (arg0, 1)).trailing_zeros ();
     8643-         if (arg1tz > 0)
     8644-           {
     8645-             double_int arg1mask, masked;
     8646-             arg1mask = ~double_int::mask (arg1tz);
     8647-             arg1mask = arg1mask.ext (TYPE_PRECISION (type),
     8648-                                        TYPE_UNSIGNED (type));
     8649-             masked = arg1mask & tree_to_double_int (arg1);
     8650-             if (masked.is_zero ())
     8651-               return omit_two_operands_loc (loc, type, build_zero_cst (type),
     8652-                                             arg0, arg1);
     8653-             else if (masked != tree_to_double_int (arg1))
     8654-               return fold_build2_loc (loc, code, type, op0,
     8655-                                       double_int_to_tree (type, masked));
     8656-           }
     8657+         double_int masked
     8658+           = mask_with_tz (type, tree_to_double_int (arg1),
     8659+                           tree_to_double_int (TREE_OPERAND (arg0, 1)));
     8660+
     8661+         if (masked.is_zero ())
     8662+           return omit_two_operands_loc (loc, type, build_zero_cst (type),
     8663+                                         arg0, arg1);
     8664+         else if (masked != tree_to_double_int (arg1))
     8665+           return fold_build2_loc (loc, code, type, op0,
     8666+                                   double_int_to_tree (type, masked));
     8667        }
     8668 
     8669       /* For constants M and N, if M == (1LL << cst) - 1 && (N & M) == M,
     8670@@ -14040,14 +14085,29 @@
     8671          && integer_zerop (op2)
     8672          && (tem = sign_bit_p (TREE_OPERAND (arg0, 0), arg1)))
     8673        {
     8674+         /* sign_bit_p looks through both zero and sign extensions,
     8675+            but for this optimization only sign extensions are
     8676+            usable.  */
     8677+         tree tem2 = TREE_OPERAND (arg0, 0);
     8678+         while (tem != tem2)
     8679+           {
     8680+             if (TREE_CODE (tem2) != NOP_EXPR
     8681+                 || TYPE_UNSIGNED (TREE_TYPE (TREE_OPERAND (tem2, 0))))
     8682+               {
     8683+                 tem = NULL_TREE;
     8684+                 break;
     8685+               }
     8686+             tem2 = TREE_OPERAND (tem2, 0);
     8687+           }
     8688          /* sign_bit_p only checks ARG1 bits within A's precision.
     8689             If <sign bit of A> has wider type than A, bits outside
     8690             of A's precision in <sign bit of A> need to be checked.
     8691             If they are all 0, this optimization needs to be done
     8692             in unsigned A's type, if they are all 1 in signed A's type,
     8693             otherwise this can't be done.  */
     8694-         if (TYPE_PRECISION (TREE_TYPE (tem))
     8695-             < TYPE_PRECISION (TREE_TYPE (arg1))
     8696+         if (tem
     8697+             && TYPE_PRECISION (TREE_TYPE (tem))
     8698+                < TYPE_PRECISION (TREE_TYPE (arg1))
     8699              && TYPE_PRECISION (TREE_TYPE (tem))
     8700                 < TYPE_PRECISION (type))
     8701            {
    75838702diff -Naur gcc-4.8.1.orig/gcc/fortran/interface.c gcc-4.8.1/gcc/fortran/interface.c
    75848703--- gcc-4.8.1.orig/gcc/fortran/interface.c      2013-04-26 19:20:55.000000000 +0000
    7585 +++ gcc-4.8.1/gcc/fortran/interface.c   2013-09-13 19:01:43.096531810 +0000
     8704+++ gcc-4.8.1/gcc/fortran/interface.c   2013-10-01 16:06:43.976554286 +0000
    75868705@@ -1024,7 +1024,8 @@
    75878706                             bool type_must_agree, char *errmsg, int err_len)
     
    75968715diff -Naur gcc-4.8.1.orig/gcc/fortran/match.c gcc-4.8.1/gcc/fortran/match.c
    75978716--- gcc-4.8.1.orig/gcc/fortran/match.c  2013-04-18 18:20:22.000000000 +0000
    7598 +++ gcc-4.8.1/gcc/fortran/match.c       2013-09-13 19:01:43.099865134 +0000
     8717+++ gcc-4.8.1/gcc/fortran/match.c       2013-10-01 16:06:43.980554285 +0000
    75998718@@ -5142,7 +5142,6 @@
    76008719 {
     
    76748793diff -Naur gcc-4.8.1.orig/gcc/fortran/module.c gcc-4.8.1/gcc/fortran/module.c
    76758794--- gcc-4.8.1.orig/gcc/fortran/module.c 2013-01-29 21:40:51.000000000 +0000
    7676 +++ gcc-4.8.1/gcc/fortran/module.c      2013-09-13 19:01:43.099865134 +0000
     8795+++ gcc-4.8.1/gcc/fortran/module.c      2013-10-01 16:06:43.980554285 +0000
    76778796@@ -4465,7 +4465,7 @@
    76788797   module_locus locus;
     
    76868805diff -Naur gcc-4.8.1.orig/gcc/fortran/resolve.c gcc-4.8.1/gcc/fortran/resolve.c
    76878806--- gcc-4.8.1.orig/gcc/fortran/resolve.c        2013-05-07 16:36:48.000000000 +0000
    7688 +++ gcc-4.8.1/gcc/fortran/resolve.c     2013-09-13 19:01:43.103198459 +0000
     8807+++ gcc-4.8.1/gcc/fortran/resolve.c     2013-10-01 16:06:43.980554285 +0000
    76898808@@ -9746,6 +9746,10 @@
    76908809 
     
    77088827diff -Naur gcc-4.8.1.orig/gcc/fortran/simplify.c gcc-4.8.1/gcc/fortran/simplify.c
    77098828--- gcc-4.8.1.orig/gcc/fortran/simplify.c       2013-05-07 16:36:48.000000000 +0000
    7710 +++ gcc-4.8.1/gcc/fortran/simplify.c    2013-09-13 19:01:43.106531784 +0000
     8829+++ gcc-4.8.1/gcc/fortran/simplify.c    2013-10-01 16:06:43.980554285 +0000
    77118830@@ -332,13 +332,15 @@
    77128831 }
     
    77638882diff -Naur gcc-4.8.1.orig/gcc/fortran/trans-array.c gcc-4.8.1/gcc/fortran/trans-array.c
    77648883--- gcc-4.8.1.orig/gcc/fortran/trans-array.c    2013-02-21 12:26:44.000000000 +0000
    7765 +++ gcc-4.8.1/gcc/fortran/trans-array.c 2013-09-13 19:01:43.109865108 +0000
     8884+++ gcc-4.8.1/gcc/fortran/trans-array.c 2013-10-01 16:06:43.984554285 +0000
    77668885@@ -3674,7 +3674,7 @@
    77678886 /* Calculate the lower bound of an array section.  */
     
    79009019diff -Naur gcc-4.8.1.orig/gcc/fortran/trans-intrinsic.c gcc-4.8.1/gcc/fortran/trans-intrinsic.c
    79019020--- gcc-4.8.1.orig/gcc/fortran/trans-intrinsic.c        2013-03-15 10:09:39.000000000 +0000
    7902 +++ gcc-4.8.1/gcc/fortran/trans-intrinsic.c     2013-09-13 19:01:43.113198433 +0000
     9021+++ gcc-4.8.1/gcc/fortran/trans-intrinsic.c     2013-10-01 16:06:43.984554285 +0000
    79039022@@ -5653,8 +5653,7 @@
    79049023 
     
    79279046diff -Naur gcc-4.8.1.orig/gcc/gcc-ar.c gcc-4.8.1/gcc/gcc-ar.c
    79289047--- gcc-4.8.1.orig/gcc/gcc-ar.c 2013-01-10 20:38:27.000000000 +0000
    7929 +++ gcc-4.8.1/gcc/gcc-ar.c      2013-09-13 19:01:43.113198433 +0000
     9048+++ gcc-4.8.1/gcc/gcc-ar.c      2013-10-01 16:06:43.984554285 +0000
    79309049@@ -136,7 +136,7 @@
    79319050   setup_prefixes (av[0]);
     
    79689087 
    79699088   /* Create new command line with plugin */
     9089diff -Naur gcc-4.8.1.orig/gcc/genoutput.c gcc-4.8.1/gcc/genoutput.c
     9090--- gcc-4.8.1.orig/gcc/genoutput.c      2013-01-10 20:38:27.000000000 +0000
     9091+++ gcc-4.8.1/gcc/genoutput.c   2013-10-01 16:06:43.984554285 +0000
     9092@@ -404,9 +404,9 @@
     9093        }
     9094 
     9095       if (d->name && d->name[0] != '*')
     9096-       printf ("    (insn_gen_fn) gen_%s,\n", d->name);
     9097+       printf ("    { (insn_gen_fn::stored_funcptr) gen_%s },\n", d->name);
     9098       else
     9099-       printf ("    0,\n");
     9100+       printf ("    { 0 },\n");
     9101 
     9102       printf ("    &operand_data[%d],\n", d->operand_number);
     9103       printf ("    %d,\n", d->n_generator_args);
    79709104diff -Naur gcc-4.8.1.orig/gcc/gimple-ssa-strength-reduction.c gcc-4.8.1/gcc/gimple-ssa-strength-reduction.c
    79719105--- gcc-4.8.1.orig/gcc/gimple-ssa-strength-reduction.c  2013-04-15 15:00:06.000000000 +0000
    7972 +++ gcc-4.8.1/gcc/gimple-ssa-strength-reduction.c       2013-09-13 19:01:43.116531757 +0000
     9106+++ gcc-4.8.1/gcc/gimple-ssa-strength-reduction.c       2013-10-01 16:06:43.984554285 +0000
    79739107@@ -1525,11 +1525,23 @@
    79749108 static void
     
    80029136diff -Naur gcc-4.8.1.orig/gcc/gimple.c gcc-4.8.1/gcc/gimple.c
    80039137--- gcc-4.8.1.orig/gcc/gimple.c 2013-01-10 20:38:27.000000000 +0000
    8004 +++ gcc-4.8.1/gcc/gimple.c      2013-09-13 19:01:43.113198433 +0000
     9138+++ gcc-4.8.1/gcc/gimple.c      2013-10-01 16:06:43.984554285 +0000
    80059139@@ -4045,6 +4045,13 @@
    80069140            ret |= visit_addr (stmt, TREE_OPERAND (op, 0), data);
     
    80199153diff -Naur gcc-4.8.1.orig/gcc/go/go-gcc.cc gcc-4.8.1/gcc/go/go-gcc.cc
    80209154--- gcc-4.8.1.orig/gcc/go/go-gcc.cc     2013-01-10 20:38:27.000000000 +0000
    8021 +++ gcc-4.8.1/gcc/go/go-gcc.cc  2013-09-13 19:01:43.166531626 +0000
    8022 @@ -287,10 +287,10 @@
     9155+++ gcc-4.8.1/gcc/go/go-gcc.cc  2013-10-01 16:06:43.992554285 +0000
     9156@@ -208,6 +208,16 @@
     9157   Bexpression*
     9158   zero_expression(Btype*);
     9159 
     9160+  Bexpression*
     9161+  error_expression()
     9162+  { return this->make_expression(error_mark_node); }
     9163+
     9164+  Bexpression*
     9165+  var_expression(Bvariable* var, Location);
     9166+
     9167+  Bexpression*
     9168+  indirect_expression(Bexpression* expr, bool known_valid, Location);
     9169+
     9170   // Statements.
     9171 
     9172   Bstatement*
     9173@@ -287,10 +297,10 @@
    80239174                     Location, Bstatement**);
    80249175 
     
    80339184 
    80349185   Bvariable*
    8035 @@ -1242,20 +1242,41 @@
     9186@@ -848,6 +858,30 @@
     9187   return tree_to_expr(ret);
     9188 }
     9189 
     9190+// An expression that references a variable.
     9191+
     9192+Bexpression*
     9193+Gcc_backend::var_expression(Bvariable* var, Location)
     9194+{
     9195+  tree ret = var->get_tree();
     9196+  if (ret == error_mark_node)
     9197+    return this->error_expression();
     9198+  return tree_to_expr(ret);
     9199+}
     9200+
     9201+// An expression that indirectly references an expression.
     9202+
     9203+Bexpression*
     9204+Gcc_backend::indirect_expression(Bexpression* expr, bool known_valid,
     9205+                                 Location location)
     9206+{
     9207+  tree ret = build_fold_indirect_ref_loc(location.gcc_location(),
     9208+                                         expr->get_tree());
     9209+  if (known_valid)
     9210+    TREE_THIS_NOTRAP(ret) = 1;
     9211+  return tree_to_expr(ret);
     9212+}
     9213+
     9214 // An expression as a statement.
     9215 
     9216 Bstatement*
     9217@@ -1242,20 +1276,41 @@
    80369218   switch (TREE_CODE(type))
    80379219     {
     
    80899271     case ARRAY_TYPE:
    80909272       {
    8091 @@ -1454,8 +1475,8 @@
     9273@@ -1454,8 +1509,8 @@
    80929274 // Create a named immutable initialized data structure.
    80939275 
     
    80959277-Gcc_backend::immutable_struct(const std::string& name, bool, Btype* btype,
    80969278-                             Location location)
    8097 +Gcc_backend::immutable_struct(const std::string& name, bool, bool,
    8098 +                             Btype* btype, Location location)
     9279+Gcc_backend::immutable_struct(const std::string& name, bool is_hidden,
     9280+                             bool, Btype* btype, Location location)
    80999281 {
    81009282   tree type_tree = btype->get_tree();
    81019283   if (type_tree == error_mark_node)
    8102 @@ -1482,7 +1503,7 @@
     9284@@ -1469,6 +1524,8 @@
     9285   TREE_CONSTANT(decl) = 1;
     9286   TREE_USED(decl) = 1;
     9287   DECL_ARTIFICIAL(decl) = 1;
     9288+  if (!is_hidden)
     9289+    TREE_PUBLIC(decl) = 1;
     9290 
     9291   // We don't call rest_of_decl_compilation until we have the
     9292   // initializer.
     9293@@ -1482,8 +1539,7 @@
    81039294 
    81049295 void
    81059296 Gcc_backend::immutable_struct_set_init(Bvariable* var, const std::string&,
    81069297-                                      bool is_common, Btype*,
    8107 +                                      bool is_hidden, bool is_common, Btype*,
    8108                                       Location,
     9298-                                      Location,
     9299+                                      bool, bool is_common, Btype*, Location,
    81099300                                       Bexpression* initializer)
    81109301 {
    8111 @@ -1495,12 +1516,18 @@
     9302   tree decl = var->get_tree();
     9303@@ -1494,13 +1550,14 @@
     9304   DECL_INITIAL(decl) = init_tree;
    81129305 
    81139306   // We can't call make_decl_one_only until we set DECL_INITIAL.
    8114    if (!is_common)
     9307-  if (!is_common)
    81159308-    TREE_PUBLIC(decl) = 1;
    81169309-  else
    8117      {
     9310-    {
    81189311-      make_decl_one_only(decl, DECL_ASSEMBLER_NAME(decl));
    81199312-      resolve_unique_section(decl, 1, 0);
    8120 +      if (!is_hidden)
    8121 +       TREE_PUBLIC(decl) = 1;
    8122      }
    8123 +  else
     9313-    }
     9314+  if (is_common)
    81249315+    make_decl_one_only(decl, DECL_ASSEMBLER_NAME(decl));
    81259316+
     
    81349325diff -Naur gcc-4.8.1.orig/gcc/go/gofrontend/backend.h gcc-4.8.1/gcc/go/gofrontend/backend.h
    81359326--- gcc-4.8.1.orig/gcc/go/gofrontend/backend.h  2012-11-29 18:11:17.000000000 +0000
    8136 +++ gcc-4.8.1/gcc/go/gofrontend/backend.h       2013-09-13 19:01:43.116531757 +0000
     9327+++ gcc-4.8.1/gcc/go/gofrontend/backend.h       2013-10-01 16:06:43.984554285 +0000
    81379328@@ -95,7 +95,10 @@
    81389329 
     
    81479338   function_type(const Btyped_identifier& receiver,
    81489339                const std::vector<Btyped_identifier>& parameters,
    8149 @@ -388,18 +391,22 @@
     9340@@ -228,6 +231,22 @@
     9341   virtual Bexpression*
     9342   zero_expression(Btype*) = 0;
     9343 
     9344+  // Create an error expression. This is used for cases which should
     9345+  // not occur in a correct program, in order to keep the compilation
     9346+  // going without crashing.
     9347+  virtual Bexpression*
     9348+  error_expression() = 0;
     9349+
     9350+  // Create a reference to a variable.
     9351+  virtual Bexpression*
     9352+  var_expression(Bvariable* var, Location) = 0;
     9353+
     9354+  // Create an expression that indirects through the pointer expression EXPR
     9355+  // (i.e., return the expression for *EXPR). KNOWN_VALID is true if the pointer
     9356+  // is known to point to a valid memory location.
     9357+  virtual Bexpression*
     9358+  indirect_expression(Bexpression* expr, bool known_valid, Location) = 0;
     9359+
     9360   // Statements.
     9361 
     9362   // Create an error statement.  This is used for cases which should
     9363@@ -388,18 +407,22 @@
    81509364                     Bstatement** pstatement) = 0;
    81519365 
     
    81749388   // TYPE will be a struct type; the type of the returned expression
    81759389   // must be a pointer to this struct type.
    8176 @@ -409,20 +416,20 @@
     9390@@ -409,20 +432,20 @@
    81779391   // address.  After calling this the frontend will call
    81789392   // immutable_struct_set_init.
     
    82069420diff -Naur gcc-4.8.1.orig/gcc/go/gofrontend/expressions.cc gcc-4.8.1/gcc/go/gofrontend/expressions.cc
    82079421--- gcc-4.8.1.orig/gcc/go/gofrontend/expressions.cc     2012-12-21 15:59:27.000000000 +0000
    8208 +++ gcc-4.8.1/gcc/go/gofrontend/expressions.cc  2013-09-13 19:01:43.119865082 +0000
    8209 @@ -1090,6 +1090,15 @@
     9422+++ gcc-4.8.1/gcc/go/gofrontend/expressions.cc  2013-10-01 16:06:43.988554285 +0000
     9423@@ -978,22 +978,19 @@
     9424 {
     9425   Bvariable* bvar = this->variable_->get_backend_variable(context->gogo(),
     9426                                                          context->function());
     9427-  tree ret = var_to_tree(bvar);
     9428-  if (ret == error_mark_node)
     9429-    return error_mark_node;
     9430   bool is_in_heap;
     9431+  Location loc = this->location();
     9432   if (this->variable_->is_variable())
     9433     is_in_heap = this->variable_->var_value()->is_in_heap();
     9434   else if (this->variable_->is_result_variable())
     9435     is_in_heap = this->variable_->result_var_value()->is_in_heap();
     9436   else
     9437     go_unreachable();
     9438+
     9439+  Bexpression* ret = context->backend()->var_expression(bvar, loc);
     9440   if (is_in_heap)
     9441-    {
     9442-      ret = build_fold_indirect_ref_loc(this->location().gcc_location(), ret);
     9443-      TREE_THIS_NOTRAP(ret) = 1;
     9444-    }
     9445-  return ret;
     9446+    ret = context->backend()->indirect_expression(ret, true, loc);
     9447+  return expr_to_tree(ret);
     9448 }
     9449 
     9450 // Ast dump for variable expression.
     9451@@ -1090,6 +1087,15 @@
    82109452   return this->statement_->type();
    82119453 }
     
    82239465 
    82249466 void
    8225 @@ -1255,17 +1264,16 @@
     9467@@ -1255,17 +1261,16 @@
    82269468     go_unreachable();
    82279469 }
     
    82479489     go_unreachable();
    82489490 
    8249 @@ -1273,14 +1281,12 @@
     9491@@ -1273,14 +1278,12 @@
    82509492   // can't take their address.
    82519493   if (fntype->is_builtin())
     
    82649506   if (id == error_mark_node)
    82659507     return error_mark_node;
    8266 @@ -1296,46 +1302,55 @@
     9508@@ -1296,46 +1299,55 @@
    82679509   if (fndecl == error_mark_node)
    82689510     return error_mark_node;
     
    83499591 
    83509592 // Ast dump for function.
    8351 @@ -1361,6 +1376,197 @@
     9593@@ -1361,6 +1373,181 @@
    83529594   return new Func_expression(function, closure, location);
    83539595 }
     
    83599601+Func_descriptor_expression::Func_descriptor_expression(Named_object* fn)
    83609602+  : Expression(EXPRESSION_FUNC_DESCRIPTOR, fn->location()),
    8361 +    fn_(fn), dfn_(NULL), dvar_(NULL)
     9603+    fn_(fn), dvar_(NULL)
    83629604+{
    83639605+  go_assert(!fn->is_function() || !fn->func_value()->needs_closure());
     
    83949636+}
    83959637+
    8396 +// Copy a Func_descriptor_expression;
    8397 +
    8398 +Expression*
    8399 +Func_descriptor_expression::do_copy()
    8400 +{
    8401 +  Func_descriptor_expression* fde =
    8402 +    Expression::make_func_descriptor(this->fn_);
    8403 +  if (this->dfn_ != NULL)
    8404 +    fde->set_descriptor_wrapper(this->dfn_);
    8405 +  return fde;
    8406 +}
    8407 +
    84089638+// The tree for a function descriptor.
    84099639+
     
    84329662+  if (no->package() != NULL
    84339663+      || Linemap::is_predeclared_location(no->location()))
    8434 +    {
    8435 +      bvar = context->backend()->immutable_struct_reference(var_name, btype,
    8436 +                                                           loc);
    8437 +      go_assert(this->dfn_ == NULL);
    8438 +    }
     9664+    bvar = context->backend()->immutable_struct_reference(var_name, btype,
     9665+                                                         loc);
    84399666+  else
    84409667+    {
     
    84469673+                                                 btype, bloc);
    84479674+      Expression_list* vals = new Expression_list();
    8448 +      go_assert(this->dfn_ != NULL);
    8449 +      vals->push_back(Expression::make_func_code_reference(this->dfn_, bloc));
     9675+      vals->push_back(Expression::make_func_code_reference(this->fn_, bloc));
    84509676+      Expression* init =
    84519677+       Expression::make_struct_composite_literal(this->type(), vals, bloc);
     
    85479773 
    85489774 // Return the name of an unknown expression.
    8549 @@ -5462,6 +5668,7 @@
     9775@@ -5462,6 +5649,7 @@
    85509776       if (tleft->is_abstract()
    85519777          && subcontext.type != NULL
     
    85559781        this->report_error(("invalid context-determined non-integer type "
    85569782                            "for left operand of shift"));
    8557 @@ -5641,6 +5848,20 @@
     9783@@ -5641,6 +5829,20 @@
    85589784          this->set_is_error();
    85599785          return;
     
    85769802   else
    85779803     {
    8578 @@ -6429,20 +6650,49 @@
     9804@@ -6429,20 +6631,49 @@
    85799805   return Expression::traverse(&this->expr_, traverse);
    85809806 }
     
    86339859 
    86349860 // Determine the types of a method expression.
    8635 @@ -6450,7 +6700,14 @@
     9861@@ -6450,7 +6681,14 @@
    86369862 void
    86379863 Bound_method_expression::do_determine_type(const Type_context*)
     
    86499875     this->expr_->determine_type_no_context();
    86509876   else
    8651 @@ -6465,31 +6722,278 @@
     9877@@ -6465,31 +6703,278 @@
    86529878 void
    86539879 Bound_method_expression::do_check_types(Gogo*)
     
    86689894+  else if (fn->is_function_declaration())
    86699895+    fntype = fn->func_declaration_value()->type();
    8670    else
     9896+  else
    86719897+    go_unreachable();
    86729898+  Type* rtype = fntype->receiver()->type()->deref();
     
    87039929+    Bound_method_expression::method_value_thunks.insert(val);
    87049930+  if (!ins.second)
     9931+    {
     9932+      // We have seen this method before.
     9933+      go_assert(ins.first->second != NULL);
     9934+      return ins.first->second;
     9935+    }
     9936+
     9937+  Location loc = fn->location();
     9938+
     9939+  Function_type* orig_fntype;
     9940+  if (fn->is_function())
     9941+    orig_fntype = fn->func_value()->type();
     9942+  else if (fn->is_function_declaration())
     9943+    orig_fntype = fn->func_declaration_value()->type();
     9944+  else
     9945+    orig_fntype = NULL;
     9946+
     9947+  if (orig_fntype == NULL || !orig_fntype->is_method())
     9948+    {
     9949+      ins.first->second = Named_object::make_erroneous_name(Gogo::thunk_name());
     9950+      return ins.first->second;
     9951+    }
     9952+
     9953+  Struct_field_list* sfl = new Struct_field_list();
     9954+  // The type here is wrong--it should be the C function type.  But it
     9955+  // doesn't really matter.
     9956+  Type* vt = Type::make_pointer_type(Type::make_void_type());
     9957+  sfl->push_back(Struct_field(Typed_identifier("fn.0", vt, loc)));
     9958+  sfl->push_back(Struct_field(Typed_identifier("val.1",
     9959+                                              orig_fntype->receiver()->type(),
     9960+                                              loc)));
     9961+  Type* closure_type = Type::make_struct_type(sfl, loc);
     9962+  closure_type = Type::make_pointer_type(closure_type);
     9963+
     9964+  Function_type* new_fntype = orig_fntype->copy_with_names();
     9965+
     9966+  Named_object* new_no = gogo->start_function(Gogo::thunk_name(), new_fntype,
     9967+                                             false, loc);
     9968+
     9969+  Variable* cvar = new Variable(closure_type, NULL, false, false, false, loc);
     9970+  cvar->set_is_used();
     9971+  Named_object* cp = Named_object::make_variable("$closure", NULL, cvar);
     9972+  new_no->func_value()->set_closure_var(cp);
     9973+
     9974+  gogo->start_block(loc);
     9975+
     9976+  // Field 0 of the closure is the function code pointer, field 1 is
     9977+  // the value on which to invoke the method.
     9978+  Expression* arg = Expression::make_var_reference(cp, loc);
     9979+  arg = Expression::make_unary(OPERATOR_MULT, arg, loc);
     9980+  arg = Expression::make_field_reference(arg, 1, loc);
     9981+
     9982+  Expression* bme = Expression::make_bound_method(arg, method, fn, loc);
     9983+
     9984+  const Typed_identifier_list* orig_params = orig_fntype->parameters();
     9985+  Expression_list* args;
     9986+  if (orig_params == NULL || orig_params->empty())
     9987+    args = NULL;
     9988   else
    87059989     {
    87069990-      Type* rtype = this->type()->function_type()->receiver()->type()->deref();
     
    87119995-      if (!Type::are_identical(rtype, etype, true, NULL))
    87129996-       this->report_error(_("method type does not match object type"));
    8713 +      // We have seen this method before.
    8714 +      go_assert(ins.first->second != NULL);
    8715 +      return ins.first->second;
    8716      }
    8717 +
    8718 +  Location loc = fn->location();
    8719 +
    8720 +  Function_type* orig_fntype;
    8721 +  if (fn->is_function())
    8722 +    orig_fntype = fn->func_value()->type();
    8723 +  else if (fn->is_function_declaration())
    8724 +    orig_fntype = fn->func_declaration_value()->type();
    8725 +  else
    8726 +    orig_fntype = NULL;
    8727 +
    8728 +  if (orig_fntype == NULL || !orig_fntype->is_method())
    8729 +    {
    8730 +      ins.first->second = Named_object::make_erroneous_name(Gogo::thunk_name());
    8731 +      return ins.first->second;
    8732 +    }
    8733 +
    8734 +  Struct_field_list* sfl = new Struct_field_list();
    8735 +  // The type here is wrong--it should be new_fntype.  But we don't
    8736 +  // have new_fntype yet, and it doesn't really matter.
    8737 +  Type* vt = Type::make_pointer_type(Type::make_void_type());
    8738 +  sfl->push_back(Struct_field(Typed_identifier("fn.0", vt, loc)));
    8739 +  sfl->push_back(Struct_field(Typed_identifier("val.1",
    8740 +                                              orig_fntype->receiver()->type(),
    8741 +                                              loc)));
    8742 +  Type* closure_type = Type::make_struct_type(sfl, loc);
    8743 +  closure_type = Type::make_pointer_type(closure_type);
    8744 +
    8745 +  Function_type* new_fntype = orig_fntype->copy_with_closure(closure_type);
    8746 +
    8747 +  Named_object* new_no = gogo->start_function(Gogo::thunk_name(), new_fntype,
    8748 +                                             false, loc);
    8749 +
    8750 +  gogo->start_block(loc);
    8751 +
    8752 +  Named_object* cp = gogo->lookup("closure.0", NULL);
    8753 +  go_assert(cp != NULL
    8754 +           && cp->is_variable()
    8755 +           && cp->var_value()->is_parameter());
    8756 +
    8757 +  // Field 0 of the closure is the function code pointer, field 1 is
    8758 +  // the value on which to invoke the method.
    8759 +  Expression* arg = Expression::make_var_reference(cp, loc);
    8760 +  arg = Expression::make_unary(OPERATOR_MULT, arg, loc);
    8761 +  arg = Expression::make_field_reference(arg, 1, loc);
    8762 +
    8763 +  Expression* bme = Expression::make_bound_method(arg, method, fn, loc);
    8764 +
    8765 +  const Typed_identifier_list* orig_params = orig_fntype->parameters();
    8766 +  Expression_list* args;
    8767 +  if (orig_params == NULL || orig_params->empty())
    8768 +    args = NULL;
    8769 +  else
    8770 +    {
    87719997+      const Typed_identifier_list* new_params = new_fntype->parameters();
    87729998+      args = new Expression_list();
    87739999+      for (Typed_identifier_list::const_iterator p = new_params->begin();
    8774 +          p + 1 != new_params->end();
     10000+          p != new_params->end();
    877510001+          ++p)
    877610002+       {
     
    878110007+         args->push_back(Expression::make_var_reference(p_no, loc));
    878210008+       }
    8783 +    }
     10009     }
    878410010+
    878510011+  Call_expression* call = Expression::make_call(bme, args,
     
    894510171 
    894610172 // Dump ast representation of a bound method expression.
    8947 @@ -6508,16 +7012,16 @@
     10173@@ -6508,16 +6993,16 @@
    894810174       ast_dump_context->ostream() << ")";
    894910175     }
     
    896610192 
    896710193 // Class Builtin_call_expression.  This is used for a call to a
    8968 @@ -6722,6 +7226,26 @@
     10194@@ -6722,6 +7207,26 @@
    896910195       return Expression::make_error(loc);
    897010196     }
     
    899310219     {
    899410220       Numeric_constant nc;
    8995 @@ -6874,6 +7398,8 @@
     10221@@ -6874,6 +7379,8 @@
    899610222   Type* uintptr_type = Type::lookup_integer_type("uintptr");
    899710223   int uintptr_bits = uintptr_type->integer_type()->bits();
     
    900210228   Expression* len_arg;
    900310229   if (parg == args->end())
    9004 @@ -6892,6 +7418,7 @@
     10230@@ -6892,6 +7399,7 @@
    900510231   else
    900610232     {
     
    901010236        return Expression::make_error(this->location());
    901110237       if (len_arg->type()->integer_type() != NULL
    9012 @@ -6904,6 +7431,7 @@
     10238@@ -6904,6 +7412,7 @@
    901310239   if (is_slice && parg != args->end())
    901410240     {
     
    901810244        return Expression::make_error(this->location());
    901910245 
    9020 @@ -7279,19 +7807,31 @@
     10246@@ -7240,8 +7749,6 @@
     10247        return false;
     10248       if (arg_type->is_abstract())
     10249        return false;
     10250-      if (arg_type->named_type() != NULL)
     10251-       arg_type->named_type()->convert(this->gogo_);
     10252 
     10253       unsigned int ret;
     10254       if (this->code_ == BUILTIN_SIZEOF)
     10255@@ -7279,19 +7786,31 @@
    902110256       Field_reference_expression* farg = arg->field_reference_expression();
    902210257       if (farg == NULL)
     
    906210297     }
    906310298   else if (this->code_ == BUILTIN_REAL || this->code_ == BUILTIN_IMAG)
    9064 @@ -7509,6 +8049,8 @@
     10299@@ -7509,6 +8028,8 @@
    906510300     case BUILTIN_REAL:
    906610301     case BUILTIN_IMAG:
     
    907110306       break;
    907210307 
    9073 @@ -7517,6 +8059,8 @@
     10308@@ -7517,6 +8038,8 @@
    907410309        // For the complex function the type of one operand can
    907510310        // determine the type of the other, as in a binary expression.
     
    908010315          {
    908110316            Type* t1 = args->front()->type();
    9082 @@ -8509,6 +9053,74 @@
     10317@@ -8509,6 +9032,74 @@
    908310318 
    908410319 // Class Call_expression.
     
    915510390 
    915610391 int
    9157 @@ -8624,7 +9236,7 @@
     10392@@ -8542,35 +9133,27 @@
     10393   // Because do_type will return an error type and thus prevent future
     10394   // errors, check for that case now to ensure that the error gets
     10395   // reported.
     10396-  if (this->get_function_type() == NULL)
     10397+  Function_type* fntype = this->get_function_type();
     10398+  if (fntype == NULL)
     10399     {
     10400       if (!this->fn_->type()->is_error())
     10401        this->report_error(_("expected function"));
     10402       return Expression::make_error(loc);
     10403     }
     10404 
     10405-  // Recognize a call to a builtin function.
     10406-  Func_expression* fne = this->fn_->func_expression();
     10407-  if (fne != NULL
     10408-      && fne->named_object()->is_function_declaration()
     10409-      && fne->named_object()->func_declaration_value()->type()->is_builtin())
     10410-    return new Builtin_call_expression(gogo, this->fn_, this->args_,
     10411-                                      this->is_varargs_, loc);
     10412-
     10413   // Handle an argument which is a call to a function which returns
     10414   // multiple results.
     10415   if (this->args_ != NULL
     10416       && this->args_->size() == 1
     10417-      && this->args_->front()->call_expression() != NULL
     10418-      && this->fn_->type()->function_type() != NULL)
     10419+      && this->args_->front()->call_expression() != NULL)
     10420     {
     10421-      Function_type* fntype = this->fn_->type()->function_type();
     10422       size_t rc = this->args_->front()->call_expression()->result_count();
     10423       if (rc > 1
     10424-         && fntype->parameters() != NULL
     10425-         && (fntype->parameters()->size() == rc
     10426-             || (fntype->is_varargs()
     10427-                 && fntype->parameters()->size() - 1 <= rc)))
     10428+         && ((fntype->parameters() != NULL
     10429+               && (fntype->parameters()->size() == rc
     10430+                   || (fntype->is_varargs()
     10431+                       && fntype->parameters()->size() - 1 <= rc)))
     10432+              || fntype->is_builtin()))
     10433        {
     10434          Call_expression* call = this->args_->front()->call_expression();
     10435          Expression_list* args = new Expression_list;
     10436@@ -8584,6 +9167,11 @@
     10437        }
     10438     }
     10439 
     10440+  // Recognize a call to a builtin function.
     10441+  if (fntype->is_builtin())
     10442+    return new Builtin_call_expression(gogo, this->fn_, this->args_,
     10443+                                      this->is_varargs_, loc);
     10444+
     10445   // If this call returns multiple results, create a temporary
     10446   // variable for each result.
     10447   size_t rc = this->result_count();
     10448@@ -8592,8 +9180,7 @@
     10449       std::vector<Temporary_statement*>* temps =
     10450        new std::vector<Temporary_statement*>;
     10451       temps->reserve(rc);
     10452-      const Typed_identifier_list* results =
     10453-       this->fn_->type()->function_type()->results();
     10454+      const Typed_identifier_list* results = fntype->results();
     10455       for (Typed_identifier_list::const_iterator p = results->begin();
     10456           p != results->end();
     10457           ++p)
     10458@@ -8608,10 +9195,8 @@
     10459 
     10460   // Handle a call to a varargs function by packaging up the extra
     10461   // parameters.
     10462-  if (this->fn_->type()->function_type() != NULL
     10463-      && this->fn_->type()->function_type()->is_varargs())
     10464+  if (fntype->is_varargs())
     10465     {
     10466-      Function_type* fntype = this->fn_->type()->function_type();
     10467       const Typed_identifier_list* parameters = fntype->parameters();
     10468       go_assert(parameters != NULL && !parameters->empty());
     10469       Type* varargs_type = parameters->back().type();
     10470@@ -8624,7 +9209,7 @@
    915810471   Bound_method_expression* bme = this->fn_->bound_method_expression();
    915910472   if (bme != NULL)
     
    916410477 
    916510478       // We always pass a pointer when calling a method.
    9166 @@ -8665,7 +9277,7 @@
     10479@@ -8665,7 +9250,7 @@
    916710480       // old arguments, because we may be traversing them up in some
    916810481       // caller.  FIXME.
     
    917310486     }
    917410487 
    9175 @@ -9117,11 +9729,21 @@
     10488@@ -9117,6 +9702,16 @@
    917610489   const bool has_closure = func != NULL && func->closure() != NULL;
    917710490   const bool is_interface_method = interface_method != NULL;
    917810491 
    9179 int closure_arg;
     10492bool has_closure_arg;
    918010493+  if (has_closure)
    9181 +    closure_arg = 1;
     10494+    has_closure_arg = true;
    918210495+  else if (func != NULL)
    9183 +    closure_arg = 0;
     10496+    has_closure_arg = false;
    918410497+  else if (is_interface_method)
    9185 +    closure_arg = 0;
     10498+    has_closure_arg = false;
    918610499+  else
    9187 +    closure_arg = 1;
     10500+    has_closure_arg = true;
    918810501+
    918910502   int nargs;
    919010503   tree* args;
    919110504   if (this->args_ == NULL || this->args_->empty())
    9192      {
    9193 -      nargs = is_interface_method ? 1 : 0;
    9194 +      nargs = (is_interface_method ? 1 : 0) + closure_arg;
    9195        args = nargs == 0 ? NULL : new tree[nargs];
    9196      }
    9197    else if (fntype->parameters() == NULL || fntype->parameters()->empty())
    9198 @@ -9130,7 +9752,7 @@
    9199        go_assert(!is_interface_method
    9200                 && fntype->is_method()
    9201                 && this->args_->size() == 1);
    9202 -      nargs = 1;
    9203 +      nargs = 1 + closure_arg;
    9204        args = new tree[nargs];
    9205        args[0] = this->args_->front()->get_tree(context);
    9206      }
    9207 @@ -9141,6 +9763,7 @@
    9208        nargs = this->args_->size();
    9209        int i = is_interface_method ? 1 : 0;
    9210        nargs += i;
    9211 +      nargs += closure_arg;
    9212        args = new tree[nargs];
    9213  
    9214        Typed_identifier_list::const_iterator pp = params->begin();
    9215 @@ -9161,36 +9784,71 @@
     10505@@ -9161,36 +9756,71 @@
    921610506                                                       arg_val,
    921710507                                                       location);
     
    922410514        }
    922510515       go_assert(pp == params->end());
    9226 -      go_assert(i == nargs);
    9227 +      go_assert(i + closure_arg == nargs);
     10516       go_assert(i == nargs);
    922810517     }
    922910518 
     
    925110540-  if (has_closure)
    925210541-    fn = func->get_tree_without_closure(gogo);
     10542+  tree closure_tree;
    925310543+  if (func != NULL)
    925410544+    {
    925510545+      Named_object* no = func->named_object();
    9256 +      go_assert(!no->is_function()
    9257 +               || !no->func_value()->is_descriptor_wrapper());
    925810546+      fn = Func_expression::get_code_pointer(gogo, no, location);
    9259 +      if (has_closure)
     10547+      if (!has_closure)
     10548+       closure_tree = NULL_TREE;
     10549+      else
    926010550+       {
    9261 +         go_assert(closure_arg == 1 && nargs > 0);
    9262 +         args[nargs - 1] = func->closure()->get_tree(context);
     10551+         closure_tree = func->closure()->get_tree(context);
     10552+         if (closure_tree == error_mark_node)
     10553+           return error_mark_node;
    926310554+       }
    926410555+    }
     
    927210563-      delete[] args;
    927310564-      return error_mark_node;
    9274 +      tree closure_tree = this->fn_->get_tree(context);
     10565+      closure_tree = this->fn_->get_tree(context);
    927510566+      if (closure_tree == error_mark_node)
    927610567+       return error_mark_node;
     
    928610577+                                                      fnc),
    928710578+                          field, NULL_TREE);
    9288 +      go_assert(closure_arg == 1 && nargs > 0);
    9289 +      args[nargs - 1] = closure_tree;
    929010579+    }     
    929110580+  else
     
    929510584+      if (fn == error_mark_node)
    929610585+       return error_mark_node;
    9297 +      go_assert(closure_arg == 0);
     10586+      closure_tree = NULL_TREE;
    929810587     }
    929910588 
     
    930410593   if (TREE_CODE(fndecl) == ADDR_EXPR)
    930510594     fndecl = TREE_OPERAND(fndecl, 0);
    9306 @@ -9198,12 +9856,7 @@
     10595@@ -9198,12 +9828,7 @@
    930710596   // Add a type cast in case the type of the function is a recursive
    930810597   // type which refers to itself.
     
    931810607   // This is to support builtin math functions when using 80387 math.
    931910608   tree excess_type = NULL_TREE;
    9320 @@ -9247,13 +9900,6 @@
     10609@@ -9241,19 +9866,38 @@
     10610   if (func == NULL)
     10611     fn = save_expr(fn);
     10612 
     10613+  if (!has_closure_arg)
     10614+    go_assert(closure_tree == NULL_TREE);
     10615+  else
     10616+    {
     10617+      // Pass the closure argument by calling the function function
     10618+      // __go_set_closure.  In the order_evaluations pass we have
     10619+      // ensured that if any parameters contain call expressions, they
     10620+      // will have been moved out to temporary variables.
     10621+
     10622+      go_assert(closure_tree != NULL_TREE);
     10623+      closure_tree = fold_convert_loc(location.gcc_location(), ptr_type_node,
     10624+                                     closure_tree);
     10625+      static tree set_closure_fndecl;
     10626+      tree set_closure = Gogo::call_builtin(&set_closure_fndecl,
     10627+                                           location,
     10628+                                           "__go_set_closure",
     10629+                                           1,
     10630+                                           void_type_node,
     10631+                                           ptr_type_node,
     10632+                                           closure_tree);
     10633+      if (set_closure == error_mark_node)
     10634+       return error_mark_node;
     10635+      fn = build2_loc(location.gcc_location(), COMPOUND_EXPR,
     10636+                     TREE_TYPE(fn), set_closure, fn);
     10637+    }
     10638+
     10639   tree ret = build_call_array(excess_type != NULL_TREE ? excess_type : rettype,
     10640                              fn, nargs, args);
     10641   delete[] args;
    932110642 
    932210643   SET_EXPR_LOCATION(ret, location.gcc_location());
     
    933210653   //   type F func() F
    933310654   // we have used ptr_type_node for the return type.  Add a cast here
    9334 @@ -9274,24 +9920,6 @@
     10655@@ -9274,24 +9918,6 @@
    933510656   if (this->results_ != NULL)
    933610657     ret = this->set_results(context, ret);
     
    935710678 
    935810679   return ret;
    9359 @@ -9774,13 +10402,20 @@
     10680@@ -9774,13 +10400,20 @@
    936010681 void
    936110682 Array_index_expression::do_check_types(Gogo*)
     
    938010701 
    938110702   Array_type* array_type = this->array_->type()->array_type();
    9382 @@ -10845,6 +11480,28 @@
     10703@@ -10845,6 +11478,28 @@
    938310704   return Expression::traverse(&this->expr_, traverse);
    938410705 }
     
    940910730 
    941010731 Type*
    9411 @@ -10905,18 +11562,188 @@
     10732@@ -10905,18 +11560,188 @@
    941210733     }
    941310734 }
     
    946610787+
    946710788+  Struct_field_list* sfl = new Struct_field_list();
    9468 +  // The type here is wrong--it should be new_fntype.  But we don't
    9469 +  // have new_fntype yet, and it doesn't really matter.
     10789+  // The type here is wrong--it should be the C function type.  But it
     10790+  // doesn't really matter.
    947010791+  Type* vt = Type::make_pointer_type(Type::make_void_type());
    947110792+  sfl->push_back(Struct_field(Typed_identifier("fn.0", vt, loc)));
     
    947410795+  closure_type = Type::make_pointer_type(closure_type);
    947510796+
    9476 +  Function_type* new_fntype = orig_fntype->copy_with_closure(closure_type);
     10797+  Function_type* new_fntype = orig_fntype->copy_with_names();
    947710798+
    947810799+  Named_object* new_no = gogo->start_function(Gogo::thunk_name(), new_fntype,
    947910800+                                             false, loc);
    948010801+
     10802+  Variable* cvar = new Variable(closure_type, NULL, false, false, false, loc);
     10803+  cvar->set_is_used();
     10804+  Named_object* cp = Named_object::make_variable("$closure", NULL, cvar);
     10805+  new_no->func_value()->set_closure_var(cp);
     10806+
    948110807+  gogo->start_block(loc);
    9482 +
    9483 +  Named_object* cp = gogo->lookup("closure.0", NULL);
    9484 +  go_assert(cp != NULL
    9485 +           && cp->is_variable()
    9486 +           && cp->var_value()->is_parameter());
    948710808+
    948810809+  // Field 0 of the closure is the function code pointer, field 1 is
     
    950410825+      args = new Expression_list();
    950510826+      for (Typed_identifier_list::const_iterator p = new_params->begin();
    9506 +          p + 1 != new_params->end();
     10827+          p != new_params->end();
    950710828+          ++p)
    950810829+       {
     
    960710928 
    960810929 // Dump ast representation for an interface field reference.
    9609 @@ -11114,8 +11941,10 @@
     10930@@ -11114,8 +11939,10 @@
    961010931   // as their first argument.  If this is for a pointer type, we can
    961110932   // simply reuse the existing function.  We use an internal hack to
     
    962010941       Named_object* mno = (method->needs_stub_method()
    962110942                           ? method->stub_object()
    9622 @@ -11170,22 +11999,7 @@
     10943@@ -11170,22 +11997,7 @@
    962310944                                                method_type->is_varargs(),
    962410945                                                location);
     
    964610967diff -Naur gcc-4.8.1.orig/gcc/go/gofrontend/expressions.h gcc-4.8.1/gcc/go/gofrontend/expressions.h
    964710968--- gcc-4.8.1.orig/gcc/go/gofrontend/expressions.h      2013-01-29 00:28:09.000000000 +0000
    9648 +++ gcc-4.8.1/gcc/go/gofrontend/expressions.h   2013-09-13 19:01:43.123198407 +0000
     10969+++ gcc-4.8.1/gcc/go/gofrontend/expressions.h   2013-10-01 16:06:43.988554285 +0000
    964910970@@ -16,6 +16,7 @@
    965010971 class Traverse;
     
    975611077  protected:
    975711078   int
    9758 @@ -1532,11 +1556,68 @@
     11079@@ -1532,11 +1556,59 @@
    975911080   // The function itself.
    976011081   Named_object* function_;
     
    977611097+  Func_descriptor_expression(Named_object* fn);
    977711098+
    9778 +  // Set the descriptor wrapper.
    9779 +  void
    9780 +  set_descriptor_wrapper(Named_object* dfn)
    9781 +  {
    9782 +    go_assert(this->dfn_ == NULL);
    9783 +    this->dfn_ = dfn;
    9784 +  }
    9785 +
    978611099+  // Make the function descriptor type, so that it can be converted.
    978711100+  static void
     
    980011113+
    980111114+  Expression*
    9802 +  do_copy();
     11115+  do_copy()
     11116+  { return Expression::make_func_descriptor(this->fn_); }
    980311117+
    980411118+  bool
     
    981811132+  // The function for which this is the descriptor.
    981911133+  Named_object* fn_;
    9820 +  // The descriptor function.
    9821 +  Named_object* dfn_;
    982211134+  // The descriptor variable.
    982311135+  Bvariable* dvar_;
     
    982711139 
    982811140 class Unknown_expression : public Parser_expression
    9829 @@ -1773,10 +1854,10 @@
     11141@@ -1773,10 +1845,10 @@
    983011142 class Bound_method_expression : public Expression
    983111143 {
     
    984111153 
    984211154   // Return the object which is the first argument.
    9843 @@ -1791,20 +1872,33 @@
     11155@@ -1791,20 +1863,33 @@
    984411156   first_argument_type() const
    984511157   { return this->expr_type_; }
     
    987811190   do_type();
    987911191 
    9880 @@ -1818,7 +1912,7 @@
     11192@@ -1818,7 +1903,7 @@
    988111193   do_copy()
    988211194   {
     
    988711199 
    988811200   tree
    9889 @@ -1828,6 +1922,11 @@
     11201@@ -1828,6 +1913,11 @@
    989011202   do_dump_expression(Ast_dump_context*) const;
    989111203 
     
    989911211   // as the first argument.
    990011212   Expression* expr_;
    9901 @@ -1835,8 +1934,12 @@
     11213@@ -1835,8 +1925,12 @@
    990211214   // NULL in the normal case, non-NULL when using a method from an
    990311215   // anonymous field which does not require a stub.
     
    991411226 
    991511227 // A reference to a field in a struct.
    9916 @@ -1847,7 +1950,7 @@
     11228@@ -1847,7 +1941,7 @@
    991711229   Field_reference_expression(Expression* expr, unsigned int field_index,
    991811230                             Location location)
     
    992311235 
    992411236   // Return the struct expression.
    9925 @@ -1860,6 +1963,15 @@
     11237@@ -1860,6 +1954,15 @@
    992611238   field_index() const
    992711239   { return this->field_index_; }
     
    993911251   void
    994011252   set_struct_expression(Expression* expr)
    9941 @@ -1914,6 +2026,9 @@
     11253@@ -1914,6 +2017,9 @@
    994211254   Expression* expr_;
    994311255   // The zero-based index of the field we are retrieving.
     
    994911261   bool called_fieldtrack_;
    995011262 };
    9951 @@ -1940,6 +2055,11 @@
     11263@@ -1940,6 +2046,11 @@
    995211264   name() const
    995311265   { return this->name_; }
     
    996111273   // tree for the expression.
    996211274   tree
    9963 @@ -1955,6 +2075,9 @@
     11275@@ -1955,6 +2066,9 @@
    996411276   int
    996511277   do_traverse(Traverse* traverse);
     
    997111283   do_type();
    997211284 
    9973 @@ -1979,6 +2102,13 @@
     11285@@ -1979,6 +2093,13 @@
    997411286   do_dump_expression(Ast_dump_context*) const;
    997511287 
     
    998711299diff -Naur gcc-4.8.1.orig/gcc/go/gofrontend/go.cc gcc-4.8.1/gcc/go/gofrontend/go.cc
    998811300--- gcc-4.8.1.orig/gcc/go/gofrontend/go.cc      2012-10-31 00:38:49.000000000 +0000
    9989 +++ gcc-4.8.1/gcc/go/gofrontend/go.cc   2013-09-13 19:01:43.123198407 +0000
     11301+++ gcc-4.8.1/gcc/go/gofrontend/go.cc   2013-10-01 16:06:43.988554285 +0000
    999011302@@ -44,7 +44,7 @@
    999111303 GO_EXTERN_C
     
    1002711339diff -Naur gcc-4.8.1.orig/gcc/go/gofrontend/gogo-tree.cc gcc-4.8.1/gcc/go/gofrontend/gogo-tree.cc
    1002811340--- gcc-4.8.1.orig/gcc/go/gofrontend/gogo-tree.cc       2013-01-29 00:28:09.000000000 +0000
    10029 +++ gcc-4.8.1/gcc/go/gofrontend/gogo-tree.cc    2013-09-13 19:01:43.126531731 +0000
     11341+++ gcc-4.8.1/gcc/go/gofrontend/gogo-tree.cc    2013-10-01 16:06:43.988554285 +0000
    1003011342@@ -755,6 +755,18 @@
    1003111343   this->build_interface_method_tables();
     
    1007211384       // have ideal or non-integral type.
    1007311385       if (no->is_const())
    10074 @@ -1255,14 +1278,47 @@
     11386@@ -986,6 +1009,16 @@
     11387       else
     11388        package_name = this->package_->package_name();
     11389 
     11390+      // Note that this will be misleading if this is an unexported
     11391+      // method generated for an embedded imported type.  In that case
     11392+      // the unexported method should have the package name of the
     11393+      // package from which it is imported, but we are going to give
     11394+      // it our package name.  Fixing this would require knowing the
     11395+      // package name, but we only know the package path.  It might be
     11396+      // better to use package paths here anyhow.  This doesn't affect
     11397+      // the assembler code, because we always set that name in
     11398+      // Function::get_or_make_decl anyhow.  FIXME.
     11399+
     11400       decl_name = package_name + '.' + Gogo::unpack_hidden_name(this->name_);
     11401 
     11402       Function_type* fntype;
     11403@@ -1028,6 +1061,12 @@
     11404   if (this->tree_ != NULL_TREE)
     11405     return this->tree_;
     11406 
     11407+  if (Gogo::is_erroneous_name(this->name_))
     11408+    {
     11409+      this->tree_ = error_mark_node;
     11410+      return error_mark_node;
     11411+    }
     11412+
     11413   tree name;
     11414   if (this->classification_ == NAMED_OBJECT_TYPE)
     11415     name = NULL_TREE;
     11416@@ -1255,14 +1294,23 @@
    1007511417   if (this->fndecl_ == NULL_TREE)
    1007611418     {
     
    1008711429+         go_assert(FUNCTION_POINTER_TYPE_P(functype));
    1008811430+         functype = TREE_TYPE(functype);
    10089 +
    10090 +         // In the struct, the function type always has a trailing
    10091 +         // closure argument.  For the function body, we only use
    10092 +         // that trailing arg if this is a function literal or if it
    10093 +         // is a wrapper created to store in a descriptor.  Remove it
    10094 +         // in that case.
    10095 +         if (this->enclosing_ == NULL && !this->is_descriptor_wrapper_)
    10096 +           {
    10097 +             tree old_params = TYPE_ARG_TYPES(functype);
    10098 +             go_assert(old_params != NULL_TREE
    10099 +                       && old_params != void_list_node);
    10100 +             tree new_params = NULL_TREE;
    10101 +             tree *pp = &new_params;
    10102 +             while (TREE_CHAIN (old_params) != void_list_node)
    10103 +               {
    10104 +                 tree p = TREE_VALUE(old_params);
    10105 +                 go_assert(TYPE_P(p));
    10106 +                 *pp = tree_cons(NULL_TREE, p, NULL_TREE);
    10107 +                 pp = &TREE_CHAIN(*pp);
    10108 +                 old_params = TREE_CHAIN (old_params);
    10109 +               }
    10110 +             *pp = void_list_node;
    10111 +             functype = build_function_type(TREE_TYPE(functype), new_params);
    10112 +           }
    1011311431+       }
    1011411432+
     
    1012411442                                  id, functype);
    1012511443 
    10126 @@ -1308,9 +1364,6 @@
     11444@@ -1285,7 +1333,21 @@
     11445                   || this->type_->is_method())
     11446            {
     11447              TREE_PUBLIC(decl) = 1;
     11448-             std::string asm_name = gogo->pkgpath_symbol();
     11449+             std::string pkgpath = gogo->pkgpath_symbol();
     11450+             if (this->type_->is_method()
     11451+                 && Gogo::is_hidden_name(no->name())
     11452+                 && Gogo::hidden_name_pkgpath(no->name()) != gogo->pkgpath())
     11453+               {
     11454+                 // This is a method we created for an unexported
     11455+                 // method of an imported embedded type.  We need to
     11456+                 // use the pkgpath of the imported package to avoid
     11457+                 // a possible name collision.  See bug478 for a test
     11458+                 // case.
     11459+                 pkgpath = Gogo::hidden_name_pkgpath(no->name());
     11460+                 pkgpath = Gogo::pkgpath_for_symbol(pkgpath);
     11461+               }
     11462+
     11463+             std::string asm_name = pkgpath;
     11464              asm_name.append(1, '.');
     11465              asm_name.append(Gogo::unpack_hidden_name(no->name()));
     11466              if (this->type_->is_method())
     11467@@ -1308,9 +1370,6 @@
    1012711468          DECL_CONTEXT(resdecl) = decl;
    1012811469          DECL_RESULT(decl) = resdecl;
     
    1013411475          // can't inline it, because recover behaves differently in a
    1013511476          // function passed directly to defer.  If this is a recover
    10136 @@ -1333,29 +1386,6 @@
     11477@@ -1333,29 +1392,6 @@
    1013711478            resolve_unique_section (decl, 0, 1);
    1013811479 
     
    1016411505     }
    1016511506   return this->fndecl_;
    10166 @@ -1382,15 +1412,44 @@
     11507@@ -1382,15 +1418,24 @@
    1016711508        }
    1016811509 
     
    1017911520+         go_assert(FUNCTION_POINTER_TYPE_P(functype));
    1018011521+         functype = TREE_TYPE(functype);
    10181 +
    10182 +         // In the struct, the function type always has a trailing
    10183 +         // closure argument.  Here we are referring to the function
    10184 +         // code directly, and we know it is not a function literal,
    10185 +         // and we know it is not a wrapper created to store in a
    10186 +         // descriptor.  Remove that trailing argument.
    10187 +         tree old_params = TYPE_ARG_TYPES(functype);
    10188 +         go_assert(old_params != NULL_TREE && old_params != void_list_node);
    10189 +         tree new_params = NULL_TREE;
    10190 +         tree *pp = &new_params;
    10191 +         while (TREE_CHAIN (old_params) != void_list_node)
    10192 +           {
    10193 +             tree p = TREE_VALUE(old_params);
    10194 +             go_assert(TYPE_P(p));
    10195 +             *pp = tree_cons(NULL_TREE, p, NULL_TREE);
    10196 +             pp = &TREE_CHAIN(*pp);
    10197 +             old_params = TREE_CHAIN (old_params);
    10198 +           }
    10199 +         *pp = void_list_node;
    10200 +         functype = build_function_type(TREE_TYPE(functype), new_params);
    1020111522+       }
    1020211523+
     
    1021311534                             functype);
    1021411535          TREE_PUBLIC(decl) = 1;
    10215 @@ -1599,6 +1658,32 @@
     11536@@ -1599,10 +1644,41 @@
    1021611537            }
    1021711538        }
    1021811539     }
    1021911540+
    10220 +  // The closure variable is passed last, if this is a function
    10221 +  // literal or a descriptor wrapper.
     11541   *pp = NULL_TREE;
     11542 
     11543   DECL_ARGUMENTS(fndecl) = params;
     11544 
     11545+  // If we need a closure variable, fetch it by calling a runtime
     11546+  // function.  The caller will have called __go_set_closure before
     11547+  // the function call.
    1022211548+  if (this->closure_var_ != NULL)
    1022311549+    {
     
    1022711553+      if (var_decl != error_mark_node)
    1022811554+       {
    10229 +         go_assert(TREE_CODE(var_decl) == PARM_DECL);
    10230 +         *pp = var_decl;
    10231 +         pp = &DECL_CHAIN(*pp);
     11555+         go_assert(TREE_CODE(var_decl) == VAR_DECL);
     11556+         static tree get_closure_fndecl;
     11557+         tree get_closure = Gogo::call_builtin(&get_closure_fndecl,
     11558+                                               this->location_,
     11559+                                               "__go_get_closure",
     11560+                                               0,
     11561+                                               ptr_type_node);
     11562+
     11563+         // Mark the __go_get_closure function as pure, since it
     11564+         // depends only on the global variable g.
     11565+         DECL_PURE_P(get_closure_fndecl) = 1;
     11566+
     11567+         get_closure = fold_convert_loc(this->location_.gcc_location(),
     11568+                                        TREE_TYPE(var_decl), get_closure);
     11569+         DECL_INITIAL(var_decl) = get_closure;
     11570+         DECL_CHAIN(var_decl) = declare_vars;
     11571+         declare_vars = var_decl;
    1023211572+       }
    1023311573+    }
    10234 +  else if (this->enclosing_ != NULL || this->is_descriptor_wrapper_)
    10235 +    {
    10236 +      tree parm_decl = build_decl(this->location_.gcc_location(), PARM_DECL,
    10237 +                                 get_identifier("$closure"),
    10238 +                                 const_ptr_type_node);
    10239 +      DECL_CONTEXT(parm_decl) = current_function_decl;
    10240 +      DECL_ARG_TYPE(parm_decl) = const_ptr_type_node;
    10241 +      *pp = parm_decl;
    10242 +      pp = &DECL_CHAIN(*pp);
    10243 +    }
    10244 +
    10245    *pp = NULL_TREE;
    10246  
    10247    DECL_ARGUMENTS(fndecl) = params;
    10248 @@ -1681,6 +1766,13 @@
     11574+
     11575   if (this->block_ != NULL)
     11576     {
     11577       go_assert(DECL_INITIAL(fndecl) == NULL_TREE);
     11578@@ -1681,6 +1757,13 @@
    1024911579 
    1025011580       DECL_SAVED_TREE(fndecl) = code;
     
    1026011590 
    1026111591 // Build the wrappers around function code needed if the function has
    10262 @@ -1844,6 +1936,20 @@
     11592@@ -1844,6 +1927,20 @@
    1026311593     }
    1026411594 }
     
    1028111611 
    1028211612 GO_EXTERN_C
    10283 @@ -2437,70 +2543,3 @@
     11613@@ -2437,70 +2534,3 @@
    1028411614                    build2(COMPOUND_EXPR, type_tree, call, tmp));
    1028511615     }
     
    1035411684diff -Naur gcc-4.8.1.orig/gcc/go/gofrontend/gogo.cc gcc-4.8.1/gcc/go/gofrontend/gogo.cc
    1035511685--- gcc-4.8.1.orig/gcc/go/gofrontend/gogo.cc    2013-02-10 06:02:38.000000000 +0000
    10356 +++ gcc-4.8.1/gcc/go/gofrontend/gogo.cc 2013-09-13 19:01:43.126531731 +0000
     11686+++ gcc-4.8.1/gcc/go/gofrontend/gogo.cc 2013-10-01 16:06:43.988554285 +0000
    1035711687@@ -364,7 +364,7 @@
    1035811688       // Declare "main" as a function which takes no parameters and
     
    1037411704   else if (!type->is_method())
    1037511705     {
    10376 @@ -1277,6 +1278,14 @@
     11706@@ -1191,6 +1192,27 @@
     11707   this->interface_types_.push_back(itype);
     11708 }
     11709 
     11710+// Return an erroneous name that indicates that an error has already
     11711+// been reported.
     11712+
     11713+std::string
     11714+Gogo::erroneous_name()
     11715+{
     11716+  static int erroneous_count;
     11717+  char name[50];
     11718+  snprintf(name, sizeof name, "$erroneous%d", erroneous_count);
     11719+  ++erroneous_count;
     11720+  return name;
     11721+}
     11722+
     11723+// Return whether a name is an erroneous name.
     11724+
     11725+bool
     11726+Gogo::is_erroneous_name(const std::string& name)
     11727+{
     11728+  return name.compare(0, 10, "$erroneous") == 0;
     11729+}
     11730+
     11731 // Return a name for a thunk object.
     11732 
     11733 std::string
     11734@@ -1277,6 +1299,14 @@
    1037711735                   n.c_str());
    1037811736          inform(pf->second, "%qs imported here", n.c_str());
     
    1038911747 }
    1039011748 
    10391 @@ -1599,8 +1608,9 @@
     11749@@ -1599,8 +1629,9 @@
    1039211750   return TRAVERSE_CONTINUE;
    1039311751 }
     
    1040111759 int
    1040211760 Lower_parse_tree::function(Named_object* no)
    10403 @@ -1732,6 +1742,146 @@
     11761@@ -1732,6 +1763,146 @@
    1040411762   lower.constant(no, false);
    1040511763 }
     
    1043311791+      && no->func_value()->enclosing() == NULL
    1043411792+      && !no->func_value()->is_method()
    10435 +      && !no->func_value()->is_descriptor_wrapper()
    10436 +      && !Gogo::is_hidden_name(no->name()))
     11793+      && !Gogo::is_hidden_name(no->name())
     11794+      && !Gogo::is_thunk(no))
    1043711795+    no->func_value()->descriptor(this->gogo_, no);
    1043811796+
     
    1054811906 // interfaces.
    1054911907 
    10550 @@ -2643,6 +2793,13 @@
     11908@@ -2217,7 +2388,7 @@
     11909   Block* retblock = new Block(enclosing, loc);
     11910   retblock->set_end_location(loc);
     11911 
     11912-  Temporary_statement* ts = Statement::make_temporary(Type::lookup_bool_type(),
     11913+  Temporary_statement* ts = Statement::make_temporary(shortcut->type(),
     11914                                                      left, loc);
     11915   retblock->add_statement(ts);
     11916 
     11917@@ -2391,13 +2562,38 @@
     11918     return TRAVERSE_CONTINUE;
     11919 
     11920   // If there is only one expression with a side-effect, we can
     11921-  // usually leave it in place.  However, for an assignment statement,
     11922-  // we need to evaluate an expression on the right hand side before
     11923-  // we evaluate any index expression on the left hand side, so for
     11924-  // that case we always move the expression.  Otherwise we mishandle
     11925-  // m[0] = len(m) where m is a map.
     11926-  if (c == 1 && s->classification() != Statement::STATEMENT_ASSIGNMENT)
     11927-    return TRAVERSE_CONTINUE;
     11928+  // usually leave it in place.
     11929+  if (c == 1)
     11930+    {
     11931+      switch (s->classification())
     11932+       {
     11933+       case Statement::STATEMENT_ASSIGNMENT:
     11934+         // For an assignment statement, we need to evaluate an
     11935+         // expression on the right hand side before we evaluate any
     11936+         // index expression on the left hand side, so for that case
     11937+         // we always move the expression.  Otherwise we mishandle
     11938+         // m[0] = len(m) where m is a map.
     11939+         break;
     11940+
     11941+       case Statement::STATEMENT_EXPRESSION:
     11942+         {
     11943+           // If this is a call statement that doesn't return any
     11944+           // values, it will not have been counted as a value to
     11945+           // move.  We need to move any subexpressions in case they
     11946+           // are themselves call statements that require passing a
     11947+           // closure.
     11948+           Expression* expr = s->expression_statement()->expr();
     11949+           if (expr->call_expression() != NULL
     11950+               && expr->call_expression()->result_count() == 0)
     11951+             break;
     11952+           return TRAVERSE_CONTINUE;
     11953+         }
     11954+
     11955+       default:
     11956+         // We can leave the expression in place.
     11957+         return TRAVERSE_CONTINUE;
     11958+       }
     11959+    }
     11960 
     11961   bool is_thunk = s->thunk_statement() != NULL;
     11962   for (Find_eval_ordering::const_iterator p = find_eval_ordering.begin();
     11963@@ -2643,10 +2839,17 @@
    1055111964   Expression* closure = NULL;
    1055211965   if (orig_func->needs_closure())
     
    1056211975       Variable* orig_closure_var = orig_closure_no->var_value();
    1056311976       Variable* new_var = new Variable(orig_closure_var->type(), NULL, false,
    10564 @@ -2682,22 +2839,7 @@
     11977-                                      true, false, location);
     11978+                                      false, false, location);
     11979       snprintf(buf, sizeof buf, "closure.%u", count);
     11980       ++count;
     11981       Named_object* new_closure_no = Named_object::make_variable(buf, NULL,
     11982@@ -2682,22 +2885,7 @@
    1056511983   // Any varargs call has already been lowered.
    1056611984   call->set_varargs_are_lowered();
     
    1058612004   gogo->add_statement(s);
    1058712005 
    10588 @@ -2991,7 +3133,8 @@
     12006@@ -2991,7 +3179,8 @@
    1058912007     return TRAVERSE_CONTINUE;
    1059012008 
     
    1059612014   return TRAVERSE_CONTINUE;
    1059712015 }
    10598 @@ -3101,6 +3244,7 @@
     12016@@ -3101,6 +3290,7 @@
    1059912017   Map_type::make_map_descriptor_type();
    1060012018   Channel_type::make_chan_type_descriptor_type();
     
    1060412022 
    1060512023   Runtime::convert_types(this);
    10606 @@ -3128,10 +3272,10 @@
     12024@@ -3128,9 +3318,9 @@
    1060712025                   Location location)
    1060812026   : type_(type), enclosing_(enclosing), results_(NULL),
     
    1061112029-    results_are_named_(false), nointerface_(false), calls_recover_(false),
    1061212030-    is_recover_thunk_(false), has_recover_thunk_(false),
    10613 -    in_unique_section_(false)
    1061412031+    local_type_count_(0), descriptor_(NULL), fndecl_(NULL), defer_stack_(NULL),
    1061512032+    is_sink_(false), results_are_named_(false), nointerface_(false),
    1061612033+    calls_recover_(false), is_recover_thunk_(false), has_recover_thunk_(false),
    10617 +    in_unique_section_(false), is_descriptor_wrapper_(false)
     12034     in_unique_section_(false)
    1061812035 {
    1061912036 }
    10620  
    10621 @@ -3206,6 +3350,7 @@
     12037@@ -3206,15 +3396,16 @@
    1062212038 {
    1062312039   if (this->closure_var_ == NULL)
     
    1062712043       // we find them.
    1062812044       Location loc = this->type_->location();
    10629 @@ -3229,7 +3374,14 @@
     12045       Struct_field_list* sfl = new Struct_field_list;
     12046       Type* struct_type = Type::make_struct_type(sfl, loc);
     12047       Variable* var = new Variable(Type::make_pointer_type(struct_type),
     12048-                                  NULL, false, true, false, loc);
     12049+                                  NULL, false, false, false, loc);
     12050       var->set_is_used();
     12051-      this->closure_var_ = Named_object::make_variable("closure", NULL, var);
     12052+      this->closure_var_ = Named_object::make_variable("$closure", NULL, var);
     12053       // Note that the new variable is not in any binding contour.
     12054     }
     12055   return this->closure_var_;
     12056@@ -3229,7 +3420,14 @@
    1063012057     return;
    1063112058   Named_object* closure = this->closure_var_;
     
    1064312070        p != this->closure_fields_.end();
    1064412071        ++p, ++index)
    10645 @@ -3410,6 +3562,102 @@
     12072@@ -3410,6 +3608,19 @@
    1064612073     this->block_->determine_types();
    1064712074 }
    1064812075 
    10649 +// Build a wrapper function for a function descriptor.  A function
    10650 +// descriptor refers to a function that takes a closure as its last
    10651 +// argument.  In this case there will be no closure, but an indirect
    10652 +// call will pass nil as the last argument.  We need to build a
    10653 +// wrapper function that accepts and discards that last argument, so
    10654 +// that cases like -mrtd will work correctly.  In most cases the
    10655 +// wrapper function will simply be a jump.
    10656 +
    10657 +Named_object*
    10658 +Function::make_descriptor_wrapper(Gogo* gogo, Named_object* no,
    10659 +                                 Function_type* orig_fntype)
    10660 +{
    10661 +  Location loc = no->location();
    10662 +
    10663 +  Type* vt = Type::make_pointer_type(Type::make_void_type());
    10664 +  Function_type* new_fntype = orig_fntype->copy_with_closure(vt);
    10665 +
    10666 +  std::string name = no->name() + "$descriptorfn";
    10667 +  Named_object* dno = gogo->start_function(name, new_fntype, false, loc);
    10668 +  dno->func_value()->is_descriptor_wrapper_ = true;
    10669 +
    10670 +  // Put the wrapper in a unique section so that it can be discarded
    10671 +  // by the linker if it is not needed.  Every top-level function will
    10672 +  // get a wrapper, in case there is a reference other than a call
    10673 +  // from some other package, but most will not need one.
    10674 +  dno->func_value()->set_in_unique_section();
    10675 +
    10676 +  gogo->start_block(loc);
    10677 +
    10678 +  Expression* fn = Expression::make_func_reference(no, NULL, loc);
    10679 +
    10680 +  // Call the function begin wrapped, passing all of the arguments
    10681 +  // except for the last one (the last argument is the ignored
    10682 +  // closure).
    10683 +  const Typed_identifier_list* orig_params = orig_fntype->parameters();
    10684 +  Expression_list* args;
    10685 +  if (orig_params == NULL || orig_params->empty())
    10686 +    args = NULL;
    10687 +  else
    10688 +    {
    10689 +      const Typed_identifier_list* new_params = new_fntype->parameters();
    10690 +      args = new Expression_list();
    10691 +      for (Typed_identifier_list::const_iterator p = new_params->begin();
    10692 +          p + 1 != new_params->end();
    10693 +          ++p)
    10694 +       {
    10695 +         Named_object* p_no = gogo->lookup(p->name(), NULL);
    10696 +         go_assert(p_no != NULL
    10697 +                   && p_no->is_variable()
    10698 +                   && p_no->var_value()->is_parameter());
    10699 +         args->push_back(Expression::make_var_reference(p_no, loc));
    10700 +       }
    10701 +    }
    10702 +
    10703 +  Call_expression* call = Expression::make_call(fn, args,
    10704 +                                               orig_fntype->is_varargs(),
    10705 +                                               loc);
    10706 +  call->set_varargs_are_lowered();
    10707 +
    10708 +  Statement* s = Statement::make_return_from_call(call, loc);
    10709 +  gogo->add_statement(s);
    10710 +  Block* b = gogo->finish_block(loc);
    10711 +  gogo->add_block(b, loc);
    10712 +  gogo->lower_block(dno, b);
    10713 +  gogo->finish_function(loc);
    10714 +
    10715 +  return dno;
    10716 +}
    10717 +
    1071812076+// Return the function descriptor, the value you get when you refer to
    1071912077+// the function in Go code without calling it.
    1072012078+
    1072112079+Expression*
    10722 +Function::descriptor(Gogo* gogo, Named_object* no)
     12080+Function::descriptor(Gogo*, Named_object* no)
    1072312081+{
    1072412082+  go_assert(!this->is_method());
    1072512083+  go_assert(this->closure_var_ == NULL);
    10726 +  go_assert(!this->is_descriptor_wrapper_);
    1072712084+  if (this->descriptor_ == NULL)
    10728 +    {
    10729 +      // Make and record the descriptor first, so that when we lower
    10730 +      // the descriptor wrapper we don't try to make it again.
    10731 +      Func_descriptor_expression* descriptor =
    10732 +       Expression::make_func_descriptor(no);
    10733 +      this->descriptor_ = descriptor;
    10734 +      if (no->package() == NULL
    10735 +         && !Linemap::is_predeclared_location(no->location()))
    10736 +       {
    10737 +         Named_object* dno = Function::make_descriptor_wrapper(gogo, no,
    10738 +                                                               this->type_);
    10739 +         descriptor->set_descriptor_wrapper(dno);
    10740 +       }
    10741 +    }
     12085+    this->descriptor_ = Expression::make_func_descriptor(no);
    1074212086+  return this->descriptor_;
    1074312087+}
     
    1074612090 // function, making it if necessary.  The value of the variable is set
    1074712091 // by the runtime routines to true if the function is returning,
    10748 @@ -3940,6 +4188,32 @@
     12092@@ -3940,6 +4151,19 @@
    1074912093     }
    1075012094 }
     
    1075512099+
    1075612100+Expression*
    10757 +Function_declaration::descriptor(Gogo* gogo, Named_object* no)
     12101+Function_declaration::descriptor(Gogo*, Named_object* no)
    1075812102+{
    1075912103+  go_assert(!this->fntype_->is_method());
    1076012104+  if (this->descriptor_ == NULL)
    10761 +    {
    10762 +      // Make and record the descriptor first, so that when we lower
    10763 +      // the descriptor wrapper we don't try to make it again.
    10764 +      Func_descriptor_expression* descriptor =
    10765 +       Expression::make_func_descriptor(no);
    10766 +      this->descriptor_ = descriptor;
    10767 +      if (no->package() == NULL
    10768 +         && !Linemap::is_predeclared_location(no->location()))
    10769 +       {
    10770 +         Named_object* dno = Function::make_descriptor_wrapper(gogo, no,
    10771 +                                                               this->fntype_);
    10772 +         descriptor->set_descriptor_wrapper(dno);
    10773 +       }
    10774 +    }
     12105+    this->descriptor_ = Expression::make_func_descriptor(no);
    1077512106+  return this->descriptor_;
    1077612107+}
     
    1077912110 
    1078012111 Variable::Variable(Type* type, Expression* init, bool is_global,
    10781 @@ -4755,6 +5029,12 @@
     12112@@ -4755,6 +4979,12 @@
    1078212113 Named_object::set_function_value(Function* function)
    1078312114 {
     
    1079412125diff -Naur gcc-4.8.1.orig/gcc/go/gofrontend/gogo.h gcc-4.8.1/gcc/go/gofrontend/gogo.h
    1079512126--- gcc-4.8.1.orig/gcc/go/gofrontend/gogo.h     2012-12-21 22:23:23.000000000 +0000
    10796 +++ gcc-4.8.1/gcc/go/gofrontend/gogo.h  2013-09-13 19:01:43.126531731 +0000
    10797 @@ -476,6 +476,10 @@
     12127+++ gcc-4.8.1/gcc/go/gofrontend/gogo.h  2013-10-01 16:06:43.988554285 +0000
     12128@@ -387,6 +387,16 @@
     12129   void
     12130   mark_locals_used();
     12131 
     12132+  // Return a name to use for an error case.  This should only be used
     12133+  // after reporting an error, and is used to avoid useless knockon
     12134+  // errors.
     12135+  static std::string
     12136+  erroneous_name();
     12137+
     12138+  // Return whether the name indicates an error.
     12139+  static bool
     12140+  is_erroneous_name(const std::string&);
     12141+
     12142   // Return a name to use for a thunk function.  A thunk function is
     12143   // one we create during the compilation, for a go statement or a
     12144   // defer statement or a method expression.
     12145@@ -476,6 +486,10 @@
    1079812146   void
    1079912147   lower_constant(Named_object*);
     
    1080612154   void
    1080712155   finalize_methods();
    10808 @@ -614,10 +618,6 @@
     12156@@ -614,10 +628,6 @@
    1080912157   receive_from_channel(tree type_tree, tree type_descriptor_tree, tree channel,
    1081012158                       Location);
     
    1081712165   // During parsing, we keep a stack of functions.  Each function on
    1081812166   // the stack is one that we are currently parsing.  For each
    10819 @@ -669,10 +669,6 @@
     12167@@ -669,10 +679,6 @@
    1082012168   tree
    1082112169   ptr_go_string_constant_tree(const std::string&);
     
    1082812176   typedef std::map<std::string, Package*> Imports;
    1082912177 
    10830 @@ -915,6 +911,14 @@
     12178@@ -915,6 +921,14 @@
    1083112179   result_variables()
    1083212180   { return this->results_; }
     
    1084312191   bool
    1084412192   results_are_named() const
    10845 @@ -1046,6 +1050,12 @@
    10846    set_in_unique_section()
    10847    { this->in_unique_section_ = true; }
    10848  
    10849 +  // Whether this function was created as a descriptor wrapper for
    10850 +  // another function.
    10851 +  bool
    10852 +  is_descriptor_wrapper() const
    10853 +  { return this->is_descriptor_wrapper_; }
    10854 +
    10855    // Swap with another function.  Used only for the thunk which calls
    10856    // recover.
    10857    void
    10858 @@ -1059,6 +1069,26 @@
     12193@@ -1059,6 +1073,22 @@
    1085912194   void
    1086012195   determine_types();
     
    1087612211+  }
    1087712212+
    10878 +  // Build a descriptor wrapper function.
    10879 +  static Named_object*
    10880 +  make_descriptor_wrapper(Gogo*, Named_object*, Function_type*);
    10881 +
    1088212213   // Return the function's decl given an identifier.
    1088312214   tree
    1088412215   get_or_make_decl(Gogo*, Named_object*, tree id);
    10885 @@ -1137,25 +1167,32 @@
     12216@@ -1137,22 +1167,26 @@
    1088612217   Labels labels_;
    1088712218   // The number of local types defined in this function.
     
    1091512246   // turned on for field tracking.
    1091612247   bool in_unique_section_ : 1;
    10917 +  // True if this is a function wrapper created to put in a function
    10918 +  // descriptor.
    10919 +  bool is_descriptor_wrapper_ : 1;
    10920  };
    10921  
    10922  // A snapshot of the current binding state.
    10923 @@ -1198,7 +1235,8 @@
     12248@@ -1198,7 +1232,8 @@
    1092412249 {
    1092512250  public:
     
    1093112256 
    1093212257   Function_type*
    10933 @@ -1218,10 +1256,27 @@
     12258@@ -1218,10 +1253,27 @@
    1093412259   set_asm_name(const std::string& asm_name)
    1093512260   { this->asm_name_ = asm_name; }
     
    1095912284   void
    1096012285   export_func(Export* exp, const std::string& name) const
    10961 @@ -1235,6 +1290,8 @@
     12286@@ -1235,6 +1287,8 @@
    1096212287   // The assembler name: this is the name to use in references to the
    1096312288   // function.  This is normally empty.
     
    1096812293   tree fndecl_;
    1096912294 };
    10970 @@ -1630,7 +1687,7 @@
     12295@@ -1630,7 +1684,7 @@
    1097112296   Named_constant(Type* type, Expression* expr, int iota_value,
    1097212297                 Location location)
     
    1097712302 
    1097812303   Type*
    10979 @@ -1664,6 +1721,14 @@
     12304@@ -1664,6 +1718,14 @@
    1098012305   clear_lowering()
    1098112306   { this->lowering_ = false; }
     
    1099212317   int
    1099312318   traverse_expression(Traverse*);
    10994 @@ -1699,6 +1764,8 @@
     12319@@ -1699,6 +1761,8 @@
    1099512320   Location location_;
    1099612321   // Whether we are currently lowering this constant.
     
    1100312328diff -Naur gcc-4.8.1.orig/gcc/go/gofrontend/parse.cc gcc-4.8.1/gcc/go/gofrontend/parse.cc
    1100412329--- gcc-4.8.1.orig/gcc/go/gofrontend/parse.cc   2012-12-13 22:20:23.000000000 +0000
    11005 +++ gcc-4.8.1/gcc/go/gofrontend/parse.cc        2013-09-13 19:01:43.129865056 +0000
     12330+++ gcc-4.8.1/gcc/go/gofrontend/parse.cc        2013-10-01 16:06:43.992554285 +0000
     12331@@ -213,7 +213,7 @@
     12332   if (name == "_")
     12333     {
     12334       error_at(this->location(), "invalid use of %<_%>");
     12335-      name = "blank";
     12336+      name = Gogo::erroneous_name();
     12337     }
     12338 
     12339   if (package->name() == this->gogo_->package_name())
    1100612340@@ -1457,6 +1457,16 @@
    1100712341 
     
    1102112355   if (pe != expr_list->end())
    1102212356     error_at(this->location(), "too many initializers");
    11023 @@ -2627,7 +2637,11 @@
     12357@@ -1930,12 +1940,9 @@
     12358        {
     12359          if (this->gogo_->in_global_scope())
     12360            return this->create_dummy_global(type, init, location);
     12361-         else if (type == NULL)
     12362-           this->gogo_->add_statement(Statement::make_statement(init, true));
     12363          else
     12364            {
     12365-             // With both a type and an initializer, create a dummy
     12366-             // variable so that we will check whether the
     12367+             // Create a dummy variable so that we will check whether the
     12368              // initializer can be assigned to the type.
     12369              Variable* var = new Variable(type, init, false, false, false,
     12370                                           location);
     12371@@ -2627,7 +2634,11 @@
    1102412372   Named_object* this_function = this->gogo_->current_function();
    1102512373   Named_object* closure = this_function->func_value()->closure_var();
     
    1103412382     this->enclosing_vars_.insert(ev);
    1103512383   if (ins.second)
    11036 @@ -2882,8 +2896,9 @@
     12384@@ -2882,8 +2893,9 @@
    1103712385 // Create a closure for the nested function FUNCTION.  This is based
    1103812386 // on ENCLOSING_VARS, which is a list of all variables defined in
     
    1104612394 Expression*
    1104712395 Parse::create_closure(Named_object* function, Enclosing_vars* enclosing_vars,
    11048 @@ -2899,16 +2914,25 @@
     12396@@ -2899,16 +2911,25 @@
    1104912397   for (Enclosing_vars::const_iterator p = enclosing_vars->begin();
    1105012398        p != enclosing_vars->end();
     
    1107412422       Expression* ref;
    1107512423       if (ev[i].in_function() == enclosing_function)
    11076 @@ -3016,7 +3040,7 @@
     12424@@ -3016,7 +3037,7 @@
    1107712425                  && t->array_type()->length()->is_nil_expression())
    1107812426                {
     
    1108312431                }
    1108412432              else
    11085 @@ -4499,9 +4523,12 @@
     12433@@ -3083,7 +3104,7 @@
     12434       if (token->identifier() == "_")
     12435        {
     12436          error_at(this->location(), "invalid use of %<_%>");
     12437-         name = this->gogo_->pack_hidden_name("blank", false);
     12438+         name = Gogo::erroneous_name();
     12439        }
     12440       this->advance_token();
     12441       return Expression::make_selector(left, name, location);
     12442@@ -4499,9 +4520,12 @@
    1108612443   bool is_fallthrough = false;
    1108712444   if (this->peek_token()->is_keyword(KEYWORD_FALLTHROUGH))
     
    1109612453 
    1109712454   if (is_default)
    11098 @@ -5239,7 +5266,8 @@
     12455@@ -4905,7 +4929,7 @@
     12456            {
     12457              error_at(recv_var_loc,
     12458                       "no new variables on left side of %<:=%>");
     12459-             recv_var = "blank";
     12460+             recv_var = Gogo::erroneous_name();
     12461            }
     12462          *is_send = false;
     12463          *varname = gogo->pack_hidden_name(recv_var, is_rv_exported);
     12464@@ -4941,7 +4965,7 @@
     12465                    {
     12466                      error_at(recv_var_loc,
     12467                               "no new variables on left side of %<:=%>");
     12468-                     recv_var = "blank";
     12469+                     recv_var = Gogo::erroneous_name();
     12470                    }
     12471                  *is_send = false;
     12472                  if (recv_var != "_")
     12473@@ -5239,7 +5263,8 @@
    1109912474        no->var_value()->set_type_from_range_value();
    1110012475       if (is_new)
     
    1110612481 
    1110712482   if (!any_new)
     12483@@ -5477,7 +5502,7 @@
     12484          if (name == "_")
     12485            {
     12486              error_at(this->location(), "invalid package name _");
     12487-             name = "blank";
     12488+             name = Gogo::erroneous_name();
     12489            }
     12490          this->advance_token();
     12491        }
    1110812492diff -Naur gcc-4.8.1.orig/gcc/go/gofrontend/runtime.def gcc-4.8.1/gcc/go/gofrontend/runtime.def
    1110912493--- gcc-4.8.1.orig/gcc/go/gofrontend/runtime.def        2012-11-29 18:11:17.000000000 +0000
    11110 +++ gcc-4.8.1/gcc/go/gofrontend/runtime.def     2013-09-13 19:01:43.129865056 +0000
     12494+++ gcc-4.8.1/gcc/go/gofrontend/runtime.def     2013-10-01 16:06:43.992554285 +0000
    1111112495@@ -224,11 +224,6 @@
    1111212496 DEF_GO_RUNTIME(NEW_NOPOINTERS, "__go_new_nopointers", P1(UINTPTR), R1(POINTER))
     
    1112312507diff -Naur gcc-4.8.1.orig/gcc/go/gofrontend/statements.cc gcc-4.8.1/gcc/go/gofrontend/statements.cc
    1112412508--- gcc-4.8.1.orig/gcc/go/gofrontend/statements.cc      2012-12-21 15:59:27.000000000 +0000
    11125 +++ gcc-4.8.1/gcc/go/gofrontend/statements.cc   2013-09-13 19:01:43.133198380 +0000
     12509+++ gcc-4.8.1/gcc/go/gofrontend/statements.cc   2013-10-01 16:06:43.992554285 +0000
    1112612510@@ -569,7 +569,10 @@
    1112712511 Assignment_statement::do_determine_types()
     
    1113612520 }
    1113712521 
    11138 @@ -1707,8 +1710,8 @@
     12522@@ -591,6 +594,15 @@
     12523 
     12524   Type* lhs_type = this->lhs_->type();
     12525   Type* rhs_type = this->rhs_->type();
     12526+
     12527+  // Invalid assignment of nil to the blank identifier.
     12528+  if (lhs_type->is_sink_type()
     12529+      && rhs_type->is_nil_type())
     12530+    {
     12531+      this->report_error(_("use of untyped nil"));
     12532+      return;
     12533+    }
     12534+
     12535   std::string reason;
     12536   bool ok;
     12537   if (this->are_hidden_fields_ok_)
     12538@@ -972,7 +984,10 @@
     12539 
     12540       if ((*plhs)->is_sink_expression())
     12541        {
     12542-         b->add_statement(Statement::make_statement(*prhs, true));
     12543+          if ((*prhs)->type()->is_nil_type())
     12544+            this->report_error(_("use of untyped nil"));
     12545+          else
     12546+            b->add_statement(Statement::make_statement(*prhs, true));
     12547          continue;
     12548        }
     12549 
     12550@@ -1655,46 +1670,23 @@
     12551                                                   location);
     12552 }
     12553 
     12554-// An expression statement.
     12555-
     12556-class Expression_statement : public Statement
     12557-{
     12558- public:
     12559-  Expression_statement(Expression* expr, bool is_ignored)
     12560-    : Statement(STATEMENT_EXPRESSION, expr->location()),
     12561-      expr_(expr), is_ignored_(is_ignored)
     12562-  { }
     12563-
     12564-  Expression*
     12565-  expr()
     12566-  { return this->expr_; }
     12567-
     12568- protected:
     12569-  int
     12570-  do_traverse(Traverse* traverse)
     12571-  { return this->traverse_expression(traverse, &this->expr_); }
     12572-
     12573-  void
     12574-  do_determine_types()
     12575-  { this->expr_->determine_type_no_context(); }
     12576-
     12577-  void
     12578-  do_check_types(Gogo*);
     12579+// Class Expression_statement.
     12580 
     12581-  bool
     12582-  do_may_fall_through() const;
     12583+// Constructor.
     12584 
     12585-  Bstatement*
     12586-  do_get_backend(Translate_context* context);
     12587+Expression_statement::Expression_statement(Expression* expr, bool is_ignored)
     12588+  : Statement(STATEMENT_EXPRESSION, expr->location()),
     12589+    expr_(expr), is_ignored_(is_ignored)
     12590+{
     12591+}
     12592 
     12593-  void
     12594-  do_dump_statement(Ast_dump_context*) const;
     12595+// Determine types.
     12596 
     12597- private:
     12598-  Expression* expr_;
     12599-  // Whether the value of this expression is being explicitly ignored.
     12600-  bool is_ignored_;
     12601-};
     12602+void
     12603+Expression_statement::do_determine_types()
     12604+{
     12605+  this->expr_->determine_type_no_context();
     12606+}
     12607 
     12608 // Check the types of an expression statement.  The only check we do
     12609 // is to possibly give an error about discarding the value of the
     12610@@ -1707,8 +1699,8 @@
    1113912611     this->expr_->discarding_value();
    1114012612 }
     
    1114712619 bool
    1114812620 Expression_statement::do_may_fall_through() const
    11149 @@ -1717,22 +1720,28 @@
     12621@@ -1717,22 +1709,28 @@
    1115012622   if (call != NULL)
    1115112623     {
     
    1115812630        {
    1115912631-         const Named_object* no = fe->named_object();
    11160 +         Named_object* no = ue->named_object();
    11161  
     12632-
    1116212633-         Function_type* fntype;
    1116312634-         if (no->is_function())
     
    1116712638-         else
    1116812639-           fntype = NULL;
    11169 -
     12640+         Named_object* no = ue->named_object();
     12641 
    1117012642-         // The builtin function panic does not return.
    1117112643-         if (fntype != NULL && fntype->is_builtin() && no->name() == "panic")
     
    1119012662     }
    1119112663   return true;
    11192 @@ -1953,10 +1962,15 @@
     12664@@ -1953,10 +1951,15 @@
    1119312665              && results->begin()->type()->points_to() == NULL)))
    1119412666     return false;
     
    1120812680 
    1120912681   return true;
    11210 @@ -2496,7 +2510,11 @@
     12682@@ -2496,7 +2499,11 @@
    1121112683 
    1121212684   Call_expression* ce = this->call_->call_expression();
     
    1122112693   const Expression_list* args = ce->args();
    1122212694   if (args == NULL || args->empty())
    11223 @@ -2800,6 +2818,28 @@
     12695@@ -2800,6 +2807,28 @@
    1122412696   return new Return_statement(vals, location);
    1122512697 }
     
    1125012722 
    1125112723 class Bc_statement : public Statement
    11252 @@ -3700,9 +3740,6 @@
     12724@@ -3700,9 +3729,6 @@
    1125312725   void
    1125412726   do_check_types(Gogo*);
     
    1126012732   do_get_backend(Translate_context*);
    1126112733 
    11262 @@ -3746,22 +3783,6 @@
     12734@@ -3746,22 +3772,6 @@
    1126312735     this->set_is_error();
    1126412736 }
     
    1128312755 
    1128412756 Bstatement*
    11285 @@ -3911,6 +3932,22 @@
     12757@@ -3911,6 +3921,22 @@
    1128612758   ast_dump_context->ostream() << std::endl;
    1128712759 }
     
    1130612778 
    1130712779 Switch_statement*
    11308 @@ -4050,6 +4087,27 @@
     12780@@ -4050,6 +4076,27 @@
    1130912781     }
    1131012782 }
     
    1133412806 
    1133512807 void
    11336 @@ -4148,6 +4206,25 @@
     12808@@ -4148,6 +4195,25 @@
    1133712809                        NULL);
    1133812810 }
     
    1136012832 
    1136112833 void
    11362 @@ -4237,6 +4314,22 @@
     12834@@ -4237,6 +4303,22 @@
    1136312835   return Statement::make_block_statement(b, loc);
    1136412836 }
     
    1138312855 // if necessary.
    1138412856 
    11385 @@ -4954,6 +5047,19 @@
     12857@@ -4954,6 +5036,19 @@
    1138612858   return Statement::make_block_statement(b, loc);
    1138712859 }
     
    1140312875 
    1140412876 Bstatement*
    11405 @@ -5114,6 +5220,20 @@
     12877@@ -5114,6 +5209,20 @@
    1140612878   this->continue_label_ = continue_label;
    1140712879 }
     
    1142612898diff -Naur gcc-4.8.1.orig/gcc/go/gofrontend/statements.h gcc-4.8.1/gcc/go/gofrontend/statements.h
    1142712899--- gcc-4.8.1.orig/gcc/go/gofrontend/statements.h       2013-01-29 00:28:09.000000000 +0000
    11428 +++ gcc-4.8.1/gcc/go/gofrontend/statements.h    2013-09-13 19:01:43.133198380 +0000
    11429 @@ -207,6 +207,13 @@
     12900+++ gcc-4.8.1/gcc/go/gofrontend/statements.h    2013-10-01 16:06:43.992554285 +0000
     12901@@ -17,6 +17,7 @@
     12902 class Unnamed_label;
     12903 class Temporary_statement;
     12904 class Variable_declaration_statement;
     12905+class Expression_statement;
     12906 class Return_statement;
     12907 class Thunk_statement;
     12908 class Label_statement;
     12909@@ -207,6 +208,13 @@
    1143012910   static Return_statement*
    1143112911   make_return_statement(Expression_list*, Location);
     
    1144112921   static Statement*
    1144212922   make_break_statement(Unnamed_label* label, Location);
    11443 @@ -894,8 +901,7 @@
     12923@@ -322,6 +330,14 @@
     12924                         STATEMENT_VARIABLE_DECLARATION>();
     12925   }
     12926 
     12927+  // If this is an expression statement, return it.  Otherwise return
     12928+  // NULL.
     12929+  Expression_statement*
     12930+  expression_statement()
     12931+  {
     12932+    return this->convert<Expression_statement, STATEMENT_EXPRESSION>();
     12933+  }
     12934+
     12935   // If this is a return statement, return it.  Otherwise return NULL.
     12936   Return_statement*
     12937   return_statement()
     12938@@ -629,6 +645,43 @@
     12939   bool is_lowered_;
     12940 };
     12941 
     12942+// An expression statement.
     12943+
     12944+class Expression_statement : public Statement
     12945+{
     12946+ public:
     12947+  Expression_statement(Expression* expr, bool is_ignored);
     12948+
     12949+  Expression*
     12950+  expr()
     12951+  { return this->expr_; }
     12952+
     12953+ protected:
     12954+  int
     12955+  do_traverse(Traverse* traverse)
     12956+  { return this->traverse_expression(traverse, &this->expr_); }
     12957+
     12958+  void
     12959+  do_determine_types();
     12960+
     12961+  void
     12962+  do_check_types(Gogo*);
     12963+
     12964+  bool
     12965+  do_may_fall_through() const;
     12966+
     12967+  Bstatement*
     12968+  do_get_backend(Translate_context* context);
     12969+
     12970+  void
     12971+  do_dump_statement(Ast_dump_context*) const;
     12972+
     12973+ private:
     12974+  Expression* expr_;
     12975+  // Whether the value of this expression is being explicitly ignored.
     12976+  bool is_ignored_;
     12977+};
     12978+
     12979 // A send statement.
     12980 
     12981 class Send_statement : public Statement
     12982@@ -894,8 +947,7 @@
    1144412983   { this->clauses_->check_types(); }
    1144512984 
     
    1145112990   Bstatement*
    1145212991   do_get_backend(Translate_context*);
    11453 @@ -1086,6 +1092,9 @@
     12992@@ -1086,6 +1138,9 @@
    1145412993   Statement*
    1145512994   do_lower(Gogo*, Named_object*, Block*, Statement_inserter*);
     
    1146113000   do_get_backend(Translate_context*)
    1146213001   { go_unreachable(); }
    11463 @@ -1399,6 +1408,9 @@
     13002@@ -1399,6 +1454,9 @@
    1146413003   void
    1146513004   do_dump_statement(Ast_dump_context*) const;
     
    1147113010   // The value to switch on.  This may be NULL.
    1147213011   Expression* val_;
    11473 @@ -1449,6 +1461,11 @@
     13012@@ -1449,6 +1507,11 @@
    1147413013   lower(Type*, Block*, Temporary_statement* descriptor_temp,
    1147513014        Unnamed_label* break_label) const;
     
    1148313022   void
    1148413023   dump_clauses(Ast_dump_context*) const;
    11485 @@ -1493,6 +1510,12 @@
     13024@@ -1493,6 +1556,12 @@
    1148613025     lower(Type*, Block*, Temporary_statement* descriptor_temp,
    1148713026          Unnamed_label* break_label, Unnamed_label** stmts_label) const;
     
    1149613035     void
    1149713036     dump_clause(Ast_dump_context*) const;
    11498 @@ -1556,6 +1579,9 @@
     13037@@ -1556,6 +1625,9 @@
    1149913038   void
    1150013039   do_dump_statement(Ast_dump_context*) const;
     
    1150813047diff -Naur gcc-4.8.1.orig/gcc/go/gofrontend/types.cc gcc-4.8.1/gcc/go/gofrontend/types.cc
    1150913048--- gcc-4.8.1.orig/gcc/go/gofrontend/types.cc   2013-02-01 00:23:22.000000000 +0000
    11510 +++ gcc-4.8.1/gcc/go/gofrontend/types.cc        2013-09-13 19:01:43.136531705 +0000
     13049+++ gcc-4.8.1/gcc/go/gofrontend/types.cc        2013-10-01 16:06:43.992554285 +0000
    1151113050@@ -1298,8 +1298,8 @@
    1151213051   // converting INITIALIZER.
     
    1158713126   ++p;
    1158813127   go_assert(p == fields->end());
    11589 @@ -3407,6 +3387,19 @@
     13128@@ -2308,9 +2288,7 @@
     13129       }
     13130 
     13131     case TYPE_NAMED:
     13132-      // Begin converting this type to the backend representation.
     13133-      // This will create a placeholder if necessary.
     13134-      this->get_backend(gogo);
     13135+      this->named_type()->convert(gogo);
     13136       return this->named_type()->is_named_backend_type_size_known();
     13137 
     13138     case TYPE_FORWARD:
     13139@@ -3407,6 +3385,16 @@
    1159013140 Btype*
    1159113141 Function_type::do_get_backend(Gogo* gogo)
     
    1159413144+  // is represented as a pointer to a struct whose first field is the
    1159513145+  // actual function.  So that is what we return as the type of a Go
    11596 +  // function.  The function stored in the first field always that
    11597 +  // takes one additional trailing argument: the closure pointer.  For
    11598 +  // a top-level function, this additional argument will only be
    11599 +  // passed when invoking the function indirectly, via the struct.
     13146+  // function.
    1160013147+
    1160113148+  Location loc = this->location();
     
    1160713154   if (this->receiver_ != NULL)
    1160813155     {
    11609 @@ -3422,9 +3415,15 @@
    11610      }
    11611  
    11612    std::vector<Backend::Btyped_identifier> bparameters;
    11613 -  if (this->parameters_ != NULL)
    11614 +  size_t last;
    11615 +  if (this->parameters_ == NULL)
    11616 +    {
    11617 +      bparameters.resize(1);
    11618 +      last = 0;
    11619 +    }
    11620 +  else
    11621      {
    11622 -      bparameters.resize(this->parameters_->size());
    11623 +      bparameters.resize(this->parameters_->size() + 1);
    11624        size_t i = 0;
    11625        for (Typed_identifier_list::const_iterator p = this->parameters_->begin();
    11626            p != this->parameters_->end();
    11627 @@ -3434,8 +3433,12 @@
    11628           bparameters[i].btype = p->type()->get_backend(gogo);
    11629           bparameters[i].location = p->location();
    11630         }
    11631 -      go_assert(i == bparameters.size());
    11632 +      last = i;
    11633      }
    11634 +  go_assert(last + 1 == bparameters.size());
    11635 +  bparameters[last].name = "$closure";
    11636 +  bparameters[last].btype = ptr_struct_type;
    11637 +  bparameters[last].location = loc;
    11638  
    11639    std::vector<Backend::Btyped_identifier> bresults;
    11640    if (this->results_ != NULL)
    11641 @@ -3453,8 +3456,15 @@
     13156@@ -3453,8 +3441,15 @@
    1164213157       go_assert(i == bresults.size());
    1164313158     }
     
    1165713172 
    1165813173 // The type of a function type descriptor.
    11659 @@ -3826,6 +3836,49 @@
     13174@@ -3826,6 +3821,47 @@
    1166013175   return ret;
    1166113176 }
     
    1166513180+
    1166613181+Function_type*
    11667 +Function_type::copy_with_closure(Type* closure_type) const
     13182+Function_type::copy_with_names() const
    1166813183+{
    1166913184+  Typed_identifier_list* new_params = new Typed_identifier_list();
     
    1168313198+       }
    1168413199+    }
    11685 +  new_params->push_back(Typed_identifier("closure.0", closure_type,
    11686 +                                        this->location_));
    1168713200+
    1168813201+  const Typed_identifier_list* orig_results = this->results_;
     
    1170713220 
    1170813221 Function_type*
    11709 @@ -4168,6 +4221,22 @@
     13222@@ -4168,6 +4204,22 @@
    1171013223     }
    1171113224 }
     
    1173013243 
    1173113244 // A hash table used to find identical unnamed structs so that they
    11732 @@ -4532,6 +4601,7 @@
     13245@@ -4175,6 +4227,11 @@
     13246 
     13247 Struct_type::Identical_structs Struct_type::identical_structs;
     13248 
     13249+// A hash table used to merge method sets for identical unnamed
     13250+// structs.
     13251+
     13252+Struct_type::Struct_method_tables Struct_type::struct_method_tables;
     13253+
     13254 // Traversal.
     13255 
     13256 int
     13257@@ -4532,6 +4589,7 @@
    1173313258              go_assert(sub != NULL);
    1173413259            }
     
    1173813263       else if (subdepth > found_depth)
    1173913264        delete sub;
    11740 @@ -4781,11 +4851,16 @@
     13265@@ -4638,9 +4696,24 @@
     13266                                    const Interface_type* interface,
     13267                                    bool is_pointer)
     13268 {
     13269+  std::pair<Struct_type*, Struct_type::Struct_method_table_pair*>
     13270+    val(this, NULL);
     13271+  std::pair<Struct_type::Struct_method_tables::iterator, bool> ins =
     13272+    Struct_type::struct_method_tables.insert(val);
     13273+
     13274+  Struct_method_table_pair* smtp;
     13275+  if (!ins.second)
     13276+    smtp = ins.first->second;
     13277+  else
     13278+    {
     13279+      smtp = new Struct_method_table_pair();
     13280+      smtp->first = NULL;
     13281+      smtp->second = NULL;
     13282+      ins.first->second = smtp;
     13283+    }
     13284+
     13285   return Type::interface_method_table(gogo, this, interface, is_pointer,
     13286-                                     &this->interface_method_tables_,
     13287-                                     &this->pointer_interface_method_tables_);
     13288+                                     &smtp->first, &smtp->second);
     13289 }
     13290 
     13291 // Convert struct fields to the backend representation.  This is not
     13292@@ -4781,11 +4854,16 @@
    1174113293 
    1174213294       ++q;
     
    1175813310          fvals->push_back(Expression::make_unary(OPERATOR_AND, s, bloc));
    1175913311        }
    11760 @@ -6227,7 +6302,8 @@
     13312@@ -6227,7 +6305,8 @@
    1176113313 
    1176213314   std::string mangled_name = "__go_map_" + this->mangled_name(gogo);
     
    1176813320                                                      bloc);
    1176913321 
    11770 @@ -6235,7 +6311,7 @@
     13322@@ -6235,7 +6314,7 @@
    1177113323   context.set_is_const();
    1177213324   Bexpression* binitializer = tree_to_expr(initializer->get_tree(&context));
     
    1177713329                                             binitializer);
    1177813330 
    11779 @@ -7569,7 +7645,7 @@
     13331@@ -7569,7 +7648,7 @@
    1178013332       // the child class.
    1178113333       return this->do_bind_method(expr, location);
     
    1178613338 
    1178713339 // Return the named object associated with a method.  This may only be
    11788 @@ -7612,8 +7688,8 @@
     13340@@ -7612,8 +7691,8 @@
    1178913341 Named_method::do_bind_method(Expression* expr, Location location) const
    1179013342 {
     
    1179713349   // the real method expects a different type.  We need to cast the
    1179813350   // first argument.
    11799 @@ -8991,28 +9067,16 @@
     13351@@ -8991,28 +9070,16 @@
    1180013352   Call_expression* call = Expression::make_call(func, arguments, is_varargs,
    1180113353                                                location);
     
    1183113383 
    1183213384 // Apply FIELD_INDEXES to EXPR.  The field indexes have to be applied
    11833 @@ -9353,13 +9417,18 @@
     13385@@ -9202,7 +9269,11 @@
     13386     }
     13387   else
     13388     {
     13389-      if (!ambig1.empty())
     13390+      if (Gogo::is_erroneous_name(name))
     13391+       {
     13392+         // An error was already reported.
     13393+       }
     13394+      else if (!ambig1.empty())
     13395        error_at(location, "%qs is ambiguous via %qs and %qs",
     13396                 Gogo::message_name(name).c_str(), ambig1.c_str(),
     13397                 ambig2.c_str());
     13398@@ -9353,13 +9424,18 @@
    1183413399        fnt = pf->type()->deref()->named_type();
    1183513400       go_assert(fnt != NULL);
     
    1185313418diff -Naur gcc-4.8.1.orig/gcc/go/gofrontend/types.h gcc-4.8.1/gcc/go/gofrontend/types.h
    1185413419--- gcc-4.8.1.orig/gcc/go/gofrontend/types.h    2013-02-01 00:23:22.000000000 +0000
    11855 +++ gcc-4.8.1/gcc/go/gofrontend/types.h 2013-09-13 19:01:43.139865030 +0000
     13420+++ gcc-4.8.1/gcc/go/gofrontend/types.h 2013-10-01 16:06:43.992554285 +0000
    1185613421@@ -523,6 +523,14 @@
    1185713422   static Type*
     
    1188813453   copy_with_receiver(Type*) const;
    1188913454 
    11890 +  // Return a copy of this type ignoring any receiver and adding a
    11891 +  // final closure parameter of type CLOSURE_TYPE.  This is used when
    11892 +  // creating descriptors.
     13455+  // Return a copy of this type ignoring any receiver and using dummy
     13456+  // names for all parameters.  This is used for thunks for method
     13457+  // values.
    1189313458+  Function_type*
    11894 +  copy_with_closure(Type* closure_type) const;
     13459+  copy_with_names() const;
    1189513460+
    1189613461   static Type*
     
    1191713482   Type*
    1191813483   type() const
     13484@@ -2031,8 +2041,7 @@
     13485  public:
     13486   Struct_type(Struct_field_list* fields, Location location)
     13487     : Type(TYPE_STRUCT),
     13488-      fields_(fields), location_(location), all_methods_(NULL),
     13489-      interface_method_tables_(NULL), pointer_interface_method_tables_(NULL)
     13490+      fields_(fields), location_(location), all_methods_(NULL)
     13491   { }
     13492 
     13493   // Return the field NAME.  This only looks at local fields, not at
     13494@@ -2190,6 +2199,16 @@
     13495 
     13496   static Identical_structs identical_structs;
     13497 
     13498+  // Used to manage method tables for identical unnamed structs.
     13499+  typedef std::pair<Interface_method_tables*, Interface_method_tables*>
     13500+    Struct_method_table_pair;
     13501+
     13502+  typedef Unordered_map_hash(Struct_type*, Struct_method_table_pair*,
     13503+                            Type_hash_identical, Type_identical)
     13504+    Struct_method_tables;
     13505+
     13506+  static Struct_method_tables struct_method_tables;
     13507+
     13508   // Used to avoid infinite loops in field_reference_depth.
     13509   struct Saw_named_type
     13510   {
     13511@@ -2208,13 +2227,6 @@
     13512   Location location_;
     13513   // If this struct is unnamed, a list of methods.
     13514   Methods* all_methods_;
     13515-  // A mapping from interfaces to the associated interface method
     13516-  // tables for this type.  Only used if this struct is unnamed.
     13517-  Interface_method_tables* interface_method_tables_;
     13518-  // A mapping from interfaces to the associated interface method
     13519-  // tables for pointers to this type.  Only used if this struct is
     13520-  // unnamed.
     13521-  Interface_method_tables* pointer_interface_method_tables_;
     13522 };
     13523 
     13524 // The type of an array.
    1191913525diff -Naur gcc-4.8.1.orig/gcc/graphite-clast-to-gimple.c gcc-4.8.1/gcc/graphite-clast-to-gimple.c
    1192013526--- gcc-4.8.1.orig/gcc/graphite-clast-to-gimple.c       2013-01-10 20:38:27.000000000 +0000
    11921 +++ gcc-4.8.1/gcc/graphite-clast-to-gimple.c    2013-09-13 19:01:43.959862879 +0000
     13527+++ gcc-4.8.1/gcc/graphite-clast-to-gimple.c    2013-10-01 16:07:00.564553809 +0000
    1192213528@@ -1170,8 +1170,11 @@
    1192313529   redirect_edge_succ_nodup (next_e, after);
     
    1193513541diff -Naur gcc-4.8.1.orig/gcc/graphite-dependences.c gcc-4.8.1/gcc/graphite-dependences.c
    1193613542--- gcc-4.8.1.orig/gcc/graphite-dependences.c   2013-01-10 20:38:27.000000000 +0000
    11937 +++ gcc-4.8.1/gcc/graphite-dependences.c        2013-09-13 19:01:43.963196204 +0000
     13543+++ gcc-4.8.1/gcc/graphite-dependences.c        2013-10-01 16:07:00.564553809 +0000
    1193813544@@ -297,7 +297,7 @@
    1193913545              int depth)
     
    1196413570diff -Naur gcc-4.8.1.orig/gcc/ipa-cp.c gcc-4.8.1/gcc/ipa-cp.c
    1196513571--- gcc-4.8.1.orig/gcc/ipa-cp.c 2013-05-09 11:56:32.000000000 +0000
    11966 +++ gcc-4.8.1/gcc/ipa-cp.c      2013-09-13 19:01:43.166531626 +0000
     13572+++ gcc-4.8.1/gcc/ipa-cp.c      2013-10-01 16:06:43.996554285 +0000
    1196713573@@ -1507,7 +1507,8 @@
    1196813574   tree otr_type;
     
    1198713593diff -Naur gcc-4.8.1.orig/gcc/ipa-prop.c gcc-4.8.1/gcc/ipa-prop.c
    1198813594--- gcc-4.8.1.orig/gcc/ipa-prop.c       2013-05-23 13:25:23.000000000 +0000
    11989 +++ gcc-4.8.1/gcc/ipa-prop.c    2013-09-13 19:01:43.169864951 +0000
     13595+++ gcc-4.8.1/gcc/ipa-prop.c    2013-10-01 16:06:43.996554285 +0000
    1199013596@@ -678,13 +678,19 @@
    1199113597   bool modified = false;
     
    1201413620diff -Naur gcc-4.8.1.orig/gcc/ira.c gcc-4.8.1/gcc/ira.c
    1201513621--- gcc-4.8.1.orig/gcc/ira.c    2013-05-23 10:36:55.000000000 +0000
    12016 +++ gcc-4.8.1/gcc/ira.c 2013-09-13 19:01:43.169864951 +0000
     13622+++ gcc-4.8.1/gcc/ira.c 2013-10-01 16:06:43.996554285 +0000
    1201713623@@ -2863,6 +2863,28 @@
    1201813624     }
     
    1211213718diff -Naur gcc-4.8.1.orig/gcc/lra-assigns.c gcc-4.8.1/gcc/lra-assigns.c
    1211313719--- gcc-4.8.1.orig/gcc/lra-assigns.c    2013-02-15 19:17:02.000000000 +0000
    12114 +++ gcc-4.8.1/gcc/lra-assigns.c 2013-09-13 19:01:43.173198275 +0000
     13720+++ gcc-4.8.1/gcc/lra-assigns.c 2013-10-01 16:06:43.996554285 +0000
    1211513721@@ -116,6 +116,11 @@
    1211613722 /* Map regno to the corresponding regno assignment info.  */
     
    1216013766diff -Naur gcc-4.8.1.orig/gcc/lra-constraints.c gcc-4.8.1/gcc/lra-constraints.c
    1216113767--- gcc-4.8.1.orig/gcc/lra-constraints.c        2013-05-02 19:16:29.000000000 +0000
    12162 +++ gcc-4.8.1/gcc/lra-constraints.c     2013-09-13 19:01:43.173198275 +0000
     13768+++ gcc-4.8.1/gcc/lra-constraints.c     2013-10-01 16:06:43.996554285 +0000
    1216313769@@ -1388,7 +1388,7 @@
    1216413770   for (nalt = 0; nalt < n_alternatives; nalt++)
     
    1218113787diff -Naur gcc-4.8.1.orig/gcc/omp-low.c gcc-4.8.1/gcc/omp-low.c
    1218213788--- gcc-4.8.1.orig/gcc/omp-low.c        2013-05-16 10:45:55.000000000 +0000
    12183 +++ gcc-4.8.1/gcc/omp-low.c     2013-09-13 19:01:43.179864925 +0000
     13789+++ gcc-4.8.1/gcc/omp-low.c     2013-10-01 16:06:44.000554285 +0000
    1218413790@@ -836,6 +836,7 @@
    1218513791   DECL_ARTIFICIAL (copy) = DECL_ARTIFICIAL (var);
     
    1219013796   DECL_SEEN_IN_BIND_EXPR_P (copy) = 1;
    1219113797 
     13798@@ -5009,8 +5010,7 @@
     13799     {
     13800       /* If we are not inside a combined parallel+sections region,
     13801         call GOMP_sections_start.  */
     13802-      t = build_int_cst (unsigned_type_node,
     13803-                        exit_reachable ? len - 1 : len);
     13804+      t = build_int_cst (unsigned_type_node, len - 1);
     13805       u = builtin_decl_explicit (BUILT_IN_GOMP_SECTIONS_START);
     13806       stmt = gimple_build_call (u, 1, t);
     13807     }
    1219213808diff -Naur gcc-4.8.1.orig/gcc/passes.c gcc-4.8.1/gcc/passes.c
    1219313809--- gcc-4.8.1.orig/gcc/passes.c 2013-02-20 15:19:13.000000000 +0000
    12194 +++ gcc-4.8.1/gcc/passes.c      2013-09-13 19:01:43.179864925 +0000
    12195 @@ -1531,15 +1531,15 @@
     13810+++ gcc-4.8.1/gcc/passes.c      2013-10-01 16:06:44.000554285 +0000
     13811@@ -1531,18 +1531,21 @@
    1219613812       /* Perform simple scalar cleanup which is constant/copy propagation.  */
    1219713813       NEXT_PASS (pass_ccp);
     
    1221313829          need to adjust LIM to be more friendly towards preserving accurate
    1221413830         debug information here.  */
     13831+      /* Split critical edges before late uninit warning to reduce the
     13832+         number of false positives from it.  */
     13833+      NEXT_PASS (pass_split_crit_edges);
     13834       NEXT_PASS (pass_late_warn_uninitialized);
     13835       NEXT_PASS (pass_uncprop);
     13836       NEXT_PASS (pass_local_pure_const);
    1221513837diff -Naur gcc-4.8.1.orig/gcc/recog.c gcc-4.8.1/gcc/recog.c
    1221613838--- gcc-4.8.1.orig/gcc/recog.c  2013-01-10 20:38:27.000000000 +0000
    12217 +++ gcc-4.8.1/gcc/recog.c       2013-09-13 19:01:43.183198249 +0000
     13839+++ gcc-4.8.1/gcc/recog.c       2013-10-01 16:06:44.000554285 +0000
    1221813840@@ -1949,9 +1949,6 @@
    1221913841     (strictp ? strict_memory_address_addr_space_p
     
    1235713979        {
    1235813980          add_to_hard_reg_set (reg_set, mode, regno);
     13981diff -Naur gcc-4.8.1.orig/gcc/recog.h gcc-4.8.1/gcc/recog.h
     13982--- gcc-4.8.1.orig/gcc/recog.h  2013-01-10 20:38:27.000000000 +0000
     13983+++ gcc-4.8.1/gcc/recog.h       2013-10-01 16:06:44.000554285 +0000
     13984@@ -256,7 +256,57 @@
     13985 
     13986 typedef int (*insn_operand_predicate_fn) (rtx, enum machine_mode);
     13987 typedef const char * (*insn_output_fn) (rtx *, rtx);
     13988-typedef rtx (*insn_gen_fn) (rtx, ...);
     13989+
     13990+struct insn_gen_fn
     13991+{
     13992+  typedef rtx (*f0) (void);
     13993+  typedef rtx (*f1) (rtx);
     13994+  typedef rtx (*f2) (rtx, rtx);
     13995+  typedef rtx (*f3) (rtx, rtx, rtx);
     13996+  typedef rtx (*f4) (rtx, rtx, rtx, rtx);
     13997+  typedef rtx (*f5) (rtx, rtx, rtx, rtx, rtx);
     13998+  typedef rtx (*f6) (rtx, rtx, rtx, rtx, rtx, rtx);
     13999+  typedef rtx (*f7) (rtx, rtx, rtx, rtx, rtx, rtx, rtx);
     14000+  typedef rtx (*f8) (rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx);
     14001+  typedef rtx (*f9) (rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx);
     14002+  typedef rtx (*f10) (rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx);
     14003+  typedef rtx (*f11) (rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx);
     14004+  typedef rtx (*f12) (rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx);
     14005+  typedef rtx (*f13) (rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx);
     14006+  typedef rtx (*f14) (rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx);
     14007+  typedef rtx (*f15) (rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx);
     14008+  typedef rtx (*f16) (rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx, rtx);
     14009+
     14010+  typedef f0 stored_funcptr;
     14011+
     14012+  rtx operator () (void) const { return ((f0)func) (); }
     14013+  rtx operator () (rtx a0) const { return ((f1)func) (a0); }
     14014+  rtx operator () (rtx a0, rtx a1) const { return ((f2)func) (a0, a1); }
     14015+  rtx operator () (rtx a0, rtx a1, rtx a2) const { return ((f3)func) (a0, a1, a2); }
     14016+  rtx operator () (rtx a0, rtx a1, rtx a2, rtx a3) const { return ((f4)func) (a0, a1, a2, a3); }
     14017+  rtx operator () (rtx a0, rtx a1, rtx a2, rtx a3, rtx a4) const { return ((f5)func) (a0, a1, a2, a3, a4); }
     14018+  rtx operator () (rtx a0, rtx a1, rtx a2, rtx a3, rtx a4, rtx a5) const { return ((f6)func) (a0, a1, a2, a3, a4, a5); }
     14019+  rtx operator () (rtx a0, rtx a1, rtx a2, rtx a3, rtx a4, rtx a5, rtx a6) const { return ((f7)func) (a0, a1, a2, a3, a4, a5, a6); }
     14020+  rtx operator () (rtx a0, rtx a1, rtx a2, rtx a3, rtx a4, rtx a5, rtx a6, rtx a7) const { return ((f8)func) (a0, a1, a2, a3, a4, a5, a6, a7); }
     14021+  rtx operator () (rtx a0, rtx a1, rtx a2, rtx a3, rtx a4, rtx a5, rtx a6, rtx a7, rtx a8) const { return ((f9)func) (a0, a1, a2, a3, a4, a5, a6, a7, a8); }
     14022+  rtx operator () (rtx a0, rtx a1, rtx a2, rtx a3, rtx a4, rtx a5, rtx a6, rtx a7, rtx a8, rtx a9) const { return ((f10)func) (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9); }
     14023+  rtx operator () (rtx a0, rtx a1, rtx a2, rtx a3, rtx a4, rtx a5, rtx a6, rtx a7, rtx a8, rtx a9, rtx a10) const { return ((f11)func) (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10); }
     14024+  rtx operator () (rtx a0, rtx a1, rtx a2, rtx a3, rtx a4, rtx a5, rtx a6, rtx a7, rtx a8, rtx a9, rtx a10, rtx a11) const { return ((f12)func) (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11); }
     14025+  rtx operator () (rtx a0, rtx a1, rtx a2, rtx a3, rtx a4, rtx a5, rtx a6, rtx a7, rtx a8, rtx a9, rtx a10, rtx a11, rtx a12) const { return ((f13)func) (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12); }
     14026+  rtx operator () (rtx a0, rtx a1, rtx a2, rtx a3, rtx a4, rtx a5, rtx a6, rtx a7, rtx a8, rtx a9, rtx a10, rtx a11, rtx a12, rtx a13) const { return ((f14)func) (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13); }
     14027+  rtx operator () (rtx a0, rtx a1, rtx a2, rtx a3, rtx a4, rtx a5, rtx a6, rtx a7, rtx a8, rtx a9, rtx a10, rtx a11, rtx a12, rtx a13, rtx a14) const { return ((f15)func) (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14); }
     14028+  rtx operator () (rtx a0, rtx a1, rtx a2, rtx a3, rtx a4, rtx a5, rtx a6, rtx a7, rtx a8, rtx a9, rtx a10, rtx a11, rtx a12, rtx a13, rtx a14, rtx a15) const { return ((f16)func) (a0, a1, a2, a3, a4, a5, a6, a7, a8, a9, a10, a11, a12, a13, a14, a15); }
     14029+
     14030+  // This is for compatibility of code that invokes functions like
     14031+  //   (*funcptr) (arg)
     14032+  insn_gen_fn operator * (void) const { return *this; }
     14033+
     14034+  // The wrapped function pointer must be public and there must not be any
     14035+  // constructors.  Otherwise the insn_data_d struct initializers generated
     14036+  // by genoutput.c will result in static initializer functions, which defeats
     14037+  // the purpose of the generated insn_data_d array.
     14038+  stored_funcptr func;
     14039+};
     14040 
     14041 struct insn_operand_data
     14042 {
    1235914043diff -Naur gcc-4.8.1.orig/gcc/simplify-rtx.c gcc-4.8.1/gcc/simplify-rtx.c
    1236014044--- gcc-4.8.1.orig/gcc/simplify-rtx.c   2013-03-05 06:04:14.000000000 +0000
    12361 +++ gcc-4.8.1/gcc/simplify-rtx.c        2013-09-13 19:01:43.183198249 +0000
     14045+++ gcc-4.8.1/gcc/simplify-rtx.c        2013-10-01 16:06:44.000554285 +0000
    1236214046@@ -2784,6 +2784,7 @@
    1236314047           HOST_WIDE_INT mask = INTVAL (trueop1) << count;
     
    1237014054diff -Naur gcc-4.8.1.orig/gcc/testsuite/c-c++-common/gomp/pr58257.c gcc-4.8.1/gcc/testsuite/c-c++-common/gomp/pr58257.c
    1237114055--- gcc-4.8.1.orig/gcc/testsuite/c-c++-common/gomp/pr58257.c    1970-01-01 00:00:00.000000000 +0000
    12372 +++ gcc-4.8.1/gcc/testsuite/c-c++-common/gomp/pr58257.c 2013-09-13 19:01:43.186531574 +0000
     14056+++ gcc-4.8.1/gcc/testsuite/c-c++-common/gomp/pr58257.c 2013-10-01 16:06:44.000554285 +0000
    1237314057@@ -0,0 +1,15 @@
    1237414058+/* PR middle-end/58257 */
     
    1238914073diff -Naur gcc-4.8.1.orig/gcc/testsuite/g++.dg/cpp0x/constexpr-value4.C gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/constexpr-value4.C
    1239014074--- gcc-4.8.1.orig/gcc/testsuite/g++.dg/cpp0x/constexpr-value4.C        1970-01-01 00:00:00.000000000 +0000
    12391 +++ gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/constexpr-value4.C     2013-09-13 19:01:43.196531548 +0000
     14075+++ gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/constexpr-value4.C     2013-10-01 16:06:44.008554285 +0000
    1239214076@@ -0,0 +1,16 @@
    1239314077+// PR c++/57901
     
    1240914093diff -Naur gcc-4.8.1.orig/gcc/testsuite/g++.dg/cpp0x/decltype55.C gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/decltype55.C
    1241014094--- gcc-4.8.1.orig/gcc/testsuite/g++.dg/cpp0x/decltype55.C      1970-01-01 00:00:00.000000000 +0000
    12411 +++ gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/decltype55.C   2013-09-13 19:01:43.196531548 +0000
     14095+++ gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/decltype55.C   2013-10-01 16:06:44.008554285 +0000
    1241214096@@ -0,0 +1,20 @@
    1241314097+// PR c++/53211
     
    1243314117diff -Naur gcc-4.8.1.orig/gcc/testsuite/g++.dg/cpp0x/defaulted44.C gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/defaulted44.C
    1243414118--- gcc-4.8.1.orig/gcc/testsuite/g++.dg/cpp0x/defaulted44.C     1970-01-01 00:00:00.000000000 +0000
    12435 +++ gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/defaulted44.C  2013-09-13 19:01:43.196531548 +0000
     14119+++ gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/defaulted44.C  2013-10-01 16:06:44.008554285 +0000
    1243614120@@ -0,0 +1,24 @@
    1243714121+// PR c++/57319
     
    1246114145diff -Naur gcc-4.8.1.orig/gcc/testsuite/g++.dg/cpp0x/defaulted45.C gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/defaulted45.C
    1246214146--- gcc-4.8.1.orig/gcc/testsuite/g++.dg/cpp0x/defaulted45.C     1970-01-01 00:00:00.000000000 +0000
    12463 +++ gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/defaulted45.C  2013-09-13 19:01:43.196531548 +0000
     14147+++ gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/defaulted45.C  2013-10-01 16:06:44.008554285 +0000
    1246414148@@ -0,0 +1,20 @@
    1246514149+// { dg-do run }
     
    1248514169diff -Naur gcc-4.8.1.orig/gcc/testsuite/g++.dg/cpp0x/initlist71.C gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/initlist71.C
    1248614170--- gcc-4.8.1.orig/gcc/testsuite/g++.dg/cpp0x/initlist71.C      1970-01-01 00:00:00.000000000 +0000
    12487 +++ gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/initlist71.C   2013-09-13 19:01:43.196531548 +0000
     14171+++ gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/initlist71.C   2013-10-01 16:06:44.008554285 +0000
    1248814172@@ -0,0 +1,9 @@
    1248914173+// PR c++/56930
     
    1249814182diff -Naur gcc-4.8.1.orig/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto3.C gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto3.C
    1249914183--- gcc-4.8.1.orig/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto3.C     1970-01-01 00:00:00.000000000 +0000
    12500 +++ gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto3.C  2013-09-13 19:01:43.196531548 +0000
     14184+++ gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-auto3.C  2013-10-01 16:06:44.008554285 +0000
    1250114185@@ -0,0 +1,24 @@
    1250214186+// PR c++/57526
     
    1252614210diff -Naur gcc-4.8.1.orig/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg5.C gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg5.C
    1252714211--- gcc-4.8.1.orig/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg5.C   1970-01-01 00:00:00.000000000 +0000
    12528 +++ gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg5.C        2013-09-13 19:01:43.196531548 +0000
     14212+++ gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-defarg5.C        2013-10-01 16:06:44.008554285 +0000
    1252914213@@ -0,0 +1,30 @@
    1253014214+// PR c++/58083
     
    1256014244diff -Naur gcc-4.8.1.orig/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-return1.C gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-return1.C
    1256114245--- gcc-4.8.1.orig/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-return1.C   1970-01-01 00:00:00.000000000 +0000
    12562 +++ gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-return1.C        2013-09-13 19:01:43.196531548 +0000
     14246+++ gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/lambda/lambda-return1.C        2013-10-01 16:06:44.008554285 +0000
    1256314247@@ -0,0 +1,26 @@
    1256414248+// PR c++/57437
     
    1259014274diff -Naur gcc-4.8.1.orig/gcc/testsuite/g++.dg/cpp0x/noexcept21.C gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/noexcept21.C
    1259114275--- gcc-4.8.1.orig/gcc/testsuite/g++.dg/cpp0x/noexcept21.C      1970-01-01 00:00:00.000000000 +0000
    12592 +++ gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/noexcept21.C   2013-09-13 19:01:43.196531548 +0000
     14276+++ gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/noexcept21.C   2013-10-01 16:06:44.012554285 +0000
    1259314277@@ -0,0 +1,87 @@
    1259414278+// PR c++/57645
     
    1268114365diff -Naur gcc-4.8.1.orig/gcc/testsuite/g++.dg/cpp0x/pr57981.C gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/pr57981.C
    1268214366--- gcc-4.8.1.orig/gcc/testsuite/g++.dg/cpp0x/pr57981.C 1970-01-01 00:00:00.000000000 +0000
    12683 +++ gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/pr57981.C      2013-09-13 19:01:43.196531548 +0000
     14367+++ gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/pr57981.C      2013-10-01 16:06:44.012554285 +0000
    1268414368@@ -0,0 +1,17 @@
    1268514369+// { dg-options "-std=c++11 -Wall -Wextra" }
     
    1270214386diff -Naur gcc-4.8.1.orig/gcc/testsuite/g++.dg/cpp0x/ref-qual14.C gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/ref-qual14.C
    1270314387--- gcc-4.8.1.orig/gcc/testsuite/g++.dg/cpp0x/ref-qual14.C      1970-01-01 00:00:00.000000000 +0000
    12704 +++ gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/ref-qual14.C   2013-09-13 19:01:43.199864872 +0000
     14388+++ gcc-4.8.1/gcc/testsuite/g++.dg/cpp0x/ref-qual14.C   2013-10-01 16:06:44.012554285 +0000
    1270514389@@ -0,0 +1,18 @@
    1270614390+// PR c++/57825
     
    1272414408diff -Naur gcc-4.8.1.orig/gcc/testsuite/g++.dg/debug/template2.C gcc-4.8.1/gcc/testsuite/g++.dg/debug/template2.C
    1272514409--- gcc-4.8.1.orig/gcc/testsuite/g++.dg/debug/template2.C       1970-01-01 00:00:00.000000000 +0000
    12726 +++ gcc-4.8.1/gcc/testsuite/g++.dg/debug/template2.C    2013-09-13 19:01:43.199864872 +0000
     14410+++ gcc-4.8.1/gcc/testsuite/g++.dg/debug/template2.C    2013-10-01 16:06:44.012554285 +0000
    1272714411@@ -0,0 +1,14 @@
    1272814412+// PR c++/57545
     
    1274214426diff -Naur gcc-4.8.1.orig/gcc/testsuite/g++.dg/expr/const1.C gcc-4.8.1/gcc/testsuite/g++.dg/expr/const1.C
    1274314427--- gcc-4.8.1.orig/gcc/testsuite/g++.dg/expr/const1.C   1970-01-01 00:00:00.000000000 +0000
    12744 +++ gcc-4.8.1/gcc/testsuite/g++.dg/expr/const1.C        2013-09-13 19:01:43.199864872 +0000
     14428+++ gcc-4.8.1/gcc/testsuite/g++.dg/expr/const1.C        2013-10-01 16:06:44.012554285 +0000
    1274514429@@ -0,0 +1,9 @@
    1274614430+// PR c++/57551
     
    1275514439diff -Naur gcc-4.8.1.orig/gcc/testsuite/g++.dg/ext/pr57362.C gcc-4.8.1/gcc/testsuite/g++.dg/ext/pr57362.C
    1275614440--- gcc-4.8.1.orig/gcc/testsuite/g++.dg/ext/pr57362.C   1970-01-01 00:00:00.000000000 +0000
    12757 +++ gcc-4.8.1/gcc/testsuite/g++.dg/ext/pr57362.C        2013-09-13 19:01:43.199864872 +0000
     14441+++ gcc-4.8.1/gcc/testsuite/g++.dg/ext/pr57362.C        2013-10-01 16:06:44.012554285 +0000
    1275814442@@ -0,0 +1,199 @@
    1275914443+/* { dg-do compile { target i?86-*-* x86_64-*-* } } */
     
    1295614640+/* { dg-prune-output "int foo.* previously defined here" } */
    1295714641+/* { dg-prune-output "No dispatcher found for" } */
     14642diff -Naur gcc-4.8.1.orig/gcc/testsuite/g++.dg/ext/pr57735.C gcc-4.8.1/gcc/testsuite/g++.dg/ext/pr57735.C
     14643--- gcc-4.8.1.orig/gcc/testsuite/g++.dg/ext/pr57735.C   1970-01-01 00:00:00.000000000 +0000
     14644+++ gcc-4.8.1/gcc/testsuite/g++.dg/ext/pr57735.C        2013-10-01 16:06:44.012554285 +0000
     14645@@ -0,0 +1,145 @@
     14646+/* { dg-do compile { target arm*-*-* } } */
     14647+/* { dg-options "-march=armv5te -marm  -mtune=xscale -mfloat-abi=soft -O1" } */
     14648+
     14649+typedef unsigned int size_t;
     14650+__extension__
     14651+typedef long long int int64_t;
     14652+namespace WTF {
     14653+    template<typename T> class RefPtr {
     14654+    public:
     14655+        inline T* operator->() const { return m_ptr; }
     14656+        T* m_ptr;
     14657+    };
     14658+}
     14659+using WTF::RefPtr;
     14660+namespace JSC {
     14661+    class ExecState;
     14662+    class JSString;
     14663+    typedef int64_t EncodedJSValue;
     14664+    class JSValue {
     14665+    public:
     14666+        static EncodedJSValue encode(JSValue);
     14667+        JSString* toString(ExecState*) const;
     14668+    };
     14669+}
     14670+typedef unsigned char LChar;
     14671+    typedef short unsigned int UChar;
     14672+namespace WTF {
     14673+    template<typename T, size_t inlineCapacity = 0>
     14674+    class Vector {
     14675+    public:
     14676+        template<typename U> bool tryAppend(const U*, size_t);
     14677+    };
     14678+}
     14679+using WTF::Vector;
     14680+namespace WTF {
     14681+template<typename CharType> inline bool isASCIIDigit(CharType c)
     14682+{
     14683+}
     14684+template<typename CharType> inline bool isASCIIHexDigit(CharType c)
     14685+{
     14686+    return isASCIIDigit(c) || ((c | 0x20) >= 'a' && (c | 0x20) <= 'f');
     14687+}
     14688+    class StringImpl;
     14689+}
     14690+using WTF::StringImpl;
     14691+namespace WTF {
     14692+class StringImpl {
     14693+public:
     14694+    unsigned length() const { return m_length; }
     14695+    unsigned m_length;
     14696+};
     14697+}
     14698+namespace JSC {
     14699+    class Register {
     14700+    };
     14701+class UString {
     14702+public:
     14703+    unsigned length() const
     14704+    {
     14705+        return m_impl->length();
     14706+    }
     14707+    const LChar* characters8() const
     14708+    {
     14709+    }
     14710+    RefPtr<StringImpl> m_impl;
     14711+};
     14712+    class ExecState : private Register {
     14713+    public:
     14714+        JSValue argument(size_t argument)
     14715+        {
     14716+        }
     14717+    };
     14718+    class JSCell {
     14719+    };
     14720+    class JSString : public JSCell {
     14721+    public:
     14722+        const UString& value(ExecState*) const;
     14723+    };
     14724+class JSStringBuilder {
     14725+public:
     14726+    void append(const UChar u)
     14727+    {
     14728+        m_okay &= buffer16.tryAppend(&u, 1);
     14729+    }
     14730+    Vector<UChar, 64> buffer16;
     14731+    bool m_okay;
     14732+};
     14733+template <typename T>
     14734+class Lexer {
     14735+public:
     14736+    static unsigned char convertHex(int c1, int c2);
     14737+};
     14738+}
     14739+namespace WTF {
     14740+namespace Unicode {
     14741+    int UTF8SequenceLength(char);
     14742+    int decodeUTF8Sequence(const char*);
     14743+}
     14744+}
     14745+using namespace WTF;
     14746+using namespace Unicode;
     14747+namespace JSC {
     14748+template <typename CharType>
     14749+static JSValue decode(ExecState* exec, const CharType* characters, int length, const char* doNotUnescape, bool strict)
     14750+{
     14751+    JSStringBuilder builder;
     14752+    int k = 0;
     14753+    UChar u = 0;
     14754+    while (k < length) {
     14755+        const CharType* p = characters + k;
     14756+        CharType c = *p;
     14757+        if (c == '%') {
     14758+            int charLen = 0;
     14759+            if (k <= length - 3 && isASCIIHexDigit(p[1]) && isASCIIHexDigit(p[2])) {
     14760+                const char b0 = Lexer<CharType>::convertHex(p[1], p[2]);
     14761+                const int sequenceLen = UTF8SequenceLength(b0);
     14762+                if (sequenceLen && k <= length - sequenceLen * 3) {
     14763+                    charLen = sequenceLen * 3;
     14764+                    char sequence[5];
     14765+                    if (charLen != 0) {
     14766+                        const int character = decodeUTF8Sequence(sequence);
     14767+                        if (character < 0 || character >= 0x110000)
     14768+                            charLen = 0;
     14769+                        else if (character >= 0x10000) {
     14770+                            builder.append(static_cast<UChar>(0xD800 | ((character - 0x10000) >> 10)));
     14771+                        } else
     14772+                            u = static_cast<UChar>(character);
     14773+                    }
     14774+                }
     14775+            }
     14776+        }
     14777+    }
     14778+}
     14779+static JSValue decode(ExecState* exec, const char* doNotUnescape, bool strict)
     14780+{
     14781+    UString str = exec->argument(0).toString(exec)->value(exec);
     14782+        return decode(exec, str.characters8(), str.length(), doNotUnescape, strict);
     14783+}
     14784+EncodedJSValue globalFuncDecodeURI(ExecState* exec)
     14785+{
     14786+    static const char do_not_unescape_when_decoding_URI[] =
     14787+        "#$&+,/:;=?@";
     14788+    return JSValue::encode(decode(exec, do_not_unescape_when_decoding_URI, true));
     14789+}
     14790+}
    1295814791diff -Naur gcc-4.8.1.orig/gcc/testsuite/g++.dg/opt/pr58006.C gcc-4.8.1/gcc/testsuite/g++.dg/opt/pr58006.C
    12959147