Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 17 Jun 2004 18:24:12 -0700
From:      Sean McNeil <sean@mcneil.com>
To:        freebsd-amd64@freebsd.org, freebsd-gnome@freebsd.org
Subject:   Re: bad compiler generated code?
Message-ID:  <1087521851.32817.27.camel@server.mcneil.com>
In-Reply-To: <20040616015703.GA17852@dragon.nuxi.com>
References:  <1087346887.66377.1.camel@server.mcneil.com> <20040616015703.GA17852@dragon.nuxi.com>

next in thread | previous in thread | raw e-mail | index | archive | help
On Tue, 2004-06-15 at 18:57, David O'Brien wrote:
> On Tue, Jun 15, 2004 at 05:48:08PM -0700, Sean McNeil wrote:
> > I'm recompiling firefox right now and I get a whole bunch of the
> > following:
> > 
> > {standard input}:766: Warning: indirect jmp without `*'
> > {standard input}:816: Warning: indirect jmp without `*'
> ...
> > this happens on quite a number of C++ source files.  Looks like the
> > compiler is generating some bad assembly.
> 
> This is not a useful bug report.  Can you provide the preprocesed C file?
> Or at least provide command line(s) invocation that produces this?

I took a look into this and it appears that the bad code generation of
c++ is related to my issues with firefox.  Here is what I saw:

In xpcom/base/nsExceptionService.cpp it is generating thunks as

_ZThn8_N18nsExceptionService6AddRefEv:
	addq	$-8, %rdi
	jmp	_ZN18nsExceptionService6AddRefEv(%rip)
	.size	_ZThn8_N18nsExceptionService6AddRefEv, .-_ZThn8_N18nsExceptionService6AddRefEv

when they should be

_ZThn8_N18nsExceptionService6AddRefEv:
	addq	$-8, %rdi
	jmp	_ZN18nsExceptionService6AddRefEv
	.size	_ZThn8_N18nsExceptionService6AddRefEv, .-_ZThn8_N18nsExceptionService6AddRefEv

This has been fixed in the cvs version of gcc and involves the following patch:

*** contrib/gcc/config/i386/i386.c.orig Thu Jun 17 18:20:11 2004
--- contrib/gcc/config/i386/i386.c      Thu Jun 17 18:10:55 2004
*************** x86_output_mi_thunk (file, thunk, delta,
*** 14607,14621 ****
        output_asm_insn ("mov{l}\t{%0, %1|%1, %0}", xops);
      }

!   xops[0] = DECL_RTL (function);
    if (TARGET_64BIT)
      {
        if (!flag_pic || (*targetm.binds_local_p) (function))
        output_asm_insn ("jmp\t%P0", xops);
        else
        {
!         tmp = XEXP (xops[0], 0);
!         tmp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, tmp), UNSPEC_GOTPCREL);
          tmp = gen_rtx_CONST (Pmode, tmp);
          tmp = gen_rtx_MEM (QImode, tmp);
          xops[0] = tmp;
--- 14607,14620 ----
        output_asm_insn ("mov{l}\t{%0, %1|%1, %0}", xops);
      }

!   xops[0] = XEXP (DECL_RTL (function), 0);
    if (TARGET_64BIT)
      {
        if (!flag_pic || (*targetm.binds_local_p) (function))
        output_asm_insn ("jmp\t%P0", xops);
        else
        {
!         tmp = gen_rtx_UNSPEC (Pmode, gen_rtvec (1, xops[0]), UNSPEC_GOTPCREL);
          tmp = gen_rtx_CONST (Pmode, tmp);
          tmp = gen_rtx_MEM (QImode, tmp);
          xops[0] = tmp;


I am rebuilding firefox with this patch and will report back if firefox works.

Cheers,
Sean




Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?1087521851.32817.27.camel>