X-Git-Url: http://nsz.repo.hu/git/?a=blobdiff_plain;ds=sidebyside;f=ast.c;h=d08da8cf232aac0b56781599116e136f85583515;hb=373937ba4ad87e9fa55dbf89644182050ed1b75a;hp=3f258cb921cd5865cf902c156d04faeac42105ee;hpb=7f17b1a31bb62120fe91d1f192eae2fe6ae01f24;p=cparser diff --git a/ast.c b/ast.c index 3f258cb..d08da8c 100644 --- a/ast.c +++ b/ast.c @@ -1005,18 +1005,17 @@ static void print_for_statement(const for_statement_t *statement) * * @param arguments the arguments */ -static void print_asm_arguments(asm_argument_t *arguments) +static void print_asm_arguments(asm_argument_t const *const arguments) { - separator_t sep = { "", ", " }; - asm_argument_t *argument = arguments; - for (; argument != NULL; argument = argument->next) { + print_string(" :"); + separator_t sep = { " ", ", " }; + for (asm_argument_t const *i = arguments; i; i = i->next) { print_string(sep_next(&sep)); - if (argument->symbol) { - print_format("[%s] ", argument->symbol->string); - } - print_quoted_string(&argument->constraints, '"'); + if (i->symbol) + print_format("[%s] ", i->symbol->string); + print_quoted_string(&i->constraints, '"'); print_string(" ("); - print_expression(argument->expression); + print_expression(i->expression); print_char(')'); } } @@ -1026,48 +1025,50 @@ static void print_asm_arguments(asm_argument_t *arguments) * * @param clobbers the clobbers */ -static void print_asm_clobbers(asm_clobber_t *clobbers) +static void print_asm_clobbers(asm_clobber_t const *const clobbers) +{ + print_string(" :"); + separator_t sep = { " ", ", " }; + for (asm_clobber_t const *i = clobbers; i; i = i->next) { + print_string(sep_next(&sep)); + print_quoted_string(&i->clobber, '"'); + } +} + +static void print_asm_labels(asm_label_t const *const labels) { - separator_t sep = { "", ", " }; - asm_clobber_t *clobber = clobbers; - for (; clobber != NULL; clobber = clobber->next) { + print_string(" :"); + separator_t sep = { " ", ", " }; + for (asm_label_t const *i = labels; i; i = i->next) { print_string(sep_next(&sep)); - print_quoted_string(&clobber->clobber, '"'); + print_string(i->label->base.symbol->string); } } /** * Print an assembler statement. * - * @param statement the statement + * @param stmt the statement */ -static void print_asm_statement(const asm_statement_t *statement) +static void print_asm_statement(asm_statement_t const *const stmt) { - print_string("asm "); - if (statement->is_volatile) { - print_string("volatile "); - } + print_string("asm"); + if (stmt->is_volatile) print_string(" volatile"); + if (stmt->labels) print_string(" goto"); print_char('('); - print_quoted_string(&statement->asm_text, '"'); - if (statement->outputs == NULL && - statement->inputs == NULL && - statement->clobbers == NULL) - goto end_of_print_asm_statement; - - print_string(" : "); - print_asm_arguments(statement->outputs); - if (statement->inputs == NULL && statement->clobbers == NULL) - goto end_of_print_asm_statement; - - print_string(" : "); - print_asm_arguments(statement->inputs); - if (statement->clobbers == NULL) - goto end_of_print_asm_statement; - - print_string(" : "); - print_asm_clobbers(statement->clobbers); - -end_of_print_asm_statement: + print_quoted_string(&stmt->asm_text, '"'); + + unsigned const n = + stmt->labels ? 4 : + stmt->clobbers ? 3 : + stmt->inputs ? 2 : + stmt->outputs ? 1 : + 0; + if (n >= 1) print_asm_arguments(stmt->outputs); + if (n >= 2) print_asm_arguments(stmt->inputs); + if (n >= 3) print_asm_clobbers( stmt->clobbers); + if (n >= 4) print_asm_labels( stmt->labels); + print_string(");"); } @@ -1497,6 +1498,14 @@ static expression_classification_t is_object_with_linker_constant_address( case EXPR_UNARY_DEREFERENCE: return is_linker_constant(expression->unary.value); + case EXPR_COMPOUND_LITERAL: { + const compound_literal_expression_t *literal + = &expression->compound_literal; + return literal->global_scope || + ((literal->type->base.qualifiers & TYPE_QUALIFIER_CONST) + && is_constant_initializer(literal->initializer)); + } + case EXPR_SELECT: { type_t *base_type = skip_typeref(expression->select.compound->base.type); if (is_type_pointer(base_type)) {