Bug#336167: gcc-4.0: breaks kernel builds in random ways.
Thiemo Seufer wrote:
> Sven Luther wrote:
> > Package: gcc-4.0
> > Version: 4.0.2-3
> > Severity: grave
> > Justification: renders package unusable
> >
> >
> > Well, i confirm that this problem is also present on powerpc, using
> > gcc-4.0 4.0.2-3 makes the kernel build fail, while using -2 seems to be
> > ok. I have heard people mentioning two other arches where this is the
> > case (m68k and mips i think) on irc (on #debian-release i think even,
> > not sure), but no bug has been filed so i do it now.
> >
> > My powerpc builds failed with :
>
> For mips 2.6.12, which built fine with gcc 4.0.2-2:
>
> CC [M] fs/reiserfs/tail_conversion.o
> fs/reiserfs/tail_conversion.c: In function 'direct2indirect':
> fs/reiserfs/tail_conversion.c:138: internal compiler error:
> Floating point exception
> Please submit a full bug report,
> with preprocessed source if appropriate.
> See <URL:http://gcc.gnu.org/bugs.html> for instructions.
> For Debian GNU/Linux specific bug reporting instructions,
> see <URL:file:///usr/share/doc/gcc-4.0/README.Bugs>.
> make[5]: *** [fs/reiserfs/tail_conversion.o] Error 1
> make[4]: *** [fs/reiserfs] Error 2
>
> Sorry, no testcase yet.
The attached testcase triggers this bug on mips-linux when compiled
with "gcc -O2 -mabi=64 -c"
The appended patch reverts a single line of the diff between 4.0.2-2
and 4.0.2-3 and lets the testcase succeed. I don't know that part of
gcc enough to judge if it is a valid fix for the problem.
Sven, could you test if this fixes also the problem you see?
Thiemo
/* gcc -O2 -mabi=64 -c -o foo.o foo.c */
struct offset_v1 {
int k_uniqueness;
};
struct offset_v2 {
long v;
} __attribute__ ((__packed__));
struct reiserfs_key {
int k_objectid;
union {
struct offset_v1 k_offset_v1;
struct offset_v2 k_offset_v2;
} u;
};
struct item_head
{
struct reiserfs_key ih_key;
int ih_version;
};
static void set_offset_v2_k_type(struct offset_v2 *v2)
{
v2->v &= 1;
}
static void set_le_key_k_type (int version, struct reiserfs_key * key)
{
version ? (key->u.k_offset_v1.k_uniqueness = 1)
: set_offset_v2_k_type(&(key->u.k_offset_v2));
}
static void set_le_ih_k_type (struct item_head * ih)
{
set_le_key_k_type((__builtin_constant_p((ih)->ih_version) ? (ih)->ih_version : (ih)->ih_version), &(ih->ih_key));
}
void boo(struct item_head *ih, const char *body);
void direct2indirect(void)
{
struct item_head *p_le_ih;
struct item_head ind_ih;
unsigned int unfm_ptr;
if (__builtin_expect(32, 0)) __asm__ ("break");
set_le_ih_k_type (&ind_ih);
if (__builtin_constant_p(p_le_ih) ? 1 : 2) {
(__builtin_constant_p(__builtin_constant_p(1) == 1));
boo(&ind_ih, (char *)&unfm_ptr);
}
}
--- gcc-4.0-4.0.2.new/src/gcc/reorg.c 2005-09-03 21:09:51.000000000 +0200
+++ gcc-4.0-4.0.2/src/gcc/reorg.c 2005-10-31 23:16:47.000000000 +0100
@@ -2653,7 +2653,7 @@ fill_slots_from_thread (rtx insn, rtx co
if (!must_annul
&& (condition == const_true_rtx
|| (! insn_sets_resource_p (trial, &opposite_needed, 1)
- && ! may_trap_or_fault_p (pat))))
+ && ! may_trap_p (pat))))
{
old_trial = trial;
trial = try_split (pat, trial, 0);
Reply to: