[Clfs-support] Compilation error for SPARC v9 Multilib

Berkin Ozisikyilmaz boz283 at ece.northwestern.edu
Mon Jan 21 16:15:03 PST 2008


Joe Ciccone wrote:
> boz283 wrote:
>   
>>  
>>
>> -----Original Message-----
>> *From:* clfs-support-bounces at lists.cross-lfs.org
>> [mailto:clfs-support-bounces at lists.cross-lfs.org] *On Behalf Of *boz283
>> *Sent:* Saturday, January 19, 2008 10:04 PM
>> *To:* clfs-support at lists.cross-lfs.org
>> *Subject:* [Clfs-support] Compilation error for SPARC v9 Multilib
>>
>>  
>>
>> At section 5.9 of SPARC Cross-Compiled Linux From Scratch - Version
>> SVN-20080119-Sparc64-Multilib
>>
>> http://cross-lfs.org/view/svn/sparc64/cross-tools/glibc.html
>>
>> When I say make, I get the following error. I have googled for it, and
>> I didn’t find any error. I looked at the code and deleted “1” from one
>> of the parameters. But then I got to the second error which is shown
>> under =====.
>>
>>  
>>
>>  
>>
>> /clfs/sources/glibc-build/nptl/pthread_cond_signal.o.dt -MT
>> /home/sparc/clfs/sources/glibc-build/nptl/pthread_cond_signal.o
>>
>> pthread_cond_signal.c:51:19: error: macro "lll_futex_wake_unlock"
>> passed 5 arguments, but takes just 4
>>
>> pthread_cond_signal.c: In function '__pthread_cond_signal':
>>
>> pthread_cond_signal.c:49: error: 'lll_futex_wake_unlock' undeclared
>> (first use in this function)
>>
>> pthread_cond_signal.c:49: error: (Each undeclared identifier is
>> reported only once
>>
>> pthread_cond_signal.c:49: error: for each function it appears in.)
>>
>> make[2]: ***
>> [/home/sparc/clfs/sources/glibc-build/nptl/pthread_cond_signal.o] Error 1
>>
>> make[2]: Leaving directory `/home/sparc/clfs/sources/glibc-2.7/nptl'
>>
>> make[1]: *** [nptl/subdir_lib] Error 2
>>
>> make[1]: Leaving directory `/home/sparc/clfs/sources/glibc-2.7'
>>
>> make: *** [all] Error 2
>>
>>  
>>
>> ../nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c: In function
>> '__old_sem_wait':
>>
>> ../nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c:158: error:
>> 'futex' undeclared (first use in this function)
>>
>> ../nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c:158: error:
>> (Each undeclared identifier is reported only once
>>
>> ../nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c:158: error:
>> for each function it appears in.)
>>
>> make[2]: *** [/home/sparc/clfs/sources/glibc-build/nptl/sem_wait.os]
>> Error 1
>>
>> make[2]: Leaving directory `/home/sparc/clfs/sources/glibc-2.7/nptl'
>>
>> make[1]: *** [nptl/subdir_lib] Error 2
>>
>> make[1]: Leaving directory
>>
>>  
>>
>>  
>>
>>  
>>
>> I have added this to sem_wait.c at tht ebeginning of the function
>>
>> Int *futex = (int *) sem;
>>
>> As I have seen from this website
>>
>> http://www.koders.com/c/fid292BACA000810CF10A513A9A4E400B574BA2BD1D.aspx.
>>
>>  
>>
>> Glibc finished compiling without errors.
>>
>> Am I doing something that is correct?
>>
>>
>>     
> I can confirm that it's broken, Looking into the fix that you posted.
> _______________________________________________
> Clfs-support mailing list
> Clfs-support at lists.cross-lfs.org
> http://lists.cross-lfs.org/listinfo.cgi/clfs-support-cross-lfs.org
>   

I have looked in to the code.
The lll_futex_wake_unlock is defined at
nptl/sysdeps/unix/sysv/linux/sparc/lowlevellock.h as
#ifdef __sparc32_atomic_do_lock
/* Avoid FUTEX_WAKE_OP if supporting pre-v9 CPUs.  */
# define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2) 1
#else
# define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2,
private) \


So it seems that for the 32bit sparc this function returns always 1.
However there is no ifdef statement in pthread_cond_signal.c, that
changes the number of parameters this function is called.

      if (! __builtin_expect (lll_futex_wake_unlock
(&cond->__data.__futex, 1,
                                                     1,
&cond->__data.__lock,
                                                     pshared), 0))
        return 0;
      lll_futex_wake (&cond->__data.__futex, 1, pshared);

The compiler description says that "You may use |__builtin_expect| to
provide the compiler with branch prediction information." So knowing
that when I am compiling 32bit glibc for the multilib, I think I can
change the lowlevellock.h accordingly.
So I made it
#ifdef __sparc32_atomic_do_lock
/* Avoid FUTEX_WAKE_OP if supporting pre-v9 CPUs.  */
# define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2, *private*) 1
#else
# define lll_futex_wake_unlock(futexp, nr_wake, nr_wake2, futexp2,
private) \

Then there was another problem in sem_wait.c.

../nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c: In function
'__old_sem_wait':
../nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c:158: error:
'futex' undeclared (first use in this function)
../nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c:158: error:
(Each undeclared identifier is reported only once
../nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c:158: error: for
each function it appears in.)
make[2]: *** [/home/sparc/clfs/sources/glibc-build/nptl/sem_wait.os]
Error 1
make[2]: Leaving directory `/home/sparc/clfs/sources/glibc-2.7/nptl'

make[1]: *** [nptl/subdir_lib] Error 2

make[1]: Leaving directory

I went to old versions of glibc, and i saw this patch. 
http://sourceware.org/cgi-bin/cvsweb.cgi/libc/nptl/sysdeps/unix/sysv/linux/sparc/sparc32/sem_wait.c.diff?cvsroot=glibc&r1=1.1&r2=1.2


It seems that they have replaced the variable futex with &isem->value except line 158. So I did it, and compilation finished. I was able to complete the section successfully. I will try to compile an application and check its correctness soon.


- val = atomic_decrement_if_positive (futex);
+ val = atomic_decrement_if_positive (&isem->value);

berkin



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.clfs.org/pipermail/clfs-support-clfs.org/attachments/20080121/f0b17551/attachment-0001.htm>


More information about the Clfs-support mailing list