On Sun, 2006-01-22 21:54:47 +0100, Jan-Benedict Glaw <[EMAIL PROTECTED]> wrote: > On Sun, 2006-01-22 21:49:31 +0100, Zdenek Dvorak <[EMAIL PROTECTED]> wrote: > [...] > > > This is the SIGN_EXTRACT case of expand_compound_operation(), maybe this > > > does ring a > > > bell? > > > > no idea; this is either completely unrelated, or we randomly clobber memory > > somewhere. > > Could you please provide a preprocessed testcase (preferably reduced > > one)? > > Thanks for commenting on this. I've just started a build with r110030 > and will try to produce something. Once that is done (it takes some > time:-)
First of all, this indeed starts with r110030. -O2 is needed, the
problem goes away if no -O is used. While trying to cut it down, I
noticed that the ICE is probably connected to the bitfields. It's 75
lines right now:
----------------------------------------------------------------------
typedef long unsigned int size_t;
extern void abort (void) __attribute__ ((__noreturn__));
typedef unsigned _Unwind_Ptr __attribute__((__mode__(__pointer__)));
struct fde_vector
{
size_t count;
const struct dwarf_fde *array[];
};
struct object
{
struct fde_vector *sort;
struct {
unsigned long mixed_encoding : 1;
unsigned long encoding : 8;
} b;
struct object *next;
};
typedef int sword __attribute__ ((mode (SI)));
struct dwarf_cie
{
sword CIE_id;
} __attribute__ ((packed, aligned (__alignof__ (void *))));
struct dwarf_fde
{
sword CIE_delta;
} __attribute__ ((packed, aligned (__alignof__ (void *))));
typedef struct dwarf_fde fde;
static struct object *seen_objects;
static _Unwind_Ptr
base_from_object (unsigned char encoding)
{
if (encoding)
abort ();
}
static const fde *
search_object (struct object* ob, void *pc)
{
struct fde_vector *vec = ob->sort;
int encoding = ob->b.encoding;
_Unwind_Ptr base = base_from_object (encoding);
size_t lo, hi;
for (lo = 0, hi = vec->count; lo < hi; )
{
size_t i = (lo + hi) / 2;
const fde *f = vec->array[i];
_Unwind_Ptr pc_begin;
if ((_Unwind_Ptr) pc < pc_begin)
return f;
}
}
const fde *
_Unwind_Find_FDE (void *pc)
{
struct object *ob;
const fde *f = ((void *)0);
for (ob = seen_objects; ob; ob = ob->next)
f = search_object (ob, pc);
return f;
}
----------------------------------------------------------------------
To build it:
(This is binutils from CVS)
.../binutils/configure --target=vax-linux-uclibc --disable-nls --prefix=...
make all-binutils
make all-ld
make all-gas
make install-binutils
make install-ld
make install-gas
(GCC)
.../gcc/configure --disable-multilib --with-newlib --disable-nls \
--enable-threads=no --disable-threads --enable-symvers=gnu \
--enable-__cxa_atexit --disable-shared --target=vax-linux-uclibc \
--prefix=... \
--enable-languages=c,c++
make all-gcc
This patch is used for GCC:
diff -Nurp src-gcc-fresh/gcc/config/vax/linux.h
src-gcc-hacked/gcc/config/vax/linux.h
--- src-gcc-fresh/gcc/config/vax/linux.h 1970-01-01 01:00:00.000000000
+0100
+++ src-gcc-hacked/gcc/config/vax/linux.h 2005-12-09 21:57:45.000000000
+0100
@@ -0,0 +1,31 @@
+#ifndef _CONFIG_VAX_LINUX_H
+/*
+ * Copyright (C) 2005 Free Software Foundation, Inc.
+ *
+ * This file is part of GCC.
+ *
+ * GCC 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.
+ *
+ * GCC 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 GCC; see the file COPYING. If not, write to
+ *
+ * Free Software Foundation
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301
+ * USA
+ */
+
+/*
+ * This file contains definitions specific to Linux using GNU libc and
+ * the ELF binary format.
+ */
+
+#endif /* _CONFIG_VAX_LINUX_H */
diff -Nurp src-gcc-fresh/gcc/config/vax/uclinux.h
src-gcc-hacked/gcc/config/vax/uclinux.h
--- src-gcc-fresh/gcc/config/vax/uclinux.h 1970-01-01 01:00:00.000000000
+0100
+++ src-gcc-hacked/gcc/config/vax/uclinux.h 2005-12-09 21:57:45.000000000
+0100
@@ -0,0 +1,31 @@
+#ifndef _CONFIG_VAX_UCLINUX_H
+/*
+ * Copyright (C) 2005 Free Software Foundation, Inc.
+ *
+ * This file is part of GCC.
+ *
+ * GCC 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.
+ *
+ * GCC 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 GCC; see the file COPYING. If not, write to
+ *
+ * Free Software Foundation
+ * 51 Franklin Street, Fifth Floor
+ * Boston, MA 02110-1301
+ * USA
+ */
+
+/*
+ * This file contains definitions specific to Linux using the small uClibc
+ * and the ELF binary format.
+ */
+
+#endif /* _CONFIG_VAX_UCLINUX_H */
diff -Nurp src-gcc-fresh/gcc/config.gcc src-gcc-hacked/gcc/config.gcc
--- src-gcc-fresh/gcc/config.gcc 2005-11-30 21:09:05.000000000 +0100
+++ src-gcc-hacked/gcc/config.gcc 2005-12-09 21:57:45.000000000 +0100
@@ -2258,6 +2258,12 @@ vax-*-sysv*) # VAXen running system V
tmake_file=vax/t-memfuncs
use_fixproto=yes
;;
+vax-*-linux-uclibc*) # VAXen running Linux ELF with uClibc
+ tm_file="${tm_file} elfos.h linux.h vax/elf.h vax/uclinux.h"
+ ;;
+vax-*-linux*) # VAXen running Linux ELF with GNU libc
+ tm_file="${tm_file} elfos.h linux.h vax/elf.h vax/linux.h"
+ ;;
vax-*-netbsdelf*)
tm_file="${tm_file} elfos.h netbsd.h netbsd-elf.h vax/elf.h
vax/netbsd-elf.h"
;;
diff -Nurp src-gcc-fresh/gcc/config/vax/vax.c
src-gcc-hacked/gcc/config/vax/vax.c
--- src-gcc-fresh/gcc/config/vax/vax.c 2005-06-26 15:39:59.000000000 +0200
+++ src-gcc-hacked/gcc/config/vax/vax.c 2005-09-23 01:09:46.000000000 +0200
@@ -98,6 +98,13 @@ override_options (void)
/* We're VAX floating point, not IEEE floating point. */
if (TARGET_G_FLOAT)
REAL_MODE_FORMAT (DFmode) = &vax_g_format;
+
+ if (write_symbols != NO_DEBUG)
+ {
+ warning (0, "-g is only supported when using GAS on this processor,");
+ warning (0, "-g option disabled");
+ write_symbols = NO_DEBUG;
+ }
}
/* Generate the assembly code for function entry. FILE is a stdio
diff -Nurp src-gcc-fresh/gcc/config/vax/lib1funcs.S
src-gcc-hacked/gcc/config/vax/lib1funcs.S
--- src-gcc-fresh/gcc/config/vax/lib1funcs.S 1970-01-01 01:00:00.000000000
+0100
+++ src-gcc-hacked/gcc/config/vax/lib1funcs.S 2005-12-09 22:19:00.000000000
+0100
@@ -0,0 +1,86 @@
+/*
+ * Assembly functions for the VAX version of libgcc1.
+ * Copyright (C) 2005 Free Software Foundation, Inc.
+ * Contributed by Jan-Benedict Glaw <[EMAIL PROTECTED]>.
+ *
+ * This file is part of GCC.
+ *
+ * GCC 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.
+ *
+ * In addition to the permissions in the GNU General Public License, the
+ * Free Software Foundation gives you unlimited permission to link the
+ * compiled version of this file into combinations with other programs,
+ * and to distribute those combinations without any restriction coming
+ * from the use of this file. (The General Public License restrictions
+ * do apply in other respects; for example, they cover modification of
+ * the file, and distribution when not linked into a combine
+ * executable.)
+ *
+ * GCC 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 GCC; see the file COPYING. If not, write to the Free
+ * Software Foundation, 51 Franklin Street, Fifth Floor, Boston, MA
+ * 02110-1301, USA.
+ */
+
+#ifdef L_udivsi3
+#define DIVISOR 8(%ap)
+#define DIVIDENT 4(%ap)
+ .align 4
+ .global __udivsi3
+ .type __udivsi3, @function
+__udivsi3:
+ .word 0x0004
+ movl DIVISOR, %r2
+ jlss JustCompare
+ movl DIVIDENT, %r0
+ jlss RealHardDivide
+
+SimpleDivide:
+ divl2 %r2, %r0
+ j Return
+
+RealHardDivide:
+ clrl %r1
+ ediv %r2, %r0, %r0, %r1
+ j Return
+
+JustCompare:
+ cmpl DIVIDEND, %r2
+ jgequ ItIsOne
+
+ItIsntOne:
+ clrl %r0
+ j Return
+
+ItIsOne:
+ movl $1, %r0
+ j Return
+
+Return:
+ ret
+ .size __udivsi3, . - __udivsi3
+#undef DIVISOR
+#undef DIVIDENT
+#endif /* L_udivsi3 */
+
+
+#ifdef L_umodsi3
+#define DIVISOR 8(%ap)
+#define DIVIDENT 4(%ap)
+ .align 4
+ .global __umodsi3
+ .type __umodsi3, @function
+__umodsi3:
+ .word 0x0004
+
+ .size __umodsi3, . - __umodsi3
+#endif /* L_umodsi3 */
+
diff -Nurp src-gcc-fresh/gcc/config/vax/linux.h
src-gcc-hacked/gcc/config/vax/linux.h
--- src-gcc-fresh/gcc/config/vax/linux.h 2005-12-09 22:18:14.000000000
+0100
+++ src-gcc-hacked/gcc/config/vax/linux.h 2005-12-09 22:19:00.000000000
+0100
@@ -28,4 +28,8 @@
* the ELF binary format.
*/
+#ifdef HAVE___UDIV___UREM_IN_LIBC
+#undef HAVE___UDIV___UREM_IN_LIBC
+#endif
+
#endif /* _CONFIG_VAX_LINUX_H */
diff -Nurp src-gcc-fresh/gcc/config/vax/netbsd.h
src-gcc-hacked/gcc/config/vax/netbsd.h
--- src-gcc-fresh/gcc/config/vax/netbsd.h 2005-10-28 18:32:14.000000000
+0200
+++ src-gcc-hacked/gcc/config/vax/netbsd.h 2005-12-09 22:19:00.000000000
+0100
@@ -46,3 +46,7 @@ Boston, MA 02110-1301, USA. */
/* We use gas, not the UNIX assembler. */
#undef TARGET_DEFAULT
#define TARGET_DEFAULT 0
+
+/* BSDs do have __udev and __urem in libc. */
+#define HAVE___UDIV___UREM_IN_LIBC
+
diff -Nurp src-gcc-fresh/gcc/config/vax/openbsd1.h
src-gcc-hacked/gcc/config/vax/openbsd1.h
--- src-gcc-fresh/gcc/config/vax/openbsd1.h 2005-10-28 18:32:14.000000000
+0200
+++ src-gcc-hacked/gcc/config/vax/openbsd1.h 2005-12-09 22:19:00.000000000
+0100
@@ -19,5 +19,9 @@ the Free Software Foundation, 51 Frankli
Boston, MA 02110-1301, USA. */
/* Set up definitions before picking up the common openbsd.h file. */
-#define OBSD_OLD_GAS
+#define OBSD_OLD_GAS
#define OBSD_NO_DYNAMIC_LIBRARIES
+
+/* BSDs do have __udiv and __urem in libc. */
+#define HAVE___UDIV___UREM_IN_LIBC
+
diff -Nurp src-gcc-fresh/gcc/config/vax/openbsd.h
src-gcc-hacked/gcc/config/vax/openbsd.h
--- src-gcc-fresh/gcc/config/vax/openbsd.h 2005-10-28 18:32:14.000000000
+0200
+++ src-gcc-hacked/gcc/config/vax/openbsd.h 2005-12-09 22:19:00.000000000
+0100
@@ -44,3 +44,7 @@ Boston, MA 02110-1301, USA. */
#undef WCHAR_TYPE_SIZE
#define WCHAR_TYPE_SIZE 32
+
+/* BSDs do have __udiv and __urem in libc. */
+#define HAVE___UDIV___UREM_IN_LIBC
+
diff -Nurp src-gcc-fresh/gcc/config/vax/t-vax
src-gcc-hacked/gcc/config/vax/t-vax
--- src-gcc-fresh/gcc/config/vax/t-vax 1970-01-01 01:00:00.000000000 +0100
+++ src-gcc-hacked/gcc/config/vax/t-vax 2005-12-09 22:19:00.000000000 +0100
@@ -0,0 +1,4 @@
+# LIB1ASMSRC = vax/lib1funcs.S
+# LIB1ASMFUNCS = _udivsi3 _uremsi3
+# LIB1ASMSRC = $(srcdir)/config/udivmod.c $(srcdir)/config/udivmodsi4.c
+LIB2FUNCS_EXTRA = $(srcdir)/config/udivmod.c $(srcdir)/config/udivmodsi4.c
diff -Nurp src-gcc-fresh/gcc/config/vax/vax.c
src-gcc-hacked/gcc/config/vax/vax.c
--- src-gcc-fresh/gcc/config/vax/vax.c 2005-10-28 18:32:14.000000000 +0200
+++ src-gcc-hacked/gcc/config/vax/vax.c 2005-12-09 22:19:00.000000000 +0100
@@ -46,13 +46,15 @@ Boston, MA 02110-1301, USA. */
static void vax_output_function_prologue (FILE *, HOST_WIDE_INT);
static void vax_file_start (void);
-static void vax_init_libfuncs (void);
static void vax_output_mi_thunk (FILE *, tree, HOST_WIDE_INT,
HOST_WIDE_INT, tree);
static int vax_address_cost_1 (rtx);
static int vax_address_cost (rtx);
static bool vax_rtx_costs (rtx, int, int, int *);
static rtx vax_struct_value_rtx (tree, int);
+#ifdef HAVE___UDIV___UREM_IN_LIBC
+static void vax_init_libfuncs (void);
+#endif
/* Initialize the GCC target structure. */
#undef TARGET_ASM_ALIGNED_HI_OP
@@ -66,8 +68,10 @@ static rtx vax_struct_value_rtx (tree, i
#undef TARGET_ASM_FILE_START_APP_OFF
#define TARGET_ASM_FILE_START_APP_OFF true
+#ifdef HAVE___UDIV___UREM_IN_LIBC
#undef TARGET_INIT_LIBFUNCS
#define TARGET_INIT_LIBFUNCS vax_init_libfuncs
+#endif
#undef TARGET_ASM_OUTPUT_MI_THUNK
#define TARGET_ASM_OUTPUT_MI_THUNK vax_output_mi_thunk
@@ -155,6 +166,7 @@ vax_file_start (void)
fprintf (asm_out_file, "___vax_%c_doubles:\n", ASM_DOUBLE_CHAR);
}
+#ifdef HAVE___UDIV___UREM_IN_LIBC
/* We can use the BSD C library routines for the libgcc calls that are
still generated, since that's what they boil down to anyways. When
ELF, avoid the user's namespace. */
@@ -165,6 +177,7 @@ vax_init_libfuncs (void)
set_optab_libfunc (udiv_optab, SImode, TARGET_ELF ? "*__udiv" : "*udiv");
set_optab_libfunc (umod_optab, SImode, TARGET_ELF ? "*__urem" : "*urem");
}
+#endif /* HAVE___UDIV___UREM_IN_LIBC */
/* This is like nonimmediate_operand with a restriction on the type of MEM. */
diff -Nurp src-gcc-fresh/gcc/config.gcc src-gcc-hacked/gcc/config.gcc
--- src-gcc-fresh/gcc/config.gcc 2005-12-09 22:18:14.000000000 +0100
+++ src-gcc-hacked/gcc/config.gcc 2005-12-09 22:19:00.000000000 +0100
@@ -2260,9 +2260,11 @@ vax-*-sysv*) # VAXen running system V
;;
vax-*-linux-uclibc*) # VAXen running Linux ELF with uClibc
tm_file="${tm_file} elfos.h linux.h vax/elf.h vax/uclinux.h"
+ tmake_file="vax/t-vax"
;;
vax-*-linux*) # VAXen running Linux ELF with GNU libc
tm_file="${tm_file} elfos.h linux.h vax/elf.h vax/linux.h"
+ tmake_file="vax/t-vax"
;;
vax-*-netbsdelf*)
tm_file="${tm_file} elfos.h netbsd.h netbsd-elf.h vax/elf.h
vax/netbsd-elf.h"
diff -Nurp src-gcc-fresh/gcc/config/host-linux.c
src-gcc-hacked/gcc/config/host-linux.c
--- src-gcc-fresh/gcc/config/host-linux.c 2005-10-28 18:32:26.000000000
+0200
+++ src-gcc-hacked/gcc/config/host-linux.c 2005-11-01 10:36:34.000000000
+0100
@@ -89,8 +89,12 @@
# define TRY_EMPTY_VM_SPACE 0
#endif
+#ifndef SSIZE_MAX
+# define SSIZE_MAX 4096
+#endif
+
/* Determine a location where we might be able to reliably allocate SIZE
- bytes. FD is the PCH file, though we should return with the file
+ bytes. FD is the PCH file, though we should return with the file
unmapped. */
static void *
Thanks, JBG
--
Jan-Benedict Glaw [EMAIL PROTECTED] . +49-172-7608481 _ O _
"Eine Freie Meinung in einem Freien Kopf | Gegen Zensur | Gegen Krieg _ _ O
für einen Freien Staat voll Freier Bürger" | im Internet! | im Irak! O O O
ret = do_actions((curr | FREE_SPEECH) & ~(NEW_COPYRIGHT_LAW | DRM | TCPA));
signature.asc
Description: Digital signature
