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>