Re[6]: [Gc] Missed AO_compare_and_swap_full on Solaris 10 SPARC building
Ivan Maidanski
ivmai at mail.ru
Thu Sep 15 12:17:58 PDT 2011
Hi,
1. AO_test_and_set_full is defined in src\atomic_ops\sysdeps\sunc\sparc.S which should be included by atomic_ops_sysdeps.S which compiled and put to libatomic_ops.la (check whether the function is there).
2. As you said AO_compare_and_swap_emulation is present atomic_ops.o, so please try to find out why this symbol is not seen when that test is linked.
PS. Solaris/Sparc target looks to be not well tested nowadays, so with your help we could fix a bug in the scripts regarding this target (although I'm still not sure that this is a bug of libatomic_ops itself).
Regards.
15 09 2011, 22:57 "Claudio A. Costagliola Fiedler" <claudio.costagliola at gmail.com>:
>
>
>
> Ivan,
>
> I repeated the configuration process defining AO_REQUIRE_CAS in the test, as you told me. The results were the same. I think this is rather a problem with libatomic_ops building as the AO_compare_and_swap_full symbol is not build at all. You can see evidence in this conversation thread. The client of the library (in this case erlang) may or may not define AO_REQUIRE_CAS, but when it links with the library to find the implementation of AO_compare_and_swap_full it doesn't find it.
>
> Here is the test:
> configure:10588: checking for a usable libatomic_ops implementation
> configure:10630: cc -o conftest -m32 -g -I/desarrollo/proyectos/ps2mix09003/claudio/build/erlangR14B03/otp_src_R14B03/erts/sparc
> -sun-solaris2.10 -D_LARGEFILE_SOURCE -D_FILE_OFFSET_BITS=64 -DAO_REQUIRE_CAS -D_THREAD_SAFE -D_REENTRANT -DPOSIX_THREADS -D_P
> OSIX_PTHREAD_SEMANTICS -I/desarrollo/proyectos/ps2mix09003/claudio/build/erlangR14B03/LIBATOMIC/include -m32 conftest.c -ldl -
> lm -lpthread -lkstat >&5
> Undefined first referenced
> symbol in file
> AO_compare_and_swap_emulation conftest.o
> AO_compare_double_and_swap_double_emulation conftest.o
> AO_store_full_emulation conftest.o
> AO_test_and_set_full conftest.o
> ld: fatal: Symbol referencing errors. No output written to conftest
> configure:10636: $? = 1
> configure: failed program was:
> | /* confdefs.h. */
> |
> | #define PACKAGE_NAME ""
> | #define PACKAGE_TARNAME ""
> | #define PACKAGE_VERSION ""
> | #define PACKAGE_STRING ""
> | #define PACKAGE_BUGREPORT ""
> | #define STDC_HEADERS 1
> | #define HAVE_SYS_TYPES_H 1
> | #define HAVE_SYS_STAT_H 1
> | #define HAVE_STDLIB_H 1
> | #define HAVE_STRING_H 1
> | #define HAVE_MEMORY_H 1
> | #define HAVE_STRINGS_H 1
> | #define HAVE_INTTYPES_H 1
> | #define HAVE_STDINT_H 1
> | #define HAVE_UNISTD_H 1
> | #define SIZEOF_VOID_P 4
> | #define HAVE_LIBM 1
> | #define HAVE_LIBDL 1
> | #define HAVE_PTHREAD_H 1
> | #define HAVE_KSTAT 1
> | #define ETHR_PTHREADS 1
> | #define ETHR_HAVE_PTHREAD_H 1
> | #define ETHR_HAVE_SCHED_H 1
> | #define ETHR_HAVE_SYS_TIME_H 1
> | #define ETHR_TIME_WITH_SYS_TIME 1
> | #define ETHR_HAVE_PTHREAD_SPIN_LOCK 1
> | #define ETHR_HAVE_SCHED_YIELD 1
> | #define ETHR_SCHED_YIELD_RET_INT 1
> | #define ETHR_HAVE_PTHREAD_ATTR_SETGUARDSIZE 1
> | /* end confdefs.h. */
> | #include "atomic_ops.h"
> | int
> | main ()
> | {
> |
> | volatile AO_t x;
> | AO_t y;
> | int z;
> |
> | AO_nop_full();
> | AO_store(&x, (AO_t) 0);
> | z = AO_load(&x);
> | z = AO_compare_and_swap_full(&x, (AO_t) 0, (AO_t) 1);
> |
> | ;
> | return 0;
> | }
> configure:10660: result: no
> configure:11125: error: No usable libatomic_ops implementation found
>
> Regards,
> Claudio
>
>
> On Thu, Sep 15, 2011 at 11:54 AM, Ivan Maidanski <ivmai at mail.ru> wrote:
> Hi Claudio,
>
> By the contract, if the client uses CAS operation (AO_compare_and_swap_...) then it should define AO_REQUIRE_CAS before including atomic_ops.h (see README).
>
> So, it's a bug of erlang. (erlang script should add #define AO_REQUIRE_CAS to that test).
>
> Regards.
>
> 15 09 2011, 19:42 "Claudio A. Costagliola Fiedler" <claudio.costagliola at gmail.com>:
> > Ivan,
> >
>
> > The failed test made by configure script of erlang is:
> > configure:10588: checking for a usable libatomic_ops implementation
> > configure:10630: cc -o conftest -m32 -g
> > -I<path>/otp_src_R14B03/erts/sparc-sun-solaris2.10 -D_LARGEFILE_SOURCE
> > -D_FILE_OFFSET_BITS=64 -D_THREAD_SAFE -D_REENTRANT -DPOSIX_THREADS
> > -D_POSIX_PTHREAD_SEMANTICS -I<path>/include -m32 conftest.c -ldl -lm
> > -lpthread -lkstat >&5
> > "conftest.c", line 45: warning: implicit function declaration:
>
> > AO_compare_and_swap_full
>
> > Undefined first referenced
> > symbol in file
> > AO_compare_and_swap_full conftest.o
>
>
>
> > AO_test_and_set_full conftest.o
> > ld: fatal: Symbol referencing errors. No output written to conftest
> > configure:10636: $? = 1
> > configure: failed program was:
> > | /* confdefs.h. */
> > |
> > | #define PACKAGE_NAME ""
> > | #define PACKAGE_TARNAME ""
> > | #define PACKAGE_VERSION ""
> > | #define PACKAGE_STRING ""
> > | #define PACKAGE_BUGREPORT ""
> > | #define STDC_HEADERS 1
> > | #define HAVE_SYS_TYPES_H 1
> > | #define HAVE_SYS_STAT_H 1
> > | #define HAVE_STDLIB_H 1
> > | #define HAVE_STRING_H 1
> > | #define HAVE_MEMORY_H 1
> > | #define HAVE_STRINGS_H 1
> > | #define HAVE_INTTYPES_H 1
> > | #define HAVE_STDINT_H 1
> > | #define HAVE_UNISTD_H 1
> > | #define SIZEOF_VOID_P 4
> > | #define HAVE_LIBM 1
> > | #define HAVE_LIBDL 1
> > | #define HAVE_PTHREAD_H 1
> > | #define HAVE_KSTAT 1
> > | #define ETHR_PTHREADS 1
> > | #define ETHR_HAVE_PTHREAD_H 1
> > | #define ETHR_HAVE_SCHED_H 1
> > | #define ETHR_HAVE_SYS_TIME_H 1
> > | #define ETHR_TIME_WITH_SYS_TIME 1
> > | #define ETHR_HAVE_PTHREAD_SPIN_LOCK 1
> > | #define ETHR_HAVE_SCHED_YIELD 1
> > | #define ETHR_SCHED_YIELD_RET_INT 1
> > | #define ETHR_HAVE_PTHREAD_ATTR_SETGUARDSIZE 1
> > | /* end confdefs.h. */
> > | #include "atomic_ops.h"
> > | int
> > | main ()
> > | {
> > |
> > | volatile AO_t x;
> > | AO_t y;
> > | int z;
> > |
> > | AO_nop_full();
> > | AO_store(&x, (AO_t) 0);
> > | z = AO_load(&x);
> > | z = AO_compare_and_swap_full(&x, (AO_t) 0, (AO_t)
> > 1);
> > |
> > | ;
> > | return 0;
> > | }
> > configure:10660: result: no
> > configure:11125: error: No usable libatomic_ops implementation found
> >
>
> > On Thu, Sep 15, 2011 at 11:15 AM, Ivan Maidanski <ivmai at mail.ru> wrote:
> >
> > > Hi Claudio,
> > >
>
>
>
> > > AO_REQUIRE_CAS should defined in include/private/gc_priv.h provided
> > > PARALLEL_MARK is defined.
> > >
> > > AO_compare_and_swap() should be in use only if PARALLEL_MARK is defined in
> > > make scripts.
> > > What's the code that uses AO_compare_and_swap in your case?
> > >
> > > Regards.
> > >
> > > 15 09 2011, 19:04 "Claudio A. Costagliola Fiedler" <
> > > claudio.costagliola at gmail.com>:
> > > > Ivan,
> > > >
> > > > Thanks for your answer.
> > > >
> > > > In atomic_ops.h, at this point:
> > > > #if defined(AO_REQUIRE_CAS) && !defined(AO_HAVE_compare_and_swap) \
> > > > && !defined(AO_HAVE_compare_and_swap_full) \
> > > > && !defined(AO_HAVE_compare_and_swap_acquire)
> > > > # if defined(AO_CAN_EMUL_CAS)
> > > > # include "atomic_ops/sysdeps/emul_cas.h"
> > > > # else
> > > > # error Cannot implement AO_compare_and_swap_full on this architecture.
> > > > # endif
> > > > #endif /* AO_REQUIRE_CAS && !AO_HAVE_compare_and_swap ... */
> > > >
> > > > None of these macros are defined: AO_REQUIRE_CAS,
> > > AO_HAVE_compare_and_swap,
> > > > AO_HAVE_compare_and_swap_full, AO_HAVE_compare_and_swap_acquire. So the
> > > > whole outter #if is not compiled.
> > > >
> > > > The file atomic_ops.c is compiled and it does have
> > > > AO_compare_and_swap_emulation:
> > > > bash-3.00$ pwd
> > > > <path>/gc-7.2alpha6/libatomic_ops
> > > > bash-3.00$ find . -name "atomic_ops.o" -print
> > > > ./src/atomic_ops.o
> > > > bash-3.00$ nm src/atomic_ops.o | grep AO_compare_and_swap_emulation
> > > > [51] | 1660| 200|FUNC |GLOB |0 |2
>
> > > > |AO_compare_and_swap_emulation
> > > >
>
> > > > Regards,
> > > > Claudio
> > > >
> > > > On Thu, Sep 15, 2011 at 2:19 AM, Ivan Maidanski <ivmai at mail.ru> wrote:
> > > >
>
>
>
> > > > > Hi Claudio,
> > > > >
> > > > > Seems that the scripts need some fixing:
> > > > >
> > > > > 1. Check that emul_cas.h is included from atomic_ops.h (it should
> > > redirect
> > > > > AO_compare_and_swap_full to AO_compare_and_swap_emulation.
> > > > > 2. Check that atomic_ops.c (which has AO_compare_and_swap_emulation) is
> > > > > compiled.
> > > > >
> > > > > Regards.
> > > > >
> > > > > 15 09 2011, 02:30 Claudio Costagliola <claudio.costagliola at gmail.com>:
> > > > > > I'm trying to build libatomic_ops version 7.2alpha6 on a Solaris 10
> > > > > SPARC. The
> > > > > > configuration and building process seems successful, but the
> > > generated
> > > > > > libraries don't have the symbol AO_compare_and_swap_full. I need it
> > > to
> > > > > build
> > > > > > Erlang R14B03, which complains about de missing symbol.
> > > > > >
> > > > > > The command line I'm using to configure is:
> > > > > > CC=cc CXX=CC ./configure --prefix=<path>
> > > > > >
> > > > > > The missed symbols:
> > > > > > bash-3.00$ nm libatomic_ops_gpl.a | grep AO_compare_and_swap_full
> > > > > > bash-3.00$ nm libatomic_ops.a | grep AO_compare_and_swap_full
> > > > > > bash-3.00$
> > > > > >
> > > > > > Any help would be appreciated
> > > > > >
> > > > > > Regards,
> > > > > > Claudio
> > > > > >
> > > > > > _______________________________________________
> > > > > > Gc mailing list
> > > > > > Gc at linux.hpl.hp.com
> > > > > > http://www.hpl.hp.com/hosted/linux/mail-archives/gc/
> > > > > >
> > > >
>
>
>
> > > > --
> > > > Claudio A. Costagliola Fiedler
> > > >
> > > >
> >
> > --
> > Claudio A. Costagliola Fiedler
> >
> >
>
>
> --
> Claudio A. Costagliola Fiedler
>
More information about the Gc
mailing list