c/5290: Miscompilation of GDB on i386

DJ Delorie dj@redhat.com
Wed Jan 9 21:06:00 GMT 2002


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))



More information about the Gcc-bugs mailing list