Re: [ROOT] root on PPC systems CINT problem

From: Rene Brun (Rene.Brun@cern.ch)
Date: Mon May 06 2002 - 15:53:48 MEST


Hi Jiri,

You are right. There is a problem with byte swapping and bool.
I can reproduce the same problem under HP-UX.

Masa, I assume that you will fix this problem.

Rene Brun

Jiri Masik wrote:
> 
> "Stephen J. Sanders" <ssanders@ku.edu> writes:
> 
> > Hi Jiri and Damir,
> > Thanks for the input.  It looks like this is a problem that may solve itself
> > with a little patience.  If Debian is running gcc 3.0.4 my guess is
> > the other
> > distributions won't be too far behind.  In the meantime, I can either
> > avoid the
> > use of booleans or fall back for root 3.02/07, which doesn't have this
> > problem.
> >
> > Regards,
> > Steve
> >
> 
> Hi,
> 
> unfortunately an upgrade of gcc won't solve this completely. As Damir
> mentioned there's another problem with booleans - the following
> code
> int main(void){
>   bool a;
>   a=true;   printf("%d\n",a);
>   a=false;  printf("%d\n",a);
>   a=true;   printf("%d\n",a);
> 
>   return (0);
> }
> 
> prints just 0's on my PPC. It looks like assignment to a bool
> variable works only in the declaration.
> 
> I'm trying to find out where the value of a bool is lost.
> It might be related to the lines of cint/src/var.c
> 
> #define G__GET_VAR(SIZE,CASTTYPE,CONVFUNC,TYPE,PTYPE)           \
> switch(G__var_type) {                                           \
> case 'p': /* return value */                                    \
>   if(var->paran[ig15]<=paran) {                                 \
>  /* if(var->varlabel[ig15][paran+1]==0) { */                    \
>     /* value , an integer */                                    \
>     result.ref = (G__struct_offset+var->p[ig15]+p_inc*SIZE);    \
>    CONVFUNC(&result,TYPE,(CASTTYPE)(*(CASTTYPE *)(result.ref)));\
>   }                                                             \
> 
> result.ref is a long and for a boolean variable it is called as
> G__GET_VAR(G__INTALLOC ,unsigned char ,G__letint ,'g' ,'G')
> 
> so there's a cast like (unsigned char)(*(unsigned char *)(long))
> 
> Is this cast guaranteed to work for both little and big endian
> systems? On PPC the function G__letint is called with 0 for result.ref
> being either 1 or 0 as the cast is done on the insignificant byte I
> guess.
> 
> cheers
>         Jiri



This archive was generated by hypermail 2b29 : Sat Jan 04 2003 - 23:50:52 MET