This is the mail archive of the gcc-prs@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

Re: c/5290: Miscompilation of GDB on i386


The following reply was made to PR c/5290; it has been noted by GNATS.

From: DJ Delorie <dj@redhat.com>
To: kettenis@gnu.org
Cc: gcc-gnats@gcc.gnu.org, gcc-prs@gcc.gnu.org, gcc-bugs@gcc.gnu.org
Subject: Re: c/5290: Miscompilation of GDB on i386
Date: Thu, 10 Jan 2002 00:06:35 -0500

 Here's a shorter testcase, also derived from gdb:
 
 int print_max;
 int null_cleanup;
 int addressprint;
 void xfree();
 
 int
 val_print_string (int addr, int len, int width, char *stream)
 {
   int errcode;
   unsigned int fetchlimit = max();
   unsigned int nfetch;
   char *buffer = 0;
   char *bufptr;
   int found_nul;
   unsigned long bufsize = 0;
 
   do
     {
       nfetch = min ();
 
       if (buffer == 0)
 	buffer = (char *) xmalloc (nfetch * width);
       else
 	buffer = (char *) xrealloc (buffer, (nfetch + bufsize) * width);
 
       bufptr = buffer + bufsize * width;
       bufsize += nfetch;
 
       nfetch = partial_memory_read (addr, bufptr, nfetch * width, &errcode);
     }
   while (bufptr - buffer < fetchlimit * width
 	 && !found_nul);
 }
 
 The bug is in global alloc and reload.  In valprint.c.21.lreg we see:
 
 
 (call_insn 96 95 98 (set (reg:SI 0 eax)
         (call (mem:QI (symbol_ref:SI ("xrealloc")) [0])
             (const_int 8 [0x8]))) 649 {*call_value_0} (nil)
     (nil)
     (nil))
 
 (insn 98 96 100 (set (reg/v/f:SI 67)
         (reg:SI 0 eax)) 45 {*movsi_1} (insn_list 96 (nil))
     (expr_list:REG_DEAD (reg:SI 0 eax)
         (nil)))
 ;; End of basic block 3, registers live:
  6 [bp] 7 [sp] 16 [] 20 [frame] 59 61 65 66 67 69 70 83 84
 
 ;; Start of basic block 4, registers live: 6 [bp] 7 [sp] 16 [] 20 [frame] 59 61 65 66 67 69 70 83 84
 (code_label 100 98 172 6 "" "" [1 uses])
 
 (note 172 100 102 [bb 4] NOTE_INSN_BASIC_BLOCK)
 
 (insn 102 172 104 (parallel[ 
             (set (reg/v:SI 70)
                 (mult:SI (reg/v:SI 70)
                     (reg/v:SI 61)))
             (clobber (reg:CC 17 flags))
         ] ) 250 {*mulsi3_1} (nil)
     (expr_list:REG_UNUSED (reg:CC 17 flags)
         (nil)))
 
 (insn 104 102 107 (parallel[ 
             (set (reg/v/f:SI 68)
                 (plus:SI (reg/v/f:SI 67)
                     (reg/v:SI 70)))
             (clobber (reg:CC 17 flags))
         ] ) 207 {*addsi_1} (insn_list 102 (nil))
     (expr_list:REG_DEAD (reg/v:SI 70)
         (expr_list:REG_UNUSED (reg:CC 17 flags)
             (nil))))
 
 But in valprint.c.22.greg we see:
 
 
 Reloads for insn # 98
 Reload 0: reload_out (SI) = (reg/v/f:SI 67)
 	NO_REGS, RELOAD_FOR_OUTPUT (opnum = 0), optional
 	reload_out_reg: (reg/v/f:SI 67)
 
 Reloads for insn # 102
 Reload 0: reload_in (SI) = (reg/v:SI 70)
 	reload_out (SI) = (reg/v:SI 70)
 	INDEX_REGS, RELOAD_OTHER (opnum = 0)
 	reload_in_reg: (reg/v:SI 70)
 	reload_out_reg: (reg/v:SI 70)
 	reload_reg_rtx: (reg:SI 0 eax)
 Reload 1: reload_in (SI) = (reg/v:SI 61)
 	GENERAL_REGS, RELOAD_FOR_INPUT (opnum = 2), optional
 	reload_in_reg: (reg/v:SI 61)
 
 Reloads for insn # 104
 Reload 0: reload_in (SI) = (reg/v/f:SI 67)
 	reload_out (SI) = (reg/v/f:SI 3 ebx [68])
 	GENERAL_REGS, RELOAD_OTHER (opnum = 0)
 	reload_in_reg: (reg/v/f:SI 67)
 	reload_out_reg: (reg/v/f:SI 3 ebx [68])
 	reload_reg_rtx: (reg/v/f:SI 3 ebx [68])
 Reload 1: reload_in (SI) = (reg/v:SI 70)
 	GENERAL_REGS, RELOAD_FOR_INPUT (opnum = 2), optional
 	reload_in_reg: (reg/v:SI 70)
 	reload_reg_rtx: (reg:SI 0 eax)
 
 (call_insn 96 95 98 (set (reg:SI 0 eax)
         (call (mem:QI (symbol_ref:SI ("xrealloc")) [0])
             (const_int 8 [0x8]))) 649 {*call_value_0} (nil)
     (nil)
     (nil))
 
 (insn 98 96 100 (set (mem:SI (plus:SI (reg/f:SI 6 ebp)
                 (const_int -24 [0xffffffffffffffe8])) [6])
         (reg:SI 0 eax)) 45 {*movsi_1} (insn_list 96 (nil))
     (nil))
 ;; End of basic block 3, registers live:
  6 [bp] 7 [sp] 16 [] 20 [frame] 59 61 65 66 67 69 70 83 84
 
 ;; Start of basic block 4, registers live: 6 [bp] 7 [sp] 59 61 65 66 67 69 70 83 84
 (code_label 100 98 172 6 "" "" [1 uses])
 
 (note 172 100 219 [bb 4] NOTE_INSN_BASIC_BLOCK)
 
 (insn 219 172 102 (set (reg:SI 0 eax)
         (mem:SI (plus:SI (reg/f:SI 6 ebp)
                 (const_int -32 [0xffffffffffffffe0])) [8])) 45 {*movsi_1} (nil)
     (nil))
 
 (insn 102 219 104 (parallel[ 
             (set (reg:SI 0 eax)
                 (mult:SI (reg:SI 0 eax)
                     (mem/f:SI (plus:SI (reg/f:SI 6 ebp)
                             (const_int 16 [0x10])) [1 width+0 S4 A32])))
             (clobber (reg:CC 17 flags))
         ] ) 250 {*mulsi3_1} (nil)
     (nil))
 
 (insn 104 102 107 (parallel[ 
             (set (reg/v/f:SI 3 ebx [68])
                 (plus:SI (reg/v/f:SI 3 ebx [68])
                     (reg:SI 0 eax)))
             (clobber (reg:CC 17 flags))
         ] ) 207 {*addsi_1} (insn_list 102 (nil))
     (nil))


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]