#18576: zeromq-4.0.5 fails to build on Solaris SPARC due to casting issues with
volatite integer.
-------------------------------------------------+-------------------------
       Reporter:  drkirkby                       |        Owner:
           Type:  PLEASE CHANGE                  |       Status:  new
       Priority:  major                          |    Milestone:  sage-6.8
      Component:  porting: Solaris               |   Resolution:
       Keywords:                                 |    Merged in:
        Authors:                                 |    Reviewers:
Report Upstream:  Reported upstream. No          |  Work issues:
  feedback yet.                                  |       Commit:
         Branch:                                 |     Stopgaps:
   Dependencies:                                 |
-------------------------------------------------+-------------------------
Description changed by drkirkby:

Old description:

> Using
>
>  * Sage 6.7
>  * Sun Blade 2000 with UltraSPARC CPU
>  * gcc 4.9.2
>
> I get a build failure on Solaris SPARC.
>
> {{{
>
> make[6]: Entering directory
> `/export/home/drkirkby/sage-6.7/local/var/tmp/sage/build/zeromq-4.0.5/src'
> make[6]: Leaving directory
> `/export/home/drkirkby/sage-6.7/local/var/tmp/sage/build/zeromq-4.0.5/src'
>   CXX    libzmq_la-address.lo
>   CXX    libzmq_la-clock.lo
>   CXX    libzmq_la-ctx.lo
> In file included from ctx.hpp:34:0,
>                  from ctx.cpp:30:
> atomic_counter.hpp: In member function 'zmq::atomic_counter_t::integer_t
> zmq::atomic_counter_t::add(zmq::atomic_counter_t::integer_t)':
> atomic_counter.hpp:87:71: error: invalid conversion from 'volatile
> integer_t* {aka volatile unsigned int*}' to 'uint32_t* {aka unsigned
> int*}' [-fpermissive]
>              integer_t new_value = atomic_add_32_nv (&value, increment_);
>                                                                        ^
> atomic_counter.hpp: In member function 'bool
> zmq::atomic_counter_t::sub(zmq::atomic_counter_t::integer_t)':
> atomic_counter.hpp:130:59: error: invalid conversion from 'volatile
> integer_t* {aka volatile unsigned int*}' to 'uint32_t* {aka unsigned
> int*}' [-fpermissive]
>              integer_t nv = atomic_add_32_nv (&value, delta);
>                                                            ^
> make[5]: *** [libzmq_la-ctx.lo] Error 1
> make[5]: Leaving directory
> `/export/home/drkirkby/sage-6.7/local/var/tmp/sage/build/zeromq-4.0.5/src/src'
> make[4]: *** [all] Error 2
> }}}
> It looks like there is assembly code that is assembled on x86 and ARM
> processors, but C++ is compiled on other processors. Here's the dodgy
> code, which appears to be casting a volatile unsigned 32-bit integer to a
> standard (non-volatile) unsigned 32-bit integer.No doubt adding
> -fpermissive would allow it to compile, but I don't know what the authors
> intended here.
>
> I have reported this upstream to Martin Sustrik, and offer him access to
> the SPARC if he wants, although I suspect he will see the problem and can
> suggest a fix.
>
> {{{
>
>        //  Atomic addition. Returns the old value.
>
>   inline integer_t add (integer_t increment_){
>     integer_t old_value;
>
> #if defined ZMQ_ATOMIC_COUNTER_WINDOWS
>
>   old_value = InterlockedExchangeAdd ((LONG*) &value, increment_);
>
> #elif defined ZMQ_ATOMIC_COUNTER_ATOMIC_H
>
>   integer_t new_value = atomic_add_32_nv (&value, increment_); // BREAKS
> ON SOLARIS
>   old_value = new_value - increment_;
>
> #elif defined ZMQ_ATOMIC_COUNTER_TILE
>
>   old_value = arch_atomic_add (&value, increment_);
>
> #elif defined ZMQ_ATOMIC_COUNTER_X86
>
>   __asm__ volatile (
>     "lock; xadd %0, %1 \n\t": "=r" (old_value), "=m" (value): "0"
> (increment_), "m" (value): "cc", "memory");
>
> #elif defined ZMQ_ATOMIC_COUNTER_ARM
>
>   integer_t flag, tmp;__asm__ volatile (
>     "       dmb     sy\n\t"
> }}}

New description:

 Using

  * Sage 6.7
  * Sun Blade 2000 with a 1200 MHz UltraSPARC III+ CPU
  * gcc 4.9.2

 I get a build failure on Solaris SPARC when building zeromq 4.0.5.

 {{{

 make[6]: Entering directory
 `/export/home/drkirkby/sage-6.7/local/var/tmp/sage/build/zeromq-4.0.5/src'
 make[6]: Leaving directory
 `/export/home/drkirkby/sage-6.7/local/var/tmp/sage/build/zeromq-4.0.5/src'
   CXX    libzmq_la-address.lo
   CXX    libzmq_la-clock.lo
   CXX    libzmq_la-ctx.lo
 In file included from ctx.hpp:34:0,
                  from ctx.cpp:30:
 atomic_counter.hpp: In member function 'zmq::atomic_counter_t::integer_t
 zmq::atomic_counter_t::add(zmq::atomic_counter_t::integer_t)':
 atomic_counter.hpp:87:71: error: invalid conversion from 'volatile
 integer_t* {aka volatile unsigned int*}' to 'uint32_t* {aka unsigned
 int*}' [-fpermissive]
              integer_t new_value = atomic_add_32_nv (&value, increment_);
                                                                        ^
 atomic_counter.hpp: In member function 'bool
 zmq::atomic_counter_t::sub(zmq::atomic_counter_t::integer_t)':
 atomic_counter.hpp:130:59: error: invalid conversion from 'volatile
 integer_t* {aka volatile unsigned int*}' to 'uint32_t* {aka unsigned
 int*}' [-fpermissive]
              integer_t nv = atomic_add_32_nv (&value, delta);
                                                            ^
 make[5]: *** [libzmq_la-ctx.lo] Error 1
 make[5]: Leaving directory
 `/export/home/drkirkby/sage-6.7/local/var/tmp/sage/build/zeromq-4.0.5/src/src'
 make[4]: *** [all] Error 2
 }}}

 The following code, which is line 87 in atomic_counter.hpp

 {{{
 integer_t new_value = atomic_add_32_nv (&value, increment_);
 }}}

 fails to compile on the SPARC processor with gcc 4.9.2. A larger section
 of the code (lines 79 to 100), showing the problem is below.

 {{{

        //  Atomic addition. Returns the old value.

   inline integer_t add (integer_t increment_){
     integer_t old_value;

 #if defined ZMQ_ATOMIC_COUNTER_WINDOWS

   old_value = InterlockedExchangeAdd ((LONG*) &value, increment_);

 #elif defined ZMQ_ATOMIC_COUNTER_ATOMIC_H

   integer_t new_value = atomic_add_32_nv (&value, increment_); // BREAKS
 ON SOLARIS
   old_value = new_value - increment_;

 #elif defined ZMQ_ATOMIC_COUNTER_TILE

   old_value = arch_atomic_add (&value, increment_);

 #elif defined ZMQ_ATOMIC_COUNTER_X86

   __asm__ volatile (
     "lock; xadd %0, %1 \n\t": "=r" (old_value), "=m" (value): "0"
 (increment_), "m" (value): "cc", "memory");

 #elif defined ZMQ_ATOMIC_COUNTER_ARM

   integer_t flag, tmp;__asm__ volatile (
     "       dmb     sy\n\t"
 }}}

 I am not a C++ programmer, but it looks like there is assembly code that
 is assembled on x86 and ARM processors, but that C++ line is compiled only
 on other processors, which might explain why this error has not been
 noticed before. Perhaps it was tested, but on an older gcc which did not
 indicate any error.

 I '''think''' the problem is that "value" is declared on line 176 as
 volatile

 {{{
         volatile integer_t value;
 }}}

 but the definition for the function atomic_add_32_nv() on Solaris 10 in
 the file /usr/include/atomic.h header file on Solaris 10 has this line for
 the prototype of .

 {{{
 extern uint32_t atomic_add_32_nv(uint32_t *target, int32_t delta);
 }}}

 which does not include "volatile". (As I say, I am not a C++ programmer,
 but I'm slightly confused that "value" appears to be defined later in the
 code than where the error is occurring, but this might be a C++ feature I
 am not familiar with.)

 I have reported this upstream to Martin Sustrik, who asked me to report it
 to zeromq-dev list, so I had to join that

 http://zeromq.org/docs:mailing-lists

 then I reported to [email protected].

--

--
Ticket URL: <http://trac.sagemath.org/ticket/18576#comment:3>
Sage <http://www.sagemath.org>
Sage: Creating a Viable Open Source Alternative to Magma, Maple, Mathematica, 
and MATLAB

-- 
You received this message because you are subscribed to the Google Groups 
"sage-trac" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
To post to this group, send email to [email protected].
Visit this group at http://groups.google.com/group/sage-trac.
For more options, visit https://groups.google.com/d/optout.

Reply via email to