Dodji Seketeli wrote:

> libcpp/ChangeLog
> 2011-10-15  Tom Tromey  <tro...@redhat.com>
>           Dodji Seketeli  <do...@redhat.com>
> 
>       (cpp_get_token_1): New static function. Split and extended from
>       cpp_get_token.  Use reached_end_of_context and
>       consume_next_token_from_context.  Unify its return point.  Move
>       the location tweaking from cpp_get_token_with_location in here.
>       (cpp_get_token): Use cpp_get_token_1

Since this set of patches went in, I'm seeing weird errors when building
newlib for SPU:

/home/kwerner/dailybuild/spu-tc-2011-10-18/newlib-head/src/newlib/libm/machine/spu/headers/recipd2.h:
 In function '_recipd2':
/home/kwerner/dailybuild/spu-tc-2011-10-18/newlib-head/src/newlib/libm/machine/spu/headers/recipd2.h:129:3:
 note: use -flax-vector-conversions to permit conversions between vectors with 
differing element types or numbers of subparts
/home/kwerner/dailybuild/spu-tc-2011-10-18/newlib-head/src/newlib/libm/machine/spu/headers/recipd2.h:129:13:
 error: incompatible types when assigning to type '__vector(4) int' from type 
'__vector(4) unsigned int'
/home/kwerner/dailybuild/spu-tc-2011-10-18/newlib-head/src/newlib/libm/machine/spu/headers/recipd2.h:131:10:
 error: incompatible types when assigning to type '__vector(4) int' from type 
'__vector(4) unsigned int'
/home/kwerner/dailybuild/spu-tc-2011-10-18/newlib-head/src/newlib/libm/machine/spu/headers/recipd2.h:132:10:
 error: incompatible types when assigning to type '__vector(4) int' from type 
'__vector(4) unsigned int'

The code in question looks like:

  vec_uint4 isinf, iszero, isdenorm0;
[snip]
  isdenorm0 = spu_cmpeq(spu_shuffle((vec_uint4)exp, (vec_uint4)exp, splat_hi), 
0);

  isinf  = spu_cmpeq((vec_uint4)value_abs, (vec_uint4)expmask);
  iszero = spu_cmpeq((vec_uint4)value_abs, 0);

Note that isinf etc. *are* defined as *unsigned* vector types.

The problem seems to be that the preprocessor somehow stripped
off the "unsigned" keyword.  A reduced test case is:

#define isinf(__x)

#define vec_uint4 __vector unsigned int

vec_uint4 isinf;

(Using the name of a function-like macro as identifer is maybe a bit odd,
but should be perfectly legal C as far as I know ...)

Running this through "cc1 -E" on a SPU target before the patch set yields:

__attribute__((__spu_vector__)) unsigned int isinf;

as expected, but after the patch set we get:

__attribute__((__spu_vector__)) int isinf;

instead.

The problem is clearly related to the platform-specific "macro_to_expand"
routine that is used on SPU to implement the context-sensitive __vector
keyword.

With your changes to cpp_get_token (which is the sole caller of the
macro_to_expand callback), are there any changes in the interface
to the callback?  Any suggestions what could be going on here?

Note that the implementation of the callback is in
  config/spu/spu-c.c:spu_macro_to_expand


Thanks,
Ulrich

-- 
  Dr. Ulrich Weigand
  GNU Toolchain for Linux on System z and Cell BE
  ulrich.weig...@de.ibm.com

Reply via email to