spu-c.c (__vector_keyword): New variable.
gcc/ * config/spu/spu-c.c (__vector_keyword): New variable. (vector_keyword): Likewise. (spu_categorize_keyword): New function. (spu_macro_to_expand): Likewise. (spu_cpu_cpp_builtins): Enable context-sensitive macros if not compiling an ISO C dialect. gcc/testsuite/ * gcc.target/spu/vector.c: New test. * gcc.target/spu/vector-ansi.c: Likewise. From-SVN: r138106
This commit is contained in:
parent
ce26ee2127
commit
e816b6b586
5 changed files with 155 additions and 0 deletions
|
@ -1,3 +1,12 @@
|
|||
2008-07-24 Ben Elliston <bje@au.ibm.com>
|
||||
|
||||
* config/spu/spu-c.c (__vector_keyword): New variable.
|
||||
(vector_keyword): Likewise.
|
||||
(spu_categorize_keyword): New function.
|
||||
(spu_macro_to_expand): Likewise.
|
||||
(spu_cpu_cpp_builtins): Enable context-sensitive macros if not
|
||||
compiling an ISO C dialect.
|
||||
|
||||
2008-07-24 Ben Elliston <bje@au.ibm.com>
|
||||
|
||||
* config/rs6000/rs6000-c.c: Move GTY(()) markers to match
|
||||
|
|
|
@ -35,6 +35,64 @@
|
|||
#include "spu-builtins.h"
|
||||
|
||||
|
||||
/* Keep the vector keywords handy for fast comparisons. */
|
||||
static GTY(()) tree __vector_keyword;
|
||||
static GTY(()) tree vector_keyword;
|
||||
|
||||
static cpp_hashnode *
|
||||
spu_categorize_keyword (const cpp_token *tok)
|
||||
{
|
||||
if (tok->type == CPP_NAME)
|
||||
{
|
||||
cpp_hashnode *ident = tok->val.node;
|
||||
|
||||
if (ident == C_CPP_HASHNODE (vector_keyword)
|
||||
|| ident == C_CPP_HASHNODE (__vector_keyword))
|
||||
return C_CPP_HASHNODE (__vector_keyword);
|
||||
else
|
||||
return ident;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* Called to decide whether a conditional macro should be expanded.
|
||||
Since we have exactly one such macro (i.e, 'vector'), we do not
|
||||
need to examine the 'tok' parameter. */
|
||||
|
||||
static cpp_hashnode *
|
||||
spu_macro_to_expand (cpp_reader *pfile, const cpp_token *tok)
|
||||
{
|
||||
cpp_hashnode *expand_this = tok->val.node;
|
||||
cpp_hashnode *ident;
|
||||
|
||||
ident = spu_categorize_keyword (tok);
|
||||
if (ident == C_CPP_HASHNODE (__vector_keyword))
|
||||
{
|
||||
tok = cpp_peek_token (pfile, 0);
|
||||
ident = spu_categorize_keyword (tok);
|
||||
|
||||
if (ident)
|
||||
{
|
||||
enum rid rid_code = (enum rid)(ident->rid_code);
|
||||
if (ident->type == NT_MACRO)
|
||||
{
|
||||
(void) cpp_get_token (pfile);
|
||||
tok = cpp_peek_token (pfile, 0);
|
||||
ident = spu_categorize_keyword (tok);
|
||||
if (ident)
|
||||
rid_code = (enum rid)(ident->rid_code);
|
||||
}
|
||||
|
||||
if (rid_code == RID_UNSIGNED || rid_code == RID_LONG
|
||||
|| rid_code == RID_SHORT || rid_code == RID_SIGNED
|
||||
|| rid_code == RID_INT || rid_code == RID_CHAR
|
||||
|| rid_code == RID_FLOAT || rid_code == RID_DOUBLE)
|
||||
expand_this = C_CPP_HASHNODE (__vector_keyword);
|
||||
}
|
||||
}
|
||||
return expand_this;
|
||||
}
|
||||
|
||||
/* target hook for resolve_overloaded_builtin(). Returns a function call
|
||||
RTX if we can resolve the overloaded builtin */
|
||||
tree
|
||||
|
@ -140,6 +198,22 @@ spu_cpu_cpp_builtins (struct cpp_reader *pfile)
|
|||
if (spu_arch == PROCESSOR_CELLEDP)
|
||||
builtin_define_std ("__SPU_EDP__");
|
||||
builtin_define_std ("__vector=__attribute__((__spu_vector__))");
|
||||
|
||||
if (!flag_iso)
|
||||
{
|
||||
/* Define this when supporting context-sensitive keywords. */
|
||||
cpp_define (pfile, "__VECTOR_KEYWORD_SUPPORTED__");
|
||||
cpp_define (pfile, "vector=vector");
|
||||
|
||||
/* Initialize vector keywords. */
|
||||
__vector_keyword = get_identifier ("__vector");
|
||||
C_CPP_HASHNODE (__vector_keyword)->flags |= NODE_CONDITIONAL;
|
||||
vector_keyword = get_identifier ("vector");
|
||||
C_CPP_HASHNODE (vector_keyword)->flags |= NODE_CONDITIONAL;
|
||||
|
||||
/* Enable context-sensitive macros. */
|
||||
cpp_get_callbacks (pfile)->macro_to_expand = spu_macro_to_expand;
|
||||
}
|
||||
}
|
||||
|
||||
void
|
||||
|
|
|
@ -1,3 +1,8 @@
|
|||
2008-07-24 Ben Elliston <bje@au.ibm.com>
|
||||
|
||||
* gcc.target/spu/vector.c: New test.
|
||||
* gcc.target/spu/vector-ansi.c: Likewise.
|
||||
|
||||
2008-07-23 Manuel Lopez-Ibanez <manu@gcc.gnu.org>
|
||||
|
||||
PR 35058
|
||||
|
|
35
gcc/testsuite/gcc.target/spu/vector-ansi.c
Normal file
35
gcc/testsuite/gcc.target/spu/vector-ansi.c
Normal file
|
@ -0,0 +1,35 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-ansi" } */
|
||||
|
||||
/* This is done by spu_internals.h, but we not include it here to keep
|
||||
down the dependencies. */
|
||||
|
||||
#ifndef __VECTOR_KEYWORD_SUPPORTED__
|
||||
#define vector __vector
|
||||
#endif
|
||||
|
||||
/* __vector is expanded unconditionally by the preprocessor. */
|
||||
__vector int vi;
|
||||
__vector unsigned char vuc;
|
||||
__vector signed char vsc;
|
||||
__vector unsigned short vus;
|
||||
__vector signed short vss;
|
||||
__vector unsigned int vui;
|
||||
__vector signed int vsi;
|
||||
__vector unsigned long long ull;
|
||||
__vector signed long long sll;
|
||||
__vector float vf;
|
||||
__vector double vd;
|
||||
|
||||
/* vector is expanded by the define above, regardless of context. */
|
||||
vector int vi;
|
||||
vector unsigned char vuc;
|
||||
vector signed char vsc;
|
||||
vector unsigned short vus;
|
||||
vector signed short vss;
|
||||
vector unsigned int vui;
|
||||
vector signed int vsi;
|
||||
vector unsigned long long ull;
|
||||
vector signed long long sll;
|
||||
vector float vf;
|
||||
vector double vd;
|
32
gcc/testsuite/gcc.target/spu/vector.c
Normal file
32
gcc/testsuite/gcc.target/spu/vector.c
Normal file
|
@ -0,0 +1,32 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "" } */
|
||||
|
||||
#ifndef __VECTOR_KEYWORD_SUPPORTED__
|
||||
#error __VECTOR_KEYWORD_SUPPORTED__ is not defined
|
||||
#endif
|
||||
|
||||
/* __vector is expanded unconditionally. */
|
||||
__vector int vi;
|
||||
__vector unsigned char vuc;
|
||||
__vector signed char vsc;
|
||||
__vector unsigned short vus;
|
||||
__vector signed short vss;
|
||||
__vector unsigned int vui;
|
||||
__vector signed int vsi;
|
||||
__vector unsigned long long ull;
|
||||
__vector signed long long sll;
|
||||
__vector float vf;
|
||||
__vector double vd;
|
||||
|
||||
/* vector is expanded conditionally, based on the context. */
|
||||
vector int vi;
|
||||
vector unsigned char vuc;
|
||||
vector signed char vsc;
|
||||
vector unsigned short vus;
|
||||
vector signed short vss;
|
||||
vector unsigned int vui;
|
||||
vector signed int vsi;
|
||||
vector unsigned long long ull;
|
||||
vector signed long long sll;
|
||||
vector float vf;
|
||||
vector double vd;
|
Loading…
Add table
Reference in a new issue