rpms/gcc/F-8 gcc41-debug-fortran-array.patch, NONE, 1.1 gcc41-java-arm1.patch, NONE, 1.1 gcc41-java-arm2.patch, NONE, 1.1 gcc41-java-arm3.patch, NONE, 1.1 gcc41-java-arm4.patch, NONE, 1.1 gcc41-java-arm5.patch, NONE, 1.1 gcc41-java-arm6.patch, NONE, 1.1 gcc41-java-arm7.patch, NONE, 1.1 gcc41-java-arm8.patch, NONE, 1.1 gcc41-omp-outer-ctx.patch, NONE, 1.1 gcc41-pr23848.patch, NONE, 1.1 gcc41-pr27643.patch, NONE, 1.1 gcc41-pr29225.patch, NONE, 1.1 gcc41-pr29712.patch, NONE, 1.1 gcc41-pr29978.patch, NONE, 1.1 gcc41-pr30293.patch, NONE, 1.1 gcc41-pr30988.patch, NONE, 1.1 gcc41-pr31483.patch, NONE, 1.1 gcc41-pr32241.patch, NONE, 1.1 gcc41-pr32384.patch, NONE, 1.1 gcc41-pr33501.patch, NONE, 1.1 gcc41-pr33516.patch, NONE, 1.1 gcc41-pr33537.patch, NONE, 1.1 gcc41-pr33616.patch, NONE, 1.1 gcc41-pr33723.patch, NONE, 1.1 gcc41-pr33836.patch, NONE, 1.1 gcc41-pr33842.patch, NONE, 1.1 gcc41-pr33844.patch, NONE, 1.1 gcc41-pr33890.patch, NONE, 1.1 gcc41-pr33962.patch, NONE, 1.1 gcc41-pr34070.patch, NONE, 1.1 gcc41-pr34089.patch, NONE, 1.1 gcc41-pr34130.patch, NONE, 1.1 gcc41-pr34146.patch, NONE, 1.1 gcc41-pr34178.patch, NONE, 1.1 gcc41-pr34213.patch, NONE, 1.1 gcc41-pr34275.patch, NONE, 1.1 gcc41-pr34364.patch, NONE, 1.1 gcc41-pr34394.patch, NONE, 1.1 gcc41-pr34506.patch, NONE, 1.1 gcc41-pr34513.patch, NONE, 1.1 gcc41-pr7081.patch, NONE, 1.1 gcc41-rh364001.patch, NONE, 1.1 gcc41-rh407281.patch, NONE, 1.1 gcc41-rh426846.patch, NONE, 1.1 gcc41-sse5-pperm.patch, NONE, 1.1 gcc41-sse5.patch, NONE, 1.1 .cvsignore, 1.213, 1.214 gcc41-c++-guard-visibility.patch, 1.1, 1.2 gcc41.spec, 1.182, 1.183 sources, 1.215, 1.216 gcc41-ppc64-cr2-unwind.patch, 1.1, NONE gcc41-pr33744.patch, 1.1, NONE

Jakub Jelinek (jakub) fedora-extras-commits at redhat.com
Mon Dec 31 18:09:36 UTC 2007


Author: jakub

Update of /cvs/pkgs/rpms/gcc/F-8
In directory cvs-int.fedora.redhat.com:/tmp/cvs-serv8180/F-8

Modified Files:
	.cvsignore gcc41-c++-guard-visibility.patch gcc41.spec sources 
Added Files:
	gcc41-debug-fortran-array.patch gcc41-java-arm1.patch 
	gcc41-java-arm2.patch gcc41-java-arm3.patch 
	gcc41-java-arm4.patch gcc41-java-arm5.patch 
	gcc41-java-arm6.patch gcc41-java-arm7.patch 
	gcc41-java-arm8.patch gcc41-omp-outer-ctx.patch 
	gcc41-pr23848.patch gcc41-pr27643.patch gcc41-pr29225.patch 
	gcc41-pr29712.patch gcc41-pr29978.patch gcc41-pr30293.patch 
	gcc41-pr30988.patch gcc41-pr31483.patch gcc41-pr32241.patch 
	gcc41-pr32384.patch gcc41-pr33501.patch gcc41-pr33516.patch 
	gcc41-pr33537.patch gcc41-pr33616.patch gcc41-pr33723.patch 
	gcc41-pr33836.patch gcc41-pr33842.patch gcc41-pr33844.patch 
	gcc41-pr33890.patch gcc41-pr33962.patch gcc41-pr34070.patch 
	gcc41-pr34089.patch gcc41-pr34130.patch gcc41-pr34146.patch 
	gcc41-pr34178.patch gcc41-pr34213.patch gcc41-pr34275.patch 
	gcc41-pr34364.patch gcc41-pr34394.patch gcc41-pr34506.patch 
	gcc41-pr34513.patch gcc41-pr7081.patch gcc41-rh364001.patch 
	gcc41-rh407281.patch gcc41-rh426846.patch 
	gcc41-sse5-pperm.patch gcc41-sse5.patch 
Removed Files:
	gcc41-ppc64-cr2-unwind.patch gcc41-pr33744.patch 
Log Message:
4.1.2-37


gcc41-debug-fortran-array.patch:

--- NEW FILE gcc41-debug-fortran-array.patch ---
2007-12-10  Jakub Jelinek  <jakub at redhat.com>

	* dwarf2out.c (gen_array_type_die, gen_descr_array_type_die): For
	Fortran multi-dimensional arrays use DW_AT_ordering
	DW_ORD_col_major.

--- gcc/dwarf2out.c	(revision 130741)
+++ gcc/dwarf2out.c	(revision 130742)
@@ -11636,6 +11636,12 @@ gen_array_type_die (tree type, dw_die_re
       add_AT_flag (array_die, DW_AT_GNU_vector, 1);
     }
 
+  /* For Fortran multidimensional arrays use DW_ORD_col_major ordering.  */
+  if (is_fortran ()
+      && TREE_CODE (type) == ARRAY_TYPE
+      && TREE_CODE (TREE_TYPE (type)) == ARRAY_TYPE)
+    add_AT_unsigned (array_die, DW_AT_ordering, DW_ORD_col_major);
+
 #if 0
   /* We default the array ordering.  SDB will probably do
      the right things even if DW_AT_ordering is not present.  It's not even
@@ -11787,6 +11793,11 @@ gen_descr_array_type_die (tree type, str
   add_name_attribute (array_die, type_tag (type));
   equate_type_number_to_die (type, array_die);
 
+  /* For Fortran multidimensional arrays use DW_ORD_col_major ordering.  */
+  if (is_fortran ()
+      && info->ndimensions >= 2)
+    add_AT_unsigned (array_die, DW_AT_ordering, DW_ORD_col_major);
+
   if (info->data_location)
     add_descr_info_field (array_die, DW_AT_data_location, info->data_location,
 			  info->base_decl);

gcc41-java-arm1.patch:

--- NEW FILE gcc41-java-arm1.patch ---
2007-05-18  Aurelien Jarno  <aurelien at aurel32.net>

	* src/arm/ffi.c (ffi_prep_closure_loc): Renamed and ajusted
	from (ffi_prep_closure): ... this.
	(FFI_INIT_TRAMPOLINE): Adjust.

2005-12-31  Phil Blundell  <pb at reciva.com>

	* src/arm/ffi.c (ffi_prep_incoming_args_SYSV, 
        ffi_closure_SYSV_inner, ffi_prep_closure): New, add closure support.
	* src/arm/sysv.S(ffi_closure_SYSV): Likewise.
	* src/arm/ffitarget.h (FFI_TRAMPOLINE_SIZE): Likewise.
	(FFI_CLOSURES): Enable closure support.

2007-07-03  Andrew Haley  <aph at hedges.billgatliff.com>

        * testsuite/libffi.call/cls_multi_ushort.c,
        testsuite/libffi.call/cls_align_uint16.c,
        testsuite/libffi.call/nested_struct1.c,
        testsuite/libffi.call/nested_struct3.c,
        testsuite/libffi.call/cls_7_1_byte.c,
        testsuite/libffi.call/cls_double.c,
        testsuite/libffi.call/cls_sint.c,
        testsuite/libffi.call/cls_20byte1.c,
        testsuite/libffi.call/cls_multi_sshortchar.c,
        testsuite/libffi.call/cls_align_sint64.c,
        testsuite/libffi.call/cls_3byte2.c,
        testsuite/libffi.call/cls_multi_schar.c,
        testsuite/libffi.call/cls_multi_uchar.c,
        testsuite/libffi.call/cls_19byte.c,
        testsuite/libffi.call/cls_9byte1.c,
        testsuite/libffi.call/cls_align_float.c,
        testsuite/libffi.call/closure_fn1.c,
        testsuite/libffi.call/problem1.c,
        testsuite/libffi.call/closure_fn3.c,
        testsuite/libffi.call/cls_sshort.c,
        testsuite/libffi.call/closure_fn5.c,
        testsuite/libffi.call/cls_align_double.c,
        testsuite/libffi.call/cls_2byte.c,
        testsuite/libffi.call/nested_struct.c,
        testsuite/libffi.call/cls_4byte.c,
        testsuite/libffi.call/cls_6byte.c,
        testsuite/libffi.call/cls_8byte.c,
        testsuite/libffi.call/cls_multi_sshort.c,
        testsuite/libffi.call/cls_align_uint32.c,
        testsuite/libffi.call/cls_align_sint16.c,
        testsuite/libffi.call/cls_float.c,
        testsuite/libffi.call/cls_20byte.c,
        testsuite/libffi.call/cls_5_1_byte.c,
        testsuite/libffi.call/nested_struct2.c,
        testsuite/libffi.call/cls_24byte.c,
        testsuite/libffi.call/cls_64byte.c,
        testsuite/libffi.call/cls_uint.c,
        testsuite/libffi.call/cls_multi_ushortchar.c,
        testsuite/libffi.call/cls_schar.c,
        testsuite/libffi.call/cls_uchar.c,
        testsuite/libffi.call/cls_align_uint64.c,
        testsuite/libffi.call/cls_ulonglong.c,
        testsuite/libffi.call/cls_align_longdouble.c,
        testsuite/libffi.call/cls_1_1byte.c,
        testsuite/libffi.call/cls_12byte.c,
        testsuite/libffi.call/cls_3_1byte.c,
        testsuite/libffi.call/cls_3byte1.c,
        testsuite/libffi.call/cls_4_1byte.c,
        testsuite/libffi.call/cls_6_1_byte.c,
        testsuite/libffi.call/cls_16byte.c,
        testsuite/libffi.call/cls_18byte.c,
        testsuite/libffi.call/closure_fn0.c,
        testsuite/libffi.call/cls_9byte2.c,
        testsuite/libffi.call/closure_fn2.c,
        testsuite/libffi.call/closure_fn4.c,
        testsuite/libffi.call/cls_ushort.c,
        testsuite/libffi.call/closure_fn6.c,
        testsuite/libffi.call/cls_5byte.c,
        testsuite/libffi.call/cls_align_pointer.c,
        testsuite/libffi.call/cls_7byte.c,
        testsuite/libffi.call/cls_align_sint32.c,
        testsuite/libffi.special/unwindtest.cc: Enable for ARM.

--- libffi/src/arm/ffitarget.h.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/src/arm/ffitarget.h	2007-09-06 14:07:30.000000000 +0200
@@ -40,7 +40,8 @@ typedef enum ffi_abi {
 
 /* ---- Definitions for closures ----------------------------------------- */
 
-#define FFI_CLOSURES 0
+#define FFI_CLOSURES 1
+#define FFI_TRAMPOLINE_SIZE 20
 #define FFI_NATIVE_RAW_API 0
 
 #endif
--- libffi/src/arm/ffi.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/src/arm/ffi.c	2007-09-06 14:07:30.000000000 +0200
@@ -168,3 +168,122 @@ void ffi_call(ffi_cif *cif, void (*fn)()
       break;
     }
 }
+
+/** private members **/
+
+static void ffi_prep_incoming_args_SYSV (char *stack, void **ret,
+					 void** args, ffi_cif* cif);
+
+void ffi_closure_SYSV (ffi_closure *);
+
+/* This function is jumped to by the trampoline */
+
+unsigned int
+ffi_closure_SYSV_inner (closure, respp, args)
+     ffi_closure *closure;
+     void **respp;
+     void *args;
+{
+  // our various things...
+  ffi_cif       *cif;
+  void         **arg_area;
+
+  cif         = closure->cif;
+  arg_area    = (void**) alloca (cif->nargs * sizeof (void*));  
+
+  /* this call will initialize ARG_AREA, such that each
+   * element in that array points to the corresponding 
+   * value on the stack; and if the function returns
+   * a structure, it will re-set RESP to point to the
+   * structure return address.  */
+
+  ffi_prep_incoming_args_SYSV(args, respp, arg_area, cif);
+
+  (closure->fun) (cif, *respp, arg_area, closure->user_data);
+
+  return cif->flags;
+}
+
+/*@-exportheader@*/
+static void 
+ffi_prep_incoming_args_SYSV(char *stack, void **rvalue,
+			    void **avalue, ffi_cif *cif)
+/*@=exportheader@*/
+{
+  register unsigned int i;
+  register void **p_argv;
+  register char *argp;
+  register ffi_type **p_arg;
+
+  argp = stack;
+
+  if ( cif->flags == FFI_TYPE_STRUCT ) {
+    *rvalue = *(void **) argp;
+    argp += 4;
+  }
+
+  p_argv = avalue;
+
+  for (i = cif->nargs, p_arg = cif->arg_types; (i != 0); i--, p_arg++)
+    {
+      size_t z;
+
+      /* Align if necessary */
+      if ((sizeof(int) - 1) & (unsigned) argp) {
+	argp = (char *) ALIGN(argp, sizeof(int));
+      }
+
+      z = (*p_arg)->size;
+
+      /* because we're little endian, this is what it turns into.   */
+
+      *p_argv = (void*) argp;
+
+      p_argv++;
+      argp += z;
+    }
+  
+  return;
+}
+
+/* How to make a trampoline.  */
+
+#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \
+({ unsigned char *__tramp = (unsigned char*)(TRAMP); \
+   unsigned int  __fun = (unsigned int)(FUN); \
+   unsigned int  __ctx = (unsigned int)(CTX); \
+   *(unsigned int*) &__tramp[0] = 0xe92d000f; /* stmfd sp!, {r0-r3} */	\
+   *(unsigned int*) &__tramp[4] = 0xe59f0000; /* ldr r0, [pc] */ \
+   *(unsigned int*) &__tramp[8] = 0xe59ff000; /* ldr pc, [pc] */ \
+   *(unsigned int*) &__tramp[12] = __ctx; \
+   *(unsigned int*) &__tramp[16] = __fun; \
+   register unsigned long _beg __asm ("a1") = (unsigned long) (&__tramp[0]);	\
+   register unsigned long _end __asm ("a2") = (unsigned long) (&__tramp[19]);	\
+   register unsigned long _flg __asm ("a3") = 0;			\
+   __asm __volatile ("swi 0x9f0002		@ sys_cacheflush"	\
+	   		    : "=r" (_beg)				\
+	   		    : "0" (_beg), "r" (_end), "r" (_flg));	\
+ })
+
+
+/* the cif must already be prep'ed */
+
+ffi_status
+ffi_prep_closure_loc (ffi_closure* closure,
+		      ffi_cif* cif,
+		      void (*fun)(ffi_cif*,void*,void**,void*),
+		      void *user_data,
+		      void *codeloc)
+{
+  FFI_ASSERT (cif->abi == FFI_SYSV);
+
+  FFI_INIT_TRAMPOLINE (&closure->tramp[0], \
+		       &ffi_closure_SYSV,  \
+		       codeloc);
+    
+  closure->cif  = cif;
+  closure->user_data = user_data;
+  closure->fun  = fun;
+
+  return FFI_OK;
+}
--- libffi/src/arm/sysv.S.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/src/arm/sysv.S	2007-09-06 14:08:26.000000000 +0200
@@ -207,6 +207,54 @@ LSYM(Lepilogue):
 .ffi_call_SYSV_end:
         .size    CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
 
+/*
+	unsigned int FFI_HIDDEN
+	ffi_closure_SYSV_inner (closure, respp, args)
+	     ffi_closure *closure;
+	     void **respp;
+  	     void *args;
+*/
+
+ARM_FUNC_START ffi_closure_SYSV
+	add	ip, sp, #16
+	stmfd	sp!, {ip, lr}
+	add	r2, sp, #8
+	sub	sp, sp, #16
+	str	sp, [sp, #8]
+	add	r1, sp, #8
+	bl	ffi_closure_SYSV_inner
+	cmp	r0, #FFI_TYPE_INT
+	beq	.Lretint
+	cmp	r0, #FFI_TYPE_FLOAT
+	beq	.Lretfloat
+	cmp	r0, #FFI_TYPE_DOUBLE
+	beq	.Lretdouble
+	cmp	r0, #FFI_TYPE_LONGDOUBLE
+	beq	.Lretlongdouble
+	cmp	r0, #FFI_TYPE_SINT64
+	beq	.Lretlonglong
+.Lclosure_epilogue:
+	add	sp, sp, #16
+	ldmfd	sp, {sp, pc}
+.Lretint:
+	ldr	r0, [sp]
+	b	.Lclosure_epilogue
+.Lretlonglong:
+	ldr	r0, [sp]
+	ldr	r1, [sp, #4]
+	b	.Lclosure_epilogue
+.Lretfloat:
+	ldfs	f0, [sp]
+	b	.Lclosure_epilogue
+.Lretdouble:
+	ldfd	f0, [sp]
+	b	.Lclosure_epilogue
+.Lretlongdouble:
+	ldfd	f0, [sp]
+	b	.Lclosure_epilogue
+.ffi_closure_SYSV_end:
+        .size    CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV)
+
 #if defined __ELF__ && defined __linux__
 	.section	.note.GNU-stack,"", at progbits
 #endif
--- libffi/testsuite/libffi.call/cls_multi_ushort.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_multi_ushort.c	2007-09-06 14:07:30.000000000 +0200
@@ -4,7 +4,7 @@
    PR:		PR13221.
    Originator:	<andreast at gcc.gnu.org> 20031129  */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 unsigned short test_func_fn(unsigned short a1, unsigned short a2)
--- libffi/testsuite/libffi.call/cls_align_uint16.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_align_uint16.c	2007-09-06 14:07:30.000000000 +0200
@@ -4,7 +4,7 @@
    PR:		none.
    Originator:	<hos at tamanegi.org> 20031203	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_align {
--- libffi/testsuite/libffi.call/nested_struct1.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/nested_struct1.c	2007-09-06 14:07:30.000000000 +0200
@@ -5,7 +5,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030828	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_16byte1 {
--- libffi/testsuite/libffi.call/nested_struct3.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/nested_struct3.c	2007-09-06 14:07:30.000000000 +0200
@@ -6,7 +6,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030911	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct A {
--- libffi/testsuite/libffi.call/cls_7_1_byte.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_7_1_byte.c	2007-09-06 14:07:30.000000000 +0200
@@ -5,7 +5,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20050708	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_7byte {
--- libffi/testsuite/libffi.call/cls_double.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_double.c	2007-09-06 14:07:30.000000000 +0200
@@ -4,7 +4,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030828	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 static void cls_ret_double_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
--- libffi/testsuite/libffi.call/cls_sint.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_sint.c	2007-09-06 14:07:33.000000000 +0200
@@ -4,7 +4,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20031108	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 static void cls_ret_sint_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
--- libffi/testsuite/libffi.call/cls_20byte1.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_20byte1.c	2007-09-06 14:07:34.000000000 +0200
@@ -5,7 +5,9 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030828	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+
+
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_20byte {
--- libffi/testsuite/libffi.call/cls_multi_sshortchar.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_multi_sshortchar.c	2007-09-06 14:07:34.000000000 +0200
@@ -4,7 +4,7 @@
    PR:		PR13221.
    Originator:	<andreast at gcc.gnu.org> 20031129  */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 signed short test_func_fn(signed char a1, signed short a2,
--- libffi/testsuite/libffi.call/cls_align_sint64.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_align_sint64.c	2007-09-06 14:07:34.000000000 +0200
@@ -4,7 +4,7 @@
    PR:		none.
    Originator:	<hos at tamanegi.org> 20031203	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_align {
--- libffi/testsuite/libffi.call/cls_3byte2.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_3byte2.c	2007-09-06 14:07:34.000000000 +0200
@@ -6,7 +6,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030828	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_3byte_1 {
--- libffi/testsuite/libffi.call/cls_multi_schar.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_multi_schar.c	2007-09-06 14:07:34.000000000 +0200
@@ -4,7 +4,7 @@
    PR:		PR13221.
    Originator:	<hos at tamanegi.org> 20031129  */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 signed char test_func_fn(signed char a1, signed char a2)
--- libffi/testsuite/libffi.call/cls_multi_uchar.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_multi_uchar.c	2007-09-06 14:07:34.000000000 +0200
@@ -4,7 +4,7 @@
    PR:		PR13221.
    Originator:	<andreast at gcc.gnu.org> 20031129  */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 unsigned char test_func_fn(unsigned char a1, unsigned char a2,
--- libffi/testsuite/libffi.call/cls_19byte.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_19byte.c	2007-09-06 14:07:34.000000000 +0200
@@ -5,7 +5,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030915	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_19byte {
--- libffi/testsuite/libffi.call/cls_9byte1.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_9byte1.c	2007-09-06 14:07:34.000000000 +0200
@@ -7,7 +7,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030914	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_9byte {
--- libffi/testsuite/libffi.call/cls_align_float.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_align_float.c	2007-09-06 14:07:34.000000000 +0200
@@ -4,7 +4,7 @@
    PR:		none.
    Originator:	<hos at tamanegi.org> 20031203	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_align {
--- libffi/testsuite/libffi.call/closure_fn1.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/closure_fn1.c	2007-09-06 14:07:34.000000000 +0200
@@ -6,7 +6,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030828	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 
--- libffi/testsuite/libffi.call/problem1.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/problem1.c	2007-09-06 14:07:34.000000000 +0200
@@ -4,7 +4,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030828	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct my_ffi_struct {
--- libffi/testsuite/libffi.call/closure_fn3.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/closure_fn3.c	2007-09-06 14:07:34.000000000 +0200
@@ -6,7 +6,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030828	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 static void closure_test_fn3(ffi_cif* cif __UNUSED__, void* resp, void** args,
--- libffi/testsuite/libffi.call/cls_sshort.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_sshort.c	2007-09-06 14:07:34.000000000 +0200
@@ -4,7 +4,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20031108	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 static void cls_ret_sshort_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
--- libffi/testsuite/libffi.call/closure_fn5.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/closure_fn5.c	2007-09-06 14:07:34.000000000 +0200
@@ -6,7 +6,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20031026	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 static void
--- libffi/testsuite/libffi.call/cls_align_double.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_align_double.c	2007-09-06 14:07:34.000000000 +0200
@@ -4,7 +4,9 @@
    PR:		none.
    Originator:	<hos at tamanegi.org> 20031203	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+
+
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_align {
--- libffi/testsuite/libffi.call/cls_2byte.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_2byte.c	2007-09-06 14:07:34.000000000 +0200
@@ -6,7 +6,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030828	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_2byte {
--- libffi/testsuite/libffi.call/nested_struct.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/nested_struct.c	2007-09-06 14:07:34.000000000 +0200
@@ -5,7 +5,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030828	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_16byte1 {
--- libffi/testsuite/libffi.call/cls_4byte.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_4byte.c	2007-09-06 14:07:35.000000000 +0200
@@ -5,7 +5,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030828	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 
 #include "ffitest.h"
 
--- libffi/testsuite/libffi.call/cls_6byte.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_6byte.c	2007-09-06 14:07:35.000000000 +0200
@@ -5,7 +5,8 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030828	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_6byte {
--- libffi/testsuite/libffi.call/cls_8byte.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_8byte.c	2007-09-06 14:07:35.000000000 +0200
@@ -5,7 +5,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030828	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_8byte {
--- libffi/testsuite/libffi.call/cls_multi_sshort.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_multi_sshort.c	2007-09-06 14:07:35.000000000 +0200
@@ -4,7 +4,7 @@
    PR:		PR13221.
    Originator:	<andreast at gcc.gnu.org> 20031129  */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 signed short test_func_fn(signed short a1, signed short a2)
--- libffi/testsuite/libffi.call/cls_align_uint32.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_align_uint32.c	2007-09-06 14:07:35.000000000 +0200
@@ -4,7 +4,7 @@
    PR:		none.
    Originator:	<hos at tamanegi.org> 20031203	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_align {
--- libffi/testsuite/libffi.call/cls_align_sint16.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_align_sint16.c	2007-09-06 14:07:35.000000000 +0200
@@ -4,7 +4,7 @@
    PR:		none.
    Originator:	<hos at tamanegi.org> 20031203	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_align {
--- libffi/testsuite/libffi.call/cls_float.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_float.c	2007-09-06 14:07:35.000000000 +0200
@@ -4,7 +4,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030828	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 static void cls_ret_float_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
--- libffi/testsuite/libffi.call/cls_20byte.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_20byte.c	2007-09-06 14:07:35.000000000 +0200
@@ -5,7 +5,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030828	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_20byte {
--- libffi/testsuite/libffi.call/cls_5_1_byte.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_5_1_byte.c	2007-09-06 14:07:35.000000000 +0200
@@ -5,7 +5,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20050708	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_5byte {
--- libffi/testsuite/libffi.call/nested_struct2.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/nested_struct2.c	2007-09-06 14:07:35.000000000 +0200
@@ -6,7 +6,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030911	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct A {
--- libffi/testsuite/libffi.call/cls_24byte.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_24byte.c	2007-09-06 14:07:35.000000000 +0200
@@ -5,7 +5,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030828	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_24byte {
--- libffi/testsuite/libffi.call/cls_64byte.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_64byte.c	2007-09-06 14:07:37.000000000 +0200
@@ -6,7 +6,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030828	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_64byte {
--- libffi/testsuite/libffi.call/cls_uint.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_uint.c	2007-09-06 14:07:37.000000000 +0200
@@ -4,7 +4,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030828	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 static void cls_ret_uint_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
--- libffi/testsuite/libffi.call/cls_multi_ushortchar.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_multi_ushortchar.c	2007-09-06 14:07:37.000000000 +0200
@@ -4,7 +4,7 @@
    PR:		PR13221.
    Originator:	<andreast at gcc.gnu.org> 20031129  */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 unsigned short test_func_fn(unsigned char a1, unsigned short a2,
--- libffi/testsuite/libffi.call/cls_schar.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_schar.c	2007-09-06 14:07:37.000000000 +0200
@@ -4,7 +4,9 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20031108	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+
+
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 static void cls_ret_schar_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
--- libffi/testsuite/libffi.call/cls_uchar.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_uchar.c	2007-09-06 14:07:37.000000000 +0200
@@ -4,7 +4,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030828	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 static void cls_ret_uchar_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
--- libffi/testsuite/libffi.call/cls_align_uint64.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_align_uint64.c	2007-09-06 14:07:37.000000000 +0200
@@ -4,7 +4,8 @@
    PR:		none.
    Originator:	<hos at tamanegi.org> 20031203	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_align {
--- libffi/testsuite/libffi.call/cls_ulonglong.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_ulonglong.c	2007-09-06 14:07:37.000000000 +0200
@@ -4,7 +4,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030828	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 static void cls_ret_ulonglong_fn(ffi_cif* cif __UNUSED__, void* resp,
--- libffi/testsuite/libffi.call/cls_align_longdouble.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_align_longdouble.c	2007-09-06 14:07:37.000000000 +0200
@@ -4,7 +4,7 @@
    PR:		none.
    Originator:	<hos at tamanegi.org> 20031203	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 
 #include "ffitest.h"
 
--- libffi/testsuite/libffi.call/cls_1_1byte.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_1_1byte.c	2007-09-06 14:07:37.000000000 +0200
@@ -6,7 +6,9 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030902	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+
+
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_1_1byte {
--- libffi/testsuite/libffi.call/cls_12byte.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_12byte.c	2007-09-06 14:07:37.000000000 +0200
@@ -4,7 +4,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030828	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_12byte {
--- libffi/testsuite/libffi.call/cls_3_1byte.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_3_1byte.c	2007-09-06 14:07:37.000000000 +0200
@@ -6,7 +6,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030902	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_3_1byte {
--- libffi/testsuite/libffi.call/cls_3byte1.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_3byte1.c	2007-09-06 14:07:37.000000000 +0200
@@ -6,7 +6,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030828	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_3byte {
--- libffi/testsuite/libffi.call/cls_4_1byte.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_4_1byte.c	2007-09-06 14:07:37.000000000 +0200
@@ -6,7 +6,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030902	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_4_1byte {
--- libffi/testsuite/libffi.call/cls_6_1_byte.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_6_1_byte.c	2007-09-06 14:07:37.000000000 +0200
@@ -5,7 +5,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20050708	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_6byte {
--- libffi/testsuite/libffi.call/cls_16byte.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_16byte.c	2007-09-06 14:07:37.000000000 +0200
@@ -5,7 +5,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030828	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_16byte {
--- libffi/testsuite/libffi.call/cls_18byte.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_18byte.c	2007-09-06 14:07:37.000000000 +0200
@@ -5,7 +5,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030915	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_18byte {
--- libffi/testsuite/libffi.call/closure_fn0.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/closure_fn0.c	2007-09-06 14:07:37.000000000 +0200
@@ -6,7 +6,10 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030828	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+
+
+
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 static void
--- libffi/testsuite/libffi.call/cls_9byte2.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_9byte2.c	2007-09-06 14:07:37.000000000 +0200
@@ -7,7 +7,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030914	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_9byte {
--- libffi/testsuite/libffi.call/closure_fn2.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/closure_fn2.c	2007-09-06 14:07:37.000000000 +0200
@@ -6,7 +6,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030828	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 static void closure_test_fn2(ffi_cif* cif __UNUSED__, void* resp, void** args,
--- libffi/testsuite/libffi.call/closure_fn4.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/closure_fn4.c	2007-09-06 14:07:37.000000000 +0200
@@ -6,7 +6,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20031026	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 
 #include "ffitest.h"
 
--- libffi/testsuite/libffi.call/cls_ushort.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_ushort.c	2007-09-06 14:07:37.000000000 +0200
@@ -4,7 +4,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030828	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 static void cls_ret_ushort_fn(ffi_cif* cif __UNUSED__, void* resp, void** args,
--- libffi/testsuite/libffi.call/cls_5byte.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_5byte.c	2007-09-06 14:07:38.000000000 +0200
@@ -5,7 +5,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030828	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_5byte {
--- libffi/testsuite/libffi.call/cls_align_pointer.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_align_pointer.c	2007-09-06 14:07:38.000000000 +0200
@@ -4,7 +4,7 @@
    PR:		none.
    Originator:	<hos at tamanegi.org> 20031203	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_align {
--- libffi/testsuite/libffi.call/cls_7byte.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_7byte.c	2007-09-06 14:07:38.000000000 +0200
@@ -5,7 +5,7 @@
    PR:		none.
    Originator:	<andreast at gcc.gnu.org> 20030828	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_7byte {
--- libffi/testsuite/libffi.call/cls_align_sint32.c.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.call/cls_align_sint32.c	2007-09-06 14:07:38.000000000 +0200
@@ -4,7 +4,7 @@
    PR:		none.
    Originator:	<hos at tamanegi.org> 20031203	 */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitest.h"
 
 typedef struct cls_struct_align {
--- libffi/testsuite/libffi.special/unwindtest.cc.jj	2007-09-06 14:05:09.000000000 +0200
+++ libffi/testsuite/libffi.special/unwindtest.cc	2007-09-06 14:07:39.000000000 +0200
@@ -4,7 +4,7 @@
    PR:		none.
    Originator:	Jeff Sturm <jsturm at one-point.com>  */
 
-/* { dg-do run { xfail mips64*-*-* arm*-*-* strongarm*-*-* xscale*-*-* } } */
+/* { dg-do run { xfail mips64*-*-* } } */
 #include "ffitestcxx.h"
 
 void

gcc41-java-arm2.patch:

--- NEW FILE gcc41-java-arm2.patch ---
2007-07-13  Andrew Haley  <aph at redhat.com>

	* libgcj.ver: Add __gcj_personality_sj0.

2007-07-11  Andrew Haley  <aph at redhat.com>

	* configure.host (arm*-linux-gnu): New.
	* sysdep/arm/locks.h: New.

--- libjava/configure.host	(revision 126621)
+++ libjava/configure.host	(revision 126623)
@@ -82,6 +82,10 @@ case "${host}" in
 	enable_getenv_properties_default=no
 	enable_main_args_default=no
 	;;
+  arm*-linux-gnu)
+	libgcj_interpreter=yes
+	sysdeps_dir=arm
+	;;
   mips-tx39-*|mipstx39-unknown-*)
 	libgcj_flags="${libgcj_flags} -G 0"
 	LDFLAGS="$LDFLAGS -Tjmr3904dram.ld"
--- libjava/libgcj.ver	(revision 126621)
+++ libjava/libgcj.ver	(revision 126623)
@@ -2,6 +2,6 @@
 # symbols in libgcj.so.
 
 {
-  global: Jv*; _Jv_*; __gcj_personality_v0; _Z*;
+  global: Jv*; _Jv_*; __gcj_personality_v0; __gcj_personality_sj0; _Z*;
   local: *;
 };
--- libjava/sysdep/arm/locks.h	(revision 0)
+++ libjava/sysdep/arm/locks.h	(revision 126623)
@@ -0,0 +1,79 @@
+// locks.h - Thread synchronization primitives. ARM implementation.
+
+/* Copyright (C) 2007  Free Software Foundation
+
+   This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
+details.  */
+
+#ifndef __SYSDEP_LOCKS_H__
+#define __SYSDEP_LOCKS_H__
+
+typedef size_t obj_addr_t;	/* Integer type big enough for object	*/
+				/* address.				*/
+
+/* Atomic compare and exchange.  These sequences are not actually
+   atomic; there is a race if *ADDR != OLD_VAL and we are preempted
+   between the two swaps.  However, they are very close to atomic, and
+   are the best that a pre-ARMv6 implementation can do without
+   operating system support.  LinuxThreads has been using these
+   sequences for many years.  */
+
+inline static bool
+compare_and_swap(volatile obj_addr_t *addr,
+		 obj_addr_t old_val,
+		 obj_addr_t new_val)
+{
+  volatile obj_addr_t result, tmp;
+  __asm__ ("\n"
+	   "0:	ldr	%[tmp],[%[addr]]\n"
+	   "	cmp	%[tmp],%[old_val]\n"
+	   "	movne	%[result],#0\n"
+	   "	bne	1f\n"
+	   "	swp	%[result],%[new_val],[%[addr]]\n"
+	   "	cmp	%[tmp],%[result]\n"
+	   "	swpne	%[tmp],%[result],[%[addr]]\n"
+	   "	bne	0b\n"
+	   "	mov	%[result],#1\n"
+	   "1:"
+	   : [result] "=&r" (result), [tmp] "=&r" (tmp)
+	   : [addr] "r" (addr), [new_val] "r" (new_val), [old_val] "r" (old_val)
+	   : "cc", "memory");
+
+  return result;
+}
+
+inline static void
+release_set(volatile obj_addr_t *addr, obj_addr_t new_val)
+{
+  __asm__ __volatile__("" : : : "memory");
+  *(addr) = new_val;
+}
+
+inline static bool
+compare_and_swap_release(volatile obj_addr_t *addr,
+		  				     obj_addr_t old,
+						     obj_addr_t new_val)
+{
+  return compare_and_swap(addr, old, new_val);
+}
+
+// Ensure that subsequent instructions do not execute on stale
+// data that was loaded from memory before the barrier.
+inline static void
+read_barrier()
+{
+  __asm__ __volatile__("" : : : "memory");
+}
+
+// Ensure that prior stores to memory are completed with respect to other
+// processors.
+inline static void
+write_barrier()
+{
+  __asm__ __volatile__("" : : : "memory");
+}
+
+#endif

gcc41-java-arm3.patch:

--- NEW FILE gcc41-java-arm3.patch ---
2007-07-15  Andrew Haley  <aph at redhat.com>

	* unwind-sjlj.c (_Unwind_GetIPInfo): Check for context->fc != NULL
	before looking in the context.

	* configure.host: 
	arm*-linux-gnu -> arm*-linux*.

--- gcc/unwind-sjlj.c	(revision 126657)
+++ gcc/unwind-sjlj.c	(revision 126659)
@@ -222,7 +222,10 @@ _Unwind_Ptr
 _Unwind_GetIPInfo (struct _Unwind_Context *context, int *ip_before_insn)
 {
   *ip_before_insn = 0;
-  return context->fc->call_site + 1;
+  if (context->fc != NULL)
+    return context->fc->call_site + 1;
+  else
+    return 0;
 }
 
 /* Set the return landing pad index in CONTEXT.  */
--- libjava/configure.host	(revision 126657)
+++ libjava/configure.host	(revision 126659)
@@ -82,7 +82,7 @@ case "${host}" in
 	enable_getenv_properties_default=no
 	enable_main_args_default=no
 	;;
-  arm*-linux-gnu)
+  arm*-linux*)
 	libgcj_interpreter=yes
 	sysdeps_dir=arm
 	;;

gcc41-java-arm4.patch:

--- NEW FILE gcc41-java-arm4.patch ---
2007-09-04  Andrew Haley  <aph at redhat.com>

	* decl.c (java_init_decl_processing): Call "__cxa_end_cleanup"
	when using the ARM EABI.

2007-08-29  Andrew Haley  <aph at redhat.com>

        * config/arm/libgcc-bpabi.ver: Add _Unwind_Backtrace as GCC_4.3.0.

2007-08-08  Andrew Haley  <aph at redhat.com>

	* config/arm/libunwind.S (UNWIND_WRAPPER _Unwind_Backtrace): New.
	* config/arm/unwind-arm.h (__gnu_Unwind_Backtrace): New.
	* config/arm/unwind-arm.c (__gnu_Unwind_Backtrace): New.

--- gcc/java/decl.c	(revision 128085)
+++ gcc/java/decl.c	(revision 128088)
@@ -1075,7 +1075,10 @@ java_init_decl_processing (void)
   eh_personality_libfunc = init_one_libfunc (USING_SJLJ_EXCEPTIONS
                                              ? "__gcj_personality_sj0"
                                              : "__gcj_personality_v0");
-  default_init_unwind_resume_libfunc ();
+  if (targetm.arm_eabi_unwinder)
+    unwind_resume_libfunc = init_one_libfunc ("__cxa_end_cleanup");
+  else
+    default_init_unwind_resume_libfunc ();
 
   lang_eh_runtime_type = do_nothing;
 
--- gcc/config/arm/libunwind.S	(revision 128085)
+++ gcc/config/arm/libunwind.S	(revision 128088)
@@ -237,5 +237,6 @@ UNWIND_WRAPPER _Unwind_RaiseException 1
 UNWIND_WRAPPER _Unwind_Resume 1
 UNWIND_WRAPPER _Unwind_Resume_or_Rethrow 1
 UNWIND_WRAPPER _Unwind_ForcedUnwind 3
+UNWIND_WRAPPER _Unwind_Backtrace 2
 
-#endif  /* __symbian__ */
+#endif  /* ndef __symbian__ */
--- gcc/config/arm/libgcc-bpabi.ver	(revision 128085)
+++ gcc/config/arm/libgcc-bpabi.ver	(revision 128088)
@@ -81,3 +81,11 @@ GCC_3.5 {
   # GNU-specific entry point.
   __gnu_unwind_frame
 }
+
+%exclude {
+  _Unwind_Backtrace
+}
+%inherit GCC_4.3.0 GCC_4.2.0
+GCC_4.3.0 {
+  _Unwind_Backtrace
+}
--- gcc/config/arm/unwind-arm.c	(revision 128085)
+++ gcc/config/arm/unwind-arm.c	(revision 128088)
@@ -950,6 +950,66 @@ _Unwind_DeleteException (_Unwind_Excepti
 }
 
 
+/* Perform stack backtrace through unwind data.  */
+_Unwind_Reason_Code
+__gnu_Unwind_Backtrace(_Unwind_Trace_Fn trace, void * trace_argument,
+		       phase2_vrs * entry_vrs);
+_Unwind_Reason_Code
+__gnu_Unwind_Backtrace(_Unwind_Trace_Fn trace, void * trace_argument,
+		       phase2_vrs * entry_vrs)
+{
+  phase1_vrs saved_vrs;
+  _Unwind_Reason_Code code;
+
+  _Unwind_Control_Block ucb;
+  _Unwind_Control_Block *ucbp = &ucb;
+
+  /* Set the pc to the call site.  */
+  entry_vrs->core.r[R_PC] = entry_vrs->core.r[R_LR];
+
+  /* Save the core registers.  */
+  saved_vrs.core = entry_vrs->core;
+  /* Set demand-save flags.  */
+  saved_vrs.demand_save_flags = ~(_uw) 0;
+  
+  do
+    {
+      /* Find the entry for this routine.  */
+      if (get_eit_entry (ucbp, saved_vrs.core.r[R_PC]) != _URC_OK)
+	{
+	  code = _URC_FAILURE;
+	  break;
+	}
+
+      /* The dwarf unwinder assumes the context structure holds things
+	 like the function and LSDA pointers.  The ARM implementation
+	 caches these in the exception header (UCB).  To avoid
+	 rewriting everything we make the virtual IP register point at
+	 the UCB.  */
+      _Unwind_SetGR((_Unwind_Context *)&saved_vrs, 12, (_Unwind_Ptr) ucbp);
+
+      /* Call trace function.  */
+      if ((*trace) ((_Unwind_Context *) &saved_vrs, trace_argument) 
+	  != _URC_NO_REASON)
+	{
+	  code = _URC_FAILURE;
+	  break;
+	}
+
+      /* Call the pr to decide what to do.  */
+      code = ((personality_routine) UCB_PR_ADDR (ucbp))
+	(_US_VIRTUAL_UNWIND_FRAME | _US_FORCE_UNWIND, 
+	 ucbp, (void *) &saved_vrs);
+    }
+  while (code != _URC_END_OF_STACK
+	 && code != _URC_FAILURE);
+
+ finish:
+  restore_non_core_regs (&saved_vrs);
+  return code;
+}
+
+
 /* Common implementation for ARM ABI defined personality routines.
    ID is the index of the personality routine, other arguments are as defined
    by __aeabi_unwind_cpp_pr{0,1,2}.  */
--- gcc/config/arm/unwind-arm.h	(revision 128085)
+++ gcc/config/arm/unwind-arm.h	(revision 128088)
@@ -205,6 +205,13 @@ extern "C" {
 	_Unwind_Control_Block *, struct _Unwind_Context *, void *);
   _Unwind_Reason_Code _Unwind_ForcedUnwind (_Unwind_Control_Block *,
 					    _Unwind_Stop_Fn, void *);
+  /* @@@ Use unwind data to perform a stack backtrace.  The trace callback
+     is called for every stack frame in the call chain, but no cleanup
+     actions are performed.  */
+  typedef _Unwind_Reason_Code (*_Unwind_Trace_Fn) (_Unwind_Context *, void *);
+  _Unwind_Reason_Code _Unwind_Backtrace(_Unwind_Trace_Fn,
+					void*);
+
   _Unwind_Word _Unwind_GetCFA (struct _Unwind_Context *);
   void _Unwind_Complete(_Unwind_Control_Block *ucbp);
   void _Unwind_DeleteException (_Unwind_Exception *);

gcc41-java-arm5.patch:

--- NEW FILE gcc41-java-arm5.patch ---
2007-09-04  Andrew Haley  <aph at redhat.com>

	* src/arm/sysv.S (UNWIND): New.
	(Whole file): Conditionally compile unwinder directives.
	* src/arm/sysv.S: Add unwinder directives.

	* src/arm/ffi.c (ffi_prep_args): Align structs by at least 4 bytes.
	Only treat r0 as a struct address if we're actually returning a
	struct by address.
	Only copy the bytes that are actually within a struct.
	(ffi_prep_cif_machdep): A Composite Type not larger than 4 bytes
	is returned in r0, not passed by address.
	(ffi_call): Allocate a word-sized temporary for the case where
	a composite is returned in r0.
	(ffi_prep_incoming_args_SYSV): Align as necessary.

2007-08-05  Steven Newbury  <s_j_newbury at yahoo.co.uk>

	* src/arm/ffi.c (FFI_INIT_TRAMPOLINE): Use __clear_cache instead of 
	directly using the sys_cacheflush syscall.

2007-07-27  Andrew Haley  <aph at redhat.com>

	* src/arm/sysv.S (ffi_closure_SYSV): Add soft-float.

--- libffi/src/arm/ffi.c	(revision 128092)
+++ libffi/src/arm/ffi.c	(revision 128093)
@@ -40,7 +40,7 @@ void ffi_prep_args(char *stack, extended
 
   argp = stack;
 
-  if ( ecif->cif->rtype->type == FFI_TYPE_STRUCT ) {
+  if ( ecif->cif->flags == FFI_TYPE_STRUCT ) {
     *(void **) argp = ecif->rvalue;
     argp += 4;
   }
@@ -58,6 +58,9 @@ void ffi_prep_args(char *stack, extended
 	argp = (char *) ALIGN(argp, (*p_arg)->alignment);
       }
 
+      if ((*p_arg)->type == FFI_TYPE_STRUCT)
+	argp = (char *) ALIGN(argp, 4);
+
 	  z = (*p_arg)->size;
 	  if (z < sizeof(int))
 	    {
@@ -81,7 +84,7 @@ void ffi_prep_args(char *stack, extended
 		  break;
 		  
 		case FFI_TYPE_STRUCT:
-		  *(unsigned int *) argp = (unsigned int)*(UINT32 *)(* p_argv);
+		  memcpy(argp, *p_argv, (*p_arg)->size);
 		  break;
 
 		default:
@@ -115,7 +118,6 @@ ffi_status ffi_prep_cif_machdep(ffi_cif 
   switch (cif->rtype->type)
     {
     case FFI_TYPE_VOID:
-    case FFI_TYPE_STRUCT:
     case FFI_TYPE_FLOAT:
     case FFI_TYPE_DOUBLE:
       cif->flags = (unsigned) cif->rtype->type;
@@ -126,6 +128,17 @@ ffi_status ffi_prep_cif_machdep(ffi_cif 
       cif->flags = (unsigned) FFI_TYPE_SINT64;
       break;
 
+    case FFI_TYPE_STRUCT:
+      if (cif->rtype->size <= 4)
+	/* A Composite Type not larger than 4 bytes is returned in r0.  */
+	cif->flags = (unsigned)FFI_TYPE_INT;
+      else
+	/* A Composite Type larger than 4 bytes, or whose size cannot
+	   be determined statically ... is stored in memory at an
+	   address passed [in r0].  */
+	cif->flags = (unsigned)FFI_TYPE_STRUCT;
+      break;
+
     default:
       cif->flags = FFI_TYPE_INT;
       break;
@@ -141,21 +154,27 @@ void ffi_call(ffi_cif *cif, void (*fn)()
 {
   extended_cif ecif;
 
+  int small_struct = (cif->flags == FFI_TYPE_INT 
+		      && cif->rtype->type == FFI_TYPE_STRUCT);
+
   ecif.cif = cif;
   ecif.avalue = avalue;
+
+  unsigned int temp;
   
   /* If the return value is a struct and we don't have a return	*/
   /* value address then we need to make one		        */
 
   if ((rvalue == NULL) && 
-      (cif->rtype->type == FFI_TYPE_STRUCT))
+      (cif->flags == FFI_TYPE_STRUCT))
     {
       ecif.rvalue = alloca(cif->rtype->size);
     }
+  else if (small_struct)
+    ecif.rvalue = &temp;
   else
     ecif.rvalue = rvalue;
-    
-  
+
   switch (cif->abi) 
     {
     case FFI_SYSV:
@@ -167,6 +186,8 @@ void ffi_call(ffi_cif *cif, void (*fn)()
       FFI_ASSERT(0);
       break;
     }
+  if (small_struct)
+    memcpy (rvalue, &temp, cif->rtype->size);
 }
 
 /** private members **/
@@ -228,9 +249,12 @@ ffi_prep_incoming_args_SYSV(char *stack,
     {
       size_t z;
 
+      size_t alignment = (*p_arg)->alignment;
+      if (alignment < 4)
+	alignment = 4;
       /* Align if necessary */
-      if ((sizeof(int) - 1) & (unsigned) argp) {
-	argp = (char *) ALIGN(argp, sizeof(int));
+      if ((alignment - 1) & (unsigned) argp) {
+	argp = (char *) ALIGN(argp, alignment);
       }
 
       z = (*p_arg)->size;
@@ -248,21 +272,16 @@ ffi_prep_incoming_args_SYSV(char *stack,
 
 /* How to make a trampoline.  */
 
-#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX) \
-({ unsigned char *__tramp = (unsigned char*)(TRAMP); \
-   unsigned int  __fun = (unsigned int)(FUN); \
-   unsigned int  __ctx = (unsigned int)(CTX); \
+#define FFI_INIT_TRAMPOLINE(TRAMP,FUN,CTX)				\
+({ unsigned char *__tramp = (unsigned char*)(TRAMP);			\
+   unsigned int  __fun = (unsigned int)(FUN);				\
+   unsigned int  __ctx = (unsigned int)(CTX);				\
    *(unsigned int*) &__tramp[0] = 0xe92d000f; /* stmfd sp!, {r0-r3} */	\
-   *(unsigned int*) &__tramp[4] = 0xe59f0000; /* ldr r0, [pc] */ \
-   *(unsigned int*) &__tramp[8] = 0xe59ff000; /* ldr pc, [pc] */ \
-   *(unsigned int*) &__tramp[12] = __ctx; \
-   *(unsigned int*) &__tramp[16] = __fun; \
-   register unsigned long _beg __asm ("a1") = (unsigned long) (&__tramp[0]);	\
-   register unsigned long _end __asm ("a2") = (unsigned long) (&__tramp[19]);	\
-   register unsigned long _flg __asm ("a3") = 0;			\
-   __asm __volatile ("swi 0x9f0002		@ sys_cacheflush"	\
-	   		    : "=r" (_beg)				\
-	   		    : "0" (_beg), "r" (_end), "r" (_flg));	\
+   *(unsigned int*) &__tramp[4] = 0xe59f0000; /* ldr r0, [pc] */	\
+   *(unsigned int*) &__tramp[8] = 0xe59ff000; /* ldr pc, [pc] */	\
+   *(unsigned int*) &__tramp[12] = __ctx;				\
+   *(unsigned int*) &__tramp[16] = __fun;				\
+   __clear_cache((&__tramp[0]), (&__tramp[19]));			\
  })
 
 
--- libffi/src/arm/sysv.S	(revision 128092)
+++ libffi/src/arm/sysv.S	(revision 128093)
@@ -82,6 +82,14 @@
 # define call_reg(x)	mov	lr, pc ; mov	pc, x
 #endif
 
+/* Conditionally compile unwinder directives.  */
+#ifdef __ARM_EABI__
+#define UNWIND
+#else
+#define UNWIND @
+#endif	
+
+	
 #if defined(__thumb__) && !defined(__THUMB_INTERWORK__)
 .macro	ARM_FUNC_START name
 	.text
@@ -92,6 +100,7 @@
 	bx	pc
 	nop
 	.arm
+	UNWIND .fnstart
 /* A hook to tell gdb that we've switched to ARM mode.  Also used to call
    directly from other local arm routines.  */
 _L__\name:		
@@ -102,6 +111,7 @@ _L__\name:		
 	.align 0
 	.arm
 	ENTRY(\name)
+	UNWIND .fnstart
 .endm
 #endif
 
@@ -134,8 +144,11 @@ _L__\name:		
 ARM_FUNC_START ffi_call_SYSV
 	@ Save registers
         stmfd	sp!, {r0-r3, fp, lr}
+	UNWIND .save	{r0-r3, fp, lr}
 	mov	fp, sp
 
+	UNWIND .setfp	fp, sp
+
 	@ Make room for all of the new args.
 	sub	sp, fp, r2
 
@@ -205,6 +218,7 @@ LSYM(Lepilogue):
 	RETLDM	"r0-r3,fp"
 
 .ffi_call_SYSV_end:
+	UNWIND .fnend
         .size    CNAME(ffi_call_SYSV),.ffi_call_SYSV_end-CNAME(ffi_call_SYSV)
 
 /*
@@ -216,21 +230,40 @@ LSYM(Lepilogue):
 */
 
 ARM_FUNC_START ffi_closure_SYSV
+	UNWIND .pad #16
 	add	ip, sp, #16
 	stmfd	sp!, {ip, lr}
+	UNWIND .save	{r0, lr}
 	add	r2, sp, #8
+	.pad #16
 	sub	sp, sp, #16
 	str	sp, [sp, #8]
 	add	r1, sp, #8
 	bl	ffi_closure_SYSV_inner
 	cmp	r0, #FFI_TYPE_INT
 	beq	.Lretint
+
 	cmp	r0, #FFI_TYPE_FLOAT
+#ifdef __SOFTFP__
+	beq	.Lretint
+#else
 	beq	.Lretfloat
+#endif
+
 	cmp	r0, #FFI_TYPE_DOUBLE
+#ifdef __SOFTFP__
+	beq	.Lretlonglong
+#else
 	beq	.Lretdouble
+#endif
+
 	cmp	r0, #FFI_TYPE_LONGDOUBLE
+#ifdef __SOFTFP__
+	beq	.Lretlonglong
+#else
 	beq	.Lretlongdouble
+#endif
+
 	cmp	r0, #FFI_TYPE_SINT64
 	beq	.Lretlonglong
 .Lclosure_epilogue:
@@ -243,6 +276,8 @@ ARM_FUNC_START ffi_closure_SYSV
 	ldr	r0, [sp]
 	ldr	r1, [sp, #4]
 	b	.Lclosure_epilogue
+
+#ifndef __SOFTFP__
 .Lretfloat:
 	ldfs	f0, [sp]
 	b	.Lclosure_epilogue
@@ -252,6 +287,9 @@ ARM_FUNC_START ffi_closure_SYSV
 .Lretlongdouble:
 	ldfd	f0, [sp]
 	b	.Lclosure_epilogue
+#endif
+
 .ffi_closure_SYSV_end:
+	UNWIND .fnend
         .size    CNAME(ffi_closure_SYSV),.ffi_closure_SYSV_end-CNAME(ffi_closure_SYSV)
 

gcc41-java-arm6.patch:

--- NEW FILE gcc41-java-arm6.patch ---
2007-09-04  Andrew Haley  <aph at redhat.com>

	PR java/27908
	* testsuite/libjava.lang/PR27908.java
	({run1,run2,run3}.isRunning): New Method.
	(main): Fix race condition.

2007-08-29  Andrew Haley  <aph at redhat.com>

	* gnu/classpath/natVMStackWalker.cc (VMStackWalker::getCallingClass):
	Make sure we're not sibcalled.
	(GET_CALLING_CLASS): Define for ARM EABI.

2007-08-22  Andrew Haley  <aph at redhat.com>

	* configure.host (BACKTRACESPEC): Add arm*-linux*.

2007-08-22  Andrew Haley  <aph at redhat.com>

	* configure.ac (LIBSTDCXXSPEC): New.
	* configure.host: Add arm*-linux* to pthread test.
	* configure.ac (LIBGCJTESTSPEC): Add path to libstdc++ for ARM
	EABI.
	* testsuite/libjava.jni/jni.exp (gcj_jni_compile_c_to_so): Use
	-fexceptions for ARM EABI.
	* testsuite/lib/libjava.exp (libjava_arguments): Add libgcj-test.spec.
	(libjava_invoke): Log the invocation.

2007-08-15  Andrew Haley  <aph at redhat.com>

	* configure.ac (extra_ldflags): Define.
	* Makefile.am: Use extra_ldflags for all executables.

2007-08-14  Andrew Haley  <aph at redhat.com>

	* sysdep/arm/backtrace.h: Remove stubs for _Unwind_GetIPInfo,
	_Unwind_GetRegionStart, and _Unwind_Backtrace.

2007-07-27  Andrew Haley  <aph at redhat.com>

	* gnu/classpath/natVMStackWalker.cc (GET_CALLING_CLASS): Stub for
	ARM EABI.
	* exception.cc (get_exception_header_from_ue): New.
	(get_ttype_entry): ARM EABI version.
	(PERSONALITY_FUNCTION): Add ARM EABI code.
	* sysdep/arm/backtrace.h: New file.
	* stacktrace.cc (_URC_NORMAL_STOP): New.
	* configure.ac (extra_ldflags_libjava): Add libsupc++.la for ARM
	EABI.
	* configure.host (BACKTRACESPEC): Add arm/backtrace.h.

--- libjava/testsuite/Makefile.in.jj	2007-09-06 14:06:13.000000000 +0200
+++ libjava/testsuite/Makefile.in	2007-09-06 17:20:42.000000000 +0200
@@ -160,6 +160,7 @@ LIBLTDL = @LIBLTDL@
 LIBMAGIC = @LIBMAGIC@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
+LIBSTDCXXSPEC = @LIBSTDCXXSPEC@
 LIBTOOL = @LIBTOOL@
 LN_S = @LN_S@
 LTLIBICONV = @LTLIBICONV@
@@ -264,6 +265,7 @@ build_vendor = @build_vendor@
 datadir = @datadir@
 dbexecdir = @dbexecdir@
 exec_prefix = @exec_prefix@
+extra_ldflags = @extra_ldflags@
 extra_ldflags_libjava = @extra_ldflags_libjava@
 gxx_include_dir = @gxx_include_dir@
 here = @here@
--- libjava/testsuite/libjava.jni/jni.exp.jj	2007-09-06 14:06:13.000000000 +0200
+++ libjava/testsuite/libjava.jni/jni.exp	2007-09-06 17:20:42.000000000 +0200
@@ -29,6 +29,10 @@ proc gcj_jni_compile_c_to_so {file {opti
   set name [file rootname $filename]
   set soname lib${name}.${so_extension}
 
+  if { [istarget "*arm-*eabi*"] } {
+      lappend options "additional_flags=-fexceptions"
+  }
+
   lappend options "additional_flags=${so_flag} -fPIC"
   # Find the generated header.
   lappend options "additional_flags=-I. -I.. -I$srcdir/$subdir"
--- libjava/testsuite/lib/libjava.exp.jj	2007-09-06 14:06:13.000000000 +0200
+++ libjava/testsuite/lib/libjava.exp	2007-09-06 17:20:42.000000000 +0200
@@ -379,6 +379,7 @@ proc libjava_arguments {{mode compile}} 
     if {$mode == "link"} {
 	global wrapper_file wrap_compile_flags
 	lappend args "additional_flags=$wrap_compile_flags"
+	lappend args "additional_flags=-specs=libgcj-test.spec"
 	lappend args "libs=$wrapper_file"
 	lappend args "libs=$libjava"
 	lappend args debug
--- libjava/configure.jj	2007-09-06 14:06:15.000000000 +0200
+++ libjava/configure	2007-09-06 17:27:04.000000000 +0200
@@ -310,7 +310,7 @@ ac_includes_default="\
 # include <unistd.h>
 #endif"
 
-ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os build_subdir host_subdir target_subdir libgcj_basedir host host_cpu host_vendor host_os target target_cpu target_vendor target_os target_noncanonical LN_S mkinstalldirs JAVA_MAINTAINER_MODE_TRUE JAVA_MAINTAINER_MODE_FALSE CC ac_ct_CC EXEEXT OBJEXT CXX ac_ct_CXX CFLAGS CXXFLAGS LDFLAGS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_T!
 RUE am__fastdepCC_FALSE CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE AS ac_ct_AS LD ac_ct_LD AR ac_ct_AR RANLIB ac_ct_RANLIB JAR ZIP UNZIP MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT LIBGCJ_CFLAGS LIBGCJ_CXXFLAGS LIBGCJ_JAVAFLAGS LIBGCJ_LD_SYMBOLIC LIBGCJDEBUG TOOLKIT XLIB_AWT_TRUE XLIB_AWT_FALSE X_AWT_TRUE X_AWT_FALSE GCJ_FOR_ECJX GCJH host_exeext INCLTDL LIBLTDL DIRLTDL LIBTOOL CXXCPP CPPFLAGS GCJ GCJFLAGS GCJDEPMODE am__fastdepGCJ_TRUE am__fastdepGCJ_FALSE subdirs TESTSUBDIR_TRUE TESTSUBDIR_FALSE ECJ_BUILD_JAR ECJ_JAR BUILD_ECJ1_TRUE BUILD_ECJ1_FALSE INSTALL_ECJ_JAR_TRUE INSTALL_ECJ_JAR_FALSE JAVA_HOME_SET_TRUE JAVA_HOME_SET_FALSE JAVA_HOME INTERPRETER LIBFFI LIBFFIINCS PLATFORM CPP EGREP USING_WIN32_PLATFORM_TRUE USING_WIN32_PLATFORM_FALSE USING_POSIX_PLATFORM_TRUE USING_POSIX_PLATFORM_FALSE USING_DARWIN_CRT_TRUE USING_DARWIN_CRT_FALSE SYSTEMSPEC LIBGCJTESTSPEC ZLIBSPEC ZLIBTESTSPEC X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS extra_ldflags_libjava GCLIBS GCINCS !
 GCDEPS GCSPEC JC1GCSPEC GCTESTSPEC USING_BOEHMGC_TRUE USING_BO!
 EHMGC_FA
LSE USING_NOGC_TRUE USING_NOGC_FALSE THREADLIBS THREADINCS THREADDEPS THREADSPEC THREADSTARTFILESPEC THREADLDFLAGS THREADCXXFLAGS USING_POSIX_THREADS_TRUE USING_POSIX_THREADS_FALSE USING_WIN32_THREADS_TRUE USING_WIN32_THREADS_FALSE USING_NO_THREADS_TRUE USING_NO_THREADS_FALSE USE_LIBGCJ_BC_TRUE USE_LIBGCJ_BC_FALSE LIBGCJ_SPEC HASH_SYNC_SPEC USING_GCC_TRUE USING_GCC_FALSE LIBICONV LTLIBICONV LIBMAGIC PKG_CONFIG GTK_CFLAGS GTK_LIBS GLIB_CFLAGS GLIB_LIBS LIBART_CFLAGS LIBART_LIBS CLASSPATH_SEPARATOR ac_ct_GCJ ZLIBS SYS_ZLIBS ZINCS DIVIDESPEC CHECKREFSPEC EXCEPTIONSPEC BACKTRACESPEC IEEESPEC NATIVE_TRUE NATIVE_FALSE ENABLE_SHARED_TRUE ENABLE_SHARED_FALSE NEEDS_DATA_START_TRUE NEEDS_DATA_START_FALSE GCC_UNWIND_INCLUDE toolexecdir toolexecmainlibdir toolexeclibdir dbexecdir GCJVERSION gxx_include_dir libstdcxx_incdir ALLOCA PERL SYSDEP_SOURCES ANONVERSCRIPT_TRUE ANONVERSCRIPT_FALSE LD_START_STATIC_SPEC LD_FINISH_STATIC_SPEC here LIBOBJS LTLIBOBJS'
+ac_subst_vars='SHELL PATH_SEPARATOR PACKAGE_NAME PACKAGE_TARNAME PACKAGE_VERSION PACKAGE_STRING PACKAGE_BUGREPORT exec_prefix prefix program_transform_name bindir sbindir libexecdir datadir sysconfdir sharedstatedir localstatedir libdir includedir oldincludedir infodir mandir build_alias host_alias target_alias DEFS ECHO_C ECHO_N ECHO_T LIBS build build_cpu build_vendor build_os build_subdir host_subdir target_subdir libgcj_basedir host host_cpu host_vendor host_os target target_cpu target_vendor target_os target_noncanonical LN_S mkinstalldirs JAVA_MAINTAINER_MODE_TRUE JAVA_MAINTAINER_MODE_FALSE CC ac_ct_CC EXEEXT OBJEXT CXX ac_ct_CXX CFLAGS CXXFLAGS LDFLAGS INSTALL_PROGRAM INSTALL_SCRIPT INSTALL_DATA CYGPATH_W PACKAGE VERSION ACLOCAL AUTOCONF AUTOMAKE AUTOHEADER MAKEINFO install_sh STRIP ac_ct_STRIP INSTALL_STRIP_PROGRAM mkdir_p AWK SET_MAKE am__leading_dot AMTAR am__tar am__untar DEPDIR am__include am__quote AMDEP_TRUE AMDEP_FALSE AMDEPBACKSLASH CCDEPMODE am__fastdepCC_T!
 RUE am__fastdepCC_FALSE CXXDEPMODE am__fastdepCXX_TRUE am__fastdepCXX_FALSE AS ac_ct_AS LD ac_ct_LD AR ac_ct_AR RANLIB ac_ct_RANLIB JAR ZIP UNZIP MAINTAINER_MODE_TRUE MAINTAINER_MODE_FALSE MAINT LIBGCJ_CFLAGS LIBGCJ_CXXFLAGS LIBGCJ_JAVAFLAGS LIBGCJ_LD_SYMBOLIC LIBGCJDEBUG TOOLKIT XLIB_AWT_TRUE XLIB_AWT_FALSE X_AWT_TRUE X_AWT_FALSE GCJ_FOR_ECJX GCJH host_exeext INCLTDL LIBLTDL DIRLTDL LIBTOOL CXXCPP CPPFLAGS GCJ GCJFLAGS GCJDEPMODE am__fastdepGCJ_TRUE am__fastdepGCJ_FALSE subdirs TESTSUBDIR_TRUE TESTSUBDIR_FALSE ECJ_BUILD_JAR ECJ_JAR BUILD_ECJ1_TRUE BUILD_ECJ1_FALSE INSTALL_ECJ_JAR_TRUE INSTALL_ECJ_JAR_FALSE JAVA_HOME_SET_TRUE JAVA_HOME_SET_FALSE JAVA_HOME INTERPRETER LIBFFI LIBFFIINCS PLATFORM CPP EGREP USING_WIN32_PLATFORM_TRUE USING_WIN32_PLATFORM_FALSE USING_POSIX_PLATFORM_TRUE USING_POSIX_PLATFORM_FALSE USING_DARWIN_CRT_TRUE USING_DARWIN_CRT_FALSE SYSTEMSPEC ZLIBSPEC ZLIBTESTSPEC X_CFLAGS X_PRE_LIBS X_LIBS X_EXTRA_LIBS extra_ldflags_libjava extra_ldflags LIBSTDCXXSPEC L!
 IBGCJTESTSPEC GCLIBS GCINCS GCDEPS GCSPEC JC1GCSPEC GCTESTSPEC!
  USING_B
OEHMGC_TRUE USING_BOEHMGC_FALSE USING_NOGC_TRUE USING_NOGC_FALSE THREADLIBS THREADINCS THREADDEPS THREADSPEC THREADSTARTFILESPEC THREADLDFLAGS THREADCXXFLAGS USING_POSIX_THREADS_TRUE USING_POSIX_THREADS_FALSE USING_WIN32_THREADS_TRUE USING_WIN32_THREADS_FALSE USING_NO_THREADS_TRUE USING_NO_THREADS_FALSE USE_LIBGCJ_BC_TRUE USE_LIBGCJ_BC_FALSE LIBGCJ_SPEC HASH_SYNC_SPEC USING_GCC_TRUE USING_GCC_FALSE LIBICONV LTLIBICONV LIBMAGIC PKG_CONFIG GTK_CFLAGS GTK_LIBS GLIB_CFLAGS GLIB_LIBS LIBART_CFLAGS LIBART_LIBS CLASSPATH_SEPARATOR ac_ct_GCJ ZLIBS SYS_ZLIBS ZINCS DIVIDESPEC CHECKREFSPEC EXCEPTIONSPEC BACKTRACESPEC IEEESPEC NATIVE_TRUE NATIVE_FALSE ENABLE_SHARED_TRUE ENABLE_SHARED_FALSE NEEDS_DATA_START_TRUE NEEDS_DATA_START_FALSE GCC_UNWIND_INCLUDE toolexecdir toolexecmainlibdir toolexeclibdir dbexecdir GCJVERSION gxx_include_dir libstdcxx_incdir ALLOCA PERL SYSDEP_SOURCES ANONVERSCRIPT_TRUE ANONVERSCRIPT_FALSE LD_START_STATIC_SPEC LD_FINISH_STATIC_SPEC here LIBOBJS LTLIBOBJS'
 ac_subst_files=''
 
 # Initialize some variables set by options.
@@ -7640,9 +7640,6 @@ case "${host}" in
 esac
 
 
-LIBGCJTESTSPEC="-L`${PWDCMD-pwd}`/.libs -rpath `${PWDCMD-pwd}`/.libs"
-
-
 
 # Check whether --with-system-zlib or --without-system-zlib was given.
 if test "${with_system_zlib+set}" = set; then
@@ -9126,6 +9123,9 @@ fi
 # FIXME: this should be _libs on some hosts.
 libsubdir=.libs
 
+LIBGCJTESTSPEC="-L`${PWDCMD-pwd}`/.libs -rpath `${PWDCMD-pwd}`/.libs"
+
+LIBSTDCXXSPEC=
 # extra LD Flags which are required for targets
 case "${host}" in
 *-*-darwin[0-7].*)
@@ -9134,9 +9134,21 @@ case "${host}" in
     # on Darwin -single_module speeds up loading of the dynamic libraries.
     extra_ldflags_libjava=-Wl,-single_module
     ;;
+arm*linux*eabi)
+    # Some of the ARM unwinder code is actually in libstdc++.  We
+    # could in principle replicate it in libgcj, but it's better to
+    # have a dependency on libstdc++.
+    extra_ldflags='-L$(here)/../libstdc++-v3/src -lstdc++'
+    LIBSTDCXXSPEC=-lstdc++
+    LIBGCJTESTSPEC="-L`${PWDCMD-pwd}`/.libs -L`${PWDCMD-pwd}`/../libstdc++-v3/src/.libs -rpath `${PWDCMD-pwd}`/.libs:`${PWDCMD-pwd}`/../libstdc++-v3/src/.libs -lstdc++"
+    ;;
 esac
 
 
+
+
+
+
 # Allow the GC to be disabled.  Can be useful when debugging.
 echo "$as_me:$LINENO: checking for garbage collector to use" >&5
 echo $ECHO_N "checking for garbage collector to use... $ECHO_C" >&6
@@ -18024,7 +18036,6 @@ s, at USING_POSIX_PLATFORM_FALSE@,$USING_PO
 s, at USING_DARWIN_CRT_TRUE@,$USING_DARWIN_CRT_TRUE,;t t
 s, at USING_DARWIN_CRT_FALSE@,$USING_DARWIN_CRT_FALSE,;t t
 s, at SYSTEMSPEC@,$SYSTEMSPEC,;t t
-s, at LIBGCJTESTSPEC@,$LIBGCJTESTSPEC,;t t
 s, at ZLIBSPEC@,$ZLIBSPEC,;t t
 s, at ZLIBTESTSPEC@,$ZLIBTESTSPEC,;t t
 s, at X_CFLAGS@,$X_CFLAGS,;t t
@@ -18032,6 +18043,9 @@ s, at X_PRE_LIBS@,$X_PRE_LIBS,;t t
 s, at X_LIBS@,$X_LIBS,;t t
 s, at X_EXTRA_LIBS@,$X_EXTRA_LIBS,;t t
 s, at extra_ldflags_libjava@,$extra_ldflags_libjava,;t t
+s, at extra_ldflags@,$extra_ldflags,;t t
+s, at LIBSTDCXXSPEC@,$LIBSTDCXXSPEC,;t t
+s, at LIBGCJTESTSPEC@,$LIBGCJTESTSPEC,;t t
 s, at GCLIBS@,$GCLIBS,;t t
 s, at GCINCS@,$GCINCS,;t t
 s, at GCDEPS@,$GCDEPS,;t t
--- libjava/Makefile.in.jj	2007-09-06 14:06:15.000000000 +0200
+++ libjava/Makefile.in	2007-09-06 17:28:51.000000000 +0200
@@ -627,6 +627,7 @@ LIBLTDL = @LIBLTDL@
 LIBMAGIC = @LIBMAGIC@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
+LIBSTDCXXSPEC = @LIBSTDCXXSPEC@
 LIBTOOL = @LIBTOOL@
 LN_S = @LN_S@
 LTLIBICONV = @LTLIBICONV@
@@ -731,6 +732,7 @@ build_vendor = @build_vendor@
 datadir = @datadir@
 dbexecdir = @dbexecdir@
 exec_prefix = @exec_prefix@
+extra_ldflags = @extra_ldflags@
 extra_ldflags_libjava = @extra_ldflags_libjava@ $(am__append_5)
 gxx_include_dir = @gxx_include_dir@
 here = @here@
@@ -812,7 +814,7 @@ GCJLINK = $(LIBTOOL) --tag=GCJ --mode=li
 
 GCJ_FOR_ECJX_LINK = $(GCJ_FOR_ECJX) -o $@
 LIBLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXX) -L$(here) $(JC1FLAGS) \
-          $(LDFLAGS) $(extra_ldflags_libjava) -o $@
+          $(LDFLAGS) $(extra_ldflags_libjava) $(extra_ldflags) -o $@
 
 WARNINGS = -Wextra -Wall
 AM_CXXFLAGS = \
@@ -872,7 +874,7 @@ xlib_nat_files = $(xlib_nat_source_files
 
 # Include THREADLIBS here to ensure that the correct version of
 # certain linuxthread functions get linked:
-libgcj_la_LDFLAGS = -rpath $(toolexeclibdir) $(THREADLDFLAGS) $(THREADLIBS) \
+libgcj_la_LDFLAGS = -rpath $(toolexeclibdir) $(THREADLDFLAGS) $(extra_ldflags) $(THREADLIBS) \
 	$(LIBLTDL) $(SYS_ZLIBS) \
 	-version-info `grep -v '^\#' $(srcdir)/libtool-version`
 
@@ -7784,7 +7786,7 @@ NM = nm
 
 jv_convert_SOURCES = 
 jv_convert_LDFLAGS = --main=gnu.gcj.convert.Convert \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 
 jv_convert_LINK = $(GCJLINK)
 jv_convert_LDADD = -L$(here)/.libs libgcj.la
@@ -7800,7 +7802,7 @@ gcj_dbtool_LDADD = gnu/gcj/tools/gcj_dbt
 gcj_dbtool_DEPENDENCIES = gnu/gcj/tools/gcj_dbtool.lo libgcj.la libgcj.spec
 gij_SOURCES = 
 gij_LDFLAGS = -rpath $(libdir)/gcj-$(gcc_version) -rpath $(toolexeclibdir) \
-	-shared-libgcc $(THREADLDFLAGS)
+	-shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 
 gij_LINK = $(GCJLINK)
 gij_LDADD = -L$(here)/.libs libgij.la
@@ -7820,91 +7822,91 @@ ECJX_BASE_FLAGS = -findirect-dispatch \
 @NATIVE_TRUE at ecjx_DEPENDENCIES = libgcj.la libgcj.spec
 gappletviewer_SOURCES = 
 gappletviewer_LDFLAGS = --main=gnu.classpath.tools.appletviewer.Main \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 
 gappletviewer_LINK = $(GCJLINK)
 gappletviewer_LDADD = -L$(here)/.libs libgcj-tools.la
 gappletviewer_DEPENDENCIES = libgcj-tools.la
 gjarsigner_SOURCES = 
 gjarsigner_LDFLAGS = --main=gnu.classpath.tools.jarsigner.Main \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 
 gjarsigner_LINK = $(GCJLINK)
 gjarsigner_LDADD = -L$(here)/.libs libgcj-tools.la
 gjarsigner_DEPENDENCIES = libgcj-tools.la
 gkeytool_SOURCES = 
 gkeytool_LDFLAGS = --main=gnu.classpath.tools.keytool.Main \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 
 gkeytool_LINK = $(GCJLINK)
 gkeytool_LDADD = -L$(here)/.libs libgcj-tools.la
 gkeytool_DEPENDENCIES = libgcj-tools.la
 gjar_SOURCES = 
 gjar_LDFLAGS = --main=gnu.classpath.tools.jar.Main \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 
 gjar_LINK = $(GCJLINK)
 gjar_LDADD = -L$(here)/.libs libgcj-tools.la
 gjar_DEPENDENCIES = libgcj-tools.la
 gjavah_SOURCES = 
 gjavah_LDFLAGS = --main=gnu.classpath.tools.javah.Main \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 
 gjavah_LINK = $(GCJLINK)
 gjavah_LDADD = -L$(here)/.libs libgcj-tools.la
 gjavah_DEPENDENCIES = libgcj-tools.la
 gcjh_SOURCES = 
 gcjh_LDFLAGS = --main=gnu.classpath.tools.javah.GcjhMain \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 
 gcjh_LINK = $(GCJLINK)
 gcjh_LDADD = -L$(here)/.libs libgcj-tools.la
 gcjh_DEPENDENCIES = libgcj-tools.la
 gnative2ascii_SOURCES = 
 gnative2ascii_LDFLAGS = --main=gnu.classpath.tools.native2ascii.Native2ASCII \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 
 gnative2ascii_LINK = $(GCJLINK)
 gnative2ascii_LDADD = -L$(here)/.libs libgcj-tools.la
 gnative2ascii_DEPENDENCIES = libgcj-tools.la
 gorbd_SOURCES = 
 gorbd_LDFLAGS = --main=gnu.classpath.tools.orbd.Main \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 
 gorbd_LINK = $(GCJLINK)
 gorbd_LDADD = -L$(here)/.libs libgcj-tools.la
 gorbd_DEPENDENCIES = libgcj-tools.la
 grmid_SOURCES = 
 grmid_LDFLAGS = --main=gnu.classpath.tools.rmid.Main \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 
 grmid_LINK = $(GCJLINK)
 grmid_LDADD = -L$(here)/.libs libgcj-tools.la
 grmid_DEPENDENCIES = libgcj-tools.la
 gserialver_SOURCES = 
 gserialver_LDFLAGS = --main=gnu.classpath.tools.serialver.SerialVer \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 
 gserialver_LINK = $(GCJLINK)
 gserialver_LDADD = -L$(here)/.libs libgcj-tools.la
 gserialver_DEPENDENCIES = libgcj-tools.la
 gtnameserv_SOURCES = 
 gtnameserv_LDFLAGS = --main=gnu.classpath.tools.tnameserv.Main \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 
 gtnameserv_LINK = $(GCJLINK)
 gtnameserv_LDADD = -L$(here)/.libs libgcj-tools.la
 gtnameserv_DEPENDENCIES = libgcj-tools.la
 grmic_SOURCES = 
 grmic_LDFLAGS = --main=gnu.classpath.tools.rmic.Main \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 
 grmic_LINK = $(GCJLINK)
 grmic_LDADD = -L$(here)/.libs libgcj-tools.la
 grmic_DEPENDENCIES = libgcj-tools.la
 grmiregistry_SOURCES = 
 grmiregistry_LDFLAGS = --main=gnu.classpath.tools.rmiregistry.Main \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 
 grmiregistry_LINK = $(GCJLINK)
 grmiregistry_LDADD = -L$(here)/.libs libgcj-tools.la
--- libjava/gcj/Makefile.in.jj	2007-09-06 14:06:15.000000000 +0200
+++ libjava/gcj/Makefile.in	2007-09-06 17:20:42.000000000 +0200
@@ -172,6 +172,7 @@ LIBLTDL = @LIBLTDL@
 LIBMAGIC = @LIBMAGIC@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
+LIBSTDCXXSPEC = @LIBSTDCXXSPEC@
 LIBTOOL = @LIBTOOL@
 LN_S = @LN_S@
 LTLIBICONV = @LTLIBICONV@
@@ -276,6 +277,7 @@ build_vendor = @build_vendor@
 datadir = @datadir@
 dbexecdir = @dbexecdir@
 exec_prefix = @exec_prefix@
+extra_ldflags = @extra_ldflags@
 extra_ldflags_libjava = @extra_ldflags_libjava@
 gxx_include_dir = @gxx_include_dir@
 here = @here@
--- libjava/include/Makefile.in.jj	2007-09-06 14:06:15.000000000 +0200
+++ libjava/include/Makefile.in	2007-09-06 17:20:42.000000000 +0200
@@ -171,6 +171,7 @@ LIBLTDL = @LIBLTDL@
 LIBMAGIC = @LIBMAGIC@
 LIBOBJS = @LIBOBJS@
 LIBS = @LIBS@
+LIBSTDCXXSPEC = @LIBSTDCXXSPEC@
 LIBTOOL = @LIBTOOL@
 LN_S = @LN_S@
 LTLIBICONV = @LTLIBICONV@
@@ -275,6 +276,7 @@ build_vendor = @build_vendor@
 datadir = @datadir@
 dbexecdir = @dbexecdir@
 exec_prefix = @exec_prefix@
+extra_ldflags = @extra_ldflags@
 extra_ldflags_libjava = @extra_ldflags_libjava@
 gxx_include_dir = @gxx_include_dir@
 here = @here@
--- libjava/configure.ac.jj	2007-09-06 14:06:15.000000000 +0200
+++ libjava/configure.ac	2007-09-06 17:20:42.000000000 +0200
@@ -777,9 +777,6 @@ case "${host}" in
 esac
 AC_SUBST(SYSTEMSPEC)
 
-LIBGCJTESTSPEC="-L`${PWDCMD-pwd}`/.libs -rpath `${PWDCMD-pwd}`/.libs"
-AC_SUBST(LIBGCJTESTSPEC)
-
 AC_ARG_WITH(system-zlib,
   AS_HELP_STRING([--with-system-zlib],
                  [use installed libz]))
@@ -793,6 +790,9 @@ AC_PATH_XTRA
 # FIXME: this should be _libs on some hosts.
 libsubdir=.libs
 
+LIBGCJTESTSPEC="-L`${PWDCMD-pwd}`/.libs -rpath `${PWDCMD-pwd}`/.libs"
+
+LIBSTDCXXSPEC=
 # extra LD Flags which are required for targets
 case "${host}" in
 *-*-darwin[[0-7]].*)
@@ -801,8 +801,20 @@ case "${host}" in
     # on Darwin -single_module speeds up loading of the dynamic libraries.
     extra_ldflags_libjava=-Wl,-single_module
     ;;
+arm*linux*eabi)
+    # Some of the ARM unwinder code is actually in libstdc++.  We
+    # could in principle replicate it in libgcj, but it's better to
+    # have a dependency on libstdc++.
+    extra_ldflags='-L$(here)/../libstdc++-v3/src -lstdc++'
+    LIBSTDCXXSPEC=-lstdc++
+    LIBGCJTESTSPEC="-L`${PWDCMD-pwd}`/.libs -L`${PWDCMD-pwd}`/../libstdc++-v3/src/.libs -rpath `${PWDCMD-pwd}`/.libs:`${PWDCMD-pwd}`/../libstdc++-v3/src/.libs -lstdc++"
+    ;;
 esac
 AC_SUBST(extra_ldflags_libjava)
+AC_SUBST(extra_ldflags)
+AC_SUBST(LIBSTDCXXSPEC)
+
+AC_SUBST(LIBGCJTESTSPEC)
 
 # Allow the GC to be disabled.  Can be useful when debugging.
 AC_MSG_CHECKING([for garbage collector to use])
--- libjava/libgcj.spec.in.jj	2007-09-06 14:06:15.000000000 +0200
+++ libjava/libgcj.spec.in	2007-09-06 17:20:42.000000000 +0200
@@ -7,6 +7,6 @@
 *startfile: @THREADSTARTFILESPEC@ %(startfileorig)
 
 %rename lib liborig
-*lib: @LD_START_STATIC_SPEC@ @LIBGCJ_SPEC@ @LD_FINISH_STATIC_SPEC@ -lm @LIBICONV@ @GCSPEC@ @THREADSPEC@ @ZLIBSPEC@ @SYSTEMSPEC@ %(libgcc) %(liborig)
+*lib: @LD_START_STATIC_SPEC@ @LIBGCJ_SPEC@ @LD_FINISH_STATIC_SPEC@ -lm @LIBICONV@ @GCSPEC@ @THREADSPEC@ @ZLIBSPEC@ @SYSTEMSPEC@ %(libgcc) @LIBSTDCXXSPEC@ %(liborig)
 
 *jc1: @HASH_SYNC_SPEC@ @DIVIDESPEC@ @CHECKREFSPEC@ @JC1GCSPEC@ @EXCEPTIONSPEC@ @BACKTRACESPEC@ @IEEESPEC@ -fkeep-inline-functions
--- libjava/stacktrace.cc.jj	2007-09-06 14:06:16.000000000 +0200
+++ libjava/stacktrace.cc	2007-09-06 17:20:42.000000000 +0200
@@ -39,6 +39,10 @@ using namespace java::lang::reflect;
 using namespace java::util;
 using namespace gnu::gcj::runtime;
 
+#ifdef __ARM_EABI_UNWINDER__
+#define _URC_NORMAL_STOP _URC_FAILURE
+#endif
+
 // Maps ncode values to their containing native class.
 // NOTE: Currently this Map contradicts class GC for native classes. This map
 // (and the "new class stack") will need to use WeakReferences in order to 
--- libjava/configure.host.jj	2007-09-06 17:11:05.000000000 +0200
+++ libjava/configure.host	2007-09-06 17:20:42.000000000 +0200
@@ -85,6 +85,7 @@ case "${host}" in
   arm*-linux*)
 	libgcj_interpreter=yes
 	sysdeps_dir=arm
+	fallback_backtrace_h=sysdep/arm/backtrace.h
 	;;
   mips-tx39-*|mipstx39-unknown-*)
 	libgcj_flags="${libgcj_flags} -G 0"
@@ -258,6 +259,12 @@ EOF
 	sysdeps_dir=x86-64
 	DIVIDESPEC=-f%{m32:no-}%{!m32:%{!m64:no-}}%{m64:}use-divide-subroutine
 	;;
+  arm*-linux* )
+	slow_pthread_self=no
+	can_unwind_signal=no
+	CHECKREFSPEC=-fcheck-references
+	DIVIDESPEC=-fuse-divide-subroutine
+	;;
   mips*-*-linux* )
   	sysdeps_dir=mips
   	can_unwind_signal=yes
--- libjava/Makefile.am.jj	2007-09-06 14:06:16.000000000 +0200
+++ libjava/Makefile.am	2007-09-06 17:28:27.000000000 +0200
@@ -100,6 +100,7 @@ endif
 GCJ_WITH_FLAGS = $(GCJ) --encoding=UTF-8 -Wno-deprecated
 
 extra_ldflags_libjava = @extra_ldflags_libjava@
+extra_ldflags = @extra_ldflags@
 
 if ANONVERSCRIPT
 extra_ldflags_libjava += -Wl,--version-script=$(srcdir)/libgcj.ver
@@ -110,7 +111,7 @@ GCJLINK = $(LIBTOOL) --tag=GCJ --mode=li
 GCJ_FOR_ECJX = @GCJ_FOR_ECJX@
 GCJ_FOR_ECJX_LINK = $(GCJ_FOR_ECJX) -o $@
 LIBLINK = $(LIBTOOL) --tag=CXX --mode=link $(CXX) -L$(here) $(JC1FLAGS) \
-          $(LDFLAGS) $(extra_ldflags_libjava) -o $@
+          $(LDFLAGS) $(extra_ldflags_libjava) $(extra_ldflags) -o $@
 
 GCC_UNWIND_INCLUDE = @GCC_UNWIND_INCLUDE@
 
@@ -232,7 +233,7 @@ xlib_nat_files = $(xlib_nat_source_files
 # Include THREADLIBS here to ensure that the correct version of
 # certain linuxthread functions get linked:
 ## The mysterious backslash in the grep pattern is consumed by make.
-libgcj_la_LDFLAGS = -rpath $(toolexeclibdir) $(THREADLDFLAGS) $(THREADLIBS) \
+libgcj_la_LDFLAGS = -rpath $(toolexeclibdir) $(THREADLDFLAGS) $(extra_ldflags) $(THREADLIBS) \
 	$(LIBLTDL) $(SYS_ZLIBS) \
 	-version-info `grep -v '^\#' $(srcdir)/libtool-version`
 libgcj_la_LIBADD = \
@@ -614,7 +615,7 @@ jv_convert_SOURCES =
 ## need this because we are explicitly using libtool to link using the
 ## `.la' file.
 jv_convert_LDFLAGS = --main=gnu.gcj.convert.Convert \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 jv_convert_LINK = $(GCJLINK)
 ## We don't explicitly link in the libraries we need; libgcj.la brings
 ## in all dependencies.  We need the -L so that gcj can find libgcj
@@ -635,7 +636,7 @@ gnu/gcj/tools/gcj_dbtool/natMain.cc
 ## need this because we are explicitly using libtool to link using the
 ## `.la' file.
 gcj_dbtool_LDFLAGS = --main=gnu.gcj.tools.gcj_dbtool.Main \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 gcj_dbtool_LINK = $(GCJLINK)
 ## We don't explicitly link in the libraries we need; libgcj.la brings
 ## in all dependencies.  We need the -L so that gcj can find libgcj
@@ -654,7 +655,7 @@ gij_SOURCES = 
 ## need this because we are explicitly using libtool to link using the
 ## `.la' file.
 gij_LDFLAGS = -rpath $(libdir)/gcj-$(gcc_version) -rpath $(toolexeclibdir) \
-	-shared-libgcc $(THREADLDFLAGS)
+	-shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 gij_LINK = $(GCJLINK)
 ## See jv_convert_LDADD.
 gij_LDADD = -L$(here)/.libs libgij.la
@@ -698,7 +699,7 @@ endif !NATIVE
 ## This is a dummy definition.
 gappletviewer_SOURCES =
 gappletviewer_LDFLAGS = --main=gnu.classpath.tools.appletviewer.Main \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 gappletviewer_LINK = $(GCJLINK)
 ## See jv_convert_LDADD.
 gappletviewer_LDADD = -L$(here)/.libs libgcj-tools.la
@@ -707,7 +708,7 @@ gappletviewer_DEPENDENCIES = libgcj-tool
 ## This is a dummy definition.
 gjarsigner_SOURCES =
 gjarsigner_LDFLAGS = --main=gnu.classpath.tools.jarsigner.Main \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 gjarsigner_LINK = $(GCJLINK)
 ## See jv_convert_LDADD.
 gjarsigner_LDADD = -L$(here)/.libs libgcj-tools.la
@@ -716,7 +717,7 @@ gjarsigner_DEPENDENCIES = libgcj-tools.l
 ## This is a dummy definition.
 gkeytool_SOURCES =
 gkeytool_LDFLAGS = --main=gnu.classpath.tools.keytool.Main \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 gkeytool_LINK = $(GCJLINK)
 ## See jv_convert_LDADD.
 gkeytool_LDADD = -L$(here)/.libs libgcj-tools.la
@@ -725,7 +726,7 @@ gkeytool_DEPENDENCIES = libgcj-tools.la
 ## This is a dummy definition.
 gjar_SOURCES =
 gjar_LDFLAGS = --main=gnu.classpath.tools.jar.Main \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 gjar_LINK = $(GCJLINK)
 ## See jv_convert_LDADD.
 gjar_LDADD = -L$(here)/.libs libgcj-tools.la
@@ -734,7 +735,7 @@ gjar_DEPENDENCIES = libgcj-tools.la
 ## This is a dummy definition.
 gjavah_SOURCES =
 gjavah_LDFLAGS = --main=gnu.classpath.tools.javah.Main \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 gjavah_LINK = $(GCJLINK)
 ## See jv_convert_LDADD.
 gjavah_LDADD = -L$(here)/.libs libgcj-tools.la
@@ -743,7 +744,7 @@ gjavah_DEPENDENCIES = libgcj-tools.la
 ## This is a dummy definition.
 gcjh_SOURCES =
 gcjh_LDFLAGS = --main=gnu.classpath.tools.javah.GcjhMain \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 gcjh_LINK = $(GCJLINK)
 ## See jv_convert_LDADD.
 gcjh_LDADD = -L$(here)/.libs libgcj-tools.la
@@ -752,7 +753,7 @@ gcjh_DEPENDENCIES = libgcj-tools.la
 ## This is a dummy definition.
 gnative2ascii_SOURCES =
 gnative2ascii_LDFLAGS = --main=gnu.classpath.tools.native2ascii.Native2ASCII \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 gnative2ascii_LINK = $(GCJLINK)
 ## See jv_convert_LDADD.
 gnative2ascii_LDADD = -L$(here)/.libs libgcj-tools.la
@@ -761,7 +762,7 @@ gnative2ascii_DEPENDENCIES = libgcj-tool
 ## This is a dummy definition.
 gorbd_SOURCES =
 gorbd_LDFLAGS = --main=gnu.classpath.tools.orbd.Main \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 gorbd_LINK = $(GCJLINK)
 ## See jv_convert_LDADD.
 gorbd_LDADD = -L$(here)/.libs libgcj-tools.la
@@ -770,7 +771,7 @@ gorbd_DEPENDENCIES = libgcj-tools.la
 ## This is a dummy definition.
 grmid_SOURCES =
 grmid_LDFLAGS = --main=gnu.classpath.tools.rmid.Main \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 grmid_LINK = $(GCJLINK)
 ## See jv_convert_LDADD.
 grmid_LDADD = -L$(here)/.libs libgcj-tools.la
@@ -779,7 +780,7 @@ grmid_DEPENDENCIES = libgcj-tools.la
 ## This is a dummy definition.
 gserialver_SOURCES =
 gserialver_LDFLAGS = --main=gnu.classpath.tools.serialver.SerialVer \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 gserialver_LINK = $(GCJLINK)
 ## See jv_convert_LDADD.
 gserialver_LDADD = -L$(here)/.libs libgcj-tools.la
@@ -788,7 +789,7 @@ gserialver_DEPENDENCIES = libgcj-tools.l
 ## This is a dummy definition.
 gtnameserv_SOURCES =
 gtnameserv_LDFLAGS = --main=gnu.classpath.tools.tnameserv.Main \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 gtnameserv_LINK = $(GCJLINK)
 ## See jv_convert_LDADD.
 gtnameserv_LDADD = -L$(here)/.libs libgcj-tools.la
@@ -797,7 +798,7 @@ gtnameserv_DEPENDENCIES = libgcj-tools.l
 ## This is a dummy definition.
 grmic_SOURCES =
 grmic_LDFLAGS = --main=gnu.classpath.tools.rmic.Main \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 grmic_LINK = $(GCJLINK)
 ## See jv_convert_LDADD.
 grmic_LDADD = -L$(here)/.libs libgcj-tools.la
@@ -806,7 +807,7 @@ grmic_DEPENDENCIES = libgcj-tools.la
 ## This is a dummy definition.
 grmiregistry_SOURCES =
 grmiregistry_LDFLAGS = --main=gnu.classpath.tools.rmiregistry.Main \
-	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS)
+	-rpath $(toolexeclibdir) -shared-libgcc $(THREADLDFLAGS) $(extra_ldflags)
 grmiregistry_LINK = $(GCJLINK)
 ## See jv_convert_LDADD.
 grmiregistry_LDADD = -L$(here)/.libs libgcj-tools.la
--- libjava/exception.cc.jj	2007-09-06 14:06:15.000000000 +0200
+++ libjava/exception.cc	2007-09-06 17:20:42.000000000 +0200
@@ -58,6 +58,21 @@ struct java_exception_header
   _Unwind_Exception unwindHeader;
 };
 
+#ifdef __ARM_EABI_UNWINDER__
+// This is the exception class we report -- "GNUCJAVA".
+
+const _Unwind_Exception_Class __gcj_exception_class
+  = {'G', 'N', 'U', 'C', 'J', 'A', 'V', 'A'};
+
+static inline java_exception_header *
+get_exception_header_from_ue (_Unwind_Exception *exc)
+{
+  return reinterpret_cast<java_exception_header *>(exc + 1) - 1;
+}
+
+extern "C" void __cxa_begin_cleanup (_Unwind_Exception*);
+
+#else // !__ARM_EABI_UNWINDER__
 // This is the exception class we report -- "GNUCJAVA".
 const _Unwind_Exception_Class __gcj_exception_class
 = ((((((((_Unwind_Exception_Class) 'G' 
@@ -75,6 +90,7 @@ get_exception_header_from_ue (_Unwind_Ex
 {
   return reinterpret_cast<java_exception_header *>(exc + 1) - 1;
 }
+#endif // !__ARM_EABI_UNWINDER__
 
 /* Perform a throw, Java style. Throw will unwind through this call,
    so there better not be any handlers or exception thrown here. */
@@ -89,7 +105,8 @@ _Jv_Throw (jthrowable value)
     value = new java::lang::NullPointerException ();
   xh->value = value;
 
-  xh->unwindHeader.exception_class = __gcj_exception_class;
+  memcpy (&xh->unwindHeader.exception_class, &__gcj_exception_class,
+	  sizeof xh->unwindHeader.exception_class);
   xh->unwindHeader.exception_cleanup = NULL;
 
   /* We're happy with setjmp/longjmp exceptions or region-based
@@ -159,6 +176,21 @@ parse_lsda_header (_Unwind_Context *cont
   return p;
 }
 
+#ifdef __ARM_EABI_UNWINDER__
+
+static void **
+get_ttype_entry(_Unwind_Context *, lsda_header_info* info, _Unwind_Word i)
+{
+  _Unwind_Ptr ptr;
+
+  ptr = (_Unwind_Ptr) (info->TType - (i * 4));
+  ptr = _Unwind_decode_target2(ptr);
+  
+  return reinterpret_cast<void **>(ptr);
+}
+
+#else
+
 static void **
 get_ttype_entry (_Unwind_Context *context, lsda_header_info *info, long i)
 {
@@ -170,6 +202,7 @@ get_ttype_entry (_Unwind_Context *contex
   return reinterpret_cast<void **>(ptr);
 }
 
+#endif
 
 // Using a different personality function name causes link failures
 // when trying to mix code using different exception handling models.
@@ -180,12 +213,33 @@ get_ttype_entry (_Unwind_Context *contex
 #define PERSONALITY_FUNCTION	__gcj_personality_v0
 #endif
 
+#ifdef __ARM_EABI_UNWINDER__
+
+#define CONTINUE_UNWINDING \
+  do								\
+    {								\
+      if (__gnu_unwind_frame(ue_header, context) != _URC_OK)	\
+	return _URC_FAILURE;					\
+      return _URC_CONTINUE_UNWIND;				\
+    }								\
+  while (0)
+
+extern "C" _Unwind_Reason_Code
+PERSONALITY_FUNCTION (_Unwind_State state,
+		      struct _Unwind_Exception* ue_header,
+		      struct _Unwind_Context* context)
+#else
+
+#define CONTINUE_UNWINDING return _URC_CONTINUE_UNWIND
+
 extern "C" _Unwind_Reason_Code
 PERSONALITY_FUNCTION (int version,
 		      _Unwind_Action actions,
 		      _Unwind_Exception_Class exception_class,
 		      struct _Unwind_Exception *ue_header,
 		      struct _Unwind_Context *context)
+
+#endif
 {
   java_exception_header *xh = get_exception_header_from_ue (ue_header);
 
@@ -197,16 +251,56 @@ PERSONALITY_FUNCTION (int version,
   int handler_switch_value;
   bool saw_cleanup;
   bool saw_handler;
+  bool foreign_exception;
   int ip_before_insn = 0;
 
+#ifdef __ARM_EABI_UNWINDER__
+  _Unwind_Action actions;
+
+  switch (state & _US_ACTION_MASK)
+    {
+    case _US_VIRTUAL_UNWIND_FRAME:
+      actions = _UA_SEARCH_PHASE;
+      break;
+
+    case _US_UNWIND_FRAME_STARTING:
+      actions = _UA_CLEANUP_PHASE;
+      if (!(state & _US_FORCE_UNWIND)
+	  && ue_header->barrier_cache.sp == _Unwind_GetGR(context, 13))
+	actions |= _UA_HANDLER_FRAME;
+      break;
+
+    case _US_UNWIND_FRAME_RESUME:
+      CONTINUE_UNWINDING;
+      break;
+
+    default:
+      std::abort();
+    }
+  actions |= state & _US_FORCE_UNWIND;
+
+  // We don't know which runtime we're working with, so can't check this.
+  // However the ABI routines hide this from us, and we don't actually need
+  // to know.
+  foreign_exception = false;
+
+  // The dwarf unwinder assumes the context structure holds things like the
+  // function and LSDA pointers.  The ARM implementation caches these in
+  // the exception header (UCB).  To avoid rewriting everything we make the
+  // virtual IP register point at the UCB.
+  ip = (_Unwind_Ptr) ue_header;
+  _Unwind_SetGR(context, 12, ip);
 
+#else
   // Interface version check.
   if (version != 1)
     return _URC_FATAL_PHASE1_ERROR;
+  foreign_exception = exception_class != __gcj_exception_class;
+#endif
 
   // Shortcut for phase 2 found handler for domestic exception.
   if (actions == (_UA_CLEANUP_PHASE | _UA_HANDLER_FRAME)
-      && exception_class == __gcj_exception_class)
+      && !foreign_exception)
     {
       handler_switch_value = xh->handlerSwitchValue;
       landing_pad = xh->landingPad;
@@ -227,17 +321,17 @@ PERSONALITY_FUNCTION (int version,
 
   // If no LSDA, then there are no handlers or cleanups.
   if (! language_specific_data)
-    return _URC_CONTINUE_UNWIND;
+    CONTINUE_UNWINDING;
 
   // Parse the LSDA header.
   p = parse_lsda_header (context, language_specific_data, &info);
 #ifdef HAVE_GETIPINFO
   ip = _Unwind_GetIPInfo (context, &ip_before_insn);
-  if (! ip_before_insn)
-    --ip;
 #else
   ip = _Unwind_GetIP (context) - 1;
 #endif
+  if (! ip_before_insn)
+    --ip;
   landing_pad = 0;
   action_record = 0;
   handler_switch_value = 0;
@@ -296,7 +390,7 @@ PERSONALITY_FUNCTION (int version,
   // If ip is not present in the table, C++ would call terminate.
   // ??? It is perhaps better to tweek the LSDA so that no-action
   // is mapped to no-entry for Java.
-  return _URC_CONTINUE_UNWIND;
+  CONTINUE_UNWINDING;
 
  found_something:
   saw_cleanup = false;
@@ -334,7 +428,7 @@ PERSONALITY_FUNCTION (int version,
 	  // During forced unwinding, we only run cleanups.  With a
 	  // foreign exception class, we have no class info to match.
 	  else if ((actions & _UA_FORCE_UNWIND)
-	      || exception_class != __gcj_exception_class)
+		   || foreign_exception)
 	    ;
 
 	  else if (ar_filter > 0)
@@ -374,15 +468,15 @@ PERSONALITY_FUNCTION (int version,
     }
 
   if (! saw_handler && ! saw_cleanup)
-    return _URC_CONTINUE_UNWIND;
+	CONTINUE_UNWINDING;
 
   if (actions & _UA_SEARCH_PHASE)
     {
       if (! saw_handler)
-	return _URC_CONTINUE_UNWIND;
+	CONTINUE_UNWINDING;
 
       // For domestic exceptions, we cache data from phase 1 for phase 2.
-      if (exception_class == __gcj_exception_class)
+      if (! foreign_exception)
         {
           xh->handlerSwitchValue = handler_switch_value;
           xh->landingPad = landing_pad;
@@ -396,5 +490,9 @@ PERSONALITY_FUNCTION (int version,
   _Unwind_SetGR (context, __builtin_eh_return_data_regno (1),
 		 handler_switch_value);
   _Unwind_SetIP (context, landing_pad);
+#ifdef __ARM_EABI_UNWINDER__
+  if (saw_cleanup)
+    __cxa_begin_cleanup(ue_header);
+#endif
   return _URC_INSTALL_CONTEXT;
 }
--- libjava/gnu/classpath/natVMStackWalker.cc.jj	2007-09-06 14:06:15.000000000 +0200
+++ libjava/gnu/classpath/natVMStackWalker.cc	2007-09-06 17:20:42.000000000 +0200
@@ -19,6 +19,7 @@ details.  */
 #include <java/lang/ClassLoader.h>
 #include <java/lang/Class.h>
 
+#ifndef __ARM_EABI_UNWINDER__
 // Return the class of the method that contains PC.
 // This is a macro not a function, since defining it as one would
 // introduce an extra frame on the stack.  */
@@ -44,6 +45,11 @@ details.  */
 									\
   klass;								\
  })
+#else // __ARM_EABI_UNWINDER__
+// ARM EABI doesn't support _Unwind_FindEnclosingFunction.
+#define GET_CALLING_CLASS(PC)				\
+  (_Jv_StackTrace::GetStackWalkerCallingClass ())
+#endif
 
 JArray<jclass> *
 gnu::classpath::VMStackWalker::getClassContext(void)
@@ -59,14 +65,18 @@ jclass
 gnu::classpath::VMStackWalker::getCallingClass(void)
 {
   _Jv_InitClass (&::gnu::classpath::VMStackWalker::class$);
-  return _Jv_StackTrace::GetStackWalkerCallingClass ();
+  jclass result = _Jv_StackTrace::GetStackWalkerCallingClass ();
+  __asm__ __volatile__ ("" : : "g" (result));
+  return result;
 }
 
 jclass
 gnu::classpath::VMStackWalker::getCallingClass(::gnu::gcj::RawData *pc)
 {
   _Jv_InitClass (&::gnu::classpath::VMStackWalker::class$);
-  return GET_CALLING_CLASS(pc);
+  jclass result = GET_CALLING_CLASS(pc);
+  __asm__ __volatile__ ("" : : "g" (result));
+  return result;
 }
 
 ::java::lang::ClassLoader *
--- libjava/sysdep/arm/backtrace.h.jj	2007-09-06 17:20:42.000000000 +0200
+++ libjava/sysdep/arm/backtrace.h	2007-09-06 17:20:42.000000000 +0200
@@ -0,0 +1,35 @@
+// backtrace.h - Fallback backtrace implementation. ARM implementation.
+
+/* Copyright (C) 2005, 2006  Free Software Foundation
+
+   This file is part of libgcj.
+
+This software is copyrighted work licensed under the terms of the
+Libgcj License.  Please consult the file "LIBGCJ_LICENSE" for
+details.  */
+
+#ifndef __SYSDEP_BACKTRACE_H__
+#define __SYSDEP_BACKTRACE_H__
+
+#include <java-stack.h>
+
+extern "C"
+{
+/* Unwind through the call stack calling TRACE_FN with STATE for every stack
+   frame.  Returns the reason why the unwinding was stopped.  */
+#ifdef __ARM_EABI_UNWINDER__
+
+#define _Unwind_FindEnclosingFunction(PC) \
+  (PC)
+
+_Unwind_Reason_Code
+fallback_backtrace (_Unwind_Reason_Code (*)(struct _Unwind_Context*, void*), _Jv_UnwindState *)
+#else
+_Unwind_Reason_Code
+fallback_backtrace (_Unwind_Trace_Fn, _Jv_UnwindState *)
+#endif
+{
+  return _URC_NO_REASON;
+}
+}
+#endif

gcc41-java-arm7.patch:

--- NEW FILE gcc41-java-arm7.patch ---
2007-09-07  Andrew Haley  <aph at redhat.com>

	* configure.in (noconfigdirs): Remove target-libffi and
	target-libjava.
	* configure: Regenerate.

--- configure.in	(revision 128249)
+++ configure.in	(revision 128250)
@@ -501,8 +501,8 @@ case "${target}" in
     noconfigdirs="$noconfigdirs target-libffi target-qthreads"
     ;;
   arm*-*-linux-gnueabi)
-    noconfigdirs="$noconfigdirs target-libffi target-qthreads"
-    noconfigdirs="$noconfigdirs target-libjava target-libobjc"
+    noconfigdirs="$noconfigdirs target-qthreads"
+    noconfigdirs="$noconfigdirs target-libobjc"
     ;;
   arm*-*-symbianelf*)
     noconfigdirs="$noconfigdirs ${libgcj} target-libiberty"
--- configure	(revision 128249)
+++ configure	(revision 128250)
@@ -1293,8 +1293,8 @@ case "${target}" in
     noconfigdirs="$noconfigdirs target-libffi target-qthreads"
     ;;
   arm*-*-linux-gnueabi)
-    noconfigdirs="$noconfigdirs target-libffi target-qthreads"
-    noconfigdirs="$noconfigdirs target-libjava target-libobjc"
+    noconfigdirs="$noconfigdirs target-qthreads"
+    noconfigdirs="$noconfigdirs target-libobjc"
     ;;
   arm*-*-symbianelf*)
     noconfigdirs="$noconfigdirs ${libgcj} target-libiberty"

gcc41-java-arm8.patch:

--- NEW FILE gcc41-java-arm8.patch ---
2007-07-13  Andrew Haley  <aph at redhat.com>

	* testsuite/libjava.jvmti/jvmti-interp.exp: Likewise.
	* testsuite/libjava.jni/jni.exp: Use -fdollars-in-identifiers.
	* testsuite/libjava.jni/cni.exp: Use -fdollars-in-identifiers.
	* testsuite/libjava.jvmti/jvmti.exp (gcj_jvmti_compile_cxx_to_o): Likewise.

--- libjava/testsuite/libjava.cni/cni.exp	(revision 126621)
+++ libjava/testsuite/libjava.cni/cni.exp	(revision 126622)
@@ -10,7 +10,7 @@
   set oname ${name}.o
 
   # Find the generated header.
-  lappend options "additional_flags=-I. -I.. -I$srcdir/$subdir"
+  lappend options "additional_flags=-I. -I.. -I$srcdir/$subdir -fdollars-in-identifiers"
   # Find libgcj headers.
   lappend options "additional_flags=-I$srcdir/.."
 
--- libjava/testsuite/libjava.jvmti/jvmti-interp.exp	(revision 126621)
+++ libjava/testsuite/libjava.jvmti/jvmti-interp.exp	(revision 126622)
@@ -47,7 +47,7 @@
 
   # Find jni.h and jni_md.h.
   lappend options "additional_flags=-I$srcdir/../include  \
-                   -I$srcdir/../classpath/include"
+                   -I$srcdir/../classpath/include -fdollars-in-identifiers"
 
   # Append C++ options
   lappend options "additional_flags=$options_cxx"
--- libjava/testsuite/libjava.jvmti/jvmti.exp	(revision 126621)
+++ libjava/testsuite/libjava.jvmti/jvmti.exp	(revision 126622)
@@ -11,11 +11,11 @@
   set oname ${name}.o
 
   # Find the generated header.
-  lappend options "additional_flags=-g -I. -I.."
+  lappend options "additional_flags=-g -I. -I.. -fdollars-in-identifiers"
   # Find libgcj headers.
   lappend options "additional_flags=-I$srcdir/.."
   # Find jvmti.h, jvmti_md.h, jvmti-int.h, jvm.h requirements
-  lappend options "additional_flags=-I$srcdir/../include -I$srcdir/../classpath/include -I$objdir/../include -I$objdir/../../boehm-gc/include"
+  lappend options "additional_flags=-I$srcdir/../include -I$srcdir/../classpath/include -I$objdir/../include -I$objdir/../../boehm-gc/include "
 
   set x [libjava_prune_warnings \
 	   [target_compile $file $oname object $options]]
--- libjava/testsuite/libjava.jni/jni.exp	(revision 126621)
+++ libjava/testsuite/libjava.jni/jni.exp	(revision 126622)
@@ -31,7 +31,7 @@
 
   lappend options "additional_flags=${so_flag} -fPIC"
   # Find the generated header.
-  lappend options "additional_flags=-I. -I.. -I$srcdir/$subdir"
+  lappend options "additional_flags=-I. -I.. -I$srcdir/$subdir -fdollars-in-identifiers"
 
   # Ensure that the generated header has correct prototypes.
   set cfile [file rootname $file].c
@@ -219,7 +219,7 @@
   lappend options "additional_flags=-I. -I.. -I$srcdir/$subdir"
 
   # Find jni.h and jni_md.h.
-  lappend options "additional_flags=-I$srcdir/../include -I$srcdir/../classpath/include"
+  lappend options "additional_flags=-I$srcdir/../include -I$srcdir/../classpath/include -fdollars-in-identifiers"
 
   # Append C++ options
   lappend options "additional_flags=$options_cxx"

gcc41-omp-outer-ctx.patch:

--- NEW FILE gcc41-omp-outer-ctx.patch ---
2007-12-03  Jakub Jelinek  <jakub at redhat.com>

	* omp-low.c (lookup_decl_in_outer_ctx): Allow calling this
	with !ctx->is_nested.
	(maybe_lookup_decl_in_outer_ctx): Look up in outer contexts
	even if !ctx->is_nested.
	(lower_copyprivate_clauses, lower_send_clauses,
	lower_send_shared_vars): Call lookup_decl_in_outer_ctx
	unconditionally.

	* testsuite/libgomp.c/private-1.c: New test.

--- gcc/omp-low.c	(revision 130589)
+++ gcc/omp-low.c	(revision 130590)
@@ -1518,12 +1518,10 @@ lookup_decl_in_outer_ctx (tree decl, omp
   tree t;
   omp_context *up;
 
-  gcc_assert (ctx->is_nested);
-
   for (up = ctx->outer, t = NULL; up && t == NULL; up = up->outer)
     t = maybe_lookup_decl (decl, up);
 
-  gcc_assert (t || is_global_var (decl));
+  gcc_assert (!ctx->is_nested || t || is_global_var (decl));
 
   return t ? t : decl;
 }
@@ -1538,9 +1536,8 @@ maybe_lookup_decl_in_outer_ctx (tree dec
   tree t = NULL;
   omp_context *up;
 
-  if (ctx->is_nested)
-    for (up = ctx->outer, t = NULL; up && t == NULL; up = up->outer)
-      t = maybe_lookup_decl (decl, up);
+  for (up = ctx->outer, t = NULL; up && t == NULL; up = up->outer)
+    t = maybe_lookup_decl (decl, up);
 
   return t ? t : decl;
 }
@@ -2012,7 +2009,7 @@ lower_copyprivate_clauses (tree clauses,
       by_ref = use_pointer_for_field (var, false);
 
       ref = build_sender_ref (var, ctx);
-      x = (ctx->is_nested) ? lookup_decl_in_outer_ctx (var, ctx) : var;
+      x = lookup_decl_in_outer_ctx (var, ctx);
       x = by_ref ? build_fold_addr_expr (x) : x;
       x = build_gimple_modify_stmt (ref, x);
       gimplify_and_add (x, slist);
@@ -2053,9 +2050,8 @@ lower_send_clauses (tree clauses, tree *
 	  continue;
 	}
 
-      var = val = OMP_CLAUSE_DECL (c);
-      if (ctx->is_nested)
-	var = lookup_decl_in_outer_ctx (val, ctx);
+      val = OMP_CLAUSE_DECL (c);
+      var = lookup_decl_in_outer_ctx (val, ctx);
 
       if (OMP_CLAUSE_CODE (c) != OMP_CLAUSE_COPYIN
 	  && is_global_var (var))
@@ -2127,13 +2123,10 @@ lower_send_shared_vars (tree *ilist, tre
       if (!nvar || !DECL_HAS_VALUE_EXPR_P (nvar))
 	continue;
 
-      var = ovar;
-
       /* If CTX is a nested parallel directive.  Find the immediately
 	 enclosing parallel or workshare construct that contains a
 	 mapping for OVAR.  */
-      if (ctx->is_nested)
-	var = lookup_decl_in_outer_ctx (ovar, ctx);
+      var = lookup_decl_in_outer_ctx (ovar, ctx);
 
       if (use_pointer_for_field (ovar, true))
 	{
--- libgomp/testsuite/libgomp.c/private-1.c	(revision 0)
+++ libgomp/testsuite/libgomp.c/private-1.c	(revision 130590)
@@ -0,0 +1,54 @@
+extern void abort (void);
+
+int a = 18;
+
+void
+f1 (int i, int j, int k)
+{
+  int l = 6, m = 7, n = 8;
+#pragma omp parallel private(j, m) shared(k, n) firstprivate(i, l) \
+	    num_threads(1)
+  {
+    j = 6;
+    m = 5;
+    if (++a != 19 || ++i != 9 || j != 6 || ++l != 7 || m != 5 || ++n != 9)
+      #pragma omp atomic
+	k++;
+  }
+  if (a != 19 || i != 8 || j != 26 || k != 0 || l != 6 || m != 7 || n != 9)
+    abort ();
+}
+
+int v1 = 1, v2 = 2, v5 = 5;
+int err;
+
+void
+f2 (void)
+{
+  int v3 = 3;
+#pragma omp sections private (v1) firstprivate (v2)
+  {
+  #pragma omp section
+    {
+      int v4 = 4;
+      v1 = 7;
+      #pragma omp parallel num_threads(1) firstprivate(v1, v2, v3, v4)
+	{
+	  if (++v1 != 8 || ++v2 != 3 || ++v3 != 4 || ++v4 != 5 || ++v5 != 6)
+	    err = 1;
+	}
+      if (v1 != 7 || v2 != 2 || v3 != 3 || v4 != 4 || v5 != 6)
+	abort ();
+      if (err)
+	abort ();
+    }
+  }
+}
+
+int
+main (void)
+{
+  f1 (8, 26, 0);
+  f2 ();
+  return 0;
+}

gcc41-pr23848.patch:

--- NEW FILE gcc41-pr23848.patch ---
2007-11-15  Jakub Jelinek  <jakub at redhat.com>

	PR middle-end/23848
	* tree-ssa-ccp.c (optimize_stack_restore): New function.
	(execute_fold_all_builtins): Call optimize_stack_restore for
	BUILT_IN_STACK_RESTORE.

	* gcc.dg/tree-ssa/pr23848-1.c: New test.
	* gcc.dg/tree-ssa/pr23848-2.c: New test.
	* gcc.dg/tree-ssa/pr23848-3.c: New test.
	* gcc.dg/tree-ssa/pr23848-4.c: New test.

--- gcc/tree-ssa-ccp.c	(revision 130205)
+++ gcc/tree-ssa-ccp.c	(revision 130206)
@@ -2394,6 +2394,75 @@ fold_stmt_inplace (tree stmt)
   return changed;
 }
 
+/* Try to optimize out __builtin_stack_restore.  Optimize it out
+   if there is another __builtin_stack_restore in the same basic
+   block and no calls or ASM_EXPRs are in between, or if this block's
+   only outgoing edge is to EXIT_BLOCK and there are no calls or
+   ASM_EXPRs after this __builtin_stack_restore.  */
+
+static tree
+optimize_stack_restore (basic_block bb, tree call, block_stmt_iterator i)
+{
+  tree stack_save, stmt, callee;
+
+  if (TREE_CODE (call) != CALL_EXPR
+      || TREE_OPERAND (call, 1) == NULL_TREE
+      || TREE_CHAIN (TREE_OPERAND (call, 1)) != NULL_TREE
+      || TREE_CODE (TREE_VALUE (TREE_OPERAND (call, 1))) != SSA_NAME
+      || !POINTER_TYPE_P (TREE_TYPE (TREE_VALUE (TREE_OPERAND (call, 1)))))
+    return NULL_TREE;
+
+  for (bsi_next (&i); !bsi_end_p (i); bsi_next (&i))
+    {
+      tree call;
+
+      stmt = bsi_stmt (i);
+      if (TREE_CODE (stmt) == ASM_EXPR)
+	return NULL_TREE;
+      call = get_call_expr_in (stmt);
+      if (call == NULL)
+	continue;
+
+      callee = get_callee_fndecl (call);
+      if (!callee || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL)
+	return NULL_TREE;
+
+      if (DECL_FUNCTION_CODE (callee) == BUILT_IN_STACK_RESTORE)
+	break;
+    }
+
+  if (bsi_end_p (i)
+      && (! single_succ_p (bb)
+	  || single_succ_edge (bb)->dest != EXIT_BLOCK_PTR))
+    return NULL_TREE;
+
+  stack_save = SSA_NAME_DEF_STMT (TREE_VALUE (TREE_OPERAND (call, 1)));
+  if (TREE_CODE (stack_save) != MODIFY_EXPR
+      || TREE_OPERAND (stack_save, 0)
+	 != TREE_VALUE (TREE_OPERAND (call, 1))
+      || TREE_CODE (TREE_OPERAND (stack_save, 1)) != CALL_EXPR
+      || tree_could_throw_p (stack_save)
+      || !has_single_use (TREE_VALUE (TREE_OPERAND (call, 1))))
+    return NULL_TREE;
+
+  callee = get_callee_fndecl (TREE_OPERAND (stack_save, 1));
+  if (!callee
+      || DECL_BUILT_IN_CLASS (callee) != BUILT_IN_NORMAL
+      || DECL_FUNCTION_CODE (callee) != BUILT_IN_STACK_SAVE
+      || TREE_OPERAND (TREE_OPERAND (stack_save, 1), 1) != NULL_TREE)
+    return NULL_TREE;
+
+  stmt = stack_save;
+  if (!set_rhs (&stmt,
+		build_int_cst (TREE_TYPE (TREE_VALUE (TREE_OPERAND (call,
+								    1))), 0)))
+    return NULL_TREE;
+  gcc_assert (stmt == stack_save);
+  mark_new_vars_to_rename (stmt);
+
+  return integer_zero_node;
+}
+
 /* Convert EXPR into a GIMPLE value suitable for substitution on the
    RHS of an assignment.  Insert the necessary statements before
    iterator *SI_P.  */
@@ -2469,6 +2538,12 @@ execute_fold_all_builtins (void)
 		result = integer_zero_node;
 		break;
 
+	      case BUILT_IN_STACK_RESTORE:
+		result = optimize_stack_restore (bb, *stmtp, i);
+		if (result)
+		  break;
+		/* FALLTHRU */
+
 	      default:
 		bsi_next (&i);
 		continue;
--- gcc/testsuite/gcc.dg/tree-ssa/pr23848-1.c	(revision 0)
+++ gcc/testsuite/gcc.dg/tree-ssa/pr23848-1.c	(revision 130206)
@@ -0,0 +1,32 @@
+/* PR middle-end/23848 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+void bar1 (char *, int);
+void foo1 (int size)
+{
+  char temp[size];
+  temp[size-1] = '\0';
+  bar1 (temp, size);
+}
+
+void bar2 (char *, char *, char *, char *, int);
+void foo2 (int size)
+{
+  char temp[size];
+  temp[size-1] = '\0';
+  {
+    char temp2[size];
+    {
+      char temp3[size];
+      {
+	char temp4[size];
+	bar2 (temp, temp2, temp3, temp4, size);
+      }
+    }
+  }
+}
+
+/* { dg-final { scan-tree-dump-not "__builtin_stack_save" "optimized"} } */
+/* { dg-final { scan-tree-dump-not "__builtin_stack_restore" "optimized"} } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
--- gcc/testsuite/gcc.dg/tree-ssa/pr23848-2.c	(revision 0)
+++ gcc/testsuite/gcc.dg/tree-ssa/pr23848-2.c	(revision 130206)
@@ -0,0 +1,25 @@
+/* PR middle-end/23848 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+void bar (char *, char *, char *, char *, int);
+void foo (int size)
+{
+  char temp[size];
+  temp[size-1] = '\0';
+  {
+    char temp2[size];
+    {
+      char temp3[size];
+      {
+	char temp4[size];
+	bar (temp, temp2, temp3, temp4, size);
+      }
+    }
+    bar (temp, temp2, (char *) 0, (char *) 0, size);
+  }
+}
+
+/* { dg-final { scan-tree-dump-times "__builtin_stack_save" 1 "optimized"} } */
+/* { dg-final { scan-tree-dump-times "__builtin_stack_restore" 1 "optimized"} } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
--- gcc/testsuite/gcc.dg/tree-ssa/pr23848-3.c	(revision 0)
+++ gcc/testsuite/gcc.dg/tree-ssa/pr23848-3.c	(revision 130206)
@@ -0,0 +1,28 @@
+/* PR middle-end/23848 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+void bar (int, char *, char *, char *, char *, int);
+void foo (int size)
+{
+  int i;
+  for (i = 0; i < size; i++)
+    {
+      char temp[size];
+      temp[size-1] = '\0';
+      {
+	char temp2[size];
+	{
+	  char temp3[size];
+	  {
+	    char temp4[size];
+	    bar (i, temp, temp2, temp3, temp4, size);
+	  }
+	}
+      }
+    }
+}
+
+/* { dg-final { scan-tree-dump-times "__builtin_stack_save" 1 "optimized"} } */
+/* { dg-final { scan-tree-dump-times "__builtin_stack_restore" 1 "optimized"} } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
--- gcc/testsuite/gcc.dg/tree-ssa/pr23848-4.c	(revision 0)
+++ gcc/testsuite/gcc.dg/tree-ssa/pr23848-4.c	(revision 130206)
@@ -0,0 +1,25 @@
+/* PR middle-end/23848 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+
+void bar (char *, char *, char *, char *, int);
+void foo (int size)
+{
+  char temp[size];
+  temp[size-1] = '\0';
+  {
+    char temp2[size];
+    {
+      char temp3[size];
+      {
+	char temp4[size];
+	bar (temp, temp2, temp3, temp4, size);
+      }
+    }
+    __asm __volatile ("" : : "r" (&temp[0]), "r" (&temp2[0]) : "memory");
+  }
+}
+
+/* { dg-final { scan-tree-dump-times "__builtin_stack_save" 1 "optimized"} } */
+/* { dg-final { scan-tree-dump-times "__builtin_stack_restore" 1 "optimized"} } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */

gcc41-pr27643.patch:

--- NEW FILE gcc41-pr27643.patch ---
2007-12-18  Andrew Haley  <aph at redhat.com>

	PR java/27643
	* jcf-parse.c (java_parse_file): Remove call to
	java_mark_class_local.
	(parse_class_file): Reinstate call to java_mark_class_local here.
	* decl.c (java_mark_cni_decl_local): If the ASSEMBLER_NAME is
	already set, call java_mangle_decl() and make_decl_rtl() to
	rewrite its name as a hidden alias.

--- gcc/java/decl.c	(revision 131035)
+++ gcc/java/decl.c	(revision 131036)
@@ -1890,18 +1890,27 @@ java_mark_decl_local (tree decl)
 static void
 java_mark_cni_decl_local (tree decl)
 {
-  /* Setting DECL_LOCAL_CNI_METHOD_P changes the behavior of the mangler.
-     We expect that we should not yet have referenced this decl in a 
-     context that requires it.  Check this invariant even if we don't have
-     support for hidden aliases.  */
-  gcc_assert (!DECL_ASSEMBLER_NAME_SET_P (decl));
-
 #if !defined(HAVE_GAS_HIDDEN) || !defined(ASM_OUTPUT_DEF)
   return;
 #endif
 
   DECL_VISIBILITY (decl) = VISIBILITY_HIDDEN;
   DECL_LOCAL_CNI_METHOD_P (decl) = 1;
+
+  /* Setting DECL_LOCAL_CNI_METHOD_P changes the behavior of the
+     mangler.  We might have already referenced this native method and
+     therefore created its name, but even if we have it won't hurt.
+     We'll just go via its externally visible name, rather than its
+     hidden alias.  However, we must force things so that the correct
+     mangling is done.  */
+
+  if (DECL_ASSEMBLER_NAME_SET_P (decl))
+    java_mangle_decl (decl);
+  if (DECL_RTL_SET_P (decl))
+    {
+      SET_DECL_RTL (decl, 0);
+      make_decl_rtl (decl);
+    }
 }
 
 /* Use the preceding two functions and mark all members of the class.  */
--- gcc/java/jcf-parse.c	(revision 131035)
+++ gcc/java/jcf-parse.c	(revision 131036)
@@ -1596,6 +1596,8 @@ parse_class_file (void)
   file_start_location = input_location;
   (*debug_hooks->start_source_file) (input_line, input_filename);
 
+  java_mark_class_local (current_class);
+
   gen_indirect_dispatch_tables (current_class);
 
   for (method = TYPE_METHODS (current_class);
@@ -1967,13 +1969,6 @@ java_parse_file (int set_yydebug ATTRIBU
 	}
     }
 
-  /* Do this before lowering any code.  */
-  for (node = current_file_list; node; node = TREE_CHAIN (node))
-    {
-      if (CLASS_FILE_P (node))
-	java_mark_class_local (TREE_TYPE (node));
-    }
-
   for (node = current_file_list; node; node = TREE_CHAIN (node))
     {
       input_location = DECL_SOURCE_LOCATION (node);

gcc41-pr29225.patch:

--- NEW FILE gcc41-pr29225.patch ---
2007-11-13  Jakub Jelinek  <jakub at redhat.com>

	PR c++/29225
	* call.c (build_new_op): Call resolve_args before calling
	build_over_call.

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

--- gcc/cp/call.c	(revision 130125)
+++ gcc/cp/call.c	(revision 130126)
@@ -3918,7 +3918,10 @@ build_new_op (enum tree_code code, int f
 	  if (overloaded_p)
 	    *overloaded_p = true;
 
-	  result = build_over_call (cand, LOOKUP_NORMAL);
+	  if (resolve_args (arglist) == error_mark_node)
+	    result = error_mark_node;
+	  else
+	    result = build_over_call (cand, LOOKUP_NORMAL);
 	}
       else
 	{
--- gcc/testsuite/g++.dg/template/crash72.C	(revision 0)
+++ gcc/testsuite/g++.dg/template/crash72.C	(revision 130126)
@@ -0,0 +1,25 @@
+// PR c++/29225
+// { dg-do compile }
+
+template <typename L, typename R> bool operator< (L x, R y);
+struct T { int t (); };
+class S {};
+
+struct U
+{
+   typedef int (T::* M) ();
+   M m;
+
+   bool operator() (S &x)
+   {
+     T a;
+     return (a.*m) < x;	// { dg-error "invalid use of non-static member" }
+   }
+};
+
+void foo (S &x)
+{
+  U m;
+  m.m = &T::t;
+  m (x);
+}

gcc41-pr29712.patch:

--- NEW FILE gcc41-pr29712.patch ---
2007-01-15  Paul Thomas  <pault at gcc.gnu.org>

	PR fortran/29712
	* resolve.c (resolve_function): Only a reference to the final
	dimension of an assumed size array is an error in an inquiry
	function.

	* gfortran.dg/bound_2.f90: Reinstate commented out line.
	* gfortran.dg/initialization_1.f90: Change warning.

--- gcc/fortran/resolve.c	(revision 120789)
+++ gcc/fortran/resolve.c	(revision 120790)
@@ -1498,10 +1498,16 @@ resolve_function (gfc_expr * expr)
 	    
       for (arg = expr->value.function.actual; arg; arg = arg->next)
 	{
-	  if (inquiry && arg->next != NULL && arg->next->expr
-		&& arg->next->expr->expr_type != EXPR_CONSTANT)
-	    break;
-	  
+	  if (inquiry && arg->next != NULL && arg->next->expr)
+	    {
+	      if (arg->next->expr->expr_type != EXPR_CONSTANT)
+		break;
+
+	      if ((int)mpz_get_si (arg->next->expr->value.integer)
+			< arg->expr->rank)
+		break;
+	    }
+
 	  if (arg->expr != NULL
 		&& arg->expr->rank > 0
 		&& resolve_assumed_size_actual (arg->expr))
--- gcc/testsuite/gfortran.dg/initialization_1.f90	(revision 120789)
+++ gcc/testsuite/gfortran.dg/initialization_1.f90	(revision 120790)
@@ -27,7 +27,7 @@ contains
     integer :: l1 = len (ch1)     ! { dg-warning "assumed character length variable" }
 
 ! These are warnings because they are gfortran extensions.
-    integer :: m3 = size (x, 1)   ! { dg-warning "upper bound in the last dimension" }
+    integer :: m3 = size (x, 1)   ! { dg-warning "Evaluation of nonstandard initialization" }
     integer :: m4(2) = shape (z)  ! { dg-warning "Evaluation of nonstandard initialization" }
 
 ! This does not depend on non-constant properties.
--- gcc/testsuite/gfortran.dg/bound_2.f90	(revision 120789)
+++ gcc/testsuite/gfortran.dg/bound_2.f90	(revision 120790)
@@ -194,7 +194,7 @@ contains
   subroutine foo (x,n)
     integer :: x(7,n,2,*), n
 
-    !if (ubound(x,1) /= 7 .or. ubound(x,2) /= 4 .or. ubound(x,3) /= 2) call abort
+    if (ubound(x,1) /= 7 .or. ubound(x,2) /= 4 .or. ubound(x,3) /= 2) call abort
   end subroutine foo
 
   subroutine jackal (b, c)

gcc41-pr29978.patch:

--- NEW FILE gcc41-pr29978.patch ---
2007-12-14  Jakub Jelinek  <jakub at redhat.com>

	PR target/29978
	* config/i386/i386.c (ix86_expand_branch): Optimize LE/LEU/GT/GTU
	DImode comparisons against constant with all 1's in the lower word.

	* gcc.target/i386/pr29978.c: New test.

--- gcc/config/i386/i386.c	(revision 130937)
+++ gcc/config/i386/i386.c	(revision 130938)
@@ -10496,16 +10496,28 @@ ix86_expand_branch (enum rtx_code code, 
 
 	/* Otherwise, if we are doing less-than or greater-or-equal-than,
 	   op1 is a constant and the low word is zero, then we can just
-	   examine the high word.  */
+	   examine the high word.  Similarly for low word -1 and
+	   less-or-equal-than or greater-than.  */
 
-	if (GET_CODE (hi[1]) == CONST_INT && lo[1] == const0_rtx)
+	if (GET_CODE (hi[1]) == CONST_INT)
 	  switch (code)
 	    {
 	    case LT: case LTU: case GE: case GEU:
-	      ix86_compare_op0 = hi[0];
-	      ix86_compare_op1 = hi[1];
-	      ix86_expand_branch (code, label);
-	      return;
+	      if (lo[1] == const0_rtx)
+		{
+		  ix86_compare_op0 = hi[0];
+		  ix86_compare_op1 = hi[1];
+		  ix86_expand_branch (code, label);
+		  return;
+		}
+	    case LE: case LEU: case GT: case GTU:
+	      if (lo[1] == constm1_rtx)
+		{
+		  ix86_compare_op0 = hi[0];
+		  ix86_compare_op1 = hi[1];
+		  ix86_expand_branch (code, label);
+		  return;
+		}
 	    default:
 	      break;
 	    }
--- gcc/testsuite/gcc.target/i386/pr29978.c	(revision 0)
+++ gcc/testsuite/gcc.target/i386/pr29978.c	(revision 130938)
@@ -0,0 +1,16 @@
+/* PR target/29978 */
+/* { dg-do compile } */
+/* { dg-options "-Os" } */
+
+void g ();
+
+void
+f (long long v)
+{
+  if (v > 0xfffffffffLL)
+    g ();
+  g ();
+}
+
+/* Verify there are no redundant jumps jl .L2; jle .L2 */
+/* { dg-final { scan-assembler-not "jl\[^e\]*\\.L" { target ilp32 } } } */

gcc41-pr30293.patch:

--- NEW FILE gcc41-pr30293.patch ---
2007-11-23  Jakub Jelinek  <jakub at redhat.com>

	PR c++/30293
	PR c++/30294
	* decl.c (cp_finish_decl): Disallow variable or field
	definitions if extern "Java" aggregates.
	(grokparms): Disallow parameters with extern "Java"
	aggregates.
	(check_function_type): Disallow function return values
	with extern "Java" aggregates.
	* init.c (build_new_1): Disallow placement new with
	extern "Java" aggregates.

	* g++.dg/ext/java-2.C: New test.

--- gcc/cp/decl.c.jj	2007-11-19 17:46:41.000000000 +0100
+++ gcc/cp/decl.c	2007-11-22 13:34:52.000000000 +0100
@@ -5349,6 +5349,20 @@ cp_finish_decl (tree decl, tree init, bo
 	     is *not* defined.  */
 	  && (!DECL_EXTERNAL (decl) || init))
 	{
+	  if (TYPE_FOR_JAVA (type) && IS_AGGR_TYPE (type))
+	    {
+	      tree jclass
+		= IDENTIFIER_GLOBAL_VALUE (get_identifier ("jclass"));
+	      /* Allow libjava/prims.cc define primitive classes.  */
+	      if (init != NULL_TREE
+		  || jclass == NULL_TREE
+		  || TREE_CODE (jclass) != TYPE_DECL
+		  || !POINTER_TYPE_P (TREE_TYPE (jclass))
+		  || !same_type_ignoring_top_level_qualifiers_p
+					(type, TREE_TYPE (TREE_TYPE (jclass))))
+		error ("Java object %qD not allocated with %<new%>", decl);
+	      init = NULL_TREE;
+	    }
 	  if (init)
 	    {
 	      DECL_NONTRIVIALLY_INITIALIZED_P (decl) = 1;
@@ -5419,6 +5433,9 @@ cp_finish_decl (tree decl, tree init, bo
       else if (TREE_CODE (type) == ARRAY_TYPE)
 	layout_type (type);
     }
+  else if (TREE_CODE (decl) == FIELD_DECL
+	   && TYPE_FOR_JAVA (type) && IS_AGGR_TYPE (type))
+    error ("non-static data member %qD has Java class type", decl);
 
   /* Add this declaration to the statement-tree.  This needs to happen
      after the call to check_initializer so that the DECL_EXPR for a
@@ -8993,6 +9010,16 @@ grokparms (cp_parameter_declarator *firs
 	  TREE_TYPE (decl) = error_mark_node;
 	}
 
+      if (type != error_mark_node
+	  && TYPE_FOR_JAVA (type)
+	  && IS_AGGR_TYPE (type))
+	{
+	  error ("parameter %qD has Java class type", decl);
+	  type = error_mark_node;
+	  TREE_TYPE (decl) = error_mark_node;
+	  init = NULL_TREE;
+	}
+
       if (type != error_mark_node)
 	{
 	  /* Top-level qualifiers on the parameters are
@@ -10465,11 +10492,15 @@ check_function_type (tree decl, tree cur
 
   if (dependent_type_p (return_type))
     return;
-  if (!COMPLETE_OR_VOID_TYPE_P (return_type))
+  if (!COMPLETE_OR_VOID_TYPE_P (return_type)
+      || (TYPE_FOR_JAVA (return_type) && IS_AGGR_TYPE (return_type)))
     {
       tree args = TYPE_ARG_TYPES (fntype);
-	  
-      error ("return type %q#T is incomplete", return_type);
+
+      if (!COMPLETE_OR_VOID_TYPE_P (return_type))
+	error ("return type %q#T is incomplete", return_type);
+      else
+	error ("return type has Java class type %q#T", return_type);
 
       /* Make it return void instead.  */
       if (TREE_CODE (fntype) == METHOD_TYPE)
--- gcc/cp/init.c.jj	2007-09-20 21:26:48.000000000 +0200
+++ gcc/cp/init.c	2007-11-22 10:49:47.000000000 +0100
@@ -1786,6 +1786,11 @@ build_new_1 (tree placement, tree type, 
 		    (alloc_fn,
 		     build_tree_list (NULL_TREE, class_addr)));
     }
+  else if (TYPE_FOR_JAVA (elt_type))
+    {
+      error ("Java class %q#T object allocated using placement new", elt_type);
+      return error_mark_node;
+    }
   else
     {
       tree fnname;
--- gcc/testsuite/g++.dg/ext/java-2.C.jj	2007-11-22 10:55:10.000000000 +0100
+++ gcc/testsuite/g++.dg/ext/java-2.C	2007-11-22 10:54:59.000000000 +0100
@@ -0,0 +1,79 @@
+// PR c++/30293
+// PR c++/30294
+// { dg-do compile }
+// { dg-options "" }
+
+extern "Java" {
+typedef __java_byte jbyte;
+namespace java {
+namespace lang {
+  class Object {};
+  class Class {};
+}
+}
+typedef struct java::lang::Object* jobject;
+typedef java::lang::Class *jclass;
+}
+extern "C" jobject _Jv_AllocObject (jclass);
+
+extern "Java" {
+  struct A { static java::lang::Class class$; };
+}
+
+struct B {
+  A a;		// { dg-error "has Java class type" }
+};
+
+void* operator new (__SIZE_TYPE__, void*) throw();
+char buf[1024];
+
+A a;		// { dg-error "not allocated with" }
+A b = A ();	// { dg-error "not allocated with" }
+A *c = new ((void *) buf) A ();	// { dg-error "using placement new" }
+A *d = new A ();
+jbyte e = 6;
+
+const A fn1 ()	// { dg-error "return type has Java class type" }
+{
+  A a;		// { dg-error "not allocated with" }
+  return a;
+}
+
+A fn2 ()	// { dg-error "return type has Java class type" }
+{
+  A a;		// { dg-error "not allocated with" }
+  return a;
+}
+
+A *fn3 ()
+{
+  return new A ();
+}
+
+A &fn4 ()
+{
+  return *c;
+}
+
+jbyte fn5 ()
+{
+  return 7;
+}
+
+void fn6 (A x)	// { dg-error "has Java class type" }
+{
+}
+
+void fn7 (const A x)	// { dg-error "has Java class type" }
+{
+}
+
+void fn8 (A *x)
+{
+  (void) x;
+}
+
+void fn9 (jbyte x)
+{
+  (void) x;
+}

gcc41-pr30988.patch:

--- NEW FILE gcc41-pr30988.patch ---
2007-11-18  Jakub Jelinek  <jakub at redhat.com>

	PR c++/30988
	* semantics.c (finish_call_expr): Set
	current_function_returns_abnormally if fn is noreturn FUNCTION_DECL
	or OVERLOAD with all noreturn functions.

	* g++.dg/warn/noreturn-4.C: New test.
	* g++.dg/warn/noreturn-5.C: New test.
	* g++.dg/warn/noreturn-6.C: New test.
	* g++.dg/warn/noreturn-7.C: New test.

--- gcc/cp/semantics.c	(revision 130279)
+++ gcc/cp/semantics.c	(revision 130280)
@@ -1846,6 +1846,20 @@ finish_call_expr (tree fn, tree args, bo
 	{
 	  result = build_nt_call_list (fn, args);
 	  KOENIG_LOOKUP_P (result) = koenig_p;
+	  if (cfun)
+	    {
+	      do
+		{
+		  tree fndecl = OVL_CURRENT (fn);
+		  if (TREE_CODE (fndecl) != FUNCTION_DECL
+		      || !TREE_THIS_VOLATILE (fndecl))
+		    break;
+		  fn = OVL_NEXT (fn);
+		}
+	      while (fn);
+	      if (!fn)
+		current_function_returns_abnormally = 1;
+	    }
 	  return result;
 	}
       if (!BASELINK_P (fn)
--- gcc/testsuite/g++.dg/warn/noreturn-4.C	(revision 0)
+++ gcc/testsuite/g++.dg/warn/noreturn-4.C	(revision 130280)
@@ -0,0 +1,13 @@
+// PR c++/30988
+// { dg-do compile }
+// { dg-options "-O2 -Wall" }
+
+void f (const char *) __attribute__ ((noreturn));
+
+template <typename T> struct A
+{
+  int g ()
+  {
+    f (__FUNCTION__);
+  }
+};
--- gcc/testsuite/g++.dg/warn/noreturn-5.C	(revision 0)
+++ gcc/testsuite/g++.dg/warn/noreturn-5.C	(revision 130280)
@@ -0,0 +1,15 @@
+// PR c++/30988
+// { dg-do compile }
+// { dg-options "-O2 -Wall" }
+
+void f (const char *) __attribute__ ((noreturn));
+void f (int) __attribute__ ((noreturn));
+void f (double) __attribute__ ((noreturn));
+
+template <typename T> struct A
+{
+  int g ()
+  {
+    f ((T) 0);
+  }
+};
--- gcc/testsuite/g++.dg/warn/noreturn-6.C	(revision 0)
+++ gcc/testsuite/g++.dg/warn/noreturn-6.C	(revision 130280)
@@ -0,0 +1,13 @@
+// PR c++/30988
+// { dg-do compile }
+// { dg-options "-O2 -Wall" }
+
+void f (const char *);
+
+template <typename T> struct A
+{
+  int g ()
+  {
+    f (__FUNCTION__);
+  }	// { dg-warning "no return statement in function returning non-void" }
+};
--- gcc/testsuite/g++.dg/warn/noreturn-7.C	(revision 0)
+++ gcc/testsuite/g++.dg/warn/noreturn-7.C	(revision 130280)
@@ -0,0 +1,15 @@
+// PR c++/30988
+// { dg-do compile }
+// { dg-options "-O2 -Wall" }
+
+void f (const char *) __attribute__ ((noreturn));
+void f (int);
+void f (double) __attribute__ ((noreturn));
+
+template <typename T> struct A
+{
+  int g ()
+  {
+    f ((T) 0);
+  }	// { dg-warning "no return statement in function returning non-void" }
+};

gcc41-pr31483.patch:

--- NEW FILE gcc41-pr31483.patch ---
2007-04-05  Paul Thomas  <pault at gcc.gnu.org>

	PR fortran/31483
	* trans-expr.c (gfc_conv_function_call): Give a dummy
	procedure the correct type if it has alternate returns.

	* gfortran.dg/altreturn_5.f90: New test.

--- gcc/fortran/trans-expr.c	(revision 123517)
+++ gcc/fortran/trans-expr.c	(revision 123518)
@@ -2154,17 +2154,23 @@ gfc_conv_function_call (gfc_se * se, gfc
 
   /* Generate the actual call.  */
   gfc_conv_function_val (se, sym);
+
   /* If there are alternate return labels, function type should be
      integer.  Can't modify the type in place though, since it can be shared
-     with other functions.  */
+     with other functions.  For dummy arguments, the typing is done to
+     this result, even if it has to be repeated for each call.  */
   if (has_alternate_specifier
       && TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) != integer_type_node)
     {
-      gcc_assert (! sym->attr.dummy);
-      TREE_TYPE (sym->backend_decl)
-        = build_function_type (integer_type_node,
-                               TYPE_ARG_TYPES (TREE_TYPE (sym->backend_decl)));
-      se->expr = gfc_build_addr_expr (NULL, sym->backend_decl);
+      if (!sym->attr.dummy)
+	{      
+	  TREE_TYPE (sym->backend_decl)
+	    = build_function_type (integer_type_node,
+			     TYPE_ARG_TYPES (TREE_TYPE (sym->backend_decl)));
+	  se->expr = gfc_build_addr_expr (NULL, sym->backend_decl);
+	}
+      else
+	TREE_TYPE (TREE_TYPE (TREE_TYPE (se->expr))) = integer_type_node;
     }
 
   fntype = TREE_TYPE (TREE_TYPE (se->expr));
--- gcc/testsuite/gfortran.dg/altreturn_5.f90	(revision 0)
+++ gcc/testsuite/gfortran.dg/altreturn_5.f90	(revision 123518)
@@ -0,0 +1,31 @@
+! { dg-do run }
+! Tests the fix for PR31483, in which dummy argument procedures
+! produced an ICE if they had an alternate return.
+!
+! Contributed by Mathias Fröhlich <M.Froehlich at science-computing.de>
+
+      SUBROUTINE R (i, *, *)
+      INTEGER i
+      RETURN i
+      END
+
+      SUBROUTINE PHLOAD (READER, i, res)
+      IMPLICIT NONE
+      EXTERNAL         READER
+      integer i
+      character(3) res
+      CALL READER (i, *1, *2)
+ 1    res = "one"
+      return
+ 2    res = "two"
+      return
+      END
+
+      EXTERNAL R
+      character(3) res
+      call PHLOAD (R, 1, res)
+      if (res .ne. "one") call abort ()
+      CALL PHLOAD (R, 2, res)
+      if (res .ne. "two") call abort ()
+      END
+

gcc41-pr32241.patch:

--- NEW FILE gcc41-pr32241.patch ---
2007-11-10  Jakub Jelinek  <jakub at redhat.com>

	PR c++/32241
	* pt.c (tsubst_copy_and_build) <case COMPONENT_REF>: If object_type
	is not scalar type, let finish_class_member_access_expr handle
	diagnostics.  Pass BIT_NOT_EXPR argument to
	finish_pseudo_destructor_expr.  Handle SCOPE_REF properly.

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

--- gcc/cp/pt.c	(revision 130065)
+++ gcc/cp/pt.c	(revision 130066)
@@ -11004,15 +11004,23 @@ tsubst_copy_and_build (tree t,
 
 	if (object_type && !CLASS_TYPE_P (object_type))
 	  {
-	    if (TREE_CODE (member) == BIT_NOT_EXPR)
-	      return finish_pseudo_destructor_expr (object,
-						    NULL_TREE,
-						    object_type);
-	    else if (TREE_CODE (member) == SCOPE_REF
-		     && (TREE_CODE (TREE_OPERAND (member, 1)) == BIT_NOT_EXPR))
-	      return finish_pseudo_destructor_expr (object,
-						    object,
-						    object_type);
+	    if (SCALAR_TYPE_P (object_type))
+	      {
+		tree s = NULL_TREE;
+		tree dtor = member;
+
+		if (TREE_CODE (dtor) == SCOPE_REF)
+		  {
+		    s = TREE_OPERAND (dtor, 0);
+		    dtor = TREE_OPERAND (dtor, 1);
+		  }
+		if (TREE_CODE (dtor) == BIT_NOT_EXPR)
+		  {
+		    dtor = TREE_OPERAND (dtor, 0);
+		    if (TYPE_P (dtor))
+		      return finish_pseudo_destructor_expr (object, s, dtor);
+		  }
+	      }
 	  }
 	else if (TREE_CODE (member) == SCOPE_REF
 		 && TREE_CODE (TREE_OPERAND (member, 1)) == TEMPLATE_ID_EXPR)
--- gcc/testsuite/g++.dg/template/pseudodtor3.C	(revision 0)
+++ gcc/testsuite/g++.dg/template/pseudodtor3.C	(revision 130066)
@@ -0,0 +1,43 @@
+// PR c++/32241
+// { dg-do compile }
+
+struct A
+{
+  typedef int T;
+  T &foo ();
+  A () { foo.~T (); }	// { dg-error "does not have class type|expected" }
+};
+
+template <typename T> struct B
+{
+  T &foo ();
+  B () { foo.~T (); }	// { dg-error "invalid use of member" }
+};
+
+B<int> b;
+
+template <typename T, typename S> struct C
+{
+  T t;
+  C () { t.~S (); }	// { dg-error "is not of type" }
+};
+
+C<int, long int> c;
+
+template <typename T> struct D
+{
+  T t;
+  typedef long int U;
+  D () { t.~U (); }	// { dg-error "is not of type" }
+};
+
+D<int> d;
+
+template <typename T> struct E
+{
+  T &foo ();
+  typedef long int U;
+  E () { foo.~U (); }	// { dg-error "is not of type" }
+};
+
+E<int> e;

gcc41-pr32384.patch:

--- NEW FILE gcc41-pr32384.patch ---
2007-11-01  Jakub Jelinek  <jakub at redhat.com>

	PR c++/32384
	* parser.c (cp_parser_postfix_dot_deref_expression): If
	POSTFIX_EXPRESSION is type dependent, try to parse it as pseudo dtor
	first and if that succeeds and type is SCALAR_TYPE_P, create
	PSEUDO_DTOR_EXPR.

	* g++.dg/template/pseudodtor1.C: New test.
	* g++.dg/template/pseudodtor2.C: New test.

--- gcc/cp/parser.c	(revision 129835)
+++ gcc/cp/parser.c	(revision 129836)
@@ -4850,8 +4850,10 @@ cp_parser_postfix_dot_deref_expression (
   pseudo_destructor_p = false;
 
   /* If the SCOPE is a scalar type, then, if this is a valid program,
-     we must be looking at a pseudo-destructor-name.  */
-  if (scope && SCALAR_TYPE_P (scope))
+     we must be looking at a pseudo-destructor-name.  If POSTFIX_EXPRESSION
+     is type dependent, it can be pseudo-destructor-name or something else.
+     Try to parse it as pseudo-destructor-name first.  */
+  if ((scope && SCALAR_TYPE_P (scope)) || dependent_p)
     {
       tree s;
       tree type;
@@ -4860,7 +4862,12 @@ cp_parser_postfix_dot_deref_expression (
       /* Parse the pseudo-destructor-name.  */
       s = NULL_TREE;
       cp_parser_pseudo_destructor_name (parser, &s, &type);
-      if (cp_parser_parse_definitely (parser))
+      if (dependent_p
+	  && (cp_parser_error_occurred (parser)
+	      || TREE_CODE (type) != TYPE_DECL
+	      || !SCALAR_TYPE_P (TREE_TYPE (type))))
+	cp_parser_abort_tentative_parse (parser);
+      else if (cp_parser_parse_definitely (parser))
 	{
 	  pseudo_destructor_p = true;
 	  postfix_expression
--- gcc/testsuite/g++.dg/template/pseudodtor1.C	(revision 0)
+++ gcc/testsuite/g++.dg/template/pseudodtor1.C	(revision 129836)
@@ -0,0 +1,44 @@
+// PR c++/32384
+// { dg-do compile }
+
+struct A
+{
+  typedef int T;
+  T foo ();
+
+  A () { foo ().~T (); }
+};
+
+template<typename> struct B
+{
+  typedef int T;
+  T foo ();
+
+  B () { foo ().~T (); }
+};
+
+template<typename T> struct C
+{
+  T t;
+  C () { t.~T (); }
+};
+
+template<typename S> struct D
+{
+  typedef int T;
+  S foo ();
+
+  D () { foo ().~T(); }
+};
+
+struct Z
+{
+  Z () {}
+  ~Z () {}
+};
+
+A a;
+B<int> b;
+C<int> c1;
+C<Z> c2;
+D<int> d;
--- gcc/testsuite/g++.dg/template/pseudodtor2.C	(revision 0)
+++ gcc/testsuite/g++.dg/template/pseudodtor2.C	(revision 129836)
@@ -0,0 +1,18 @@
+// PR c++/32384
+// { dg-do compile }
+
+template<typename S> struct D
+{
+  typedef int T;
+  S foo ();
+
+  D () { foo ().~T(); }		// { dg-error "is not of type" }
+};
+
+struct Z
+{
+  Z () {}
+  ~Z () {}
+};
+
+D<Z> d;

gcc41-pr33501.patch:

--- NEW FILE gcc41-pr33501.patch ---
2007-11-07  Jakub Jelinek  <jakub at redhat.com>

	PR c++/33501
	* call.c (build_over_call): Don't check TREE_ADDRESSABLE
	on incomplete type.

	* g++.dg/warn/incomplete2.C: New test.
	* g++.dg/template/incomplete4.C: New test.
	* g++.dg/template/incomplete5.C: New test.

--- gcc/cp/call.c	(revision 129967)
+++ gcc/cp/call.c	(revision 129968)
@@ -4993,7 +4993,8 @@ build_over_call (struct z_candidate *can
 
       /* Don't make a copy here if build_call is going to.  */
       if (conv->kind == ck_rvalue
-	  && !TREE_ADDRESSABLE (complete_type (type)))
+	  && COMPLETE_TYPE_P (complete_type (type))
+	  && !TREE_ADDRESSABLE (type))
 	conv = conv->u.next;
 
       val = convert_like_with_context
--- gcc/testsuite/g++.dg/warn/incomplete2.C	(revision 0)
+++ gcc/testsuite/g++.dg/warn/incomplete2.C	(revision 129968)
@@ -0,0 +1,13 @@
+// PR c++/33501
+// { dg-do compile }
+
+class A;	// { dg-error "forward declaration" }
+
+int f (A);
+const A &make ();
+
+int
+main ()
+{
+  return f (make ());	// { dg-error "invalid use of undefined type|initializing argument" }
+}
--- gcc/testsuite/g++.dg/template/incomplete5.C	(revision 0)
+++ gcc/testsuite/g++.dg/template/incomplete5.C	(revision 129968)
@@ -0,0 +1,17 @@
+// PR c++/33501
+// { dg-do compile }
+
+class A;	// { dg-error "forward declaration" }
+
+template <typename T> struct X
+{
+  static int f (T);
+  static const T &make ();
+  static const bool value = sizeof (f (make ())) == sizeof (int);	// { dg-error "invalid use of undefined type|initializing argument" }
+};
+
+int
+main ()
+{
+  return X <A>::value;
+}
--- gcc/testsuite/g++.dg/template/incomplete4.C	(revision 0)
+++ gcc/testsuite/g++.dg/template/incomplete4.C	(revision 129968)
@@ -0,0 +1,16 @@
+// PR c++/33501
+// { dg-do compile }
+
+class A;	// { dg-error "forward declaration" }
+
+template <typename T> struct X
+{
+  static int f (T);
+  static const T &make ();
+};
+
+int
+main ()
+{
+  return X<A>::f (X<A>::make ());	// { dg-error "invalid use of undefined type|initializing argument" }
+}

gcc41-pr33516.patch:

--- NEW FILE gcc41-pr33516.patch ---
2007-11-02  Jakub Jelinek  <jakub at redhat.com>

	PR c++/33516
	* parser.c (cp_parser_nested_name_specifier_opt): Use
	TYPE_MAIN_VARIANT (new_scope) as scope if new_scope is an incomplete
	typedef of currently open class.

	* g++.dg/lookup/typedef1.C: New test.

--- gcc/cp/parser.c	(revision 129861)
+++ gcc/cp/parser.c	(revision 129862)
@@ -4085,7 +4085,15 @@ cp_parser_nested_name_specifier_opt (cp_
 	  && !COMPLETE_TYPE_P (new_scope)
 	  /* Do not try to complete dependent types.  */
 	  && !dependent_type_p (new_scope))
-	new_scope = complete_type (new_scope);
+	{
+	  new_scope = complete_type (new_scope);
+	  /* If it is a typedef to current class, use the current
+	     class instead, as the typedef won't have any names inside
+	     it yet.  */
+	  if (!COMPLETE_TYPE_P (new_scope)
+	      && currently_open_class (new_scope))
+	    new_scope = TYPE_MAIN_VARIANT (new_scope);
+	}
       /* Make sure we look in the right scope the next time through
 	 the loop.  */
       parser->scope = new_scope;
--- gcc/testsuite/g++.dg/lookup/typedef1.C	(revision 0)
+++ gcc/testsuite/g++.dg/lookup/typedef1.C	(revision 129862)
@@ -0,0 +1,32 @@
+// PR c++/33516
+// { dg-do compile }
+
+struct S1;
+typedef S1 T1;
+struct S1 {
+  typedef int U;
+  T1::U i;
+};
+struct S2;
+typedef S2 T2;
+struct S2 {
+  typedef int U;
+};
+T2::U j;
+struct S3;
+typedef S3 T3;
+struct S3 {
+  typedef int U;
+  S3::U i;
+};
+
+void
+foo ()
+{
+  S1 s1;
+  S2 s2;
+  S3 s3;
+  s1.i = 6;
+  j = 7;
+  s3.i = 8;
+}

gcc41-pr33537.patch:

--- NEW FILE gcc41-pr33537.patch ---
2007-11-01  Jakub Jelinek  <jakub at redhat.com>

	PR debug/33537
	* dwarf2out.c (gen_formal_parameter_die, gen_variable_die,
	gen_decl_die): Use TREE_TYPE (TREE_TYPE (decl)) as type
	rather than TREE_TYPE (decl) if DECL_BY_REFERENCE (decl).

--- gcc/dwarf2out.c	(revision 129819)
+++ gcc/dwarf2out.c	(revision 129820)
@@ -11832,8 +11832,11 @@ gen_formal_parameter_die (tree node, dw_
 	add_abstract_origin_attribute (parm_die, origin);
       else
 	{
+	  tree type = TREE_TYPE (node);
 	  add_name_and_src_coords_attributes (parm_die, node);
-	  add_type_attribute (parm_die, TREE_TYPE (node),
+	  if (DECL_BY_REFERENCE (node))
+	    type = TREE_TYPE (type);
+	  add_type_attribute (parm_die, type,
 			      TREE_READONLY (node),
 			      TREE_THIS_VOLATILE (node),
 			      context_die);
@@ -12437,8 +12440,14 @@ gen_variable_die (tree decl, dw_die_ref 
     }
   else
     {
+      tree type = TREE_TYPE (decl);
+      if ((TREE_CODE (decl) == PARM_DECL
+	   || TREE_CODE (decl) == RESULT_DECL)
+	  && DECL_BY_REFERENCE (decl))
+	type = TREE_TYPE (type);
+
       add_name_and_src_coords_attributes (var_die, decl);
-      add_type_attribute (var_die, TREE_TYPE (decl), TREE_READONLY (decl),
+      add_type_attribute (var_die, type, TREE_READONLY (decl),
 			  TREE_THIS_VOLATILE (decl), context_die);
 
       if (TREE_PUBLIC (decl))
@@ -13694,7 +13703,10 @@ gen_decl_die (tree decl, dw_die_ref cont
 
       /* Output any DIEs that are needed to specify the type of this data
 	 object.  */
-      gen_type_die (TREE_TYPE (decl), context_die);
+      if (TREE_CODE (decl) == RESULT_DECL && DECL_BY_REFERENCE (decl))
+	gen_type_die (TREE_TYPE (TREE_TYPE (decl)), context_die);
+      else
+	gen_type_die (TREE_TYPE (decl), context_die);
 
       /* And its containing type.  */
       origin = decl_class_context (decl);
@@ -13728,7 +13740,10 @@ gen_decl_die (tree decl, dw_die_ref cont
       break;
 
     case PARM_DECL:
-      gen_type_die (TREE_TYPE (decl), context_die);
+      if (DECL_BY_REFERENCE (decl))
+	gen_type_die (TREE_TYPE (TREE_TYPE (decl)), context_die);
+      else
+	gen_type_die (TREE_TYPE (decl), context_die);
       gen_formal_parameter_die (decl, context_die);
       break;
 

gcc41-pr33616.patch:

--- NEW FILE gcc41-pr33616.patch ---
2007-10-30  Jakub Jelinek  <jakub at redhat.com>

	PR c++/33616
	* decl2.c (build_offset_ref_call_from_tree): Call
	build_non_dependent_expr on object prior to building ADDR_EXPR from it
	if FN is DOTSTAR_EXPR.

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

--- gcc/cp/decl2.c	(revision 129783)
+++ gcc/cp/decl2.c	(revision 129784)
@@ -3499,9 +3499,9 @@ build_offset_ref_call_from_tree (tree fn
 	 parameter.  That must be done before the FN is transformed
 	 because we depend on the form of FN.  */
       args = build_non_dependent_args (args);
+      object = build_non_dependent_expr (object);
       if (TREE_CODE (fn) == DOTSTAR_EXPR)
 	object = build_unary_op (ADDR_EXPR, object, 0);
-      object = build_non_dependent_expr (object);
       args = tree_cons (NULL_TREE, object, args);
       /* Now that the arguments are done, transform FN.  */
       fn = build_non_dependent_expr (fn);
--- gcc/testsuite/g++.dg/template/ptrmem18.C	(revision 0)
+++ gcc/testsuite/g++.dg/template/ptrmem18.C	(revision 129784)
@@ -0,0 +1,49 @@
+// PR c++/33616
+// { dg-do run }
+// { dg-options "-O2" }
+
+extern "C" void abort ();
+
+struct S {
+  int c;
+  S () : c (0) {}
+  virtual void f1 () { c += 1; }
+  virtual void f2 () { c += 16; }
+};
+
+struct T {
+  S s;
+};
+
+typedef void (S::*Q) ();
+
+template <Q P>
+void test1 (T *t)
+{
+  (t->s.*P)();
+}
+
+template <Q P>
+void test2 (T *t)
+{
+  S &s = t->s;
+  (s.*P)();
+}
+
+int
+main ()
+{
+  T t;
+  test1 <&S::f1> (&t);
+  if (t.s.c != 1)
+    abort ();
+  test1 <&S::f2> (&t);
+  if (t.s.c != 17)
+    abort ();
+  test2 <&S::f1> (&t);
+  if (t.s.c != 18)
+    abort ();
+  test2 <&S::f2> (&t);
+  if (t.s.c != 34)
+    abort ();
+}

gcc41-pr33723.patch:

--- NEW FILE gcc41-pr33723.patch ---
2007-10-29  Jakub Jelinek  <jakub at redhat.com>

	PR tree-optimization/33723
	* c-gimplify.c (c_gimplify_expr): Optimize INIT_EXPR or
	MODIFY_EXPR with non-addressable COMPOUND_LITERAL_EXPR as source.

2007-11-20  Jakub Jelinek  <jakub at redhat.com>

	PR testsuite/33978
	* gcc.dg/tree-ssa/pr33723.c: Adjust scan pattern to make it less
	dependent on target settings like move_by_pieces etc.

2007-10-30  Jakub Jelinek  <jakub at redhat.com>

	PR tree-optimization/33723
	* gcc.dg/tree-ssa/pr33723.c (T): Decrease size of field s.

2007-10-29  Jakub Jelinek  <jakub at redhat.com>

	PR tree-optimization/33723
	* gcc.c-torture/execute/20071029-1.c: New test.
	* gcc.dg/tree-ssa/pr33723.c: New test.

--- gcc/c-gimplify.c	(revision 129742)
+++ gcc/c-gimplify.c	(revision 129743)
@@ -233,6 +233,29 @@ c_gimplify_expr (tree *expr_p, tree *pre
     case COMPOUND_LITERAL_EXPR:
       return gimplify_compound_literal_expr (expr_p, pre_p);
 
+    case INIT_EXPR:
+    case MODIFY_EXPR:
+      if (TREE_CODE (TREE_OPERAND (*expr_p, 1)) == COMPOUND_LITERAL_EXPR)
+	{
+	  tree complit = TREE_OPERAND (*expr_p, 1);
+	  tree decl_s = COMPOUND_LITERAL_EXPR_DECL_STMT (complit);
+	  tree decl = DECL_EXPR_DECL (decl_s);
+	  tree init = DECL_INITIAL (decl);
+
+	  /* struct T x = (struct T) { 0, 1, 2 } can be optimized
+	     into struct T x = { 0, 1, 2 } if the address of the
+	     compound literal has never been taken.  */
+	  if (!TREE_ADDRESSABLE (complit)
+	      && !TREE_ADDRESSABLE (decl)
+	      && init)
+	    {
+	      *expr_p = copy_node (*expr_p);
+	      TREE_OPERAND (*expr_p, 1) = init;
+	      return GS_OK;
+	    }
+	}
+      return GS_UNHANDLED;
+
     default:
       return GS_UNHANDLED;
     }
--- gcc/testsuite/gcc.c-torture/execute/20071029-1.c	(revision 0)
+++ gcc/testsuite/gcc.c-torture/execute/20071029-1.c	(revision 129743)
@@ -0,0 +1,56 @@
+extern void exit (int);
+extern void abort (void);
+
+typedef union
+{
+  struct
+  {
+    int f1, f2, f3, f4, f5, f6, f7, f8;
+    long int f9, f10;
+    int f11;
+  } f;
+  char s[56];
+  long int a;
+} T;
+
+__attribute__((noinline))
+void
+test (T *t)
+{
+  static int i = 11;
+  if (t->f.f1 != i++)
+    abort ();
+  if (t->f.f2 || t->f.f3 || t->f.f4 || t->f.f5 || t->f.f6
+      || t->f.f7 || t->f.f8 || t->f.f9 || t->f.f10 || t->f.f11)
+    abort ();
+  if (i == 20)
+    exit (0);
+}
+
+__attribute__((noinline))
+void
+foo (int i)
+{
+  T t;
+again:
+  t = (T) { { ++i, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
+  test (&t);
+  goto again;
+}
+
+int
+main (void)
+{
+  T *t1, *t2;
+  int cnt = 0;
+  t1 = (T *) 0;
+loop:
+  t2 = t1;
+  t1 = & (T) { .f.f9 = cnt++ };
+  if (cnt < 3)
+    goto loop;
+  if (t1 != t2 || t1->f.f9 != 2)
+    abort ();
+  foo (10);
+  return 0;
+}
--- gcc/testsuite/gcc.dg/tree-ssa/pr33723.c	(revision 0)
+++ gcc/testsuite/gcc.dg/tree-ssa/pr33723.c	(revision 129743)
@@ -0,0 +1,72 @@
+/* PR tree-optimization/33723 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-gimple" } */
+
+typedef union
+{
+  struct
+  {
+    int f1, f2, f3, f4, f5, f6, f7, f8;
+    long int f9, f10;
+    int f11;
+  } f;
+  char s[4];
+  long int a;
+} T;
+
+void
+foo1 (void)
+{
+  T t;
+  t = (T) { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
+  test (&t);
+}
+
+void
+bar1 (void)
+{
+  T t = { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
+  test (&t);
+}
+
+void
+baz1 (void)
+{
+  T t;
+  t = (const T) { { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 } };
+  test (&t);
+}
+
+void
+foo2 (void)
+{
+  T t;
+  t = (T) { { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 } };
+  test (&t);
+}
+
+void
+bar2 (void)
+{
+  T t = { { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 } };
+  test (&t);
+}
+
+void
+baz2 (void)
+{
+  T t;
+  t = (const T) { { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 } };
+  test (&t);
+}
+
+void
+baz3 (void)
+{
+  T t;
+  t = (const T) (T) { { 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11 } };
+  test (&t);
+}
+
+/* { dg-final { scan-tree-dump-not "t = D" "gimple"} } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */

gcc41-pr33836.patch:

--- NEW FILE gcc41-pr33836.patch ---
2007-11-05  Jakub Jelinek  <jakub at redhat.com>

	PR c++/33836
	* parser.c (cp_parser_unary_expression): For &&label call
	cp_parser_non_integral_constant_expression and return error_mark_node
	if it returned true.

	* g++.dg/ext/label10.C: New test.

--- gcc/cp/parser.c	(revision 129895)
+++ gcc/cp/parser.c	(revision 129896)
@@ -5329,13 +5329,18 @@ cp_parser_unary_expression (cp_parser *p
 	       && token->type == CPP_AND_AND)
 	{
 	  tree identifier;
+	  tree expression;
 
 	  /* Consume the '&&' token.  */
 	  cp_lexer_consume_token (parser->lexer);
 	  /* Look for the identifier.  */
 	  identifier = cp_parser_identifier (parser);
 	  /* Create an expression representing the address.  */
-	  return finish_label_address_expr (identifier);
+	  expression = finish_label_address_expr (identifier);
+	  if (cp_parser_non_integral_constant_expression (parser,
+						"the address of a label"))
+	    expression = error_mark_node;
+	  return expression;
 	}
     }
   if (unary_operator != ERROR_MARK)
--- gcc/testsuite/g++.dg/ext/label10.C	(revision 0)
+++ gcc/testsuite/g++.dg/ext/label10.C	(revision 129896)
@@ -0,0 +1,17 @@
+// PR c++/33836
+// { dg-do compile }
+// { dg-options "-std=gnu++98" }
+
+template<int N> struct A
+{
+  enum { M = && N };	// { dg-error "referenced outside|cannot appear in" }
+};
+
+A<0> a;
+
+void foo ()
+{
+  __label__ P;
+  enum { O = && P };	// { dg-error "cannot appear in" }
+  P:;
+}

gcc41-pr33842.patch:

--- NEW FILE gcc41-pr33842.patch ---
2007-10-27  Jakub Jelinek  <jakub at redhat.com>

	PR c++/33842
	* cxx-pretty-print.h (pp_cxx_offsetof_expression): New prototype.
	* cxx-pretty-print.c (pp_cxx_primary_expression): Handle
	OFFSETOF_EXPR.
	(pp_cxx_offsetof_expression_1, pp_cxx_offsetof_expression): New
	functions.
	* error.c (dump_expr): Handle OFFSETOF_EXPR.

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

--- gcc/cp/error.c	(revision 129676)
+++ gcc/cp/error.c	(revision 129677)
@@ -1887,6 +1887,10 @@ dump_expr (tree t, int flags)
       dump_expr (TREE_OPERAND (t, 0), flags);
       break;
 
+    case OFFSETOF_EXPR:
+      pp_cxx_offsetof_expression (cxx_pp, t);
+      break;
+
       /*  This list is incomplete, but should suffice for now.
 	  It is very important that `sorry' does not call
 	  `report_error_function'.  That could cause an infinite loop.  */
--- gcc/cp/cxx-pretty-print.c	(revision 129676)
+++ gcc/cp/cxx-pretty-print.c	(revision 129677)
@@ -356,6 +356,10 @@ pp_cxx_primary_expression (cxx_pretty_pr
       pp_cxx_right_paren (pp);
       break;
 
+    case OFFSETOF_EXPR:
+      pp_cxx_offsetof_expression (pp, t);
+      break;
+
     default:
       pp_c_primary_expression (pp_c_base (pp), t);
       break;
@@ -1944,6 +1948,49 @@ typedef c_pretty_print_fn pp_fun;
 
 /* Initialization of a C++ pretty-printer object.  */
 
+static bool
+pp_cxx_offsetof_expression_1 (cxx_pretty_printer *pp, tree t)
+{
+  switch (TREE_CODE (t))
+    {
+    case ARROW_EXPR:
+      if (TREE_CODE (TREE_OPERAND (t, 0)) == STATIC_CAST_EXPR
+	  && POINTER_TYPE_P (TREE_TYPE (TREE_OPERAND (t, 0))))
+	{
+	  pp_cxx_type_id (pp, TREE_TYPE (TREE_TYPE (TREE_OPERAND (t, 0))));
+	  pp_cxx_separate_with (pp, ',');
+	  return true;
+	}
+      return false;
+    case COMPONENT_REF:
+      if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
+	return false;
+      if (TREE_CODE (TREE_OPERAND (t, 0)) != ARROW_EXPR)
+	pp_cxx_dot (pp);
+      pp_cxx_expression (pp, TREE_OPERAND (t, 1));
+      return true;
+    case ARRAY_REF:
+      if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
+	return false;
+      pp_left_bracket (pp);
+      pp_cxx_expression (pp, TREE_OPERAND (t, 1));
+      pp_right_bracket (pp);
+      return true;
+    default:
+      return false;
+    }
+}
+
+void
+pp_cxx_offsetof_expression (cxx_pretty_printer *pp, tree t)
+{
+  pp_cxx_identifier (pp, "offsetof");
+  pp_cxx_left_paren (pp);
+  if (!pp_cxx_offsetof_expression_1 (pp, TREE_OPERAND (t, 0)))
+    pp_cxx_expression (pp, TREE_OPERAND (t, 0));
+  pp_cxx_right_paren (pp);
+}
+
 void
 pp_cxx_pretty_printer_init (cxx_pretty_printer *pp)
 {
--- gcc/cp/cxx-pretty-print.h	(revision 129676)
+++ gcc/cp/cxx-pretty-print.h	(revision 129677)
@@ -70,6 +70,6 @@ void pp_cxx_separate_with (cxx_pretty_pr
 
 void pp_cxx_declaration (cxx_pretty_printer *, tree);
 void pp_cxx_canonical_template_parameter (cxx_pretty_printer *, tree);
-
+void pp_cxx_offsetof_expression (cxx_pretty_printer *, tree);
 
 #endif /* GCC_CXX_PRETTY_PRINT_H */
--- gcc/testsuite/g++.dg/template/error34.C	(revision 0)
+++ gcc/testsuite/g++.dg/template/error34.C	(revision 129677)
@@ -0,0 +1,29 @@
+// PR c++/33842
+// { dg-do compile }
+
+template<typename T> struct A
+{
+  A<__builtin_offsetof(T, x)>();	// { dg-error "type/value mismatch|offsetof\\(T, x\\)" }
+};
+
+template<typename T> struct B
+{
+  B<__builtin_offsetof(T, x.y)>();	// { dg-error "type/value mismatch|offsetof\\(T, x.y\\)" }
+};
+
+template<typename T> struct C
+{
+  C<__builtin_offsetof(T, x[6])>();	// { dg-error "type/value mismatch|offsetof\\(T, x\\\[6\\\]\\)" }
+};
+
+template<typename T> struct D
+{
+  D<__builtin_offsetof(T, x.y[6].z)>();	// { dg-error "type/value mismatch|offsetof\\(T, x.y\\\[6\\\].z\\)" }
+};
+
+struct E { int x; };
+
+template<typename T> struct F
+{
+  F<__builtin_offsetof(E, x)>();	// { dg-error "type/value mismatch|offsetof\\(E, x\\)" }
+};

gcc41-pr33844.patch:

--- NEW FILE gcc41-pr33844.patch ---
2007-10-27  Jakub Jelinek  <jakub at redhat.com>

	PR c++/33844
	* cxx-pretty-print.c (pp_cxx_pm_expression) <case MEMBER_REF>: Print
	->* rather than .*.
	* error.c (dump_expr): Handle MEMBER_REF and DOTSTAR_EXPR.

	* g++.dg/other/ptrmem8.C: New test.

--- gcc/cp/error.c	(revision 129681)
+++ gcc/cp/error.c	(revision 129682)
@@ -1891,6 +1891,11 @@ dump_expr (tree t, int flags)
       pp_cxx_offsetof_expression (cxx_pp, t);
       break;
 
+    case MEMBER_REF:
+    case DOTSTAR_EXPR:
+      pp_multiplicative_expression (cxx_pp, t);
+      break;
+
       /*  This list is incomplete, but should suffice for now.
 	  It is very important that `sorry' does not call
 	  `report_error_function'.  That could cause an infinite loop.  */
--- gcc/cp/cxx-pretty-print.c	(revision 129681)
+++ gcc/cp/cxx-pretty-print.c	(revision 129682)
@@ -814,7 +814,10 @@ pp_cxx_pm_expression (cxx_pretty_printer
     case MEMBER_REF:
     case DOTSTAR_EXPR:
       pp_cxx_pm_expression (pp, TREE_OPERAND (t, 0));
-      pp_cxx_dot (pp);
+      if (TREE_CODE (t) == MEMBER_REF)
+	pp_cxx_arrow (pp);
+      else
+	pp_cxx_dot (pp);
       pp_star(pp);
       pp_cxx_cast_expression (pp, TREE_OPERAND (t, 1));
       break;
--- gcc/testsuite/g++.dg/other/ptrmem8.C	(revision 0)
+++ gcc/testsuite/g++.dg/other/ptrmem8.C	(revision 129682)
@@ -0,0 +1,16 @@
+// PR c++/33844
+// { dg-do compile }
+
+struct A {};
+
+template<int> void foo(void (A::* f)())
+{
+  A a;
+  &(a.*f);	// { dg-error "invalid use of\[^\n\]*\\.\\*\[^\n\]*to form|qualified-id is required" }
+}
+
+template<int> void bar(void (A::* f)())
+{
+  A *p;
+  &(p->*f);	// { dg-error "invalid use of\[^\n\]*->\\*\[^\n\]*to form|qualified-id is required" }
+}

gcc41-pr33890.patch:

--- NEW FILE gcc41-pr33890.patch ---
2007-12-27  Jakub Jelinek  <jakub at redhat.com>

	PR c++/33890
	* semantics.c (finish_omp_for): Don't call
	fold_build_cleanup_point_expr if processing_template_decl.

	* g++.dg/gomp/pr33890.C: New test.

--- gcc/cp/semantics.c.jj	2007-12-05 21:42:07.000000000 +0100
+++ gcc/cp/semantics.c	2007-12-27 23:45:39.000000000 +0100
@@ -3893,15 +3893,17 @@ finish_omp_for (location_t locus, tree d
       pre_body = NULL;
     }
 
-  init = fold_build_cleanup_point_expr (TREE_TYPE (init), init);
+  if (!processing_template_decl)
+    init = fold_build_cleanup_point_expr (TREE_TYPE (init), init);
   init = build_modify_expr (decl, NOP_EXPR, init);
   if (cond && TREE_SIDE_EFFECTS (cond) && COMPARISON_CLASS_P (cond))
     {
       int n = TREE_SIDE_EFFECTS (TREE_OPERAND (cond, 1)) != 0;
       tree t = TREE_OPERAND (cond, n);
 
-      TREE_OPERAND (cond, n)
-	= fold_build_cleanup_point_expr (TREE_TYPE (t), t);
+      if (!processing_template_decl)
+	TREE_OPERAND (cond, n)
+	  = fold_build_cleanup_point_expr (TREE_TYPE (t), t);
     }
   omp_for = c_finish_omp_for (locus, decl, init, cond, incr, body, pre_body);
   if (omp_for != NULL
@@ -3912,9 +3914,10 @@ finish_omp_for (location_t locus, tree d
       tree t = TREE_OPERAND (OMP_FOR_INCR (omp_for), 1);
       int n = TREE_SIDE_EFFECTS (TREE_OPERAND (t, 1)) != 0;
 
-      TREE_OPERAND (t, n)
-	= fold_build_cleanup_point_expr (TREE_TYPE (TREE_OPERAND (t, n)),
-					 TREE_OPERAND (t, n));
+      if (!processing_template_decl)
+	TREE_OPERAND (t, n)
+	  = fold_build_cleanup_point_expr (TREE_TYPE (TREE_OPERAND (t, n)),
+					   TREE_OPERAND (t, n));
     }
   return omp_for;
 }
--- gcc/testsuite/g++.dg/gomp/pr33890.C.jj	2007-12-27 23:45:39.000000000 +0100
+++ gcc/testsuite/g++.dg/gomp/pr33890.C	2007-12-27 23:45:39.000000000 +0100
@@ -0,0 +1,34 @@
+// PR c++/33890
+// { dg-do compile }
+// { dg-options "-fopenmp" }
+
+struct A
+{
+  int x;
+  A () : x (0) {}
+  int & getX ();
+};
+
+template <int> void
+foo ()
+{
+  A a;
+
+#pragma omp for
+  for (int i = a.getX (); i < 10; ++i)
+    ;
+#pragma omp for
+  for (int i = 0; i < a.getX (); ++i)
+    ;
+  a.x = 1;
+#pragma omp for
+  for (int i = 0; i < 10; i += a.getX ())
+    ;
+}
+
+void
+bar ()
+{
+  foo <0> ();
+  foo <1> ();
+}

gcc41-pr33962.patch:

--- NEW FILE gcc41-pr33962.patch ---
2007-11-20  Jakub Jelinek  <jakub at redhat.com>

	PR c++/33962
	* pt.c (more_specialized_fn): Don't segfault if one or
	both argument list end with ellipsis.

	* g++.dg/overload/template3.C: New test.

--- gcc/cp/pt.c	(revision 130307)
+++ gcc/cp/pt.c	(revision 130308)
@@ -13523,6 +13523,10 @@ more_specialized_fn (tree pat1, tree pat
 
       args1 = TREE_CHAIN (args1);
       args2 = TREE_CHAIN (args2);
+
+      /* Stop when an ellipsis is seen.  */
+      if (args1 == NULL_TREE || args2 == NULL_TREE)
+	break;
     }
 
   processing_template_decl--;
--- gcc/testsuite/g++.dg/overload/template3.C	(revision 0)
+++ gcc/testsuite/g++.dg/overload/template3.C	(revision 130308)
@@ -0,0 +1,15 @@
+// PR c++/33962
+// { dg-do compile }
+
+template <class T> struct A;
+
+template <class U> void foo (const U &x, ...);
+template <class T> void foo (const A<T> &x, ...);
+
+void bar (const A<int> &x, const char *y)
+{
+  foo (x, y);
+}
+
+/* { dg-final { scan-assembler "_Z3fooIiEvRK1AIT_Ez" } } */
+/* { dg-final { scan-assembler-not "_Z3fooI1AIiEEvRKT_z" } } */

gcc41-pr34070.patch:

--- NEW FILE gcc41-pr34070.patch ---
2007-11-12  Richard Guenther  <rguenther at suse.de>

	PR middle-end/34070
	* fold-const.c (fold_binary): If testing for non-negative
	operands with tree_expr_nonnegative_warnv_p make sure to
	use op0 which has all (sign) conversions retained.

	* gcc.c-torture/execute/pr34070-1.c: New testcase.
	* gcc.c-torture/execute/pr34070-2.c: Likewise.

--- gcc/fold-const.c	(revision 130097)
+++ gcc/fold-const.c	(revision 130098)
@@ -8509,7 +8509,7 @@ fold_binary (enum tree_code code, tree t
       /* Simplify A / (B << N) where A and B are positive and B is
 	 a power of 2, to A >> (N + log2(B)).  */
       if (TREE_CODE (arg1) == LSHIFT_EXPR
-	  && (TYPE_UNSIGNED (type) || tree_expr_nonnegative_p (arg0)))
+	  && (TYPE_UNSIGNED (type) || tree_expr_nonnegative_p (op0)))
 	{
 	  tree sval = TREE_OPERAND (arg1, 0);
 	  if (integer_pow2p (sval) && tree_int_cst_sgn (sval) > 0)
@@ -8584,7 +8584,7 @@ fold_binary (enum tree_code code, tree t
       /* Optimize TRUNC_MOD_EXPR by a power of two into a BIT_AND_EXPR,
          i.e. "X % C" into "X & (C - 1)", if X and C are positive.  */
       if ((code == TRUNC_MOD_EXPR || code == FLOOR_MOD_EXPR)
-	  && (TYPE_UNSIGNED (type) || tree_expr_nonnegative_p (arg0)))
+	  && (TYPE_UNSIGNED (type) || tree_expr_nonnegative_p (op0)))
 	{
 	  tree c = arg1;
 	  /* Also optimize A % (C << N)  where C is a power of 2,
--- gcc/testsuite/gcc.c-torture/execute/pr34070-1.c	(revision 0)
+++ gcc/testsuite/gcc.c-torture/execute/pr34070-1.c	(revision 130098)
@@ -0,0 +1,13 @@
+extern void abort (void);
+
+int f(unsigned int x)
+{
+    return ((int)x) % 4;
+}
+
+int main()
+{
+  if (f(-1) != -1)
+    abort ();
+  return 0;
+}
--- gcc/testsuite/gcc.c-torture/execute/pr34070-2.c	(revision 0)
+++ gcc/testsuite/gcc.c-torture/execute/pr34070-2.c	(revision 130098)
@@ -0,0 +1,13 @@
+extern void abort (void);
+
+int f(unsigned int x, int n)
+{
+    return ((int)x) / (1 << n);
+}
+
+int main()
+{
+  if (f(-1, 1) != 0)
+    abort ();
+  return 0;
+}

gcc41-pr34089.patch:

--- NEW FILE gcc41-pr34089.patch ---
2007-11-20  Jakub Jelinek  <jakub at redhat.com>

	PR c++/34089
	* parser.c (cp_parser_class_head): Reject function template ids.

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

--- gcc/cp/parser.c	(revision 130315)
+++ gcc/cp/parser.c	(revision 130316)
@@ -14536,8 +14536,18 @@ cp_parser_class_head (cp_parser* parser,
   /* Look up the type.  */
   if (template_id_p)
     {
-      type = TREE_TYPE (id);
-      type = maybe_process_partial_specialization (type);
+      if (TREE_CODE (id) == TEMPLATE_ID_EXPR
+	  && (DECL_FUNCTION_TEMPLATE_P (TREE_OPERAND (id, 0))
+	      || TREE_CODE (TREE_OPERAND (id, 0)) == OVERLOAD))
+	{
+	  error ("function template %qD redeclared as a class template", id);
+	  type = error_mark_node;
+	}
+      else
+	{
+	  type = TREE_TYPE (id);
+	  type = maybe_process_partial_specialization (type);
+	}
       if (nested_name_specifier)
 	pushed_scope = push_scope (nested_name_specifier);
     }
--- gcc/testsuite/g++.dg/template/crash74.C	(revision 0)
+++ gcc/testsuite/g++.dg/template/crash74.C	(revision 130316)
@@ -0,0 +1,6 @@
+// PR c++/34089
+// { dg-do compile }
+// { dg-options "" }
+
+template<typename F> void foo () { }
+template<typename F> struct foo<F> { };	// { dg-error "redeclared as" }

gcc41-pr34130.patch:

--- NEW FILE gcc41-pr34130.patch ---
2007-11-17  Richard Guenther  <rguenther at suse.de>

	PR middle-end/34130
	* fold-const.c (extract_muldiv_1): Do not move negative
	constants inside ABS_EXPR.

	* gcc.c-torture/execute/pr34130.c: New testcase.

--- gcc/fold-const.c	(revision 130257)
+++ gcc/fold-const.c	(revision 130258)
@@ -6095,6 +6095,9 @@ extract_muldiv_1 (tree t, tree c, enum t
             }
           break;
         }
+      /* If the constant is negative, we cannot simplify this.  */
+      if (tree_int_cst_sgn (c) == -1)
+        break;
       /* FALLTHROUGH */
     case NEGATE_EXPR:
       if ((t1 = extract_muldiv (op0, c, code, wide_type, strict_overflow_p))
--- gcc/testsuite/gcc.c-torture/execute/pr34130.c	(revision 0)
+++ gcc/testsuite/gcc.c-torture/execute/pr34130.c	(revision 130258)
@@ -0,0 +1,12 @@
+extern void abort (void);
+int foo (int i)
+{
+  return -2 * __builtin_abs(i - 2);
+}
+int main()
+{
+  if (foo(1) != -2
+      || foo(3) != -2)
+    abort ();
+  return 0;
+}

gcc41-pr34146.patch:

--- NEW FILE gcc41-pr34146.patch ---
2007-11-20  Jakub Jelinek  <jakub at redhat.com>

	PR c/34146
	* c-gimplify.c (optimize_compound_literals_in_ctor): New function.
	(c_gimplify_expr): Use it.

	* gcc.dg/tree-ssa/pr34146.c: New test.
 
--- gcc/c-gimplify.c	(revision 130310)
+++ gcc/c-gimplify.c	(revision 130311)
@@ -208,6 +208,47 @@ gimplify_compound_literal_expr (tree *ex
   return GS_OK;
 }
 
+/* Optimize embedded COMPOUND_LITERAL_EXPRs within a CONSTRUCTOR,
+   return a new CONSTRUCTOR if something changed.  */
+
+static tree
+optimize_compound_literals_in_ctor (tree orig_ctor)
+{
+  tree ctor = orig_ctor;
+  VEC(constructor_elt,gc) *elts = CONSTRUCTOR_ELTS (ctor);
+  unsigned int idx, num = VEC_length (constructor_elt, elts);
+
+  for (idx = 0; idx < num; idx++)
+    {
+      tree value = VEC_index (constructor_elt, elts, idx)->value;
+      tree newval = value;
+      if (TREE_CODE (value) == CONSTRUCTOR)
+	newval = optimize_compound_literals_in_ctor (value);
+      else if (TREE_CODE (value) == COMPOUND_LITERAL_EXPR)
+	{
+	  tree decl_s = COMPOUND_LITERAL_EXPR_DECL_STMT (value);
+	  tree decl = DECL_EXPR_DECL (decl_s);
+	  tree init = DECL_INITIAL (decl);
+
+	  if (!TREE_ADDRESSABLE (value)
+	      && !TREE_ADDRESSABLE (decl)
+	      && init)
+	    newval = init;
+	}
+      if (newval == value)
+	continue;
+
+      if (ctor == orig_ctor)
+	{
+	  ctor = copy_node (orig_ctor);
+	  CONSTRUCTOR_ELTS (ctor) = VEC_copy (constructor_elt, gc, elts);
+	  elts = CONSTRUCTOR_ELTS (ctor);
+	}
+      VEC_index (constructor_elt, elts, idx)->value = newval;
+    }
+  return ctor;
+}
+
 /* Do C-specific gimplification.  Args are as for gimplify_expr.  */
 
 int
@@ -254,6 +295,18 @@ c_gimplify_expr (tree *expr_p, tree *pre
 	      return GS_OK;
 	    }
 	}
+      else if (TREE_CODE (TREE_OPERAND (*expr_p, 1)) == CONSTRUCTOR)
+	{
+	  tree ctor
+	    = optimize_compound_literals_in_ctor (TREE_OPERAND (*expr_p, 1));
+
+	  if (ctor != TREE_OPERAND (*expr_p, 1))
+	    {
+	      *expr_p = copy_node (*expr_p);
+	      TREE_OPERAND (*expr_p, 1) = ctor;
+	      return GS_OK;
+	    }
+	}
       return GS_UNHANDLED;
 
     default:
--- gcc/testsuite/gcc.dg/tree-ssa/pr34146.c	(revision 0)
+++ gcc/testsuite/gcc.dg/tree-ssa/pr34146.c	(revision 130311)
@@ -0,0 +1,53 @@
+/* PR c/34146 */
+/* { dg-do compile } */
+/* { dg-options "-O2 -fdump-tree-gimple" } */
+
+struct A
+{
+  int f1, f2, f3;
+};
+
+struct B
+{
+  struct A g1, g2;
+};
+
+struct C
+{
+  struct B h1, h2;
+};
+
+typedef union
+{
+  struct C c;
+  char s[4];
+  long int a;
+} T;
+
+void
+foo (void)
+{
+  T t = { { { { 0, 0, 0 }, { 0, 0, 0 } }, { { 0, 0, 0 }, { 0, 0, 0 } } } };
+  test (&t);
+}
+
+void
+bar (void)
+{
+  T t = { { { { 0, 0, 0 }, (struct A) { 0, 0, 0 } },
+	    (struct B) { (struct A) { 0, 0, 0 }, { 0, 0, 0 } } } };
+  test (&t);
+}
+
+void
+baz (void)
+{
+  T t = { { { { 0, 0, 0 }, (struct A) { 1, 1, 1 } },
+	    (struct B) { (struct A) { 0, 0, 0 }, { 1, 1, 1 } } } };
+  test (&t);
+}
+
+/* { dg-final { scan-tree-dump-not "t = D" "gimple"} } */
+/* { dg-final { scan-tree-dump-not "t\.c\.h\[12\] = D" "gimple"} } */
+/* { dg-final { scan-tree-dump-not "\.g\[12\] = D" "gimple"} } */
+/* { dg-final { cleanup-tree-dump "gimple" } } */

gcc41-pr34178.patch:

--- NEW FILE gcc41-pr34178.patch ---
2007-12-09  Jakub Jelinek  <jakub at redhat.com>

	PR c++/34178
	PR c++/34340
	* repo.c (repo_emit_p): Return 2 for DECL_INTEGRAL_CONSTANT_VAR_P
	in class scope rather than DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P.
	Return 2 also if DECL_EXPLICIT_INSTANTIATION.
	* decl2.c (import_export_decl): Don't make VAR_DECLs import_p when
	flag_use_repository and repo_emit_p returned 2.

	* g++.dg/template/repo6.C: New test.
	* g++.dg/template/repo7.C: New test.
	* g++.dg/template/repo8.C: New test.

--- gcc/cp/decl2.c	(revision 130726)
+++ gcc/cp/decl2.c	(revision 130727)
@@ -2230,7 +2230,8 @@ import_export_decl (tree decl)
     {
       /* DECL is an implicit instantiation of a function or static
 	 data member.  */
-      if (flag_implicit_templates
+      if ((flag_implicit_templates
+	   && !flag_use_repository)
 	  || (flag_implicit_inline_templates
 	      && TREE_CODE (decl) == FUNCTION_DECL
 	      && DECL_DECLARED_INLINE_P (decl)))
--- gcc/cp/repo.c	(revision 130726)
+++ gcc/cp/repo.c	(revision 130727)
@@ -304,16 +304,19 @@ repo_emit_p (tree decl)
 	  && (!TYPE_LANG_SPECIFIC (type)
 	      || !CLASSTYPE_TEMPLATE_INSTANTIATION (type)))
 	return 2;
-      /* Static data members initialized by constant expressions must
+      /* Const static data members initialized by constant expressions must
 	 be processed where needed so that their definitions are
 	 available.  */
-      if (DECL_INITIALIZED_BY_CONSTANT_EXPRESSION_P (decl)
+      if (DECL_INTEGRAL_CONSTANT_VAR_P (decl)
 	  && DECL_CLASS_SCOPE_P (decl))
 	return 2;
     }
   else if (!DECL_TEMPLATE_INSTANTIATION (decl))
     return 2;
 
+  if (DECL_EXPLICIT_INSTANTIATION (decl))
+    return 2;
+
   /* For constructors and destructors, the repository contains
      information about the clones -- not the original function --
      because only the clones are emitted in the object file.  */
--- gcc/testsuite/g++.dg/template/repo7.C	(revision 0)
+++ gcc/testsuite/g++.dg/template/repo7.C	(revision 130727)
@@ -0,0 +1,23 @@
+// PR c++/34340
+// { dg-options "-frepo" }
+// { dg-final { cleanup-repo-files } }
+
+struct A
+{
+  int a;
+};
+
+template <typename T> struct D
+{
+  static const A b;
+};
+
+template<typename T> const A D<T>::b = { 2 };
+template class D<A>;
+
+const A *x = &D<A>::b;
+
+int
+main ()
+{
+}
--- gcc/testsuite/g++.dg/template/repo8.C	(revision 0)
+++ gcc/testsuite/g++.dg/template/repo8.C	(revision 130727)
@@ -0,0 +1,22 @@
+// PR c++/34340
+// { dg-options "-frepo" }
+// { dg-final { cleanup-repo-files } }
+
+struct A
+{
+  int a;
+};
+
+template <typename T> struct D
+{
+  static const A b;
+};
+
+template<typename T> const A D<T>::b = { 2 };
+
+const A *x = &D<A>::b;
+
+int
+main ()
+{
+}
--- gcc/testsuite/g++.dg/template/repo6.C	(revision 0)
+++ gcc/testsuite/g++.dg/template/repo6.C	(revision 130727)
@@ -0,0 +1,24 @@
+// PR c++/34178
+// { dg-options "-frepo" }
+// { dg-final { cleanup-repo-files } }
+
+template<typename T>
+class A
+{
+private:
+  static const int x;
+  static int y;
+
+public:
+  int getX () { return x + y; }
+};
+
+template<typename T> const int A<T>::x = 0;
+template<typename T> int A<T>::y = 0;
+
+int
+main ()
+{
+  A<int> a;
+  return a.getX();
+}

gcc41-pr34213.patch:

--- NEW FILE gcc41-pr34213.patch ---
2007-11-27  Jakub Jelinek  <jakub at redhat.com>

	PR c++/34213
	* tree.c (decl_linkage): Static data members and static member
	functions in anonymous ns classes are lk_external.

	* g++.dg/ext/visibility/anon8.C: New test.

--- gcc/cp/tree.c	(revision 130462)
+++ gcc/cp/tree.c	(revision 130463)
@@ -2526,10 +2526,18 @@ decl_linkage (tree decl)
   /* Members of the anonymous namespace also have TREE_PUBLIC unset, but
      are considered to have external linkage for language purposes.  DECLs
      really meant to have internal linkage have DECL_THIS_STATIC set.  */
-  if (TREE_CODE (decl) == TYPE_DECL
-      || ((TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == FUNCTION_DECL)
-	  && !DECL_THIS_STATIC (decl)))
+  if (TREE_CODE (decl) == TYPE_DECL)
     return lk_external;
+  if (TREE_CODE (decl) == VAR_DECL || TREE_CODE (decl) == FUNCTION_DECL)
+    {
+      if (!DECL_THIS_STATIC (decl))
+	return lk_external;
+
+      /* Static data members and static member functions from classes
+	 in anonymous namespace also don't have TREE_PUBLIC set.  */
+      if (DECL_CLASS_CONTEXT (decl))
+	return lk_external;
+    }
 
   /* Everything else has internal linkage.  */
   return lk_internal;
--- gcc/testsuite/g++.dg/ext/visibility/anon8.C	(revision 0)
+++ gcc/testsuite/g++.dg/ext/visibility/anon8.C	(revision 130463)
@@ -0,0 +1,33 @@
+// PR c++/34213
+// { dg-do compile }
+
+template <void (*fn) ()>
+void call ()
+{
+  fn ();
+}
+
+namespace
+{
+  struct B1
+  {
+    static void fn1 () {}
+    static void fn4 ();
+  };
+  void fn3 () {}
+  void B1::fn4 () {}
+  static void fn5 () {}
+}
+
+int main ()
+{
+  struct B2
+  {
+    static void fn2 () {}
+  };
+  call<&B1::fn1> ();
+  call<&B2::fn2> ();	// { dg-error "not external linkage|no matching" }
+  call<&fn3> ();
+  call<&B1::fn4> ();
+  call<&fn5> ();	// { dg-error "not external linkage|no matching" }
+}

gcc41-pr34275.patch:

--- NEW FILE gcc41-pr34275.patch ---
2007-11-30  Jakub Jelinek  <jakub at redhat.com>

	PR c++/34275
	* error.c (dump_expr): Handle OBJ_TYPE_REF.

	* g++.dg/other/error20.C: New test.

--- gcc/cp/error.c	(revision 130532)
+++ gcc/cp/error.c	(revision 130533)
@@ -2056,6 +2056,10 @@ dump_expr (tree t, int flags)
       pp_expression (cxx_pp, t);
       break;
 
+    case OBJ_TYPE_REF:
+      dump_expr (resolve_virtual_fun_from_obj_type_ref (t), flags);
+      break;
+
       /*  This list is incomplete, but should suffice for now.
 	  It is very important that `sorry' does not call
 	  `report_error_function'.  That could cause an infinite loop.  */
--- gcc/testsuite/g++.dg/other/error20.C	(revision 0)
+++ gcc/testsuite/g++.dg/other/error20.C	(revision 130533)
@@ -0,0 +1,12 @@
+// PR c++/34275
+// { dg-do compile }
+
+struct A
+{		// { dg-error "candidates" }
+  virtual A foo ();
+};
+
+void bar (A& a)
+{
+  a.foo () = 0; // { dg-error "A::foo\\(\\) = 0" }
+}   

gcc41-pr34364.patch:

--- NEW FILE gcc41-pr34364.patch ---
2007-12-11  Jakub Jelinek  <jakub at redhat.com>

	PR c++/34364
	* rtti.c (build_dynamic_cast): Call convert_from_reference even for
	dynamic_cast in a template.

	* g++.dg/rtti/dyncast2.C: New test.

--- gcc/cp/rtti.c	(revision 130769)
+++ gcc/cp/rtti.c	(revision 130770)
@@ -728,8 +728,7 @@ build_dynamic_cast (tree type, tree expr
     {
       expr = build_min (DYNAMIC_CAST_EXPR, type, expr);
       TREE_SIDE_EFFECTS (expr) = 1;
-
-      return expr;
+      return convert_from_reference (expr);
     }
 
   return convert_from_reference (build_dynamic_cast_1 (type, expr));
--- gcc/testsuite/g++.dg/rtti/dyncast2.C	(revision 0)
+++ gcc/testsuite/g++.dg/rtti/dyncast2.C	(revision 130770)
@@ -0,0 +1,31 @@
+// PR c++/34364
+// { dg-do run }
+
+struct A
+{
+  virtual ~A () {}
+};
+
+struct B : public A
+{
+  template <typename T> struct C
+  {
+    static void f (A &a)
+    {
+      dynamic_cast <B &>(a).g ();
+    }
+  };
+
+  B () : c (6) {}
+  void g () { c++; }
+  int c;
+};
+
+B b;
+
+int
+main (void)
+{
+  B::C<int>::f (b);
+  return b.c != 7;
+}

gcc41-pr34394.patch:

--- NEW FILE gcc41-pr34394.patch ---
2007-12-10  Jakub Jelinek  <jakub at redhat.com>

	PR c++/34394
	* error.c (dump_expr): Handle ABS_EXPR.

	* g++.dg/other/error22.C: New test.

--- gcc/cp/error.c	(revision 130743)
+++ gcc/cp/error.c	(revision 130744)
@@ -1757,6 +1757,7 @@ dump_expr (tree t, int flags)
       break;
 
     case SCOPE_REF:
+    case ABS_EXPR:
       pp_expression (cxx_pp, t);
       break;
 
--- gcc/testsuite/g++.dg/other/error22.C	(revision 0)
+++ gcc/testsuite/g++.dg/other/error22.C	(revision 130744)
@@ -0,0 +1,9 @@
+// PR c++/34394
+// { dg-do compile }
+
+extern double fabs (double);
+
+void foo (double x)
+{
+  fabs (x) ();	// { dg-error "__builtin_abs" }
+}

gcc41-pr34506.patch:

--- NEW FILE gcc41-pr34506.patch ---
2007-12-17  Jakub Jelinek  <jakub at redhat.com>

	PR c/34506
	* c-parser.c (c_parser_omp_all_clauses): Accept optional comma
	in between clauses.

	* parser.c (cp_parser_omp_all_clauses): Accept optional comma
	in between clauses.

	* gcc.dg/gomp/clause-2.c: New test.
	* g++.dg/gomp/clause-4.C: New test.

--- gcc/c-parser.c	(revision 131007)
+++ gcc/c-parser.c	(revision 131008)
@@ -7065,13 +7065,20 @@ c_parser_omp_all_clauses (c_parser *pars
 			  const char *where)
 {
   tree clauses = NULL;
+  bool first = true;
 
   while (c_parser_next_token_is_not (parser, CPP_PRAGMA_EOL))
     {
-      const pragma_omp_clause c_kind = c_parser_omp_clause_name (parser);
+      pragma_omp_clause c_kind;
       const char *c_name;
       tree prev = clauses;
 
+      if (!first && c_parser_next_token_is (parser, CPP_COMMA))
+	c_parser_consume_token (parser);
+
+      first = false;
+      c_kind = c_parser_omp_clause_name (parser);
+
       switch (c_kind)
 	{
 	case PRAGMA_OMP_CLAUSE_COPYIN:
--- gcc/cp/parser.c	(revision 131007)
+++ gcc/cp/parser.c	(revision 131008)
@@ -19671,13 +19671,20 @@ cp_parser_omp_all_clauses (cp_parser *pa
 			   const char *where, cp_token *pragma_tok)
 {
   tree clauses = NULL;
+  bool first = true;
 
   while (cp_lexer_next_token_is_not (parser->lexer, CPP_PRAGMA_EOL))
     {
-      pragma_omp_clause c_kind = cp_parser_omp_clause_name (parser);
+      pragma_omp_clause c_kind;
       const char *c_name;
       tree prev = clauses;
 
+      if (!first && cp_lexer_next_token_is (parser->lexer, CPP_COMMA))
+	cp_lexer_consume_token (parser->lexer);
+
+      c_kind = cp_parser_omp_clause_name (parser);
+      first = false;
+
       switch (c_kind)
 	{
 	case PRAGMA_OMP_CLAUSE_COPYIN:
--- gcc/testsuite/gcc.dg/gomp/clause-2.c	(revision 0)
+++ gcc/testsuite/gcc.dg/gomp/clause-2.c	(revision 131008)
@@ -0,0 +1,23 @@
+/* PR c/34506 */
+/* { dg-do compile } */
+
+#define p parallel
+
+void
+foo (int x)
+{
+#pragma omp p num_threads (4) if (1) private (x)
+    ;
+#pragma omp p num_threads(4)if(1)private(x)
+    ;
+#pragma omp p num_threads (4), if (1) , private (x)
+    ;
+#pragma omp p num_threads(4),if(1),private(x)
+    ;
+#pragma omp p, num_threads (4), if (1), private (x)	/* { dg-error "clause before" } */
+    ;
+#pragma omp p num_threads (4), if (1), private (x),	/* { dg-error "clause before" } */
+    ;
+#pragma omp p num_threads (4), , if (1), private (x)	/* { dg-error "clause before" } */
+    ;
+}
--- gcc/testsuite/g++.dg/gomp/clause-4.C	(revision 0)
+++ gcc/testsuite/g++.dg/gomp/clause-4.C	(revision 131008)
@@ -0,0 +1,23 @@
+// PR c/34506
+// { dg-do compile }
+
+#define p parallel
+
+void
+foo (int x)
+{
+#pragma omp p num_threads (4) if (1) private (x)
+    ;
+#pragma omp p num_threads(4)if(1)private(x)
+    ;
+#pragma omp p num_threads (4), if (1) , private (x)
+    ;
+#pragma omp p num_threads(4),if(1),private(x)
+    ;
+#pragma omp p, num_threads (4), if (1), private (x)	// { dg-error "clause before" }
+    ;
+#pragma omp p num_threads (4), if (1), private (x),	// { dg-error "clause before" }
+    ;
+#pragma omp p num_threads (4), , if (1), private (x)	// { dg-error "clause before" }
+    ;
+}

gcc41-pr34513.patch:

--- NEW FILE gcc41-pr34513.patch ---
2007-12-19  Jakub Jelinek  <jakub at redhat.com>

	PR c++/34513
	* parser.c (cp_parser_omp_parallel): For non-combined parallel
	call cp_parser_statement rather than
	cp_parser_already_scoped_statement.

	* testsuite/libgomp.c/pr34513.c: New test.
	* testsuite/libgomp.c++/pr34513.C: New test.

--- gcc/cp/parser.c	(revision 131058)
+++ gcc/cp/parser.c	(revision 131059)
@@ -20271,7 +20271,7 @@ cp_parser_omp_parallel (cp_parser *parse
   switch (p_kind)
     {
     case PRAGMA_OMP_PARALLEL:
-      cp_parser_already_scoped_statement (parser);
+      cp_parser_statement (parser, NULL_TREE, false);
       par_clause = clauses;
       break;
 
--- libgomp/testsuite/libgomp.c++/pr34513.C	(revision 0)
+++ libgomp/testsuite/libgomp.c++/pr34513.C	(revision 131059)
@@ -0,0 +1,32 @@
+// PR c++/34513
+// { dg-do run }
+
+#include <omp.h>
+
+extern "C" void abort ();
+
+static int errors = 0;
+static int thrs = 4;
+
+int
+main ()
+{
+  omp_set_dynamic (0);
+
+  #pragma omp parallel num_threads (thrs)
+  {
+    static int shrd = 0;
+
+    #pragma omp atomic
+      shrd += 1;
+
+    #pragma omp barrier
+
+    if (shrd != thrs)
+      #pragma omp atomic
+	errors += 1;
+  }
+
+  if (errors)
+    abort ();
+}
--- libgomp/testsuite/libgomp.c/pr34513.c	(revision 0)
+++ libgomp/testsuite/libgomp.c/pr34513.c	(revision 131059)
@@ -0,0 +1,33 @@
+/* PR c++/34513 */
+/* { dg-do run } */
+
+#include <omp.h>
+
+extern void abort ();
+
+static int errors = 0;
+static int thrs = 4;
+
+int
+main ()
+{
+  omp_set_dynamic (0);
+
+  #pragma omp parallel num_threads (thrs)
+  {
+    static int shrd = 0;
+
+    #pragma omp atomic
+      shrd += 1;
+
+    #pragma omp barrier
+
+    if (shrd != thrs)
+      #pragma omp atomic
+	errors += 1;
+  }
+
+  if (errors)
+    abort ();
+  return 0;
+}

gcc41-pr7081.patch:

--- NEW FILE gcc41-pr7081.patch ---
2007-12-20  Jakub Jelinek  <jakub at redhat.com>                                                                                    
                                                                                                                                 
	PR debug/34535                                                                                                           
	* cp-lang.c (cp_classify_record): Check TYPE_LANG_SPECIFIC                                                               
	is non-NULL before testing CLASSTYPE_DECLARED_CLASS.

2007-12-15  Alexandre Oliva  <aoliva at redhat.com>

	PR debug/7081
	* dwarf2out.c (dwarf_tag_name): Synchronize with dwarf2.h.
	(is_type_die): Cover interface types.
	(class_or_namespace_scope_p): Cover interface and class types.
	(record_type_tag): New.
	(gen_inlined_structure_type_die): Use it.
	(gen_struct_or_union_type_die): Likewise.
	(prune_unused_types_walk): Cover interface types.
	* langhooks.h (classify_record): New enum.
	(classify_record): New member in struct langhooks_for_types.
	* langhooks-def.h (LANG_HOOKS_CLASSIFY_RECORD): New.
	(LANGHOOKS_FOR_TYPES_INITIALIZER): Adjust.
cp/
	* cp-lang.c (cp_classify_record): New.
	(LANG_HOOKS_CLASSIFY_RECORD): Override.
java/
	* lang.c (java_classify_record): New.
	(LANG_HOOKS_CLASSIFY_RECORD): Override.

--- gcc/java/lang.c	(revision 130959)
+++ gcc/java/lang.c	(revision 130960)
@@ -67,6 +67,8 @@ static bool java_decl_ok_for_sibcall (tr
 static tree java_get_callee_fndecl (tree);
 static void java_clear_binding_stack (void);
 
+static enum classify_record java_classify_record (tree type);
+
 #ifndef TARGET_OBJECT_SUFFIX
 # define TARGET_OBJECT_SUFFIX ".o"
 #endif
@@ -183,6 +185,8 @@ struct language_function GTY(())
 #define LANG_HOOKS_TYPE_FOR_MODE java_type_for_mode
 #undef LANG_HOOKS_TYPE_FOR_SIZE
 #define LANG_HOOKS_TYPE_FOR_SIZE java_type_for_size
+#undef LANG_HOOKS_CLASSIFY_RECORD
+#define LANG_HOOKS_CLASSIFY_RECORD java_classify_record
 #undef LANG_HOOKS_SIGNED_TYPE
 #define LANG_HOOKS_SIGNED_TYPE java_signed_type
 #undef LANG_HOOKS_UNSIGNED_TYPE
@@ -1027,4 +1031,16 @@ java_clear_binding_stack (void)
     poplevel (0, 0, 0);
 }
 
+static enum classify_record
+java_classify_record (tree type)
+{
+  if (! CLASS_P (type))
+    return RECORD_IS_STRUCT;
+
+  if (0 && CLASS_INTERFACE (TYPE_NAME (type)))
+    return RECORD_IS_INTERFACE;
+
+  return RECORD_IS_CLASS;
+}
+
 #include "gt-java-lang.h"
--- gcc/cp/cp-lang.c	(revision 130959)
+++ gcc/cp/cp-lang.c	(revision 130960)
@@ -36,6 +36,7 @@ Boston, MA 02110-1301, USA.  */
 
 enum c_language_kind c_language = clk_cxx;
 static void cp_init_ts (void);
+static enum classify_record cp_classify_record (tree type);
 
 /* Lang hooks common to C++ and ObjC++ are declared in cp/cp-objcp-common.h;
    consequently, there should be very few hooks below.  */
@@ -44,6 +45,8 @@ static void cp_init_ts (void);
 #define LANG_HOOKS_NAME "GNU C++"
 #undef LANG_HOOKS_INIT
 #define LANG_HOOKS_INIT cxx_init
+#undef LANG_HOOKS_CLASSIFY_RECORD
+#define LANG_HOOKS_CLASSIFY_RECORD cp_classify_record
 #undef LANG_HOOKS_DECL_PRINTABLE_NAME
 #define LANG_HOOKS_DECL_PRINTABLE_NAME	cxx_printable_name
 #undef LANG_HOOKS_FOLD_OBJ_TYPE_REF
@@ -138,6 +141,15 @@ cp_init_ts (void)
 
 }
 
+static enum classify_record
+cp_classify_record (tree type)
+{
+  if (TYPE_LANG_SPECIFIC (type) && CLASSTYPE_DECLARED_CLASS (type))
+    return RECORD_IS_CLASS;
+
+  return RECORD_IS_STRUCT;
+}
+
 void
 finish_file (void)
 {
--- gcc/dwarf2out.c	(revision 130959)
+++ gcc/dwarf2out.c	(revision 130960)
@@ -4445,8 +4445,6 @@ dwarf_tag_name (unsigned int tag)
       return "DW_TAG_namelist";
     case DW_TAG_namelist_item:
       return "DW_TAG_namelist_item";
-    case DW_TAG_namespace:
-      return "DW_TAG_namespace";
     case DW_TAG_packed_type:
       return "DW_TAG_packed_type";
     case DW_TAG_subprogram:
@@ -4465,8 +4463,26 @@ dwarf_tag_name (unsigned int tag)
       return "DW_TAG_variable";
     case DW_TAG_volatile_type:
       return "DW_TAG_volatile_type";
+    case DW_TAG_dwarf_procedure:
+      return "DW_TAG_dwarf_procedure";
+    case DW_TAG_restrict_type:
+      return "DW_TAG_restrict_type";
+    case DW_TAG_interface_type:
+      return "DW_TAG_interface_type";
+    case DW_TAG_namespace:
+      return "DW_TAG_namespace";
     case DW_TAG_imported_module:
       return "DW_TAG_imported_module";
+    case DW_TAG_unspecified_type:
+      return "DW_TAG_unspecified_type";
+    case DW_TAG_partial_unit:
+      return "DW_TAG_partial_unit";
+    case DW_TAG_imported_unit:
+      return "DW_TAG_imported_unit";
+    case DW_TAG_condition:
+      return "DW_TAG_condition";
+    case DW_TAG_shared_type:
+      return "DW_TAG_shared_type";
     case DW_TAG_MIPS_loop:
       return "DW_TAG_MIPS_loop";
     case DW_TAG_format_label:
@@ -6181,6 +6197,7 @@ is_type_die (dw_die_ref die)
     {
     case DW_TAG_array_type:
     case DW_TAG_class_type:
+    case DW_TAG_interface_type:
     case DW_TAG_enumeration_type:
     case DW_TAG_pointer_type:
     case DW_TAG_reference_type:
@@ -10986,6 +11003,8 @@ class_or_namespace_scope_p (dw_die_ref c
 {
   return (context_die
 	  && (context_die->die_tag == DW_TAG_structure_type
+	      || context_die->die_tag == DW_TAG_class_type
+	      || context_die->die_tag == DW_TAG_interface_type
 	      || context_die->die_tag == DW_TAG_union_type
 	      || context_die->die_tag == DW_TAG_namespace));
 }
@@ -11381,12 +11400,36 @@ gen_inlined_enumeration_type_die (tree t
   add_abstract_origin_attribute (type_die, type);
 }
 
+/* Determine what tag to use for a record type.  */
+
+static enum dwarf_tag
+record_type_tag (tree type)
+{
+  if (! lang_hooks.types.classify_record)
+    return DW_TAG_structure_type;
+
+  switch (lang_hooks.types.classify_record (type))
+    {
+    case RECORD_IS_STRUCT:
+      return DW_TAG_structure_type;
+
+    case RECORD_IS_CLASS:
+      return DW_TAG_class_type;
+
+    case RECORD_IS_INTERFACE:
+      return DW_TAG_interface_type;
+
+    default:
+      gcc_unreachable ();
+    }
+}
+
 /* Generate a DIE to represent an inlined instance of a structure type.  */
 
 static void
 gen_inlined_structure_type_die (tree type, dw_die_ref context_die)
 {
-  dw_die_ref type_die = new_die (DW_TAG_structure_type, context_die, type);
+  dw_die_ref type_die = new_die (record_type_tag (type), context_die, type);
 
   /* We do not check for TREE_ASM_WRITTEN (type) being set, as the type may
      be incomplete and such types are not marked.  */
@@ -12530,7 +12573,7 @@ gen_struct_or_union_type_die (tree type,
       dw_die_ref old_die = type_die;
 
       type_die = new_die (TREE_CODE (type) == RECORD_TYPE
-			  ? DW_TAG_structure_type : DW_TAG_union_type,
+			  ? record_type_tag (type) : DW_TAG_union_type,
 			  scope_die, type);
       equate_type_number_to_die (type, type_die);
       if (old_die)
@@ -14183,6 +14226,7 @@ prune_unused_types_walk (dw_die_ref die)
   case DW_TAG_structure_type:
   case DW_TAG_union_type:
   case DW_TAG_class_type:
+  case DW_TAG_interface_type:
   case DW_TAG_friend:
   case DW_TAG_variant_part:
   case DW_TAG_enumeration_type:
--- gcc/langhooks.h	(revision 130959)
+++ gcc/langhooks.h	(revision 130960)
@@ -33,6 +33,9 @@ struct array_descr_info;
 /* A print hook for print_tree ().  */
 typedef void (*lang_print_tree_hook) (FILE *, tree, int indent);
 
+enum classify_record
+  { RECORD_IS_STRUCT, RECORD_IS_CLASS, RECORD_IS_INTERFACE };
+
 /* The following hooks are documented in langhooks.c.  Must not be
    NULL.  */
 
@@ -91,6 +94,11 @@ struct lang_hooks_for_types
      language-specific processing is required.  */
   tree (*make_type) (enum tree_code);
 
+  /* Return what kind of RECORD_TYPE this is, mainly for purposes of
+     debug information.  If not defined, record types are assumed to
+     be structures.  */
+  enum classify_record (*classify_record) (tree);
+
   /* Given MODE and UNSIGNEDP, return a suitable type-tree with that
      mode.  */
   tree (*type_for_mode) (enum machine_mode, int);
--- gcc/langhooks-def.h	(revision 130959)
+++ gcc/langhooks-def.h	(revision 130960)
@@ -172,6 +172,7 @@ extern tree lhd_make_node (enum tree_cod
 /* Types hooks.  There are no reasonable defaults for most of them,
    so we create a compile-time error instead.  */
 #define LANG_HOOKS_MAKE_TYPE lhd_make_node
+#define LANG_HOOKS_CLASSIFY_RECORD	NULL
 #define LANG_HOOKS_INCOMPLETE_TYPE_ERROR lhd_incomplete_type_error
 #define LANG_HOOKS_GENERIC_TYPE_P	hook_bool_const_tree_false
 #define LANG_HOOKS_TYPE_PROMOTES_TO lhd_type_promotes_to
@@ -185,6 +186,7 @@ extern tree lhd_make_node (enum tree_cod
 
 #define LANG_HOOKS_FOR_TYPES_INITIALIZER { \
   LANG_HOOKS_MAKE_TYPE, \
+  LANG_HOOKS_CLASSIFY_RECORD, \
   LANG_HOOKS_TYPE_FOR_MODE, \
   LANG_HOOKS_TYPE_FOR_SIZE, \
   LANG_HOOKS_GENERIC_TYPE_P, \

gcc41-rh364001.patch:

--- NEW FILE gcc41-rh364001.patch ---
2007-11-16  Jakub Jelinek  <jakub at redhat.com>

	PR fortran/22244
	* langhooks-def.h (LANG_HOOKS_GET_ARRAY_DESCR_INFO): Define.
	(LANG_HOOKS_FOR_TYPES_INITIALIZER): Add it.
	* langhooks.h (struct array_descr_info): Forward declaration.
	(struct lang_hooks_for_types): Add get_array_descr_info field.
	* dwarf2.h (DW_AT_bit_stride, DW_AT_byte_stride): New.
	(DW_AT_stride_size, DW_AT_stride): Keep around for Dwarf2
	compatibility.
	* dwarf2out.h (struct array_descr_info): New type.
	* dwarf2out.c (dwarf_attr_name): Rename DW_AT_stride to
	DW_AT_byte_stride and DW_AT_stride_size to DW_AT_bit_size.
	(descr_info_loc, add_descr_info_field, gen_descr_array_type_die):
	New functions.
	(gen_type_die_with_usage): Call lang_hooks.types.get_array_descr_info
	and gen_descr_array_type_die.

	* trans.h (struct array_descr_info): Forward declaration.
	(gfc_get_array_descr_info): New prototype.
	(enum gfc_array_kind): New type.
	(struct lang_type): Add akind field.
	(GFC_TYPE_ARRAY_AKIND): Define.
	* trans-types.c: Include dwarf2out.h.
	(gfc_build_array_type): Add akind argument.  Adjust
	gfc_get_array_type_bounds call.
	(gfc_get_nodesc_array_type): Include proper debug info even for
	assumed-size arrays.
	(gfc_get_array_type_bounds): Add akind argument, set
	GFC_TYPE_ARRAY_AKIND to it.
	(gfc_sym_type, gfc_get_derived_type): Adjust gfc_build_array_type
	callers.
	(gfc_get_array_descr_info): New function.
	* trans-array.c (gfc_trans_create_temp_array,
	gfc_conv_expr_descriptor): Adjust gfc_get_array_type_bounds
	callers.
	* trans-stmt.c (gfc_trans_pointer_assign_need_temp): Likewise.
	* trans-types.h (gfc_get_array_type_bounds): Adjust prototype.
	* Make-lang.in (fortran/trans-types.o): Depend on dwarf2out.h.
	* f95-lang.c (LANG_HOOKS_GET_ARRAY_DESCR_INFO): Define.

--- gcc/fortran/trans.h.jj	2007-07-23 12:24:16.000000000 +0200
+++ gcc/fortran/trans.h	2007-11-24 15:04:51.000000000 +0100
@@ -453,6 +453,8 @@ tree getdecls (void);
 tree gfc_truthvalue_conversion (tree);
 tree builtin_function (const char *, tree, int, enum built_in_class,
 		       const char *, tree);
+struct array_descr_info;
+bool gfc_get_array_descr_info (tree, struct array_descr_info *);
 
 /* In trans-openmp.c */
 bool gfc_omp_privatize_by_reference (tree);
@@ -541,10 +543,19 @@ extern GTY(()) tree gfor_fndecl_sr_kind;
 
 /* G95-specific declaration information.  */
 
+enum gfc_array_kind
+{
+  GFC_ARRAY_UNKNOWN,
+  GFC_ARRAY_ASSUMED_SHAPE,
+  GFC_ARRAY_ALLOCATABLE,
+  GFC_ARRAY_POINTER
+};
+
 /* Array types only.  */
 struct lang_type		GTY(())
 {
   int rank;
+  enum gfc_array_kind akind;
   tree lbound[GFC_MAX_DIMENSIONS];
   tree ubound[GFC_MAX_DIMENSIONS];
   tree stride[GFC_MAX_DIMENSIONS];
@@ -595,7 +606,8 @@ struct lang_decl		GTY(())
 #define GFC_TYPE_ARRAY_RANK(node) (TYPE_LANG_SPECIFIC(node)->rank)
 #define GFC_TYPE_ARRAY_SIZE(node) (TYPE_LANG_SPECIFIC(node)->size)
 #define GFC_TYPE_ARRAY_OFFSET(node) (TYPE_LANG_SPECIFIC(node)->offset)
-/* Code should use gfc_get_dtype instead of accesig this directly.  It may
+#define GFC_TYPE_ARRAY_AKIND(node) (TYPE_LANG_SPECIFIC(node)->akind)
+/* Code should use gfc_get_dtype instead of accesing this directly.  It may
    not be known when the type is created.  */
 #define GFC_TYPE_ARRAY_DTYPE(node) (TYPE_LANG_SPECIFIC(node)->dtype)
 #define GFC_TYPE_ARRAY_DATAPTR_TYPE(node) \
--- gcc/fortran/trans-stmt.c.jj	2007-03-12 08:28:15.000000000 +0100
+++ gcc/fortran/trans-stmt.c	2007-11-24 14:58:20.000000000 +0100
@@ -2313,7 +2313,8 @@ gfc_trans_pointer_assign_need_temp (gfc_
       /* Make a new descriptor.  */
       parmtype = gfc_get_element_type (TREE_TYPE (desc));
       parmtype = gfc_get_array_type_bounds (parmtype, loop.dimen,
-                                            loop.from, loop.to, 1);
+                                            loop.from, loop.to, 1,
+					    GFC_ARRAY_UNKNOWN);
 
       /* Allocate temporary for nested forall construct.  */
       tmp1 = allocate_temp_for_forall_nest (nested_forall_info, parmtype,
--- gcc/fortran/f95-lang.c.jj	2007-02-20 22:38:20.000000000 +0100
+++ gcc/fortran/f95-lang.c	2007-11-24 15:03:19.000000000 +0100
@@ -124,6 +124,7 @@ static HOST_WIDE_INT gfc_get_alias_set (
 #undef LANG_HOOKS_OMP_DISREGARD_VALUE_EXPR
 #undef LANG_HOOKS_OMP_PRIVATE_DEBUG_CLAUSE
 #undef LANG_HOOKS_OMP_FIRSTPRIVATIZE_TYPE_SIZES
+#undef LANG_HOOKS_GET_ARRAY_DESCR_INFO
 
 /* Define lang hooks.  */
 #define LANG_HOOKS_NAME                 "GNU F95"
@@ -150,6 +151,7 @@ static HOST_WIDE_INT gfc_get_alias_set (
 #define LANG_HOOKS_OMP_PRIVATE_DEBUG_CLAUSE	gfc_omp_private_debug_clause
 #define LANG_HOOKS_OMP_FIRSTPRIVATIZE_TYPE_SIZES \
   gfc_omp_firstprivatize_type_sizes
+#define LANG_HOOKS_GET_ARRAY_DESCR_INFO		gfc_get_array_descr_info
 
 const struct lang_hooks lang_hooks = LANG_HOOKS_INITIALIZER;
 
--- gcc/fortran/Make-lang.in.jj	2007-09-25 11:32:17.000000000 +0200
+++ gcc/fortran/Make-lang.in	2007-11-24 15:02:36.000000000 +0100
@@ -292,7 +292,7 @@ fortran/trans-decl.o: $(GFORTRAN_TRANS_D
   cgraph.h $(TARGET_H) function.h $(FLAGS_H) $(RTL_H) tree-gimple.h \
   tree-dump.h
 fortran/trans-types.o: $(GFORTRAN_TRANS_DEPS) gt-fortran-trans-types.h \
-  real.h toplev.h $(TARGET_H) $(FLAGS_H)
+  real.h toplev.h $(TARGET_H) $(FLAGS_H) dwarf2out.h
 fortran/trans-const.o: $(GFORTRAN_TRANS_DEPS)
 fortran/trans-expr.o: $(GFORTRAN_TRANS_DEPS) fortran/dependency.h
 fortran/trans-stmt.o: $(GFORTRAN_TRANS_DEPS) fortran/dependency.h
--- gcc/fortran/trans-types.c.jj	2007-09-25 11:32:17.000000000 +0200
+++ gcc/fortran/trans-types.c	2007-11-24 15:06:59.000000000 +0100
@@ -36,6 +36,7 @@ Software Foundation, 51 Franklin Street,
 #include "trans-const.h"
 #include "real.h"
 #include "flags.h"
+#include "dwarf2out.h"
 
 
 #if (GFC_MAX_DIMENSIONS < 10)
@@ -821,7 +822,8 @@ gfc_is_nodesc_array (gfc_symbol * sym)
 /* Create an array descriptor type.  */
 
 static tree
-gfc_build_array_type (tree type, gfc_array_spec * as)
+gfc_build_array_type (tree type, gfc_array_spec * as,
+		      enum gfc_array_kind akind)
 {
   tree lbound[GFC_MAX_DIMENSIONS];
   tree ubound[GFC_MAX_DIMENSIONS];
@@ -837,7 +839,9 @@ gfc_build_array_type (tree type, gfc_arr
       ubound[n] = gfc_conv_array_bound (as->upper[n]);
     }
 
-  return gfc_get_array_type_bounds (type, as->rank, lbound, ubound, 0);
+  if (as->type == AS_ASSUMED_SHAPE)
+    akind = GFC_ARRAY_ASSUMED_SHAPE;
+  return gfc_get_array_type_bounds (type, as->rank, lbound, ubound, 0, akind);
 }
 
 /* Returns the struct descriptor_dimension type.  */
@@ -1015,7 +1019,7 @@ gfc_get_nodesc_array_type (tree etype, g
       if (expr->expr_type == EXPR_CONSTANT)
         {
           tmp = gfc_conv_mpz_to_tree (expr->value.integer,
-                                  gfc_index_integer_kind);
+				      gfc_index_integer_kind);
         }
       else
         {
@@ -1107,7 +1111,7 @@ gfc_get_nodesc_array_type (tree etype, g
   /* In debug info represent packed arrays as multi-dimensional
      if they have rank > 1 and with proper bounds, instead of flat
      arrays.  */
-  if (known_stride && write_symbols != NO_DEBUG)
+  if (known_offset && write_symbols != NO_DEBUG)
     {
       tree gtype = etype, rtype, type_decl;
 
@@ -1193,7 +1197,8 @@ gfc_get_array_descriptor_base (int dimen
 
 tree
 gfc_get_array_type_bounds (tree etype, int dimen, tree * lbound,
-			   tree * ubound, int packed)
+			   tree * ubound, int packed,
+			   enum gfc_array_kind akind)
 {
   char name[8 + GFC_RANK_DIGITS + GFC_MAX_SYMBOL_LEN];
   tree fat_type, base_type, arraytype, lower, upper, stride, tmp;
@@ -1220,6 +1225,7 @@ gfc_get_array_type_bounds (tree etype, i
 
   GFC_TYPE_ARRAY_RANK (fat_type) = dimen;
   GFC_TYPE_ARRAY_DTYPE (fat_type) = NULL_TREE;
+  GFC_TYPE_ARRAY_AKIND (fat_type) = akind;
 
   /* Build an array descriptor record type.  */
   if (packed != 0)
@@ -1337,7 +1343,14 @@ gfc_sym_type (gfc_symbol * sym)
 	    }
         }
       else
-	type = gfc_build_array_type (type, sym->as);
+	{
+	  enum gfc_array_kind akind = GFC_ARRAY_UNKNOWN;
+	  if (sym->attr.pointer)
+	    akind = GFC_ARRAY_POINTER;
+	  else if (sym->attr.allocatable)
+	    akind = GFC_ARRAY_ALLOCATABLE;
+	  type = gfc_build_array_type (type, sym->as, akind);
+	}
     }
   else
     {
@@ -1550,7 +1563,8 @@ gfc_get_derived_type (gfc_symbol * deriv
 	    {
 	      /* Pointers to arrays aren't actually pointer types.  The
 	         descriptors are separate, but the data is common.  */
-	      field_type = gfc_build_array_type (field_type, c->as);
+	      field_type = gfc_build_array_type (field_type, c->as,
+						 GFC_ARRAY_POINTER);
 	    }
 	  else
 	    field_type = gfc_get_nodesc_array_type (field_type, c->as, 3);
@@ -1893,4 +1907,124 @@ gfc_signed_type (tree type)
   return gfc_signed_or_unsigned_type (0, type);
 }
 
+/* Return TRUE if TYPE is a type with a hidden descriptor, fill in INFO
+   in that case.  */
+
+bool
+gfc_get_array_descr_info (tree type, struct array_descr_info *info)
+{
+  int rank, dim;
+  bool indirect = false;
+  tree etype, ptype, field, t, base_decl;
+  tree data_off, offset_off, dim_off, dim_size, elem_size;
+  tree lower_suboff, upper_suboff, stride_suboff;
+
+  if (! GFC_DESCRIPTOR_TYPE_P (type))
+    {
+      if (! POINTER_TYPE_P (type))
+	return false;
+      type = TREE_TYPE (type);
+      if (! GFC_DESCRIPTOR_TYPE_P (type))
+	return false;
+      indirect = true;
+    }
+
+  rank = GFC_TYPE_ARRAY_RANK (type);
+  if (rank >= (int) (sizeof (info->dimen) / sizeof (info->dimen[0])))
+    return false;
+
+  etype = GFC_TYPE_ARRAY_DATAPTR_TYPE (type);
+  gcc_assert (POINTER_TYPE_P (etype));
+  etype = TREE_TYPE (etype);
+  gcc_assert (TREE_CODE (etype) == ARRAY_TYPE);
+  etype = TREE_TYPE (etype);
+  /* Can't handle variable sized elements yet.  */
+  if (int_size_in_bytes (etype) <= 0)
+    return false;
+  /* Nor non-constant lower bounds in assumed shape arrays.  */
+  if (GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ASSUMED_SHAPE)
+    {
+      for (dim = 0; dim < rank; dim++)
+	if (GFC_TYPE_ARRAY_LBOUND (type, dim) == NULL_TREE
+	    || TREE_CODE (GFC_TYPE_ARRAY_LBOUND (type, dim)) != INTEGER_CST)
+	  return false;
+    }
+
+  memset (info, '\0', sizeof (*info));
+  info->ndimensions = rank;
+  info->element_type = etype;
+  ptype = build_pointer_type (gfc_array_index_type);
+  if (indirect)
+    {
+      info->base_decl = build_decl (VAR_DECL, NULL_TREE,
+				    build_pointer_type (ptype));
+      base_decl = build1 (INDIRECT_REF, ptype, info->base_decl);
+    }
+  else
+    info->base_decl = base_decl = build_decl (VAR_DECL, NULL_TREE, ptype);
+
+  elem_size = fold_convert (gfc_array_index_type, TYPE_SIZE_UNIT (etype));
+  field = TYPE_FIELDS (TYPE_MAIN_VARIANT (type));
+  data_off = byte_position (field);
+  field = TREE_CHAIN (field);
+  offset_off = byte_position (field);
+  field = TREE_CHAIN (field);
+  field = TREE_CHAIN (field);
+  dim_off = byte_position (field);
+  dim_size = TYPE_SIZE_UNIT (TREE_TYPE (TREE_TYPE (field)));
+  field = TYPE_FIELDS (TREE_TYPE (TREE_TYPE (field)));
+  stride_suboff = byte_position (field);
+  field = TREE_CHAIN (field);
+  lower_suboff = byte_position (field);
+  field = TREE_CHAIN (field);
+  upper_suboff = byte_position (field);
+
+  t = base_decl;
+  if (!integer_zerop (data_off))
+    t = build2 (PLUS_EXPR, ptype, t, data_off);
+  t = build1 (NOP_EXPR, build_pointer_type (ptr_type_node), t);
+  info->data_location = build1 (INDIRECT_REF, ptr_type_node, t);
+  if (GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ALLOCATABLE)
+    info->allocated = build2 (NE_EXPR, boolean_type_node,
+			      info->data_location, null_pointer_node);
+  else if (GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_POINTER)
+    info->associated = build2 (NE_EXPR, boolean_type_node,
+			       info->data_location, null_pointer_node);
+
+  for (dim = 0; dim < rank; dim++)
+    {
+      t = build2 (PLUS_EXPR, ptype, base_decl,
+		  size_binop (PLUS_EXPR, dim_off, lower_suboff));
+      t = build1 (INDIRECT_REF, gfc_array_index_type, t);
+      info->dimen[dim].lower_bound = t;
+      t = build2 (PLUS_EXPR, ptype, base_decl,
+		  size_binop (PLUS_EXPR, dim_off, upper_suboff));
+      t = build1 (INDIRECT_REF, gfc_array_index_type, t);
+      info->dimen[dim].upper_bound = t;
+      if (GFC_TYPE_ARRAY_AKIND (type) == GFC_ARRAY_ASSUMED_SHAPE)
+	{
+	  /* Assumed shape arrays have known lower bounds.  */
+	  info->dimen[dim].upper_bound
+	    = build2 (MINUS_EXPR, gfc_array_index_type,
+		      info->dimen[dim].upper_bound,
+		      info->dimen[dim].lower_bound);
+	  info->dimen[dim].lower_bound
+	    = fold_convert (gfc_array_index_type,
+			    GFC_TYPE_ARRAY_LBOUND (type, dim));
+	  info->dimen[dim].upper_bound
+	    = build2 (PLUS_EXPR, gfc_array_index_type,
+		      info->dimen[dim].lower_bound,
+		      info->dimen[dim].upper_bound);
+	}
+      t = build2 (PLUS_EXPR, ptype, base_decl,
+		  size_binop (PLUS_EXPR, dim_off, stride_suboff));
+      t = build1 (INDIRECT_REF, gfc_array_index_type, t);
+      t = build2 (MULT_EXPR, gfc_array_index_type, t, elem_size);
+      info->dimen[dim].stride = t;
+      dim_off = size_binop (PLUS_EXPR, dim_off, dim_size);
+    }
+
+  return true;
+}
+
 #include "gt-fortran-trans-types.h"
--- gcc/fortran/trans-array.c.jj	2007-04-03 13:10:00.000000000 +0200
+++ gcc/fortran/trans-array.c	2007-11-24 14:58:20.000000000 +0100
@@ -612,7 +612,8 @@ gfc_trans_allocate_temp_array (stmtblock
 
   /* Initialize the descriptor.  */
   type =
-    gfc_get_array_type_bounds (eltype, info->dimen, loop->from, loop->to, 1);
+    gfc_get_array_type_bounds (eltype, info->dimen, loop->from, loop->to, 1,
+			       GFC_ARRAY_UNKNOWN);
   desc = gfc_create_var (type, "atmp");
   GFC_DECL_PACKED_ARRAY (desc) = 1;
 
@@ -4345,7 +4346,8 @@ gfc_conv_expr_descriptor (gfc_se * se, g
 	  /* Otherwise make a new one.  */
 	  parmtype = gfc_get_element_type (TREE_TYPE (desc));
 	  parmtype = gfc_get_array_type_bounds (parmtype, loop.dimen,
-						loop.from, loop.to, 0);
+						loop.from, loop.to, 0,
+						GFC_ARRAY_UNKNOWN);
 	  parm = gfc_create_var (parmtype, "parm");
 	}
 
--- gcc/fortran/trans-types.h.jj	2007-02-20 22:38:20.000000000 +0100
+++ gcc/fortran/trans-types.h	2007-11-24 15:03:58.000000000 +0100
@@ -79,7 +79,8 @@ tree gfc_signed_type (tree);
 tree gfc_signed_or_unsigned_type (int, tree);
 
 tree gfc_get_element_type (tree);
-tree gfc_get_array_type_bounds (tree, int, tree *, tree *, int);
+tree gfc_get_array_type_bounds (tree, int, tree *, tree *, int,
+				enum gfc_array_kind);
 tree gfc_get_nodesc_array_type (tree, gfc_array_spec *, int);
 
 /* Add a field of given name and type to a UNION_TYPE or RECORD_TYPE.  */
--- gcc/dwarf2.h.jj	2007-02-20 22:39:12.000000000 +0100
+++ gcc/dwarf2.h	2007-11-24 14:58:20.000000000 +0100
@@ -275,7 +275,8 @@ enum dwarf_attribute
     DW_AT_prototyped = 0x27,
     DW_AT_return_addr = 0x2a,
     DW_AT_start_scope = 0x2c,
-    DW_AT_stride_size = 0x2e,
+    DW_AT_bit_stride = 0x2e,
+    DW_AT_stride_size = DW_AT_bit_stride,
     DW_AT_upper_bound = 0x2f,
     DW_AT_abstract_origin = 0x31,
     DW_AT_accessibility = 0x32,
@@ -310,7 +311,8 @@ enum dwarf_attribute
     DW_AT_allocated     = 0x4e,
     DW_AT_associated    = 0x4f,
     DW_AT_data_location = 0x50,
-    DW_AT_stride        = 0x51,
+    DW_AT_byte_stride   = 0x51,
+    DW_AT_stride        = DW_AT_byte_stride,
     DW_AT_entry_pc      = 0x52,
     DW_AT_use_UTF8      = 0x53,
     DW_AT_extension     = 0x54,
--- gcc/langhooks.h.jj	2007-11-23 17:41:15.000000000 +0100
+++ gcc/langhooks.h	2007-11-24 15:01:32.000000000 +0100
@@ -28,6 +28,8 @@ struct diagnostic_info;
 
 struct gimplify_omp_ctx;
 
+struct array_descr_info;
+
 /* A print hook for print_tree ().  */
 typedef void (*lang_print_tree_hook) (FILE *, tree, int indent);
 
@@ -153,6 +155,10 @@ struct lang_hooks_for_types
      Called only after doing all language independent checks.  */
   bool (*type_hash_eq) (tree, tree);
 
+  /* Return TRUE if TYPE uses a hidden descriptor and fills in information
+     for the debugger about the array bounds, strides, etc.  */
+  bool (*get_array_descr_info) (tree, struct array_descr_info *);
+
   /* Nonzero if types that are identical are to be hashed so that only
      one copy is kept.  If a language requires unique types for each
      user-specified type, such as Ada, this should be set to TRUE.  */
--- gcc/langhooks-def.h.jj	2007-11-23 17:41:15.000000000 +0100
+++ gcc/langhooks-def.h	2007-11-24 15:00:47.000000000 +0100
@@ -223,6 +223,7 @@ extern tree lhd_make_node (enum tree_cod
 #define LANG_HOOKS_OMP_FIRSTPRIVATIZE_TYPE_SIZES \
   lhd_omp_firstprivatize_type_sizes
 #define LANG_HOOKS_TYPE_HASH_EQ		lhd_type_hash_eq
+#define LANG_HOOKS_GET_ARRAY_DESCR_INFO	NULL
 #define LANG_HOOKS_HASH_TYPES		true
 
 #define LANG_HOOKS_FOR_TYPES_INITIALIZER { \
@@ -238,6 +239,7 @@ extern tree lhd_make_node (enum tree_cod
   LANG_HOOKS_TYPE_MAX_SIZE, \
   LANG_HOOKS_OMP_FIRSTPRIVATIZE_TYPE_SIZES, \
   LANG_HOOKS_TYPE_HASH_EQ, \
+  LANG_HOOKS_GET_ARRAY_DESCR_INFO, \
   LANG_HOOKS_HASH_TYPES \
 }
 
--- gcc/dwarf2out.c.jj	2007-11-23 18:10:20.000000000 +0100
+++ gcc/dwarf2out.c	2007-11-24 14:58:20.000000000 +0100
@@ -4146,6 +4146,7 @@ static tree member_declared_type (tree);
 static const char *decl_start_label (tree);
 #endif
 static void gen_array_type_die (tree, dw_die_ref);
+static void gen_descr_array_type_die (tree, struct array_descr_info *, dw_die_ref);
 #if 0
 static void gen_entry_point_die (tree, dw_die_ref);
 #endif
@@ -4552,8 +4553,8 @@ dwarf_attr_name (unsigned int attr)
       return "DW_AT_return_addr";
     case DW_AT_start_scope:
       return "DW_AT_start_scope";
-    case DW_AT_stride_size:
-      return "DW_AT_stride_size";
+    case DW_AT_bit_stride:
+      return "DW_AT_bit_stride";
     case DW_AT_upper_bound:
       return "DW_AT_upper_bound";
     case DW_AT_abstract_origin:
@@ -4621,8 +4622,8 @@ dwarf_attr_name (unsigned int attr)
       return "DW_AT_associated";
     case DW_AT_data_location:
       return "DW_AT_data_location";
-    case DW_AT_stride:
-      return "DW_AT_stride";
+    case DW_AT_byte_stride:
+      return "DW_AT_byte_stride";
     case DW_AT_entry_pc:
       return "DW_AT_entry_pc";
     case DW_AT_use_UTF8:
@@ -11169,6 +11170,159 @@ gen_array_type_die (tree type, dw_die_re
   add_type_attribute (array_die, element_type, 0, 0, context_die);
 }
 
+static dw_loc_descr_ref
+descr_info_loc (tree val, tree base_decl)
+{
+  HOST_WIDE_INT size;
+  dw_loc_descr_ref loc, loc2;
+  enum dwarf_location_atom op;
+
+  if (val == base_decl)
+    return new_loc_descr (DW_OP_push_object_address, 0, 0);
+
+  switch (TREE_CODE (val))
+    {
+    case NOP_EXPR:
+    case CONVERT_EXPR:
+      return descr_info_loc (TREE_OPERAND (val, 0), base_decl);
+    case INTEGER_CST:
+      if (host_integerp (val, 0))
+	return int_loc_descriptor (tree_low_cst (val, 0));
+      break;
+    case INDIRECT_REF:
+      size = int_size_in_bytes (TREE_TYPE (val));
+      if (size < 0)
+	break;
+      loc = descr_info_loc (TREE_OPERAND (val, 0), base_decl);
+      if (!loc)
+	break;
+      if (size == DWARF2_ADDR_SIZE)
+	add_loc_descr (&loc, new_loc_descr (DW_OP_deref, 0, 0));
+      else
+	add_loc_descr (&loc, new_loc_descr (DW_OP_deref_size, size, 0));
+      return loc;
+    case PLUS_EXPR:
+      if (host_integerp (TREE_OPERAND (val, 1), 1)
+	  && (unsigned HOST_WIDE_INT) tree_low_cst (TREE_OPERAND (val, 1), 1)
+	     < 16384)
+	{
+	  loc = descr_info_loc (TREE_OPERAND (val, 0), base_decl);
+	  if (!loc)
+	    break;
+	  add_loc_descr (&loc,
+			 new_loc_descr (DW_OP_plus_uconst,
+					tree_low_cst (TREE_OPERAND (val, 1),
+						      1), 0));
+	}
+      else
+	{
+	  op = DW_OP_plus;
+	do_binop:
+	  loc = descr_info_loc (TREE_OPERAND (val, 0), base_decl);
+	  if (!loc)
+	    break;
+	  loc2 = descr_info_loc (TREE_OPERAND (val, 1), base_decl);
+	  if (!loc2)
+	    break;
+	  add_loc_descr (&loc, loc2);
+	  add_loc_descr (&loc2, new_loc_descr (op, 0, 0));
+	}
+      return loc;
+    case MINUS_EXPR:
+      op = DW_OP_minus;
+      goto do_binop;
+    case MULT_EXPR:
+      op = DW_OP_mul;
+      goto do_binop;
+    case EQ_EXPR:
+      op = DW_OP_eq;
+      goto do_binop;
+    case NE_EXPR:
+      op = DW_OP_ne;
+      goto do_binop;
+    default:
+      break;
+    }
+  return NULL;
+}
+
+static void
+add_descr_info_field (dw_die_ref die, enum dwarf_attribute attr,
+		      tree val, tree base_decl)
+{
+  dw_loc_descr_ref loc;
+
+  if (host_integerp (val, 0))
+    {
+      add_AT_unsigned (die, attr, tree_low_cst (val, 0));
+      return;
+    }
+
+  loc = descr_info_loc (val, base_decl);
+  if (!loc)
+    return;
+
+  add_AT_loc (die, attr, loc);
+}
+
+/* This routine generates DIE for array with hidden descriptor, details
+   are filled into *info by a langhook.  */
+
+static void
+gen_descr_array_type_die (tree type, struct array_descr_info *info,
+			  dw_die_ref context_die)
+{
+  dw_die_ref scope_die = scope_die_for (type, context_die);
+  dw_die_ref array_die;
+  int dim;
+
+  array_die = new_die (DW_TAG_array_type, scope_die, type);
+  add_name_attribute (array_die, type_tag (type));
+  equate_type_number_to_die (type, array_die);
+
+  if (info->data_location)
+    add_descr_info_field (array_die, DW_AT_data_location, info->data_location,
+			  info->base_decl);
+  if (info->associated)
+    add_descr_info_field (array_die, DW_AT_associated, info->associated,
+			  info->base_decl);
+  if (info->allocated)
+    add_descr_info_field (array_die, DW_AT_allocated, info->allocated,
+			  info->base_decl);
+
+  for (dim = 0; dim < info->ndimensions; dim++)
+    {
+      dw_die_ref subrange_die
+	= new_die (DW_TAG_subrange_type, array_die, NULL);
+
+      if (info->dimen[dim].lower_bound)
+	{
+	  /* If it is the default value, omit it.  */
+	  if ((is_c_family () || is_java ())
+	      && integer_zerop (info->dimen[dim].lower_bound))
+	    ;
+	  else if (is_fortran ()
+		   && integer_onep (info->dimen[dim].lower_bound))
+	    ;
+	  else
+	    add_descr_info_field (subrange_die, DW_AT_lower_bound,
+				  info->dimen[dim].lower_bound,
+				  info->base_decl);
+	}
+      if (info->dimen[dim].upper_bound)
+	add_descr_info_field (subrange_die, DW_AT_upper_bound,
+			      info->dimen[dim].upper_bound,
+			      info->base_decl);
+      if (info->dimen[dim].stride)
+	add_descr_info_field (subrange_die, DW_AT_byte_stride,
+			      info->dimen[dim].stride,
+			      info->base_decl);
+    }
+
+  gen_type_die (info->element_type, context_die);
+  add_type_attribute (array_die, info->element_type, 0, 0, context_die);
+}
+
 #if 0
 static void
 gen_entry_point_die (tree decl, dw_die_ref context_die)
@@ -12478,6 +12632,7 @@ static void
 gen_type_die (tree type, dw_die_ref context_die)
 {
   int need_pop;
+  struct array_descr_info info;
 
   if (type == NULL_TREE || type == error_mark_node)
     return;
@@ -12496,6 +12651,16 @@ gen_type_die (tree type, dw_die_ref cont
       return;
     }
 
+  /* If this is an array type with hidden descriptor, handle it first.  */
+  if (!TREE_ASM_WRITTEN (type)
+      && lang_hooks.types.get_array_descr_info
+      && lang_hooks.types.get_array_descr_info (type, &info))
+    {
+      gen_descr_array_type_die (type, &info, context_die);
+      TREE_ASM_WRITTEN (type) = 1;
+      return;
+    }
+
   /* We are going to output a DIE to represent the unqualified version
      of this type (i.e. without any const or volatile qualifiers) so
      get the main variant (i.e. the unqualified version) of this type
--- gcc/dwarf2out.h.jj	2007-02-20 22:39:12.000000000 +0100
+++ gcc/dwarf2out.h	2007-11-24 15:00:14.000000000 +0100
@@ -27,3 +27,19 @@ struct die_struct;
 extern void debug_dwarf_die (struct die_struct *);
 extern void dwarf2out_set_demangle_name_func (const char *(*) (const char *));
 extern void dwarf2out_add_library_unit_info (const char *, const char *);
+
+struct array_descr_info
+{
+  int ndimensions;
+  tree element_type;
+  tree base_decl;
+  tree data_location;
+  tree allocated;
+  tree associated;
+  struct array_descr_dimen
+    {
+      tree lower_bound;
+      tree upper_bound;
+      tree stride;
+    } dimen[10];
+};

gcc41-rh407281.patch:

--- NEW FILE gcc41-rh407281.patch ---
2007-12-02  Jakub Jelinek  <jakub at redhat.com>

	* gcc.c-torture/execute/20071202-1.c: New test.

2007-02-19  Eric Botcazou  <ebotcazou at adacore.com>

	* gimplify.c (gimplify_init_ctor_preeval_1): Detect potential overlap
	due to calls to functions taking pointers as parameters.

	* gnat.dg/self_aggregate_with_call.adb: New test.

2006-08-21  Olivier Hainque  <hainque at adacore.com>

	* gimplify.c (gimplify_init_constructor) <RECORD,UNION,ARRAY types>:
	Arrange for the temporary captures of components overlapping the lhs
	to happen before the lhs is possibly cleared.
	
	* gnat.dg/self_aggregate_with_zeros.adb: New test.
	* gnat.dg/self_aggregate_with_array.adb: New test.

--- gcc/gimplify.c	(revision 116299)
+++ gcc/gimplify.c	(revision 116300)
@@ -2638,6 +2638,21 @@ gimplify_init_ctor_preeval_1 (tree *tp, 
       && alias_sets_conflict_p (data->lhs_alias_set, get_alias_set (t)))
     return t;
 
+  /* If the constructor component is a call, determine if it can hide a
+     potential overlap with the lhs through an INDIRECT_REF like above.  */
+  if (TREE_CODE (t) == CALL_EXPR)
+    {
+      tree type, fntype = TREE_TYPE (TREE_TYPE (TREE_OPERAND (t, 0)));
+
+      for (type = TYPE_ARG_TYPES (fntype); type; type = TREE_CHAIN (type))
+	if (POINTER_TYPE_P (TREE_VALUE (type))
+	    && (!data->lhs_base_decl || TREE_ADDRESSABLE (data->lhs_base_decl))
+	    && alias_sets_conflict_p (data->lhs_alias_set,
+				      get_alias_set
+				        (TREE_TYPE (TREE_VALUE (type)))))
+	  return t;
+    }
+
   if (IS_TYPE_OR_DECL_P (t))
     *walk_subtrees = 0;
   return NULL;
@@ -3061,6 +3061,20 @@ gimplify_init_constructor (tree *expr_p,
 	      }
 	  }
 
+	/* If there are nonzero elements, pre-evaluate to capture elements
+	   overlapping with the lhs into temporaries.  We must do this before
+	   clearing to fetch the values before they are zeroed-out.  */
+	if (num_nonzero_elements > 0)
+	  {
+	    preeval_data.lhs_base_decl = get_base_address (object);
+	    if (!DECL_P (preeval_data.lhs_base_decl))
+	      preeval_data.lhs_base_decl = NULL;
+	    preeval_data.lhs_alias_set = get_alias_set (object);
+
+	    gimplify_init_ctor_preeval (&TREE_OPERAND (*expr_p, 1),
+					pre_p, post_p, &preeval_data);
+	  }
+
 	if (cleared)
 	  {
 	    /* Zap the CONSTRUCTOR element list, which simplifies this case.
@@ -3076,16 +3090,7 @@ gimplify_init_constructor (tree *expr_p,
 	   elements in the constructor, add assignments to the individual
 	   scalar fields of the object.  */
 	if (!cleared || num_nonzero_elements > 0)
-	  {
-	    preeval_data.lhs_base_decl = get_base_address (object);
-	    if (!DECL_P (preeval_data.lhs_base_decl))
-	      preeval_data.lhs_base_decl = NULL;
-	    preeval_data.lhs_alias_set = get_alias_set (object);
-
-	    gimplify_init_ctor_preeval (&TREE_OPERAND (*expr_p, 1),
-					pre_p, post_p, &preeval_data);
-	    gimplify_init_ctor_eval (object, elts, pre_p, cleared);
-	  }
+	  gimplify_init_ctor_eval (object, elts, pre_p, cleared);
 
 	*expr_p = NULL_TREE;
       }
--- gcc/testsuite/gcc.c-torture/execute/20071202-1.c.jj	2007-12-02 19:26:19.000000000 +0100
+++ gcc/testsuite/gcc.c-torture/execute/20071202-1.c	2007-12-02 19:24:28.000000000 +0100
@@ -0,0 +1,25 @@
+extern void abort (void);
+struct T { int t; int r[8]; };
+struct S { int a; int b; int c[6]; struct T d; };
+
+__attribute__((noinline)) void
+foo (struct S *s)
+{
+  *s = (struct S) { s->b, s->a, { 0, 0, 0, 0, 0, 0 }, s->d };
+}
+
+int
+main (void)
+{
+  struct S s = { 6, 12, { 1, 2, 3, 4, 5, 6 },
+		 { 7, { 8, 9, 10, 11, 12, 13, 14, 15 } } };
+  foo (&s);
+  if (s.a != 12 || s.b != 6
+      || s.c[0] || s.c[1] || s.c[2] || s.c[3] || s.c[4] || s.c[5])
+    abort ();
+  if (s.d.t != 7 || s.d.r[0] != 8 || s.d.r[1] != 9 || s.d.r[2] != 10
+      || s.d.r[3] != 11 || s.d.r[4] != 12 || s.d.r[5] != 13
+      || s.d.r[6] != 14 || s.d.r[7] != 15)
+    abort ();
+  return 0;
+}
--- gcc/testsuite/gnat.dg/self_aggregate_with_zeros.adb	(revision 0)
+++ gcc/testsuite/gnat.dg/self_aggregate_with_zeros.adb	(revision 116300)
@@ -0,0 +1,19 @@
+-- { dg-do run }
+
+procedure self_aggregate_with_zeros is
+
+   type Sensor is record
+      Value  : Natural;
+      A, B, C, D, E, F, G, H, I, J, K, L, M : Natural;
+   end record;
+
+   Pressure : Sensor;
+
+begin
+   Pressure.Value := 256;
+   Pressure := (Pressure.Value, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0);
+
+   if Pressure.Value /= 256 then
+      raise Program_Error;
+   end if;
+end;
--- gcc/testsuite/gnat.dg/self_aggregate_with_array.adb	(revision 0)
+++ gcc/testsuite/gnat.dg/self_aggregate_with_array.adb	(revision 116300)
@@ -0,0 +1,21 @@
+-- { dg-do run }
+
+procedure self_aggregate_with_array is
+
+   type Value_Bounds is array (1 .. 2) of Natural;
+
+   type Sensor is record
+      Value  : Natural;
+      Bounds : Value_Bounds;
+   end record;
+
+   Pressure : Sensor;
+
+begin
+   Pressure.Value := 256;
+   Pressure := (Value => Pressure.Value, Bounds => (1, 2));
+
+   if Pressure.Value /= 256 then
+      raise Program_Error;
+   end if;
+end;
--- gcc/testsuite/gnat.dg/self_aggregate_with_call.adb	(revision 0)
+++ gcc/testsuite/gnat.dg/self_aggregate_with_call.adb	(revision 122134)
@@ -0,0 +1,30 @@
+-- { dg-do run }
+-- { dg-options "-O2" }
+
+procedure self_aggregate_with_call is
+
+   type Values is array (1 .. 8) of Natural;
+
+   type Vector is record
+      Components : Values;
+   end record;
+
+   function Clone (Components: Values) return Values is
+   begin
+      return Components;
+   end;
+
+   procedure Process (V : in out Vector) is
+   begin
+      V.Components (Values'First) := 1;
+      V := (Components => Clone (V.Components));
+
+      if V.Components (Values'First) /= 1 then
+         raise Program_Error;
+      end if;
+   end;
+
+   V : Vector;
+begin
+   Process (V);
+end;

gcc41-rh426846.patch:

--- NEW FILE gcc41-rh426846.patch ---
2007-10-10  Jason Merrill  <jason at redhat.com>

	* libsupc++/guard.cc (struct mutex_wrapper): Move into
	anonymous namespace.

2007-10-09  Zhou Drangon  <drangon.mail at gmail.com>

	PR libstdc++/33682
        * libsupc++/guard.cc: Make single conditional variable
        implementation dependent to __GTHREAD_HAS_COND.

2007-10-05  Hans-Peter Nilsson  <hp at axis.com>

	* gthr-single.h: Revert last change.

2007-10-04  Doug Kwan  <dougkwan at google.com>

	* gthr-posix.h (__gthread_cond_broadcast, __gthread_cond_wait,
	__gthread_cond_wait_recursive): Add to extend interface for POSIX
	conditional variables. (__GTHREAD_HAS_COND): Macro defined to signify
	support of conditional variables.
	* gthr-posix95.h (__gthread_cond_broadcast, __gthread_cond_wait,
	__gthread_cond_wait_recursive): Add to extend interface for POSIX
	conditional variables. (__GTHREAD_HAS_COND): Macro defined to signify
	support of conditional variables.
	* gthr-single.h (__gthread_cond_broadcast, __gthread_cond_wait,
	__gthread_cond_wait_recursive): Add to extend interface for POSIX
	conditional variables.
	* gthr.h: Update comments to document new interface.

	* include/ext/concurrent.h (class __mutex,
	class __recursive_mutex): Add new method gthread_mutex to access
	inner gthread mutex.
	[__GTHREAD_HAS_COND] (class __concurrence_broadcast_error,
	class __concurrence_wait_error, class __cond): Add.
	* libsupc++/guard.cc (recursive_push, recursive_pop): Delete.
	(init_in_progress_flag, set_init_in_progress_flag): Add to
	replace recursive_push and recursive_pop.
	(throw_recursive_init_exception): Add.
	(acquire, __cxa_guard_acquire, __cxa_guard_abort and
	__cxa_guard_release): [__GTHREAD_HAS_COND] Use a conditional
	for synchronization of static variable initialization.
	The global mutex is only held briefly when guards are
	accessed. [!__GTHREAD_HAS_COND] Fall back to the old code,
	which deadlocks.
	* testsuite/thread/guard.cc: Add new test. It deadlocks with the
	old locking code in libstdc++-v3/libsup++/guard.cc.

--- gcc/gthr.h	(revision 129029)
+++ gcc/gthr.h	(revision 129030)
@@ -81,6 +81,24 @@ Software Foundation, 51 Franklin Street,
      int __gthread_recursive_mutex_trylock (__gthread_recursive_mutex_t *mutex);
      int __gthread_recursive_mutex_unlock (__gthread_recursive_mutex_t *mutex);
 
+   The following are supported in POSIX threads only. They are required to
+   fix a deadlock in static initialization inside libsupc++. The header file
+   gthr-posix.h defines a symbol __GTHREAD_HAS_COND to signify that these extra
+   features are supported.
+
+   Types:
+     __gthread_cond_t
+
+   Macros:
+     __GTHREAD_COND_INIT
+     __GTHREAD_COND_INIT_FUNCTION
+
+   Interface:
+     int __gthread_cond_broadcast (__gthread_cond_t *cond);
+     int __gthread_cond_wait (__gthread_cond_t *cond, __gthread_mutex_t *mutex);
+     int __gthread_cond_wait_recursive (__gthread_cond_t *cond,
+					__gthread_recursive_mutex_t *mutex);
+
    All functions returning int should return zero on success or the error
    number.  If the operation is not supported, -1 is returned.
 
--- gcc/gthr-posix.h	(revision 129029)
+++ gcc/gthr-posix.h	(revision 129030)
@@ -47,6 +47,11 @@ typedef pthread_key_t __gthread_key_t;
 typedef pthread_once_t __gthread_once_t;
 typedef pthread_mutex_t __gthread_mutex_t;
 typedef pthread_mutex_t __gthread_recursive_mutex_t;
+typedef pthread_cond_t __gthread_cond_t;
+
+/* POSIX like conditional variables are supported.  Please look at comments
+   in gthr.h for details. */
+#define __GTHREAD_HAS_COND	1	
 
 #define __GTHREAD_MUTEX_INIT PTHREAD_MUTEX_INITIALIZER
 #define __GTHREAD_ONCE_INIT PTHREAD_ONCE_INIT
@@ -57,6 +62,7 @@ typedef pthread_mutex_t __gthread_recurs
 #else
 #define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION __gthread_recursive_mutex_init_function
 #endif
+#define __GTHREAD_COND_INIT PTHREAD_COND_INITIALIZER
 
 #if SUPPORTS_WEAK && GTHREAD_USE_WEAK
 # ifndef __gthrw_pragma
@@ -88,6 +94,8 @@ __gthrw3(pthread_mutex_lock)
 __gthrw3(pthread_mutex_trylock)
 __gthrw3(pthread_mutex_unlock)
 __gthrw3(pthread_mutex_init)
+__gthrw3(pthread_cond_broadcast)
+__gthrw3(pthread_cond_wait)
 #else
 __gthrw(pthread_once)
 __gthrw(pthread_getspecific)
@@ -98,6 +106,8 @@ __gthrw(pthread_mutex_lock)
 __gthrw(pthread_mutex_trylock)
 __gthrw(pthread_mutex_unlock)
 __gthrw(pthread_mutex_init)
+__gthrw(pthread_cond_broadcast)
+__gthrw(pthread_cond_wait)
 #endif
 
 __gthrw(pthread_key_create)
@@ -110,20 +120,16 @@ __gthrw(pthread_mutexattr_destroy)
 #if defined(_LIBOBJC) || defined(_LIBOBJC_WEAK)
 /* Objective-C.  */
 #if defined(__osf__) && defined(_PTHREAD_USE_MANGLED_NAMES_)
-__gthrw3(pthread_cond_broadcast)
 __gthrw3(pthread_cond_destroy)
 __gthrw3(pthread_cond_init)
 __gthrw3(pthread_cond_signal)
-__gthrw3(pthread_cond_wait)
 __gthrw3(pthread_exit)
 __gthrw3(pthread_mutex_destroy)
 __gthrw3(pthread_self)
 #else
-__gthrw(pthread_cond_broadcast)
 __gthrw(pthread_cond_destroy)
 __gthrw(pthread_cond_init)
 __gthrw(pthread_cond_signal)
-__gthrw(pthread_cond_wait)
 __gthrw(pthread_exit)
 __gthrw(pthread_mutex_destroy)
 __gthrw(pthread_self)
@@ -737,6 +743,25 @@ __gthread_recursive_mutex_unlock (__gthr
   return __gthread_mutex_unlock (mutex);
 }
 
+static inline int
+__gthread_cond_broadcast (__gthread_cond_t *cond)
+{
+  return __gthrw_(pthread_cond_broadcast) (cond);
+}
+
+static inline int
+__gthread_cond_wait (__gthread_cond_t *cond, __gthread_mutex_t *mutex)
+{
+  return __gthrw_(pthread_cond_wait) (cond, mutex);
+}
+
+static inline int
+__gthread_cond_wait_recursive (__gthread_cond_t *cond,
+			       __gthread_recursive_mutex_t *mutex)
+{
+  return __gthread_cond_wait (cond, mutex);
+}
+
 #endif /* _LIBOBJC */
 
 #endif /* ! GCC_GTHR_POSIX_H */
--- gcc/gthr-posix95.h	(revision 129029)
+++ gcc/gthr-posix95.h	(revision 129030)
@@ -45,6 +45,11 @@ Software Foundation, 51 Franklin Street,
 typedef pthread_key_t __gthread_key_t;
 typedef pthread_once_t __gthread_once_t;
 typedef pthread_mutex_t __gthread_mutex_t;
+typedef pthread_cond_t __gthread_cond_t;
+
+/* POSIX like conditional variables are supported.  Please look at comments
+   in gthr.h for details. */
+#define __GTHREAD_HAS_COND	1
 
 typedef struct {
   long depth;
@@ -55,6 +60,7 @@ typedef struct {
 #define __GTHREAD_MUTEX_INIT PTHREAD_MUTEX_INITIALIZER
 #define __GTHREAD_ONCE_INIT PTHREAD_ONCE_INIT
 #define __GTHREAD_RECURSIVE_MUTEX_INIT_FUNCTION __gthread_recursive_mutex_init_function
+#define __GTHREAD_COND_INIT PTHREAD_COND_INITIALIZER
 
 #if SUPPORTS_WEAK && GTHREAD_USE_WEAK
 # define __gthrw(name) \
@@ -81,14 +87,14 @@ __gthrw(pthread_mutexattr_init)
 __gthrw(pthread_mutexattr_destroy)
 
 __gthrw(pthread_mutex_init)
+__gthrw(pthread_cond_broadcast)
+__gthrw(pthread_cond_wait)
 
 #if defined(_LIBOBJC) || defined(_LIBOBJC_WEAK)
 /* Objective-C.  */
-__gthrw(pthread_cond_broadcast)
 __gthrw(pthread_cond_destroy)
 __gthrw(pthread_cond_init)
 __gthrw(pthread_cond_signal)
-__gthrw(pthread_cond_wait)
 __gthrw(pthread_exit)
 __gthrw(pthread_mutex_destroy)
 #ifdef _POSIX_PRIORITY_SCHEDULING
@@ -719,6 +725,25 @@ __gthread_recursive_mutex_unlock (__gthr
   return 0;
 }
 
+static inline int
+__gthread_cond_broadcast (__gthread_cond_t *cond)
+{
+  return __gthrw_(pthread_cond_broadcast) (cond);
+}
+
+static inline int
+__gthread_cond_wait (__gthread_cond_t *cond, __gthread_mutex_t *mutex)
+{
+  return __gthrw_(pthread_cond_wait) (cond, mutex);
+}
+
+static inline int
+__gthread_cond_wait_recursive (__gthread_cond_t *cond,
+			       __gthread_recursive_mutex_t *mutex)
+{
+  return __gthrw_(pthread_cond_wait) (cond, mutex->actual);
+}
+
 #endif /* _LIBOBJC */
 
 #endif /* ! GCC_GTHR_POSIX_H */
--- libstdc++-v3/libsupc++/guard.cc	(revision 129029)
+++ libstdc++-v3/libsupc++/guard.cc	(revision 129218)
@@ -34,6 +34,9 @@
 #include <bits/c++config.h>
 #include <bits/gthr.h>
 #include <bits/atomicity.h>
+#if defined(__GTHREAD_HAS_COND) && !defined(__GTHREAD_COND_INIT)
+#undef __GTHREAD_HAS_COND
+#endif
 
 // The IA64/generic ABI uses the first byte of the guard variable.
 // The ARM EABI uses the least significant bit.
@@ -46,7 +49,7 @@ namespace
   // This is a static class--the need for a static initialization function
   // to pass to __gthread_once precludes creating multiple instances, though
   // I suppose you could achieve the same effect with a template.
-  class static_mutex
+  struct static_mutex
   {
     static __gthread_recursive_mutex_t mutex;
 
@@ -85,8 +88,30 @@ namespace
   {
     __gthread_recursive_mutex_unlock (&mutex);
   }
+
+  // Simple wrapper for exception safety.
+  struct mutex_wrapper
+  {
+    bool unlock;
+    mutex_wrapper() : unlock(true)
+    { static_mutex::lock(); }
+
+    ~mutex_wrapper()
+    {
+      if (unlock)
+	static_mutex::unlock();
+    }
+  };
 }
 
+#ifdef __GTHREAD_HAS_COND
+namespace
+{
+  // A single conditional variable controlling all static initializations.
+  static __gthread_cond_t static_cond = __GTHREAD_COND_INIT;
+}
+#endif
+
 #ifndef _GLIBCXX_GUARD_TEST_AND_ACQUIRE
 inline bool
 __test_and_acquire (__cxxabiv1::__guard *g)
@@ -135,19 +160,43 @@ namespace __gnu_cxx
   recursive_init::~recursive_init() throw() { }
 }
 
+//
+// Here are C++ run-time routines for guarded initiailization of static
+// variables. There are 4 scenarios under which these routines are called:
+//
+//   1. Threads not supported (__GTHREADS not defined)
+//   2. Threads are supported but not enabled at run-time.
+//   3. Threads enabled at run-time but __gthreads_* are not fully POSIX.
+//   4. Threads enabled at run-time and __gthreads_* support all POSIX threads
+//      primitives we need here.
+//
+// The old code supported scenarios 1-3 but was broken since it used a global
+// mutex for all threads and had the mutex locked during the whole duration of
+// initlization of a guarded static variable. The following created a dead-lock
+// with the old code.
+//
+//	Thread 1 acquires the global mutex.
+//	Thread 1 starts initializing static variable.
+//	Thread 1 creates thread 2 during initialization.
+//	Thread 2 attempts to acuqire mutex to initialize another variable.
+//	Thread 2 blocks since thread 1 is locking the mutex.
+//	Thread 1 waits for result from thread 2 and also blocks. A deadlock.
+//
+// The new code here can handle this situation and thus is more robust. Howere,
+// we need to use the POSIX thread conditional variable, which is not supported
+// in all platforms, notably older versions of Microsoft Windows. The gthr*.h
+// headers define a symbol __GTHREAD_HAS_COND for platforms that support POSIX
+// like conditional variables. For platforms that do not support conditional
+// variables, we need to fall back to the old code.
 namespace __cxxabiv1 
 {
   static inline int
-  recursion_push (__guard* g)
-  {
-    return ((char *)g)[1]++;
-  }
+  init_in_progress_flag(__guard* g)
+  { return ((char *)g)[1]; }
 
   static inline void
-  recursion_pop (__guard* g)
-  {
-    --((char *)g)[1];
-  }
+  set_init_in_progress_flag(__guard* g, int v)
+  { ((char *)g)[1] = v; }
 
   static int
   acquire_1 (__guard *g)
@@ -155,7 +204,7 @@ namespace __cxxabiv1 
     if (_GLIBCXX_GUARD_TEST (g))
       return 0;
 
-    if (recursion_push (g))
+    if (init_in_progress_flag (g))
       {
 #ifdef __EXCEPTIONS
 	throw __gnu_cxx::recursive_init();
@@ -164,6 +213,7 @@ namespace __cxxabiv1 
 	__builtin_trap ();
 #endif
       }
+    set_init_in_progress_flag(g, 1);
     return 1;
   }
 
@@ -179,28 +229,40 @@ namespace __cxxabiv1 
 
     if (__gthread_active_p ())
       {
-	// Simple wrapper for exception safety.
-	struct mutex_wrapper
-	{
-	  bool unlock;
-	  mutex_wrapper (): unlock(true)
-	  {
-	    static_mutex::lock ();
-	  }
-	  ~mutex_wrapper ()
-	  {
-	    if (unlock)
-	      static_mutex::unlock ();
-	  }
-	} mw;
+	mutex_wrapper mw;
 
-	if (acquire_1 (g))
-	  {
-	    mw.unlock = false;
-	    return 1;
+	while (1)	// When this loop is executing, mutex is locked.
+  	  {
+#ifdef __GTHREAD_HAS_COND
+	    // The static is allready initialized.
+	    if (_GLIBCXX_GUARD_TEST(g))
+	      return 0;	// The mutex will be unlocked via wrapper
+
+	    if (init_in_progress_flag(g))
+	      {
+		// The guarded static is currently being initialized by
+		// another thread, so we release mutex and wait for the
+		// conditional variable. We will lock the mutex again after
+		// this.
+		__gthread_cond_wait_recursive(&static_cond,
+					      &static_mutex::mutex);
+	      }
+	    else
+	      {
+		set_init_in_progress_flag(g, 1);
+		return 1; // The mutex will be unlocked via wrapper.
+	      }
+#else
+	    // This provides compatibility with older systems not supporting
+	    // POSIX like conditional variables.
+	    if (acquire_1 (g))
+	      {
+		mw.unlock = false;
+		return 1; // The mutex still locked.
+	      }
+	    return 0; // The mutex will be unlocked via wrapper.
+#endif
 	  }
-
-	return 0;
       }
 #endif
 
@@ -210,8 +272,24 @@ namespace __cxxabiv1 
   extern "C"
   void __cxa_guard_abort (__guard *g)
   {
-    recursion_pop (g);
-#ifdef __GTHREADS
+#ifdef __GTHREAD_HAS_COND
+    if (__gthread_active_p())
+      {	
+	mutex_wrapper mw;
+
+	set_init_in_progress_flag(g, 0);
+
+	// If we abort, we still need to wake up all other threads waiting for
+	// the conditional variable.
+	__gthread_cond_broadcast(&static_cond);
+	return;
+      }	
+#endif
+
+    set_init_in_progress_flag(g, 0);
+#if defined(__GTHREADS) && !defined(__GTHREAD_HAS_COND)
+    // This provides compatibility with older systems not supporting POSIX like
+    // conditional variables.
     if (__gthread_active_p ())
       static_mutex::unlock ();
 #endif
@@ -220,11 +298,27 @@ namespace __cxxabiv1 
   extern "C"
   void __cxa_guard_release (__guard *g)
   {
-    recursion_pop (g);
+#ifdef __GTHREAD_HAS_COND
+    if (__gthread_active_p())
+      {
+	mutex_wrapper mw;
+
+	set_init_in_progress_flag(g, 0);
+	_GLIBCXX_GUARD_SET_AND_RELEASE(g);
+
+	__gthread_cond_broadcast(&static_cond);
+	return;
+      }      
+#endif       
+
+    set_init_in_progress_flag(g, 0);
     _GLIBCXX_GUARD_SET_AND_RELEASE (g);
-#ifdef __GTHREADS
-    if (__gthread_active_p ())
-      static_mutex::unlock ();
+
+#if defined(__GTHREADS) && !defined(__GTHREAD_HAS_COND)
+    // This provides compatibility with older systems not supporting POSIX like
+    // conditional variables.
+    if (__gthread_active_p())
+      static_mutex::unlock();
 #endif
   }
 }
--- libstdc++-v3/testsuite/thread/guard.cc	(revision 0)
+++ libstdc++-v3/testsuite/thread/guard.cc	(revision 129030)
@@ -0,0 +1,67 @@
+//
+// Copyright (C) 2007 Free Software Foundation, Inc.
+//
+// This file is part of the GNU ISO C++ Library.  This library is free
+// software; you can redistribute it and/or modify it under the
+// terms of the GNU General Public License as published by the
+// Free Software Foundation; either version 2, or (at your option)
+// any later version.
+//
+// This library is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License along
+// with this library; see the file COPYING.  If not, write to the Free
+// Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301,
+// USA.
+
+// { dg-do run { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-cygwin *-*-darwin* alpha*-*-osf* } }
+// { dg-options "-pthread" { target *-*-freebsd* *-*-netbsd* *-*-linux* *-*-solaris* *-*-darwin* alpha*-*-osf* } }
+
+#include <cstdlib>
+#include <pthread.h>
+
+// This used to deadlock with the old libstdc++ because there is only one
+// global mutex guarding initialization of statics and it is held during by
+// the initializer thread of a static until the variable is completely
+// initialized. If the initializer thread creates and waits for another thread
+// which also initializes a static variable, there will be a deadlock because
+// the first thread is holding the mutex and waiting for the second thread,
+// which is blocked when it is acquiring the mutex.
+
+int
+get_bar (void)
+{
+  return 1;
+}
+
+void*
+do_something (void *arg)
+{
+  static int bar = get_bar ();
+  return NULL;
+}
+
+int
+get_foo (void)
+{
+  int status;
+  pthread_t new_thread;
+
+  if (pthread_create (&new_thread, NULL, do_something, NULL) != 0)
+    std::abort ();
+
+  if (pthread_join (new_thread, NULL) != 0)
+    std::abort ();
+
+  return 1;
+}
+
+int
+main (int argc, char **argv)
+{
+  static int foo = get_foo ();
+  return 0;  
+}

gcc41-sse5-pperm.patch:

--- NEW FILE gcc41-sse5-pperm.patch ---
2007-12-29  Jakub Jelinek  <jakub at redhat.com>

	* config/i386/sse.md (sse5_pperm, sse5_pperm_pack_v2di_v4si,
	sse5_pperm_pack_v4si_v8hi, sse5_pperm_pack_v8hi_v16qi,
	sse5_perm<mode>): Fix constraints.

	* gcc.target/i386/i386.exp (check_effective_target_sse5): Use __v8hi
	rather than __v2di type.

--- gcc/config/i386/sse.md.jj	2007-12-29 20:58:15.000000000 +0100
+++ gcc/config/i386/sse.md	2007-12-29 21:12:49.000000000 +0100
@@ -8350,13 +8350,13 @@
   [(set_attr "type" "sseiadd1")])
 
 ;; SSE5 permute instructions
 (define_insn "sse5_pperm"
   [(set (match_operand:V16QI 0 "register_operand" "=x,x,x,x")
-	(unspec:V16QI [(match_operand:V16QI 1 "nonimmediate_operand" "0,0,xm,xm")
-		       (match_operand:V16QI 2 "nonimmediate_operand" "x,xm,0,x")
-		       (match_operand:V16QI 3 "nonimmediate_operand" "xm,x,x,0")]
+	(unspec:V16QI [(match_operand:V16QI 1 "nonimmediate_operand" "0,0,x,xm")
+		       (match_operand:V16QI 2 "nonimmediate_operand" "x,xm,xm,x")
+		       (match_operand:V16QI 3 "nonimmediate_operand" "xm,x,0,0")]
 		     UNSPEC_SSE5_PERMUTE))]
   "TARGET_SSE5 && ix86_sse5_valid_op_p (operands, insn, 4, true, 1)"
   "pperm\t{%3, %2, %1, %0|%0, %1, %2, %3}"
   [(set_attr "type" "sse4arg")
    (set_attr "mode" "TI")])
@@ -8453,52 +8453,52 @@
 ;; SSE5 pack instructions that combine two vectors into a smaller vector
 (define_insn "sse5_pperm_pack_v2di_v4si"
   [(set (match_operand:V4SI 0 "register_operand" "=x,x,x,x")
 	(vec_concat:V4SI
 	 (truncate:V2SI
-	  (match_operand:V2DI 1 "nonimmediate_operand" "0,0,xm,xm"))
+	  (match_operand:V2DI 1 "nonimmediate_operand" "0,0,x,xm"))
 	 (truncate:V2SI
-	  (match_operand:V2DI 2 "nonimmediate_operand" "x,xm,0,x"))))
-   (use (match_operand:V16QI 3 "nonimmediate_operand" "xm,x,x,0"))]
+	  (match_operand:V2DI 2 "nonimmediate_operand" "x,xm,xm,x"))))
+   (use (match_operand:V16QI 3 "nonimmediate_operand" "xm,x,0,0"))]
   "TARGET_SSE5 && ix86_sse5_valid_op_p (operands, insn, 4, true, 1)"
   "pperm\t{%3, %2, %1, %0|%0, %1, %2, %3}"
   [(set_attr "type" "sse4arg")
    (set_attr "mode" "TI")])
 
 (define_insn "sse5_pperm_pack_v4si_v8hi"
   [(set (match_operand:V8HI 0 "register_operand" "=x,x,x,x")
 	(vec_concat:V8HI
 	 (truncate:V4HI
-	  (match_operand:V4SI 1 "nonimmediate_operand" "0,0,xm,xm"))
+	  (match_operand:V4SI 1 "nonimmediate_operand" "0,0,x,xm"))
 	 (truncate:V4HI
-	  (match_operand:V4SI 2 "nonimmediate_operand" "x,xm,0,x"))))
-   (use (match_operand:V16QI 3 "nonimmediate_operand" "xm,x,x,0"))]
+	  (match_operand:V4SI 2 "nonimmediate_operand" "x,xm,xm,x"))))
+   (use (match_operand:V16QI 3 "nonimmediate_operand" "xm,x,0,0"))]
   "TARGET_SSE5 && ix86_sse5_valid_op_p (operands, insn, 4, true, 1)"
   "pperm\t{%3, %2, %1, %0|%0, %1, %2, %3}"
   [(set_attr "type" "sse4arg")
    (set_attr "mode" "TI")])
 
 (define_insn "sse5_pperm_pack_v8hi_v16qi"
   [(set (match_operand:V16QI 0 "register_operand" "=x,x,x,x")
 	(vec_concat:V16QI
 	 (truncate:V8QI
-	  (match_operand:V8HI 1 "nonimmediate_operand" "0,0,xm,xm"))
+	  (match_operand:V8HI 1 "nonimmediate_operand" "0,0,x,xm"))
 	 (truncate:V8QI
-	  (match_operand:V8HI 2 "nonimmediate_operand" "x,xm,0,x"))))
-   (use (match_operand:V16QI 3 "nonimmediate_operand" "xm,x,x,0"))]
+	  (match_operand:V8HI 2 "nonimmediate_operand" "x,xm,xm,x"))))
+   (use (match_operand:V16QI 3 "nonimmediate_operand" "xm,x,0,0"))]
   "TARGET_SSE5 && ix86_sse5_valid_op_p (operands, insn, 4, true, 1)"
   "pperm\t{%3, %2, %1, %0|%0, %1, %2, %3}"
   [(set_attr "type" "sse4arg")
    (set_attr "mode" "TI")])
 
 ;; Floating point permutation (permps, permpd)
 (define_insn "sse5_perm<mode>"
   [(set (match_operand:SSEMODEF2P 0 "register_operand" "=x,x,x,x")
 	(unspec:SSEMODEF2P
-	 [(match_operand:SSEMODEF2P 1 "nonimmediate_operand" "0,0,xm,xm")
-	  (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,xm,0,x")
-	  (match_operand:V16QI 3 "nonimmediate_operand" "xm,x,x,0")]
+	 [(match_operand:SSEMODEF2P 1 "nonimmediate_operand" "0,0,x,xm")
+	  (match_operand:SSEMODEF2P 2 "nonimmediate_operand" "x,xm,xm,x")
+	  (match_operand:V16QI 3 "nonimmediate_operand" "xm,x,0,0")]
 	 UNSPEC_SSE5_PERMUTE))]
   "TARGET_SSE5 && ix86_sse5_valid_op_p (operands, insn, 4, true, 1)"
   "perm<ssemodesuffixf4>\t{%3, %2, %1, %0|%0, %1, %2, %3}"
   [(set_attr "type" "sse4arg")
    (set_attr "mode" "<MODE>")])
--- gcc/testsuite/gcc.target/i386/i386.exp.jj	2007-09-14 11:54:26.000000000 +0200
+++ gcc/testsuite/gcc.target/i386/i386.exp	2007-12-29 21:42:08.000000000 +0100
@@ -68,13 +68,13 @@ proc check_effective_target_sse4a { } {
 proc check_effective_target_sse5 { } {
     return [check_no_compiler_messages sse5 object {
 	typedef long long __m128i __attribute__ ((__vector_size__ (16)));
-	typedef long long __v2di __attribute__ ((__vector_size__ (16)));
+	typedef short __v8hi __attribute__ ((__vector_size__ (16)));
 
 	__m128i _mm_maccs_epi16(__m128i __A, __m128i __B, __m128i __C)
 	{
-	    return (__m128i) __builtin_ia32_pmacssww ((__v2di)__A,
-						      (__v2di)__B,
-						      (__v2di)__C);
+	    return (__m128i) __builtin_ia32_pmacssww ((__v8hi)__A,
+						      (__v8hi)__B,
+						      (__v8hi)__C);
 	}
     } "-O2 -msse5" ]
 }

gcc41-sse5.patch:

--- NEW FILE gcc41-sse5.patch ---
2007-11-12  Dwarakanath Rajagopal  <dwarak.rajagopal at amd.com>
            Michael Meissner  <michael.meissner at amd.com>

	* config/i386/i386.md (sse5_setcc<mode>): Use <ssemodefsuffix> to
	get the appropriate suffix for the coms* instruction.

	* config/i386/sse.md (sse5_pcmov_<mode>): Correct the operand
	constraints to follow the mnemonics for the pcmov instruction

2007-10-27  Uros Bizjak  <ubizjak at gmail.com>

	* g++.dg/other/i386-2a.C: New test.
	* gcc.target/i386/sse-13.c: Also include mm3dnow.h.  Add
	"-march=k8 -m3dnow" to check 3dnow and 3dnowA intrinsics.
	* gcc.target/i386/sse-14.c: Ditto.

2007-09-22  Uros Bizjak  <ubizjak at gmail.com>

	* gcc.target/i386/sse5-hadduX.c: Remove target selector.
	* gcc.target/i386/sse5-haddX.c: Ditto.
	* gcc.target/i386/sse5-hsubX.c: Ditto.
	* gcc.target/i386/sse5-maccXX.c: Ditto.
	* gcc.target/i386/sse5-msubXX.c: Ditto.
	* gcc.target/i386/sse5-nmaccXX.c: Ditto.
	* gcc.target/i386/sse5-nmsubXX.c: Ditto.
	* gcc.target/i386/sse5-permpX.c: Ditto.
	* gcc.target/i386/sse5-fma.c: Remove target selector. Require lp64
	effective target.
	* gcc.target/i386/sse5-fma-vector.c: Ditto.
	* gcc.target/i386/sse5-ima-vector.c: Ditto.
	* gcc.target/i386/sse5-pcmov.c: Ditto.
	* gcc.target/i386/sse5-pcmov2.c: Ditto.

2007-09-12  Michael Meissner  <michael.meissner at amd.com>
	    Dwarakanath Rajagopal  <dwarak.rajagopal at amd.com>
	    Tony Linthicum  <tony.linthicum at amd.com>

	* config/i386/i386.h (TARGET_ROUND): New macro for the round/ptest
	instructions which are shared between SSE4.1 and SSE5.
	(TARGET_FUSED_MADD): New macro for -mfused-madd swtich.
	(TARGET_CPU_CPP_BUILTINS): Add SSE5 support.

	* config/i386/i386.opt (-msse5): New switch for SSE5 support.
	(-mfused-madd): New switch to give users control over whether the
	compiler optimizes to use the multiply/add SSE5 instructions.

	* config/i386/i386.c (ix86_handle_option): Turn off -msse5 if
	-mno-sse, -mno-sse2, -mno-sse3 or -mno-sse4a.
	(override_options): Add SSE5 support.
	(print_operand): %Y prints comparison codes for SSE5 com/pcom
	instructions.
	(ix86_expand_sse_movcc): Add SSE5 support.
	(IX86_BUILTIN_ROUNDPD): New for SSE4.1/SSE5 intrinsic.
	(IX86_BUILTIN_ROUNDPS): Likewise.
	(IX86_BUILTIN_ROUNDSD): Likewise.
	(IX86_BUILTIN_ROUNDSS): Likewise.
	(IX86_BUILTIN_PTESTZ): Likewise.
	(IX86_BUILTIN_PTESTC): Likewise.
	(IX86_BUILTIN_PTESTNZC): Likewise.
	(IX86_BUILTIN_FMADDSS): New for SSE5 intrinsic.
	(IX86_BUILTIN_FMADDSD): Ditto.
	(IX86_BUILTIN_FMADDPS): Ditto.
	(IX86_BUILTIN_FMADDPD): Ditto.
	(IX86_BUILTIN_FMSUBSS): Ditto.
	(IX86_BUILTIN_FMSUBSD): Ditto.
	(IX86_BUILTIN_FMSUBPS): Ditto.
	(IX86_BUILTIN_FMSUBPD): Ditto.
	(IX86_BUILTIN_FNMADDSS): Ditto.
	(IX86_BUILTIN_FNMADDSD): Ditto.
	(IX86_BUILTIN_FNMADDPS): Ditto.
	(IX86_BUILTIN_FNMADDPD): Ditto.
	(IX86_BUILTIN_FNMSUBSS): Ditto.
	(IX86_BUILTIN_FNMSUBSD): Ditto.
	(IX86_BUILTIN_FNMSUBPS): Ditto.
	(IX86_BUILTIN_FNMSUBPD): Ditto.
	(IX86_BUILTIN_PCMOV_V2DI): Ditto.
	(IX86_BUILTIN_PCMOV_V4SI): Ditto.
	(IX86_BUILTIN_PCMOV_V8HI): Ditto.
	(IX86_BUILTIN_PCMOV_V16QI): Ditto.
	(IX86_BUILTIN_PCMOV_V4SF): Ditto.
	(IX86_BUILTIN_PCMOV_V2DF): Ditto.
	(IX86_BUILTIN_PPERM): Ditto.
	(IX86_BUILTIN_PERMPS): Ditto.
	(IX86_BUILTIN_PERMPD): Ditto.
	(IX86_BUILTIN_PMACSSWW): Ditto.
	(IX86_BUILTIN_PMACSWW): Ditto.
	(IX86_BUILTIN_PMACSSWD): Ditto.
	(IX86_BUILTIN_PMACSWD): Ditto.
	(IX86_BUILTIN_PMACSSDD): Ditto.
	(IX86_BUILTIN_PMACSDD): Ditto.
	(IX86_BUILTIN_PMACSSDQL): Ditto.
	(IX86_BUILTIN_PMACSSDQH): Ditto.
	(IX86_BUILTIN_PMACSDQL): Ditto.
	(IX86_BUILTIN_PMACSDQH): Ditto.
	(IX86_BUILTIN_PMADCSSWD): Ditto.
	(IX86_BUILTIN_PMADCSWD): Ditto.
	(IX86_BUILTIN_PHADDBW): Ditto.
	(IX86_BUILTIN_PHADDBD): Ditto.
	(IX86_BUILTIN_PHADDBQ): Ditto.
	(IX86_BUILTIN_PHADDWD): Ditto.
	(IX86_BUILTIN_PHADDWQ): Ditto.
	(IX86_BUILTIN_PHADDDQ): Ditto.
	(IX86_BUILTIN_PHADDUBW): Ditto.
	(IX86_BUILTIN_PHADDUBD): Ditto.
	(IX86_BUILTIN_PHADDUBQ): Ditto.
	(IX86_BUILTIN_PHADDUWD): Ditto.
	(IX86_BUILTIN_PHADDUWQ): Ditto.
	(IX86_BUILTIN_PHADDUDQ): Ditto.
	(IX86_BUILTIN_PHSUBBW): Ditto.
	(IX86_BUILTIN_PHSUBWD): Ditto.
	(IX86_BUILTIN_PHSUBDQ): Ditto.
	(IX86_BUILTIN_PROTB): Ditto.
	(IX86_BUILTIN_PROTW): Ditto.
	(IX86_BUILTIN_PROTD): Ditto.
	(IX86_BUILTIN_PROTQ): Ditto.
	(IX86_BUILTIN_PROTB_IMM): Ditto.
	(IX86_BUILTIN_PROTW_IMM): Ditto.
	(IX86_BUILTIN_PROTD_IMM): Ditto.
	(IX86_BUILTIN_PROTQ_IMM): Ditto.
	(IX86_BUILTIN_PSHLB): Ditto.
	(IX86_BUILTIN_PSHLW): Ditto.
	(IX86_BUILTIN_PSHLD): Ditto.
	(IX86_BUILTIN_PSHLQ): Ditto.
	(IX86_BUILTIN_PSHAB): Ditto.
	(IX86_BUILTIN_PSHAW): Ditto.
	(IX86_BUILTIN_PSHAD): Ditto.
	(IX86_BUILTIN_PSHAQ): Ditto.
	(IX86_BUILTIN_FRCZSS): Ditto.
	(IX86_BUILTIN_FRCZSD): Ditto.
	(IX86_BUILTIN_FRCZPS): Ditto.
	(IX86_BUILTIN_FRCZPD): Ditto.
	(IX86_BUILTIN_CVTPH2PS): Ditto.
	(IX86_BUILTIN_CVTPS2PH): Ditto.
	(IX86_BUILTIN_COMEQSS): Ditto.
	(IX86_BUILTIN_COMNESS): Ditto.
	(IX86_BUILTIN_COMLTSS): Ditto.
	(IX86_BUILTIN_COMLESS): Ditto.
	(IX86_BUILTIN_COMGTSS): Ditto.
	(IX86_BUILTIN_COMGESS): Ditto.
	(IX86_BUILTIN_COMUEQSS): Ditto.
	(IX86_BUILTIN_COMUNESS): Ditto.
	(IX86_BUILTIN_COMULTSS): Ditto.
	(IX86_BUILTIN_COMULESS): Ditto.
	(IX86_BUILTIN_COMUGTSS): Ditto.
	(IX86_BUILTIN_COMUGESS): Ditto.
	(IX86_BUILTIN_COMORDSS): Ditto.
	(IX86_BUILTIN_COMUNORDSS): Ditto.
	(IX86_BUILTIN_COMFALSESS): Ditto.
	(IX86_BUILTIN_COMTRUESS): Ditto.
	(IX86_BUILTIN_COMEQSD): Ditto.
	(IX86_BUILTIN_COMNESD): Ditto.
	(IX86_BUILTIN_COMLTSD): Ditto.
	(IX86_BUILTIN_COMLESD): Ditto.
	(IX86_BUILTIN_COMGTSD): Ditto.
	(IX86_BUILTIN_COMGESD): Ditto.
	(IX86_BUILTIN_COMUEQSD): Ditto.
	(IX86_BUILTIN_COMUNESD): Ditto.
	(IX86_BUILTIN_COMULTSD): Ditto.
	(IX86_BUILTIN_COMULESD): Ditto.
	(IX86_BUILTIN_COMUGTSD): Ditto.
	(IX86_BUILTIN_COMUGESD): Ditto.
	(IX86_BUILTIN_COMORDSD): Ditto.
	(IX86_BUILTIN_COMUNORDSD): Ditto.
	(IX86_BUILTIN_COMFALSESD): Ditto.
	(IX86_BUILTIN_COMTRUESD): Ditto.
	(IX86_BUILTIN_COMEQPS): Ditto.
	(IX86_BUILTIN_COMNEPS): Ditto.
	(IX86_BUILTIN_COMLTPS): Ditto.
	(IX86_BUILTIN_COMLEPS): Ditto.
	(IX86_BUILTIN_COMGTPS): Ditto.
	(IX86_BUILTIN_COMGEPS): Ditto.
	(IX86_BUILTIN_COMUEQPS): Ditto.
	(IX86_BUILTIN_COMUNEPS): Ditto.
	(IX86_BUILTIN_COMULTPS): Ditto.
	(IX86_BUILTIN_COMULEPS): Ditto.
	(IX86_BUILTIN_COMUGTPS): Ditto.
	(IX86_BUILTIN_COMUGEPS): Ditto.
	(IX86_BUILTIN_COMORDPS): Ditto.
	(IX86_BUILTIN_COMUNORDPS): Ditto.
	(IX86_BUILTIN_COMFALSEPS): Ditto.
	(IX86_BUILTIN_COMTRUEPS): Ditto.
	(IX86_BUILTIN_COMEQPD): Ditto.
	(IX86_BUILTIN_COMNEPD): Ditto.
	(IX86_BUILTIN_COMLTPD): Ditto.
	(IX86_BUILTIN_COMLEPD): Ditto.
	(IX86_BUILTIN_COMGTPD): Ditto.
	(IX86_BUILTIN_COMGEPD): Ditto.
	(IX86_BUILTIN_COMUEQPD): Ditto.
	(IX86_BUILTIN_COMUNEPD): Ditto.
	(IX86_BUILTIN_COMULTPD): Ditto.
	(IX86_BUILTIN_COMULEPD): Ditto.
	(IX86_BUILTIN_COMUGTPD): Ditto.
	(IX86_BUILTIN_COMUGEPD): Ditto.
	(IX86_BUILTIN_COMORDPD): Ditto.
	(IX86_BUILTIN_COMUNORDPD): Ditto.
	(IX86_BUILTIN_COMFALSEPD): Ditto.
	(IX86_BUILTIN_COMTRUEPD): Ditto.
	(IX86_BUILTIN_PCOMEQUB): Ditto.
	(IX86_BUILTIN_PCOMNEUB): Ditto.
[...7336 lines suppressed...]
+  
+  /* check nmsubss */
+  for (i = 0; i < NUM; i++)
+    dst.x[i] = _mm_nmsub_ss (src1.x[i], src2.x[i], src3.x[i]);
+  
+  if (check_nmsubss (&dst.x[i], &src1.f[i * 4], &src2.f[i * 4], &src3.f[i * 4])) 
+    abort ();
+  
+  /* Check nmsubpd */
+  init_nmsubpd ();
+  
+  for (i = 0; i < NUM; i++)
+    dst.y[i] = _mm_nmsub_pd (src1.y[i], src2.y[i], src3.y[i]);
+  
+  if (check_nmsubpd (&dst.y[i], &src1.d[i * 2], &src2.d[i * 2], &src3.d[i * 2])) 
+    abort ();
+  
+  /* Check nmsubps */
+  for (i = 0; i < NUM; i++)
+    dst.y[i] = _mm_nmsub_sd (src1.y[i], src2.y[i], src3.y[i]);
+  
+  if (check_nmsubsd (&dst.y[i], &src1.d[i * 2], &src2.d[i * 2], &src3.d[i * 2])) 
+    abort ();
+  
+}
--- gcc/testsuite/gcc.target/i386/sse5-pcmov.c.jj	2007-12-29 18:27:58.000000000 +0100
+++ gcc/testsuite/gcc.target/i386/sse5-pcmov.c	2007-09-22 23:16:19.000000000 +0200
@@ -0,0 +1,23 @@
+/* Test that the compiler properly optimizes conditional floating point moves
+   into the pcmov instruction on SSE5 systems.  */
+
+/* { dg-do compile } */
+/* { dg-require-effective-target lp64 } */
+/* { dg-options "-O2 -msse5" } */
+
+extern void exit (int);
+
+double dbl_test (double a, double b, double c, double d)
+{
+  return (a > b) ? c : d;
+}
+
+double dbl_a = 1, dbl_b = 2, dbl_c = 3, dbl_d = 4, dbl_e;
+
+int main()
+{
+  dbl_e = dbl_test (dbl_a, dbl_b, dbl_c, dbl_d);
+  exit (0);
+}
+
+/* { dg-final { scan-assembler "pcmov" } } */
--- gcc/testsuite/gcc.target/i386/sse5-pcmov2.c.jj	2007-12-29 18:27:58.000000000 +0100
+++ gcc/testsuite/gcc.target/i386/sse5-pcmov2.c	2007-09-22 23:16:19.000000000 +0200
@@ -0,0 +1,23 @@
+/* Test that the compiler properly optimizes conditional floating point moves
+   into the pcmov instruction on SSE5 systems.  */
+
+/* { dg-do compile } */
+/* { dg-require-effective-target lp64 } */
+/* { dg-options "-O2 -msse5" } */
+
+extern void exit (int);
+
+float flt_test (float a, float b, float c, float d)
+{
+  return (a > b) ? c : d;
+}
+
+float flt_a = 1, flt_b = 2, flt_c = 3, flt_d = 4, flt_e;
+
+int main()
+{
+  flt_e = flt_test (flt_a, flt_b, flt_c, flt_d);
+  exit (0);
+}
+
+/* { dg-final { scan-assembler "pcmov" } } */
--- gcc/testsuite/gcc.target/i386/sse5-permpX.c.jj	2007-12-29 18:27:58.000000000 +0100
+++ gcc/testsuite/gcc.target/i386/sse5-permpX.c	2007-09-22 23:16:19.000000000 +0200
@@ -0,0 +1,120 @@
+/* { dg-do run } */
+/* { dg-require-effective-target sse5 } */
+/* { dg-options "-O2 -msse5" } */
+
+#include "sse5-check.h"
+
+#include <bmmintrin.h>
+#include <string.h>
+
+union
+{
+  __m128 x[2];
+  __m128d y[2];
+  __m128i z[2];
+  float f[8];
+  double d[4];
+  int i[8];
+  long li[4];
+} dst, res, src1, src2, src3;
+
+
+static void
+init_ddata ()
+{
+  int i;
+  for (i = 0; i < 4; i++)
+    {
+      src1.d[i] = i;
+      src2.d[i] = i + 2;
+    }
+ 
+  src3.li[0] = 3;
+  src3.li[1] = 0;
+  src3.li[2] = 1;
+  src3.li[3] = 2;
+
+  res.d[0] = 3.0;
+  res.d[1] = 0.0;
+  res.d[2] = 3.0;
+  res.d[3] = 4.0;
+}
+
+
+static void 
+init_fdata ()
+{
+  int i;
+  for (i = 0; i < 8; i++)
+    {
+      src1.f[i] = i;
+      src2.f[i] = i + 2;
+    }
+
+  src3.i[0] = 7;
+  src3.i[1] = 5;
+  src3.i[2] = 1;
+  src3.i[3] = 2;
+  src3.i[4] = 0;
+  src3.i[5] = 4;
+  src3.i[6] = 3;
+  src3.i[7] = 6; 
+
+  res.f[0] = 5.0;
+  res.f[1] = 3.0;
+  res.f[2] = 1.0;
+  res.f[3] = 2.0;
+  res.f[4] = 4.0;
+  res.f[5] = 6.0;
+  res.f[6] = 7.0;
+  res.f[7] = 8.0;
+}
+
+static int
+check_permpd ()
+{
+  int i, check_fails = 0;
+
+  for (i = 0; i < 4; i++)
+    {
+      if (res.d[i] != dst.d[i])
+	check_fails++;
+    }
+  return check_fails++;
+}
+
+static int
+check_permps ()
+{
+  int i, check_fails = 0;
+
+  for (i = 0; i < 8; i++)
+    {
+      if (res.f[i] != dst.f[i])
+	check_fails++;
+    }
+  return check_fails++;
+}
+
+static void
+sse5_test (void)
+{
+  int i;
+  init_ddata();
+
+  for (i = 0; i < 2; i++)
+    dst.y[i] = _mm_perm_pd (src1.y[i], src2.y[i], src3.z[i]);
+  
+  if (check_permpd ())
+    abort ();
+  
+  init_fdata();
+  
+  for (i = 0; i < 2; i++)
+    dst.x[i] = _mm_perm_ps (src1.x[i], src2.x[i], src3.z[i]);
+   
+  if (check_permps ())
+    abort (); 
+}
+
+


Index: .cvsignore
===================================================================
RCS file: /cvs/pkgs/rpms/gcc/F-8/.cvsignore,v
retrieving revision 1.213
retrieving revision 1.214
diff -u -r1.213 -r1.214
--- .cvsignore	25 Sep 2007 16:09:05 -0000	1.213
+++ .cvsignore	31 Dec 2007 18:09:00 -0000	1.214
@@ -1 +1 @@
-gcc-4.1.2-20070925.tar.bz2
+gcc-4.1.2-20071124.tar.bz2

gcc41-c++-guard-visibility.patch:

Index: gcc41-c++-guard-visibility.patch
===================================================================
RCS file: /cvs/pkgs/rpms/gcc/F-8/gcc41-c++-guard-visibility.patch,v
retrieving revision 1.1
retrieving revision 1.2
diff -u -r1.1 -r1.2
--- gcc41-c++-guard-visibility.patch	2 Oct 2007 22:21:55 -0000	1.1
+++ gcc41-c++-guard-visibility.patch	31 Dec 2007 18:09:00 -0000	1.2
@@ -1,18 +1,7 @@
 2007-09-06  Jason Merrill  <jason at redhat.com>
 
-	* decl2.c (get_guard): Copy visibility from the guarded variable.
+	* g++.dg/ext/visibility/guard1.C: New test.
 
---- gcc/cp/decl2.c	(revision 128225)
-+++ gcc/cp/decl2.c	(revision 128226)
-@@ -2215,6 +2215,8 @@ get_guard (tree decl)
-       DECL_ONE_ONLY (guard) = DECL_ONE_ONLY (decl);
-       if (TREE_PUBLIC (decl))
- 	DECL_WEAK (guard) = DECL_WEAK (decl);
-+      DECL_VISIBILITY (guard) = DECL_VISIBILITY (decl);
-+      DECL_VISIBILITY_SPECIFIED (guard) = DECL_VISIBILITY_SPECIFIED (decl);
- 
-       DECL_ARTIFICIAL (guard) = 1;
-       DECL_IGNORED_P (guard) = 1;
 --- gcc/testsuite/g++.dg/ext/visibility/guard1.C	(revision 0)
 +++ gcc/testsuite/g++.dg/ext/visibility/guard1.C	(revision 128226)
 @@ -0,0 +1,29 @@


Index: gcc41.spec
===================================================================
RCS file: /cvs/pkgs/rpms/gcc/F-8/gcc41.spec,v
retrieving revision 1.182
retrieving revision 1.183
diff -u -r1.182 -r1.183
--- gcc41.spec	21 Oct 2007 11:33:51 -0000	1.182
+++ gcc41.spec	31 Dec 2007 18:09:00 -0000	1.183
@@ -1,6 +1,6 @@
-%define DATE 20070925
+%define DATE 20071124
 %define gcc_version 4.1.2
-%define gcc_release 33
+%define gcc_release 37
 %define _unpackaged_files_terminate_build 0
 %define multilib_64_archs sparc64 ppc64 s390x x86_64
 %define include_gappletviewer 1
@@ -10,6 +10,12 @@
 %define build_ada 0
 %endif
 %define build_java 1
+# If you don't have already a usable gcc-java and libgcj for your arch,
+# do on some arch which has it rpmbuild -bc --with java_tar gcc41.spec
+# which creates libjava-classes-%{version}-%{release}.tar.bz2
+# With this then on the new arch do rpmbuild -ba -v --with java_bootstrap gcc41.spec
+%define bootstrap_java %{?_with_java_bootstrap:%{build_java}}%{!?_with_java_bootstrap:0}
+%define build_java_tar %{?_with_java_tar:%{build_java}}%{!?_with_java_tar:0}
 %ifarch s390x
 %define multilib_32_arch s390
 %endif
@@ -47,7 +53,12 @@
 BuildRequires: binutils >= 2.17.50.0.17-3
 BuildRequires: zlib-devel, gettext, dejagnu, bison, flex, texinfo, sharutils
 %if %{build_java}
-BuildRequires: gcc-java, libgcj, /usr/share/java/eclipse-ecj.jar, zip, unzip
+BuildRequires: /usr/share/java/eclipse-ecj.jar, zip, unzip
+%if %{bootstrap_java}
+Source10: libjava-classes-%{version}-%{release}.tar.bz2
+%else
+BuildRequires: gcc-java, libgcj
+%endif
 %endif
 # Make sure pthread.h doesn't contain __thread tokens
 # Make sure glibc supports stack protector
@@ -154,12 +165,57 @@
 Patch38: gcc41-pr33238.patch
 Patch39: gcc41-pr33619.patch
 Patch40: gcc41-pr33639.patch
-Patch41: gcc41-pr33744.patch
 Patch42: gcc41-pr33763.patch
 Patch43: gcc41-rh317051.patch
 Patch44: gcc41-rh330771.patch
 Patch45: gcc41-rh341221.patch
-Patch46: gcc41-ppc64-cr2-unwind.patch
+Patch47: gcc41-java-arm1.patch
+Patch48: gcc41-java-arm2.patch
+Patch49: gcc41-java-arm3.patch
+Patch50: gcc41-java-arm4.patch
+Patch51: gcc41-java-arm5.patch
+Patch52: gcc41-java-arm6.patch
+Patch53: gcc41-java-arm7.patch
+Patch54: gcc41-java-arm8.patch
+Patch55: gcc41-pr23848.patch
+Patch56: gcc41-pr29225.patch
+Patch57: gcc41-pr29712.patch
+Patch58: gcc41-pr30293.patch
+Patch59: gcc41-pr30988.patch
+Patch60: gcc41-pr32241.patch
+Patch61: gcc41-pr32384.patch
+Patch62: gcc41-pr33501.patch
+Patch63: gcc41-pr33516.patch
+Patch64: gcc41-pr33537.patch
+Patch65: gcc41-pr33616.patch
+Patch66: gcc41-pr33723.patch
+Patch67: gcc41-pr33836.patch
+Patch68: gcc41-pr33842.patch
+Patch69: gcc41-pr33844.patch
+Patch70: gcc41-pr33962.patch
+Patch71: gcc41-pr34070.patch
+Patch72: gcc41-pr34089.patch
+Patch73: gcc41-pr34178.patch
+Patch74: gcc41-pr34130.patch
+Patch75: gcc41-pr34146.patch
+Patch76: gcc41-rh364001.patch
+Patch77: gcc41-pr34213.patch
+Patch78: gcc41-pr34364.patch
+Patch79: gcc41-pr34275.patch
+Patch80: gcc41-rh407281.patch
+Patch81: gcc41-pr34394.patch
+Patch82: gcc41-debug-fortran-array.patch
+Patch83: gcc41-omp-outer-ctx.patch
+Patch84: gcc41-pr27643.patch
+Patch85: gcc41-pr29978.patch
+Patch86: gcc41-pr31483.patch
+Patch87: gcc41-pr33890.patch
+Patch88: gcc41-pr34506.patch
+Patch89: gcc41-pr34513.patch
+Patch90: gcc41-pr7081.patch
+Patch91: gcc41-rh426846.patch
+Patch92: gcc41-sse5.patch
+Patch93: gcc41-sse5-pperm.patch
 
 # On ARM EABI systems, we do want -gnueabi to be part of the
 # target triple.
@@ -483,12 +539,61 @@
 %patch38 -p0 -b .pr33238~
 %patch39 -p0 -b .pr33619~
 %patch40 -p0 -b .pr33639~
-%patch41 -p0 -b .pr33744~
 %patch42 -p0 -b .pr33763~
 %patch43 -p0 -b .rh317051~
 %patch44 -p0 -b .rh330771~
 %patch45 -p0 -b .rh341221~
-%patch46 -p0 -b .ppc64-cr2-unwind~
+%patch47 -p0 -b .java-arm1~
+%patch48 -p0 -b .java-arm2~
+%patch49 -p0 -b .java-arm3~
+%patch50 -p0 -b .java-arm4~
+%patch51 -p0 -b .java-arm5~
+%patch52 -p0 -b .java-arm6~
+%patch53 -p0 -b .java-arm7~
+%patch54 -p0 -b .java-arm8~
+%patch55 -p0 -b .pr23848~
+%patch56 -p0 -b .pr29225~
+%patch57 -p0 -b .pr29712~
+%patch58 -p0 -b .pr30293~
+%patch59 -p0 -b .pr30988~
+%patch60 -p0 -b .pr32241~
+%patch61 -p0 -b .pr32384~
+%patch62 -p0 -b .pr33501~
+%patch63 -p0 -b .pr33516~
+%patch64 -p0 -b .pr33537~
+%patch65 -p0 -b .pr33616~
+%patch66 -p0 -b .pr33723~
+%patch67 -p0 -b .pr33836~
+%patch68 -p0 -b .pr33842~
+%patch69 -p0 -b .pr33844~
+%patch70 -p0 -b .pr33962~
+%patch71 -p0 -b .pr34070~
+%patch72 -p0 -b .pr34089~
+%patch73 -p0 -b .pr34178~
+%patch74 -p0 -b .pr34130~
+%patch75 -p0 -b .pr34146~
+%patch76 -p0 -b .rh364001~
+%patch77 -p0 -b .pr34213~
+%patch78 -p0 -b .pr34364~
+%patch79 -p0 -b .pr34275~
+%patch80 -p0 -b .rh407281~
+%patch81 -p0 -b .pr34394~
+%patch82 -p0 -b .debug-fortran-array~
+%patch83 -p0 -b .omp-outer-ctx~
+%patch84 -p0 -b .pr27643~
+%patch85 -p0 -b .pr29978~
+%patch86 -p0 -b .pr31483~
+%patch87 -p0 -b .pr33890~
+%patch88 -p0 -b .pr34506~
+%patch89 -p0 -b .pr34513~
+%patch90 -p0 -b .pr7081~
+%patch91 -p0 -b .rh426846~
+%patch92 -p0 -b .sse5~
+%patch93 -p0 -b .sse5-pperm~
+
+%if %{bootstrap_java}
+tar xjf %{SOURCE10}
+%endif
 
 sed -i -e 's/4\.1\.3/4.1.2/' gcc/BASE-VER gcc/version.c
 sed -i -e 's/" (Red Hat[^)]*)"/" (Red Hat %{version}-%{gcc_release})"/' gcc/version.c
@@ -535,6 +640,7 @@
 fi
 
 %if %{build_java}
+%if !%{bootstrap_java}
 # If we don't have gjavah in $PATH, try to build it with the old gij
 mkdir java_hacks
 cd java_hacks
@@ -561,6 +667,7 @@
 export PATH=`pwd`${PATH:+:$PATH}
 cd ..
 %endif
+%endif
 
 CC=gcc
 OPT_FLAGS=`echo $RPM_OPT_FLAGS|sed -e 's/\(-Wp,\)\?-D_FORTIFY_SOURCE=[12]//g'`
@@ -611,6 +718,9 @@
 	--enable-libgcj-multifile --enable-java-maintainer-mode \
 	--with-ecj-jar=/usr/share/java/eclipse-ecj.jar \
 %endif
+%ifarch %{arm}
+	--disable-sjlj-exceptions \
+%endif
 %ifarch ppc ppc64
 	--enable-secureplt \
 %endif
@@ -711,6 +821,13 @@
 rm -f rpm.doc/changelogs/gcc/ChangeLog.[1-9]
 find rpm.doc -name \*ChangeLog\* | xargs bzip2 -9
 
+%if %{build_java_tar}
+find libjava -name \*.h -type f | xargs grep -l '// DO NOT EDIT THIS FILE - it is machine generated' > libjava-classes.list
+find libjava -name \*.class -type f >> libjava-classes.list
+find libjava/testsuite -name \*.jar -type f >> libjava-classes.list
+tar cf - -T libjava-classes.list | bzip2 -9 > $RPM_SOURCE_DIR/libjava-classes-%{version}-%{release}.tar.bz2
+%endif
+
 %install
 rm -fr $RPM_BUILD_ROOT
 
@@ -726,8 +843,10 @@
 fi
 
 %if %{build_java}
+%if !%{bootstrap_java}
 export PATH=`pwd`/java_hacks${PATH:+:$PATH}
 %endif
+%endif
 
 TARGET_PLATFORM=%{gcc_target_platform}
 
@@ -1643,6 +1762,61 @@
 %doc rpm.doc/changelogs/libmudflap/ChangeLog*
 
 %changelog
+* Mon Dec 31 2007 Jakub Jelinek <jakub at redhat.com> 4.1.2-37
+- add SSE5 support (Michael Meissner, Dwarakanath Rajagopal, Tony Linthicum,
+  Uros Bizjak, #252998)
+- java_mark_cni_decl_local fix (Andrew Haley, #414411, PR java/27643)
+- i386 <= 0xNNffffffffLL comparison optimization (PR target/29978)
+- fix Fortran alternate returns with dummy procedure (Paul Thomas, #399531,
+  PR fortran/31483)
+- OpenMP fixes (PR c++/33890, c/34506, c++/34513)
+- generate DW_TAG_class_type in debuginfo instead of DW_TAG_structure_type if
+  class keyword was used in the source rather than struct (Alexandre Oliva,
+  PR debug/7081, #371831)
+- don't hold a global guard mutex across whole local static initialization
+  (Doug Kwan, #426846)
+
+* Wed Dec 12 2007 Jakub Jelinek <jakub at redhat.com> 4.1.2-36
+- revert PR c++/34094 fix altogether, it was only accepts-invalid and
+  caused a bunch of valid or unclear cases to be rejected (#411871, #402521)
+- fix OpenMP handling of global vars privatized in orphaned constructs
+  with #pragma omp parallel inside them
+- -frepo fixes (#411741, PRs c++/34178, c++/34340)
+- fix dynamic_cast<C &> in templates (PR c++/34364)
+- fix error diagnostics involving ABS_EXPR (PR c++/34394)
+
+* Sun Dec  2 2007 Jakub Jelinek <jakub at redhat.com> 4.1.2-35
+- two ctor preevaluation fixes (Olivier Hainque,
+  Eric Botcazou, #407281)
+- slightly weaken diagnostics for declared, but undefined static data
+  members in anon ns classes (#402521, PR c++/34238)
+- consider static data members and static member functions in anon ns
+  classes to be external for C++ linkage type handling (PR c++/34213)
+- handle OBJ_TYPE_REF in C++ diagnostics (PR c++/34275)
+
+* Sat Nov 24 2007 Jakub Jelinek <jakub at redhat.com> 4.1.2-34
+- update from gcc-4_1-branch (-r128736:130387)
+  - PRs middle-end/34030, rtl-optimization/28062, rtl-optimization/33822
+  - fix if-conversion to avoid introducing races into threaded code
+    (Ian Lance Taylor, #391731)
+- some C++ visibility fixes (Jason Merrill, PRs c++/32470, c++/33094,
+  c++/29365)
+- arm Java support (Andrew Haley, #246800)
+- add possibility to bootstrap gcj on architectures where libgcj
+  isn't already available or is too old - build on some already
+  supported arch the rpm with --with java_tar and the created
+  tarball bring to the new arch and build --with java_bootstrap
+- backport a bunch of bugfixes from GCC trunk
+  - PRs c++/29225, c++/30293, c++/30294, c++/30988, c++/32241,
+	c++/32384, c++/33501, c++/33516, c++/33616, c++/33836,
+	c++/33842, c++/33844, c++/33962, c++/34089, c++/34094,
+	c/34146, debug/33537, middle-end/23848, middle-end/34070,
+	testsuite/33978, tree-optimization/33723
+- fix abs optimization (Richard Guenther, #394271, PR middle-end/34130)
+- fortran lbound/ubound fix (Paul Thomas, #391151, PR fortran/29712)
+- generate proper fortran debuginfo for assumed-size, assumed-shape
+  and deferred arrays (#364001)
+
 * Sun Oct 21 2007 Jakub Jelinek <jakub at redhat.com> 4.1.2-33
 - rebuild to fix multilib conflict between i386 and x86_64 libgcj,
   set java man page timestamp from the timestamp of *.texinfo rather


Index: sources
===================================================================
RCS file: /cvs/pkgs/rpms/gcc/F-8/sources,v
retrieving revision 1.215
retrieving revision 1.216
diff -u -r1.215 -r1.216
--- sources	25 Sep 2007 16:09:05 -0000	1.215
+++ sources	31 Dec 2007 18:09:00 -0000	1.216
@@ -1 +1 @@
-562ab2446c60a9145da385ac56cf7715  gcc-4.1.2-20070925.tar.bz2
+b0e332f1be680c13608e127c6ed9acf9  gcc-4.1.2-20071124.tar.bz2


--- gcc41-ppc64-cr2-unwind.patch DELETED ---


--- gcc41-pr33744.patch DELETED ---




More information about the fedora-extras-commits mailing list