fputs(expression->symbol->string, out);
}
+static void print_builtin_constant(const builtin_constant_expression_t *expression)
+{
+ fputs("__builtin_constant_p(", out);
+ print_expression(expression->value);
+ fputs(")", out);
+}
+
static void print_conditional(const conditional_expression_t *expression)
{
fputs("(", out);
case EXPR_BUILTIN_SYMBOL:
print_builtin_symbol(&expression->builtin_symbol);
break;
+ case EXPR_BUILTIN_CONSTANT_P:
+ print_builtin_constant(&expression->builtin_constant);
+ break;
case EXPR_CONDITIONAL:
print_conditional(&expression->conditional);
break;
case EXPR_PRETTY_FUNCTION:
case EXPR_OFFSETOF:
case EXPR_ALIGNOF:
+ case EXPR_BUILTIN_CONSTANT_P:
return true;
case EXPR_BUILTIN_SYMBOL:
typedef struct va_start_expression_t va_start_expression_t;
typedef struct va_arg_expression_t va_arg_expression_t;
typedef struct builtin_symbol_expression_t builtin_symbol_expression_t;
+typedef struct builtin_constant_expression_t builtin_constant_expression_t;
typedef struct classify_type_expression_t classify_type_expression_t;
typedef union expression_t expression_t;
panic("trying to get address of non-lvalue");
}
+static ir_node *builtin_constant_to_firm(const builtin_constant_expression_t *expression)
+{
+ ir_mode *mode = get_ir_mode(expression->expression.datatype);
+ long v;
+
+ if (is_constant_expression(expression->value)) {
+ v = 1;
+ } else {
+ v = 0;
+ }
+ return new_Const_long(mode, v);
+}
+
static ir_node *_expression_to_firm(const expression_t *expression)
{
switch(expression->kind) {
case EXPR_OFFSETOF:
case EXPR_BUILTIN_SYMBOL:
panic("unimplemented expression found");
+ case EXPR_BUILTIN_CONSTANT_P:
+ return builtin_constant_to_firm(&expression->builtin_constant);
case EXPR_UNKNOWN:
case EXPR_INVALID:
EXPR_FUNCTION,
EXPR_PRETTY_FUNCTION,
EXPR_BUILTIN_SYMBOL,
+ EXPR_BUILTIN_CONSTANT_P,
EXPR_OFFSETOF,
EXPR_VA_START,
EXPR_VA_ARG,
symbol_t *symbol;
};
+struct builtin_constant_expression_t {
+ expression_base_t expression;
+ expression_t *value;
+};
+
struct reference_expression_t {
expression_base_t expression;
symbol_t *symbol;
string_literal_expression_t string;
wide_string_literal_expression_t wide_string;
builtin_symbol_expression_t builtin_symbol;
+ builtin_constant_expression_t builtin_constant;
reference_expression_t reference;
call_expression_t call;
unary_expression_t unary;
[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_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_expression();
+ expect(')');
+ expression->base.datatype = type_int;
+
+ return expression;
+}
+
static expression_t *parse_compare_builtin(void)
{
expression_t *expression;
case T___builtin_islessgreater:
case T___builtin_isunordered:
return parse_compare_builtin();
+ case T___builtin_constant_p:
+ return parse_builtin_constant();
case T___alignof__:
return parse_alignof();
case T_assume:
S(_GNUC, __builtin_islessequal)
S(_GNUC, __builtin_islessgreater)
S(_GNUC, __builtin_isunordered)
+S(_GNUC, __builtin_constant_p)
S(_C99, __PRETTY_FUNCTION__)
S(_ALL, __FUNCTION__)
S(_C99, __func__)