[EXPR_FUNCTION] = sizeof(string_literal_expression_t),
[EXPR_PRETTY_FUNCTION] = sizeof(string_literal_expression_t),
[EXPR_BUILTIN_SYMBOL] = sizeof(builtin_symbol_expression_t),
+ [EXPR_BUILTIN_CONSTANT_P] = sizeof(builtin_constant_expression_t),
+ [EXPR_BUILTIN_PREFETCH] = sizeof(builtin_prefetch_expression_t),
[EXPR_OFFSETOF] = sizeof(offsetof_expression_t),
[EXPR_VA_START] = sizeof(va_start_expression_t),
[EXPR_VA_ARG] = sizeof(va_arg_expression_t),
return expression;
}
+static expression_t *parse_builtin_constant(void)
+{
+ eat(T___builtin_constant_p);
+
+ expression_t *expression = allocate_expression_zero(EXPR_BUILTIN_CONSTANT_P);
+
+ expect('(');
+ expression->builtin_constant.value = parse_assignment_expression();
+ expect(')');
+ expression->base.datatype = type_int;
+
+ return expression;
+}
+
+static expression_t *parse_builtin_prefetch(void)
+{
+ eat(T___builtin_prefetch);
+
+ expression_t *expression = allocate_expression_zero(EXPR_BUILTIN_PREFETCH);
+
+ expect('(');
+ expression->builtin_prefetch.adr = parse_assignment_expression();
+ if (token.type == ',') {
+ next_token();
+ expression->builtin_prefetch.rw = parse_assignment_expression();
+ }
+ if (token.type == ',') {
+ next_token();
+ expression->builtin_prefetch.locality = parse_assignment_expression();
+ }
+ expect(')');
+ expression->base.datatype = type_void;
+
+ return expression;
+}
+
static expression_t *parse_compare_builtin(void)
{
expression_t *expression;
= allocate_expression_zero(EXPR_UNARY_ASSUME);
expect('(');
- expression->unary.value = parse_expression();
+ expression->unary.value = parse_assignment_expression();
expect(')');
expression->base.datatype = type_void;
case T___builtin_islessgreater:
case T___builtin_isunordered:
return parse_compare_builtin();
+ case T___builtin_constant_p:
+ return parse_builtin_constant();
+ case T___builtin_prefetch:
+ return parse_builtin_prefetch();
case T___alignof__:
return parse_alignof();
case T_assume: