From mboxrd@z Thu Jan 1 00:00:00 1970 From: Manfred Hollstein To: gcc2@cygnus.com Cc: law@cygnus.com, rms@gnu.org, Manfred.Hollstein@ks.sel.alcatel.de, oliva@dcc.unicamp.br, egcs@cygnus.com Subject: Re: New problems with gcc-2.8.0 based code - NOW FIXED! Date: Thu, 01 Jan 1998 10:02:00 -0000 Message-id: <199801011710.SAA00706@saturn.s-direktnet.de> References: <199712291737.SAA07160@saturn.s-direktnet.de> <26093.883419397@hurl.cygnus.com> <199712301444.PAA00543@saturn.s-direktnet.de> X-SW-Source: 1998-01/msg00003.html On , 30 December 1997, 18:50:24, ak@muc.de wrote: > I remember a bugfix between egcs 1.0 and 1.0.1 so that it treats > __asm__ statements without output operands always as volatile. The Linux > kernel depends on this behaviour. If gcc 2.8.0 doesn't have this bugfix > it could be the cause for your problems. > After the discussion about __volatile__ __asm__ statements I just added Jeffrey Law's patch to gcc-2.8.0-971225: Mon Dec 15 08:48:24 1997 Jeffrey A Law (law@cygnus.com) * stmt.c (expand_asm_operands): If an ASM has no outputs, then treat it as volatile. diff --context --recursive --show-c-function -x *.o -x *.info* -x *.html* -x *.elc -x *.dvi -x *.orig -x *~ -x version.el gcc-2.8.0.orig/gcc/stmt.c gcc-2.8.0/gcc/stmt.c *** gcc-2.8.0.orig/gcc/stmt.c Tue Dec 9 01:07:38 1997 --- gcc-2.8.0/gcc/stmt.c Wed Dec 31 23:42:54 1997 *************** expand_asm_operands (string, outputs, in *** 1421,1426 **** --- 1421,1430 ---- /* The insn we have emitted. */ rtx insn; + /* An ASM with no outputs needs to be treated as volatile. */ + if (noutputs == 0) + vol = 1; + if (output_bytecode) { error ("`asm' is invalid when generating bytecode"); rebuilt and installed the compiler. I then used this compiler to built linux-2.1.76 once again and I'm still getting the same boot failures (16 times the _same_ Oops's from boot to reboot): Unable to handle kernel NULL pointer dereference at virtual address 00000018 current->tss.cr3 = 00101000, ^_r3 = 00101000 *pde = 00000000 Oops: 0000 CPU: 0 EIP: 0010:[] EFLAGS: 00010002 eax: 00000100 ebx: c02f52c0 ecx: 00000000 edx: c0221000 esi: c3e79800 edi: 00000202 ebp: c3e79800 esp: c3e25f88 ds: 0018 es: 0018 ss: 0018 Process modutils (pid: 25, process nr: 8, stackpage=c3e25000) Stack: c3e24000 c3e887c0 00000400 00000021 c011b96d c009cda0 c011b99d c3e79800 c3e24000 ffffffff fffffffc 00000000 c011c14c 00000000 c0109f1a 00000000 00000000 400d2c44 ffffffff fffffffc 00000000 00000001 0000002b 0000002b Call Trace: [] [] [] [] Code: c01275d9 2b 69 18 subl 0x18(%ecx),%ebp Code: c01275dc 89 e8 movl %ebp,%eax Code: c01275de 31 d2 xorl %edx,%edx Code: c01275e0 f7 73 08 divl 0x8(%ebx),%eax Code: c01275e9 8b 51 04 movl 0x4(%ecx),%edx Code: c01275ec 8d 14 82 leal (%edx,%eax,4),%edx Code: c01275ef 89 54 24 10 movl %edx,0x10(%esp,1) Another problem has been shown by several test programs from libg++-2.8.0b6.5. As an example, try to compile the following snippet: /* File: t002.cc * Compiled by gcc-2.8.0-971225 using * optimization * _and_ -funroll-all-loops * _and_ -g * results in an `Internal compiler error'. */ #include #include #include int main (void) { String z = "This string\thas\nfive words"; String w[10]; int nw = split (z, w, 10, RXwhite); for (int i = 0; i < nw; ++i) { cout << "z[" << i << "] = \"" << w[i] << "\"" << endl; } return 0; } $ gcc -v Reading specs from /tools/gnu/lib/gcc-lib/i586-linux-gnulibc1/2.8.0/specs gcc version 2.8.0 $ uname -a Linux saturn 2.0.33 #7 Mon Dec 29 13:09:29 MET 1997 i586 unknown $ gcc -O -funroll-all-loops -g -S t002.cc t002.cc: In function `int main()': t002.cc:17: Internal compiler error. t002.cc:17: Please submit a full bug report to `bug-g++@prep.ai.mit.edu'. Omitting either `-funroll-all-loops' or `-g' works, though. If you need the expanded .ii file send me an e-mail. And you guys from the gcc2 mailing list, please add my e-mail address to the To: or Cc: fields explicitly, as I still couldn't get onto the mailing list :-( Manfred