#include "config.h"
#include "system.h"
+#include "coretypes.h"
+#include "tm.h"
#include "real.h"
#include "c-pretty-print.h"
+#include "c-tree.h"
/* literal */
-static void pp_c_char PARAMS ((c_pretty_print_info *, int));
-static void pp_c_character_literal PARAMS ((c_pretty_print_info *, tree));
-static void pp_c_bool_literal PARAMS ((c_pretty_print_info *, tree));
-static bool pp_c_enumerator PARAMS ((c_pretty_print_info *, tree));
-static void pp_c_integer_literal PARAMS ((c_pretty_print_info *, tree));
-static void pp_c_real_literal PARAMS ((c_pretty_print_info *, tree));
-static void pp_c_string_literal PARAMS ((c_pretty_print_info *, tree));
+static void pp_c_char PARAMS ((c_pretty_printer, int));
+static void pp_c_character_literal PARAMS ((c_pretty_printer, tree));
+static void pp_c_bool_literal PARAMS ((c_pretty_printer, tree));
+static bool pp_c_enumerator PARAMS ((c_pretty_printer, tree));
+static void pp_c_integer_literal PARAMS ((c_pretty_printer, tree));
+static void pp_c_real_literal PARAMS ((c_pretty_printer, tree));
+static void pp_c_string_literal PARAMS ((c_pretty_printer, tree));
-static void pp_c_primary_expression PARAMS ((c_pretty_print_info *, tree));
+static void pp_c_primary_expression PARAMS ((c_pretty_printer, tree));
/* postfix-expression */
-static void pp_c_initializer_list PARAMS ((c_pretty_print_info *, tree));
-
-static void pp_c_unary_expression PARAMS ((c_pretty_print_info *, tree));
-static void pp_c_multiplicative_expression PARAMS ((c_pretty_print_info *,
- tree));
-static void pp_c_additive_expression PARAMS ((c_pretty_print_info *, tree));
-static void pp_c_shift_expression PARAMS ((c_pretty_print_info *, tree));
-static void pp_c_relational_expression PARAMS ((c_pretty_print_info *, tree));
-static void pp_c_equality_expression PARAMS ((c_pretty_print_info *, tree));
-static void pp_c_and_expression PARAMS ((c_pretty_print_info *, tree));
-static void pp_c_exclusive_or_expression PARAMS ((c_pretty_print_info *,
+static void pp_c_initializer_list PARAMS ((c_pretty_printer, tree));
+
+static void pp_c_unary_expression PARAMS ((c_pretty_printer, tree));
+static void pp_c_multiplicative_expression PARAMS ((c_pretty_printer, tree));
+static void pp_c_additive_expression PARAMS ((c_pretty_printer, tree));
+static void pp_c_shift_expression PARAMS ((c_pretty_printer, tree));
+static void pp_c_relational_expression PARAMS ((c_pretty_printer, tree));
+static void pp_c_equality_expression PARAMS ((c_pretty_printer, tree));
+static void pp_c_and_expression PARAMS ((c_pretty_printer, tree));
+static void pp_c_exclusive_or_expression PARAMS ((c_pretty_printer,
tree));
-static void pp_c_inclusive_or_expression PARAMS ((c_pretty_print_info *,
+static void pp_c_inclusive_or_expression PARAMS ((c_pretty_printer,
tree));
-static void pp_c_logical_and_expression PARAMS ((c_pretty_print_info *, tree));
-static void pp_c_conditional_expression PARAMS ((c_pretty_print_info *, tree));
-static void pp_c_assignment_expression PARAMS ((c_pretty_print_info *, tree));
+static void pp_c_logical_and_expression PARAMS ((c_pretty_printer, tree));
+static void pp_c_conditional_expression PARAMS ((c_pretty_printer, tree));
+static void pp_c_assignment_expression PARAMS ((c_pretty_printer, tree));
+
+/* declarations. */
+static void pp_c_declaration_specifiers PARAMS ((c_pretty_printer, tree));
+static void pp_c_init_declarator PARAMS ((c_pretty_printer, tree));
+static void pp_c_declarator PARAMS ((c_pretty_printer, tree));
+static void pp_c_direct_declarator PARAMS ((c_pretty_printer, tree));
+static void pp_c_abstract_declarator PARAMS ((c_pretty_printer, tree));
+static void pp_c_specifier_qualifier_list PARAMS ((c_pretty_printer, tree));
+static void pp_c_simple_type_specifier PARAMS ((c_pretty_printer, tree));
+static void pp_c_parameter_declaration PARAMS ((c_pretty_printer, tree));
+static void pp_c_type_id PARAMS ((c_pretty_printer, tree));
+static void pp_c_storage_class_specifier PARAMS ((c_pretty_printer, tree));
+static void pp_c_function_specifier PARAMS ((c_pretty_printer, tree));
+
\f
/* Declarations. */
-/* Print out CV-qualifiers. Take care of possible extension. */
+/* Print out CV-qualifiers. Take care of possible extensions. */
void
pp_c_cv_qualifier (ppi, cv)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
int cv;
{
if (cv & TYPE_QUAL_CONST)
pp_c_identifier (ppi, flag_isoc99 ? "restrict" : "__restrict__");
}
+static void
+pp_c_simple_type_specifier (ppi, t)
+ c_pretty_printer ppi;
+ tree t;
+{
+ const enum tree_code code = TREE_CODE (t);
+ switch (code)
+ {
+ case ERROR_MARK:
+ pp_c_identifier (ppi, "<type-error>");
+ break;
+
+#if 0
+ case UNKNOWN_TYPE:
+ pp_c_identifier (ppi, "<unkown-type>");
+ break;
+#endif
+
+ case IDENTIFIER_NODE:
+ pp_c_tree_identifier (ppi, t);
+ break;
+
+ case VOID_TYPE:
+ case BOOLEAN_TYPE:
+ case CHAR_TYPE:
+ case INTEGER_TYPE:
+ case REAL_TYPE:
+ pp_c_tree_identifier (ppi, DECL_NAME (t));
+ break;
+
+ case COMPLEX_TYPE:
+ case VECTOR_TYPE:
+ pp_c_simple_type_specifier (ppi, TYPE_MAIN_VARIANT (TREE_TYPE (t)));
+ if (code == COMPLEX_TYPE)
+ pp_c_identifier (ppi, flag_isoc99 ? "_Complex" : "__complex__");
+ else if (code == VECTOR_TYPE)
+ pp_c_identifier (ppi, "__vector__");
+ break;
+
+ case TYPE_DECL:
+ if (DECL_NAME (t))
+ pp_c_tree_identifier (ppi, DECL_NAME (t));
+ else
+ pp_c_identifier (ppi, "<typedef-error>");
+ break;
+
+ case UNION_TYPE:
+ case RECORD_TYPE:
+ case ENUMERAL_TYPE:
+ if (code == UNION_TYPE)
+ pp_c_identifier (ppi, "union");
+ else if (code == RECORD_TYPE)
+ pp_c_identifier (ppi, "struct");
+ else if (code == ENUMERAL_TYPE)
+ pp_c_identifier (ppi, "enum");
+ else
+ pp_c_identifier (ppi, "<tag-error>");
+
+ if (TYPE_NAME (t))
+ pp_c_tree_identifier (ppi, TYPE_NAME (t));
+ else
+ pp_c_identifier (ppi, "<anonymous>");
+ break;
+
+ default:
+ pp_unsupported_tree (ppi, t);
+ }
+}
+
+static inline void
+pp_c_specifier_qualifier_list (ppi, t)
+ c_pretty_printer ppi;
+ tree t;
+{
+ pp_c_simple_type_specifier (ppi, TYPE_MAIN_VARIANT (TREE_TYPE (t)));
+ pp_c_cv_qualifier (ppi, TYPE_QUALS (t));
+}
+
+static void
+pp_c_abstract_declarator (ppi, t)
+ c_pretty_printer ppi;
+ tree t;
+{
+ pp_unsupported_tree (ppi, t);
+}
+
+
+static inline void
+pp_c_type_id (ppi, t)
+ c_pretty_printer ppi;
+ tree t;
+{
+ pp_c_specifier_qualifier_list (ppi, t);
+ pp_c_abstract_declarator (ppi, t);
+}
+
+static inline void
+pp_c_storage_class_specifier (pp, t)
+ c_pretty_printer pp;
+ tree t;
+{
+ if (TREE_CODE (t) == TYPE_DECL)
+ pp_c_identifier (pp, "typedef");
+ else if (DECL_REGISTER (t))
+ pp_c_identifier (pp, "register");
+}
+
+static inline void
+pp_c_function_specifier (pp, t)
+ c_pretty_printer pp;
+ tree t;
+{
+ if (TREE_CODE (t) == FUNCTION_DECL && DECL_DECLARED_INLINE_P (t))
+ pp_c_identifier (pp, "inline");
+}
+
+static inline void
+pp_c_declaration_specifiers (pp, t)
+ c_pretty_printer pp;
+ tree t;
+{
+ pp_c_storage_class_specifier (pp, t);
+ pp_c_function_specifier (pp, t);
+ pp_type_specifier (pp, TYPE_MAIN_VARIANT (TREE_TYPE (t)));
+ pp_c_cv_qualifier (pp, TYPE_QUALS (TREE_TYPE (t)));
+}
+
+static inline void
+pp_c_direct_declarator (pp, t)
+ c_pretty_printer pp;
+ tree t;
+{
+ pp_unsupported_tree (pp, t);
+}
+
+static inline void
+pp_c_declarator (pp, t)
+ c_pretty_printer pp;
+ tree t;
+{
+ pp_unsupported_tree (pp, t);
+}
+
+static inline void
+pp_c_init_declarator (pp, t)
+ c_pretty_printer pp;
+ tree t;
+{
+ pp_declarator (pp, t);
+ if (DECL_INITIAL (t))
+ {
+ pp_whitespace (pp);
+ pp_equal (pp);
+ pp_whitespace (pp);
+ pp_c_initializer (pp, DECL_INITIAL (t));
+ }
+}
+
+void
+pp_c_declaration (pp, t)
+ c_pretty_printer pp;
+ tree t;
+{
+ pp_declaration_specifiers (pp, t);
+ pp_c_init_declarator (pp, t);
+}
+
+static void
+pp_c_parameter_declaration (pp, t)
+ c_pretty_printer pp;
+ tree t;
+{
+ pp_unsupported_tree (pp, t);
+}
+
+/* Pretty-print ATTRIBUTES using GNU C extension syntax. */
+void
+pp_c_attributes (pp, attributes)
+ c_pretty_printer pp;
+ tree attributes;
+{
+ if (attributes == NULL_TREE)
+ return;
+
+ pp_c_identifier (pp, "__attribute__");
+ pp_c_left_paren (pp);
+ pp_c_left_paren (pp);
+ for (; attributes != NULL_TREE; attributes = TREE_CHAIN (attributes))
+ {
+ pp_tree_identifier (pp, TREE_PURPOSE (attributes));
+ if (TREE_VALUE (attributes))
+ {
+ pp_c_left_paren (pp);
+ pp_c_expression_list (pp, TREE_VALUE (attributes));
+ pp_c_right_paren (pp);
+ }
+
+ if (TREE_CHAIN (attributes))
+ pp_separate_with (pp, ',');
+ }
+ pp_c_right_paren (pp);
+ pp_c_right_paren (pp);
+}
+
\f
/* Expressions. */
/* Print out a c-char. */
static void
pp_c_char (ppi, c)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
int c;
{
switch (c)
if (ISPRINT (c))
pp_character (ppi, c);
else
- pp_format_integer (ppi, "\\%03o", (unsigned) c);
+ pp_format_scalar (ppi, "\\%03o", (unsigned) c);
break;
}
}
/* Print out a STRING literal. */
static inline void
pp_c_string_literal (ppi, s)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
tree s;
{
const char *p = TREE_STRING_POINTER (s);
/* Print out a CHARACTER literal. */
static inline void
pp_c_character_literal (ppi, c)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
tree c;
{
pp_quote (ppi);
/* Print out a BOOLEAN literal. */
static inline void
pp_c_bool_literal (ppi, b)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
tree b;
{
if (b == boolean_false_node || integer_zerop (b))
is then printed by pp_c_integer_literal. */
static bool
pp_c_enumerator (ppi, e)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
tree e;
{
tree type = TREE_TYPE (e);
/* Print out an INTEGER constant value. */
static void
pp_c_integer_literal (ppi, i)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
tree i;
{
tree type = TREE_TYPE (i);
{
if (tree_int_cst_sgn (i) < 0)
{
- static char format[10]; /* "%x%09999x\0" */
- if (!format[0])
- sprintf (format, "%%x%%0%dx", HOST_BITS_PER_INT / 4);
-
pp_c_char (ppi, '-');
i = build_int_2 (-TREE_INT_CST_LOW (i),
~TREE_INT_CST_HIGH (i) + !TREE_INT_CST_LOW (i));
- sprintf (pp_buffer (ppi)->digit_buffer, format,
+ sprintf (pp_buffer (ppi)->digit_buffer,
+ HOST_WIDE_INT_PRINT_DOUBLE_HEX,
TREE_INT_CST_HIGH (i), TREE_INT_CST_LOW (i));
pp_identifier (ppi, pp_buffer (ppi)->digit_buffer);
}
}
-/* Print out a REAL value. */
+/* Print out a REAL value. */
static inline void
pp_c_real_literal (ppi, r)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
tree r;
{
- REAL_VALUE_TO_DECIMAL (TREE_REAL_CST (r), "%.16g",
- pp_buffer (ppi)->digit_buffer);
+ real_to_decimal (pp_buffer (ppi)->digit_buffer, &TREE_REAL_CST (r),
+ sizeof (pp_buffer (ppi)->digit_buffer), 0, 1);
pp_identifier (ppi, pp_buffer(ppi)->digit_buffer);
}
void
pp_c_literal (ppi, e)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
tree e;
{
switch (TREE_CODE (e))
/* Pretty-print a C primary-expression. */
static void
pp_c_primary_expression (ppi, e)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
tree e;
{
switch (TREE_CODE (e))
break;
default:
- /* Make sure this call won't cause any infinite loop. */
+ /* Make sure this call won't cause any infinite loop. */
pp_c_left_paren (ppi);
pp_c_expression (ppi, e);
pp_c_right_paren (ppi);
/* Print out a C initializer -- also support C compound-literals. */
void
pp_c_initializer (ppi, e)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
tree e;
{
if (TREE_CODE (e) == CONSTRUCTOR)
static void
pp_c_initializer_list (ppi, e)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
tree e;
{
tree type = TREE_TYPE (e);
void
pp_c_postfix_expression (ppi, e)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
tree e;
{
enum tree_code code = TREE_CODE (e);
pp_initializer (ppi, e);
break;
-#if 0
- case SRCLOC:
- pp_left_paren (ppi);
- pp_identifier (ppi, "__location__");
- pp_right_paren (ppi);
- pp_whitespace (ppi);
- pp_left_brace (ppi);
- pp_dot (ppi);
- pp_identifier (ppi, "file");
- pp_whitespace (ppi);
- pp_equal (ppi);
- pp_c_whitespace (ppi);
- pp_c_expression (ppi, SRCLOC_FILE (e));
- pp_separate_with (ppi, ',');
- pp_dot (ppi);
- pp_identifier (ppi, "line");
- pp_whitespace (ppi);
- pp_equal (ppi);
- pp_c_whitespace (ppi);
- pp_c_expression (ppi, SRCLOC_LINE (e));
- pp_right_brace (ppi);
- break;
-#endif
-
case VA_ARG_EXPR:
pp_c_identifier (ppi, "__builtin_va_arg");
pp_c_left_paren (ppi);
/* Print out an expression-list; E is expected to be a TREE_LIST */
void
pp_c_expression_list (ppi, e)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
tree e;
{
for (; e != NULL_TREE; e = TREE_CHAIN (e))
static void
pp_c_unary_expression (ppi, e)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
tree e;
{
enum tree_code code = TREE_CODE (e);
void
pp_c_cast_expression (ppi, e)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
tree e;
{
if (TREE_CODE (e) == CONVERT_EXPR || TREE_CODE (e) == FLOAT_EXPR)
static void
pp_c_multiplicative_expression (ppi, e)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
tree e;
{
enum tree_code code = TREE_CODE (e);
static inline void
pp_c_additive_expression (ppi, e)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
tree e;
{
enum tree_code code = TREE_CODE (e);
static inline void
pp_c_shift_expression (ppi, e)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
tree e;
{
enum tree_code code = TREE_CODE (e);
static void
pp_c_relational_expression (ppi, e)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
tree e;
{
enum tree_code code = TREE_CODE (e);
static inline void
pp_c_equality_expression (ppi, e)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
tree e;
{
enum tree_code code = TREE_CODE (e);
static inline void
pp_c_and_expression (ppi, e)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
tree e;
{
if (TREE_CODE (e) == BIT_AND_EXPR)
static inline void
pp_c_exclusive_or_expression (ppi, e)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
tree e;
{
if (TREE_CODE (e) == BIT_XOR_EXPR)
static inline void
pp_c_inclusive_or_expression (ppi, e)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
tree e;
{
if (TREE_CODE (e) == BIT_IOR_EXPR)
static inline void
pp_c_logical_and_expression (ppi, e)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
tree e;
{
if (TREE_CODE (e) == TRUTH_ANDIF_EXPR)
void
pp_c_logical_or_expression (ppi, e)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
tree e;
{
if (TREE_CODE (e) == TRUTH_ORIF_EXPR)
static void
pp_c_conditional_expression (ppi, e)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
tree e;
{
if (TREE_CODE (e) == COND_EXPR)
/* Pretty-print a C assignment-expression. */
static void
pp_c_assignment_expression (ppi, e)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
tree e;
{
if (TREE_CODE (e) == MODIFY_EXPR || TREE_CODE (e) == INIT_EXPR)
/* Pretty-print an expression. */
void
pp_c_expression (ppi, e)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
tree e;
{
switch (TREE_CODE (e))
/* Statements. */
void
pp_c_statement (ppi, stmt)
- c_pretty_print_info *ppi;
+ c_pretty_printer ppi;
tree stmt;
{
const enum tree_code code = TREE_CODE (stmt);
case GOTO_STMT:
{
tree e = code == RETURN_STMT
- ? RETURN_EXPR (stmt)
+ ? RETURN_STMT_EXPR (stmt)
: GOTO_DESTINATION (stmt);
pp_newline (ppi);
}
+\f
+/* Initialize the PRETTY-PRINTER for handling C codes. */
+void
+pp_c_pretty_printer_init (pp)
+ c_pretty_printer pp;
+{
+ pp->offset_list = 0;
+
+ pp->declaration = pp_c_declaration;
+ pp->declaration_specifiers = pp_c_declaration_specifiers;
+ pp->type_specifier = pp_c_simple_type_specifier;
+ pp->declarator = pp_c_declarator;
+ pp->direct_declarator = pp_c_direct_declarator;
+ pp->parameter_declaration = pp_c_parameter_declaration;
+ pp->type_id = pp_c_type_id;
+
+ pp->statement = pp_c_statement;
+
+ pp->primary_expression = pp_c_primary_expression;
+ pp->postfix_expression = pp_c_postfix_expression;
+ pp->unary_expression = pp_c_unary_expression;
+ pp->initializer = pp_c_initializer;
+ pp->multiplicative_expression = pp_c_multiplicative_expression;
+ pp->conditional_expression = pp_c_conditional_expression;
+ pp->assignment_expression = pp_c_assignment_expression;
+}