[PATCH] Always inline system calls

Carmelo AMOROSO carmelo.amoroso at st.com
Tue Dec 4 07:36:31 UTC 2007


Paul Mundt wrote:
> On Mon, Dec 03, 2007 at 10:33:39PM +0100, Carmelo Amoroso wrote:
>   
>> Carmelo Amoroso wrote:
>> while doing some test for SH4 to measure size increase for 'always inline' changes,
>> doscovered suddenly that gcc-4.1.1 (cross sh4) fails with the following error:
>>
>> ../ldso/ldso/dl-elf.c: In function '_dl_dprintf':
>> ../ldso/ldso/dl-elf.c:858: error: unable to find a register to spill in class 'R0_REGS'
>> ../ldso/ldso/dl-elf.c:858: error: this is the insn:
>> (insn 916 917 24 1 (set (reg/f:SI 1 r1 [219])
>>          (mem/u/c:SI (plus:SI (reg:SI 12 r12)
>>                  (reg/f:SI 1 r1 [220])) [0 S4 A32])) 172 {movsi_ie} (nil)
>>      (expr_list:REG_DEAD (reg/f:SI 1 r1 [220])
>>          (expr_list:REG_EQUIV (symbol_ref:SI ("_dl_pagesize") <var_decl 0x313a720 _dl_pagesize>)
>>              (nil))))
>>
>> either running with -Os or -O0.
>> I'll test tomorrow with gcc-4.2.1 to see if it makes difference,
>> otherwise I suspect we should go back on my proposal in using always inline
>> only for arch strictly requiring it.
>>
>>     
> We've noticed this with some versions in buildroot also, so it seems to
> be a more common issue:
>
>   
Indeed at home I have gcc from buildroot. Tested just now at office 
using gcc-4.2.1 from STMicro toolchain
and it works fine, either using -O0 or -Os.
I'll try to update buildroot at home with gcc 4.2.1 as well and see if 
it solves.
I'll keep you informed.

Cheers,
Carmelo
> 	 CC ldso/ldso/ldso.oS
> 	  In file included from ./libpthread/linuxthreads.old/sysdeps/sh/tls.h:23,
> 	from ./include/bits/uClibc_errno.h:35,
> 	from ./include/errno.h:62,
> 	from ./include/bits/syscalls.h:16,
> 	from ./include/sys/syscall.h:34,
> 	from ./ldso/ldso/sh/dl-syscalls.h:3,
> 	from ./ldso/include/dl-syscall.h:12,
> 	from ./ldso/include/ldso.h:36,
> 	from ldso/ldso/ldso.c:33:
> 	./libpthread/linuxthreads.old/sysdeps/sh/pt-machine.h:36: warning: C99 inline functions are not supported; using GNU89
> 	./libpthread/linuxthreads.old/sysdeps/sh/pt-machine.h:36: warning: to disable this warning use -fgnu89-inline or the gnu_inline function attribute
> 	ldso/ldso/dl-elf.c: In function '_dl_dprintf':
> 	ldso/ldso/dl-elf.c:803: error: unable to find a register to spill in class 'R0_REGS'
> 	ldso/ldso/dl-elf.c:803: error: this is the insn:
> 	(insn 884 885 23 3 (set (reg/f:SI 1 r1 [221])
> 		(mem/u/c:SI (plus:SI (reg:SI 12 r12)
> 			(reg/f:SI 1 r1 [222])) [0 S4 A32])) 171 {movsi_ie} (nil)
> 		(expr_list:REG_DEAD (reg/f:SI 1 r1 [222])
> 			(expr_list:REG_EQUIV (symbol_ref:SI ("_dl_pagesize") <var_decl 0x402d7660 _dl_pagesize>)
> 				(nil))))
> 	ldso/ldso/dl-elf.c:803: confused by earlier errors, bailing out
> 	make[1]: *** [ldso/ldso/ldso.oS] Error 1
>
> So inlining itself may not really be a problem, but it might be worthwhile
> hunting down the code that generates the immediate load and seeing if that can
> be forced in to a memory access instead, so we avoid the R0 encoding dependence.
> These are all in relation to _dl_pagesize at least.
> _______________________________________________
> uClibc mailing list
> uClibc at uclibc.org
> http://busybox.net/cgi-bin/mailman/listinfo/uclibc
>
>   




More information about the uClibc mailing list