X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;f=ast.c;h=073ab7dda5b1e78c3a7498df699a77205bb10aca;hb=f4997f4d3a17361c4a6e7beaec96f76caecd1e51;hp=43387ff3beb642d81cebbbdc10dec1c8aa544dc5;hpb=9848d5e4bed2bcadf4ba894fbea9ca3c3411b9a2;p=cparser diff --git a/ast.c b/ast.c index 43387ff..073ab7d 100644 --- a/ast.c +++ b/ast.c @@ -14,6 +14,7 @@ struct obstack ast_obstack; static FILE *out; static int indent; +static int print_implicit_casts = 1; static void print_statement(const statement_t *statement); @@ -203,6 +204,10 @@ static void print_unary_expression(const unary_expression_t *unexpr) case EXPR_UNARY_DEREFERENCE: fputs("*", out); break; case EXPR_UNARY_TAKE_ADDRESS: fputs("&", out); break; + case EXPR_UNARY_BITFIELD_EXTRACT: + print_expression(unexpr->value); + return; + case EXPR_UNARY_POSTFIX_INCREMENT: fputs("(", out); print_expression(unexpr->value); @@ -215,14 +220,17 @@ static void print_unary_expression(const unary_expression_t *unexpr) fputs(")", out); fputs("--", out); return; + case EXPR_UNARY_CAST_IMPLICIT: + if(!print_implicit_casts) { + print_expression(unexpr->value); + return; + } + /* fallthrough */ case EXPR_UNARY_CAST: fputs("(", out); print_type(unexpr->expression.datatype); fputs(")", out); break; - case EXPR_UNARY_CAST_IMPLICIT: - print_expression(unexpr->value); - return; case EXPR_UNARY_ASSUME: fputs("__assume", out); break; @@ -270,11 +278,40 @@ static void print_sizeof_expression(const sizeof_expression_t *expression) } } +static void print_alignof_expression(const alignof_expression_t *expression) +{ + fputs("__alignof__(", out); + print_type(expression->type); + fputc(')', out); +} + static void print_builtin_symbol(const builtin_symbol_expression_t *expression) { 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); + fputc(')', out); +} + +static void print_builtin_prefetch(const builtin_prefetch_expression_t *expression) +{ + fputs("__builtin_prefetch(", out); + print_expression(expression->adr); + if (expression->rw) { + fputc(',', out); + print_expression(expression->rw); + } + if (expression->locality) { + fputc(',', out); + print_expression(expression->locality); + } + fputc(')', out); +} + static void print_conditional(const conditional_expression_t *expression) { fputs("(", out); @@ -392,9 +429,18 @@ void print_expression(const expression_t *expression) case EXPR_SIZEOF: print_sizeof_expression(&expression->sizeofe); break; + case EXPR_ALIGNOF: + print_alignof_expression(&expression->alignofe); + break; 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_BUILTIN_PREFETCH: + print_builtin_prefetch(&expression->builtin_prefetch); + break; case EXPR_CONDITIONAL: print_conditional(&expression->conditional); break; @@ -723,7 +769,7 @@ static void print_normal_declaration(const declaration_t *declaration) { print_storage_class(declaration->storage_class); if(declaration->is_inline) { - if (declaration->decl_modifiers & DM_FORCEINLINE) + if (declaration->modifiers & DM_FORCEINLINE) fputs("__forceinline ", out); else fputs("inline ", out); @@ -808,9 +854,12 @@ bool is_constant_expression(const expression_t *expression) case EXPR_FUNCTION: case EXPR_PRETTY_FUNCTION: case EXPR_OFFSETOF: + case EXPR_ALIGNOF: + case EXPR_BUILTIN_CONSTANT_P: return true; case EXPR_BUILTIN_SYMBOL: + case EXPR_BUILTIN_PREFETCH: case EXPR_CALL: case EXPR_SELECT: case EXPR_VA_START: @@ -820,6 +869,7 @@ bool is_constant_expression(const expression_t *expression) case EXPR_UNARY_POSTFIX_DECREMENT: case EXPR_UNARY_PREFIX_INCREMENT: case EXPR_UNARY_PREFIX_DECREMENT: + case EXPR_UNARY_BITFIELD_EXTRACT: case EXPR_UNARY_ASSUME: /* has VOID type */ case EXPR_BINARY_ASSIGN: case EXPR_BINARY_MUL_ASSIGN: