static cpp_hashnode * spu_macro_to_expand (cpp_reader *pfile, const cpp_token *tok) { cpp_hashnode *expand_this = tok->val.node.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; }
static cpp_hashnode * s390_macro_to_expand (cpp_reader *pfile, const cpp_token *tok) { cpp_hashnode *expand_this = tok->val.node.node; cpp_hashnode *ident; static bool expand_bool_p = false; int idx = 0; enum rid rid_code; /* The vector keyword is only expanded if the machine actually provides hardware support. */ if (!TARGET_ZVECTOR) return NULL; ident = s390_categorize_keyword (tok); /* Triggered when we picked a different variant in s390_categorize_keyword. */ if (ident != expand_this) expand_this = NULL; /* The vector keyword has been found already and we remembered to expand the next bool. */ if (expand_bool_p && ident == C_CPP_HASHNODE (__bool_keyword)) { expand_bool_p = false; return ident; } if (ident != C_CPP_HASHNODE (__vector_keyword)) return expand_this; do tok = cpp_peek_token (pfile, idx++); while (tok->type == CPP_PADDING); ident = s390_categorize_keyword (tok); if (!ident) return expand_this; /* vector bool - remember to expand the next bool. */ if (ident == C_CPP_HASHNODE (__bool_keyword)) { expand_bool_p = true; return C_CPP_HASHNODE (__vector_keyword); } /* The boost libraries have code with Iterator::vector vector in it. If we allow the normal handling, this module will be called recursively, and the vector will be skipped.; */ if (ident == C_CPP_HASHNODE (__vector_keyword)) return expand_this; rid_code = (enum rid)(ident->rid_code); if (ident->type == NT_MACRO) { /* Now actually fetch the tokens we "peeked" before and do a lookahead for the next. */ do (void) cpp_get_token (pfile); while (--idx > 0); do tok = cpp_peek_token (pfile, idx++); while (tok->type == CPP_PADDING); ident = s390_categorize_keyword (tok); if (ident == C_CPP_HASHNODE (__bool_keyword)) { expand_bool_p = true; return C_CPP_HASHNODE (__vector_keyword); } else if (ident) rid_code = (enum rid)(ident->rid_code); } /* vector keyword followed by type identifier: vector unsigned, vector long, ... Types consisting of more than one identifier are not supported by zvector e.g. long long, long double, unsigned long int. */ 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_DOUBLE) { expand_this = C_CPP_HASHNODE (__vector_keyword); /* If the next keyword is bool, it will need to be expanded as well. */ do tok = cpp_peek_token (pfile, idx++); while (tok->type == CPP_PADDING); ident = s390_categorize_keyword (tok); /* __vector long __bool a; */ if (ident == C_CPP_HASHNODE (__bool_keyword)) expand_bool_p = true; else { /* Triggered with: __vector long long __bool a; */ do tok = cpp_peek_token (pfile, idx++); while (tok->type == CPP_PADDING); ident = s390_categorize_keyword (tok); if (ident == C_CPP_HASHNODE (__bool_keyword)) expand_bool_p = true; } } return expand_this; }