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:

         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@uclibc.org
http://busybox.net/cgi-bin/mailman/listinfo/uclibc

Reply via email to