static FILE *out;
static int indent;
+static int print_implicit_casts = 1;
static void print_statement(const statement_t *statement);
}
}
-static void print_quoted_string(const char *string)
+static void print_quoted_string(const string_t *const string)
{
fputc('"', out);
- for(const char *c = string; *c != '\0'; ++c) {
+ for (const char *c = string->begin, *const end = c + string->size; c != end; ++c) {
switch(*c) {
case '\"': fputs("\\\"", out); break;
case '\\': fputs("\\\\", out); break;
case '\?': fputs("\\?", out); break;
default:
if(!isprint(*c)) {
- fprintf(out, "\\x%x", *c);
+ fprintf(out, "\\%03o", *c);
break;
}
fputc(*c, out);
static void print_string_literal(
const string_literal_expression_t *string_literal)
{
- print_quoted_string(string_literal->value);
+ print_quoted_string(&string_literal->value);
}
static void print_wide_string_literal(
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);
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;
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);
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;
if(constraint->symbol) {
fprintf(out, "[%s] ", constraint->symbol->string);
}
- print_quoted_string(constraint->constraints);
+ print_quoted_string(&constraint->constraints);
fputs(" (", out);
print_expression(constraint->expression);
fputs(")", out);
if(clobber != clobbers)
fputs(", ", out);
- print_quoted_string(clobber->clobber);
+ print_quoted_string(&clobber->clobber);
}
}
fputs("volatile ", out);
}
fputs("(", out);
- print_quoted_string(statement->asm_text);
+ print_quoted_string(&statement->asm_text);
if(statement->inputs == NULL && statement->outputs == NULL
&& statement->clobbers == NULL)
goto end_of_print_asm_statement;
{
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);
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:
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: