On Wed, 2008-11-19 at 14:54 +0100, Haavard Skinnemoen wrote:
> Mike Frysinger <[EMAIL PROTECTED]> wrote:
> > On Monday 17 November 2008 16:17:54 Graeme Russ wrote:
> > > Should I declare these functions as weak in the core i386 code and use a
> > > config #define to override or should I seperate the functions out into
> > > seperate source files and use conditional compilation?
> > 
> > i wonder if weak functions that are always satisfied and used 
> > unconditionally 
> > result in larger code, or if this is only a problem for people whose 
> > linkers 
> > lack lazy relaxation support ?
> 
> It's probably a problem with linkers that don't support --gc-sections,
> which is different from relaxation. Also, you definitely need to
> compile with -ffunction-sections, or the weak functions might end up in
> the same section as something linked unconditionally, which makes it
> impossible for the linker to remove them.

And you need to fix the relocation not to relocate NULL values, see
http://gcc.gnu.org/cgi-bin/cvsweb.cgi/gcc/gcc/config/rs6000/eabi.asm?rev=1.13&content-type=text/x-cvsweb-markup
look for __eabi_uconvert.

For fun I once tried to rewrite these functions i C, not tested though:

void __eabi_convert(unsigned long *low, unsigned long *high,
                    unsigned long addend)
{
        unsigned long len = high - low, val;
        if (!len)
                return;
        low--;
        do {
                val = *++low;
                if (!val)
                        continue;
                *low = val + addend;
        } while(--len);
}

void __eabi_uconvert(unsigned long *low, unsigned long *high,
                     unsigned long addend)
{
        unsigned long len = high - low, val, val2, *v2p;
        if (!len)
                return;
        low--;
        do {
                val = *++low;
                val += addend;
                v2p = (unsigned long *)val;
                *low = val;
                val2 = *v2p;
                val2 += addend;
                *v2p = val2;
        } while(--len);
}

void __eabi_uconvert_org(unsigned long *low, unsigned long *high,
                     unsigned long addend)
{
        unsigned long len = high - low, val, val2, *v2p;
        if (!len)
                return;
        low--;
        do {
                val = *++low;
                val += addend;
                v2p = (unsigned long *)val;
                val2 = *v2p;
                *low = val;
                val2 += addend;
                *v2p = val2;
        } while(--len);
}

_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to