bad compiler generated code? - firefox issues
Sean McNeil
sean at mcneil.com
Fri Jun 18 06:20:44 GMT 2004
On Thu, 2004-06-17 at 18:24, Sean McNeil wrote:
> 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.
I had to do a complete rebuild: portupgrade -fR firefox-0.9_1
Now firefox works!!!
There must have been other libraries that firefox depended on that were
built with the bad compiler.
Sean
More information about the freebsd-amd64
mailing list