Dodji Seketeli wrote:
> libcpp/ChangeLog
> 2011-10-15 Tom Tromey
> Dodji Seketeli
>
> (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