static void
show_tree (tree node)
{
  if (!CAN_HAVE_RANGE_P (node))
    return;

  gcc_rich_location richloc (EXPR_LOCATION (node));
  richloc.add_expr (node);

  if (richloc.get_num_locations () < 2)
    {
      error_at (&richloc, "range not found");
      return;
    }

  enum tree_code code = TREE_CODE (node);

  location_range *range = richloc.get_range (1);
  inform (&richloc, "%s", get_tree_code_name (code));

  /* Recurse.  */
  int min_idx = 0;
  int max_idx = TREE_OPERAND_LENGTH (node);
  switch (code)
    {
    case CALL_EXPR:
      min_idx = 3;
      break;

    default:
      break;
    }

  for (int i = min_idx; i < max_idx; i++)
    show_tree (TREE_OPERAND (node, i));
}
示例#2
0
const char *
lto_tag_name (enum LTO_tags tag)
{
  if (lto_tag_is_tree_code_p (tag))
    {
      /* For tags representing tree nodes, return the name of the
	 associated tree code.  */
      return get_tree_code_name (lto_tag_to_tree_code (tag));
    }

  if (lto_tag_is_gimple_code_p (tag))
    {
      /* For tags representing gimple statements, return the name of
	 the associated gimple code.  */
      return gimple_code_name[lto_tag_to_gimple_code (tag)];
    }

  switch (tag)
    {
    case LTO_null:
      return "LTO_null";
    case LTO_bb0:
      return "LTO_bb0";
    case LTO_bb1:
      return "LTO_bb1";
    case LTO_eh_region:
      return "LTO_eh_region";
    case LTO_function:
      return "LTO_function";
    case LTO_eh_table:
      return "LTO_eh_table";
    case LTO_ert_cleanup:
      return "LTO_ert_cleanup";
    case LTO_ert_try:
      return "LTO_ert_try";
    case LTO_ert_allowed_exceptions:
      return "LTO_ert_allowed_exceptions";
    case LTO_ert_must_not_throw:
      return "LTO_ert_must_not_throw";
    case LTO_tree_pickle_reference:
      return "LTO_tree_pickle_reference";
    case LTO_field_decl_ref:
      return "LTO_field_decl_ref";
    case LTO_function_decl_ref:
      return "LTO_function_decl_ref";
    case LTO_label_decl_ref:
      return "LTO_label_decl_ref";
    case LTO_namespace_decl_ref:
      return "LTO_namespace_decl_ref";
    case LTO_result_decl_ref:
      return "LTO_result_decl_ref";
    case LTO_ssa_name_ref:
      return "LTO_ssa_name_ref";
    case LTO_type_decl_ref:
      return "LTO_type_decl_ref";
    case LTO_type_ref:
      return "LTO_type_ref";
    case LTO_global_decl_ref:
      return "LTO_global_decl_ref";
    default:
      return "LTO_UNKNOWN";
    }
}
示例#3
0
void
print_lto_report (const char *s)
{
  unsigned i;

  fprintf (stderr, "[%s] # of input files: "
	   HOST_WIDE_INT_PRINT_UNSIGNED "\n", s, lto_stats.num_input_files);

  fprintf (stderr, "[%s] # of input cgraph nodes: "
	   HOST_WIDE_INT_PRINT_UNSIGNED "\n", s,
	   lto_stats.num_input_cgraph_nodes);

  fprintf (stderr, "[%s] # of function bodies: "
	   HOST_WIDE_INT_PRINT_UNSIGNED "\n", s,
	   lto_stats.num_function_bodies);

  for (i = 0; i < NUM_TREE_CODES; i++)
    if (lto_stats.num_trees[i])
      fprintf (stderr, "[%s] # of '%s' objects read: "
	       HOST_WIDE_INT_PRINT_UNSIGNED "\n", s,
	       get_tree_code_name ((enum tree_code) i), lto_stats.num_trees[i]);

  if (flag_lto)
    {
      fprintf (stderr, "[%s] Compression: "
	       HOST_WIDE_INT_PRINT_UNSIGNED " output bytes, "
	       HOST_WIDE_INT_PRINT_UNSIGNED " compressed bytes", s,
	       lto_stats.num_output_il_bytes,
	       lto_stats.num_compressed_il_bytes);
      if (lto_stats.num_output_il_bytes > 0)
	{
	  const float dividend = (float) lto_stats.num_compressed_il_bytes;
	  const float divisor = (float) lto_stats.num_output_il_bytes;
	  fprintf (stderr, " (ratio: %f)", dividend / divisor);
	}
      fprintf (stderr, "\n");
    }

  if (flag_wpa)
    {
      fprintf (stderr, "[%s] # of output files: "
	       HOST_WIDE_INT_PRINT_UNSIGNED "\n", s,
	       lto_stats.num_output_files);

      fprintf (stderr, "[%s] # of output symtab nodes: "
	       HOST_WIDE_INT_PRINT_UNSIGNED "\n", s,
	       lto_stats.num_output_symtab_nodes);

      fprintf (stderr, "[%s] # of output tree pickle references: "
	       HOST_WIDE_INT_PRINT_UNSIGNED "\n", s,
	       lto_stats.num_pickle_refs_output);
      fprintf (stderr, "[%s] # of output tree bodies: "
	       HOST_WIDE_INT_PRINT_UNSIGNED "\n", s,
	       lto_stats.num_tree_bodies_output);

      fprintf (stderr, "[%s] # callgraph partitions: "
	       HOST_WIDE_INT_PRINT_UNSIGNED "\n", s,
	       lto_stats.num_cgraph_partitions);

      fprintf (stderr, "[%s] Compression: "
	       HOST_WIDE_INT_PRINT_UNSIGNED " input bytes, "
	       HOST_WIDE_INT_PRINT_UNSIGNED " uncompressed bytes", s,
	       lto_stats.num_input_il_bytes,
	       lto_stats.num_uncompressed_il_bytes);
      if (lto_stats.num_input_il_bytes > 0)
	{
	  const float dividend = (float) lto_stats.num_uncompressed_il_bytes;
	  const float divisor = (float) lto_stats.num_input_il_bytes;
	  fprintf (stderr, " (ratio: %f)", dividend / divisor);
	}
      fprintf (stderr, "\n");
    }

  for (i = 0; i < LTO_N_SECTION_TYPES; i++)
    fprintf (stderr, "[%s] Size of mmap'd section %s: "
	     HOST_WIDE_INT_PRINT_UNSIGNED " bytes\n", s,
	     lto_section_name[i], lto_stats.section_size[i]);
}
示例#4
0
void
print_node_brief (FILE *file, const char *prefix, const_tree node, int indent)
{
    enum tree_code_class tclass;

    if (node == 0)
        return;

    tclass = TREE_CODE_CLASS (TREE_CODE (node));

    /* Always print the slot this node is in, and its code, address and
       name if any.  */
    if (indent > 0)
        fprintf (file, " ");
    fprintf (file, "%s <%s", prefix, get_tree_code_name (TREE_CODE (node)));
    dump_addr (file, " ", node);

    if (tclass == tcc_declaration)
    {
        if (DECL_NAME (node))
            fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
        else if (TREE_CODE (node) == LABEL_DECL
                 && LABEL_DECL_UID (node) != -1)
        {
            if (dump_flags & TDF_NOUID)
                fprintf (file, " L.xxxx");
            else
                fprintf (file, " L.%d", (int) LABEL_DECL_UID (node));
        }
        else
        {
            if (dump_flags & TDF_NOUID)
                fprintf (file, " %c.xxxx",
                         TREE_CODE (node) == CONST_DECL ? 'C' : 'D');
            else
                fprintf (file, " %c.%u",
                         TREE_CODE (node) == CONST_DECL ? 'C' : 'D',
                         DECL_UID (node));
        }
    }
    else if (tclass == tcc_type)
    {
        if (TYPE_NAME (node))
        {
            if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
                fprintf (file, " %s", IDENTIFIER_POINTER (TYPE_NAME (node)));
            else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
                     && DECL_NAME (TYPE_NAME (node)))
                fprintf (file, " %s",
                         IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node))));
        }
        if (!ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
            fprintf (file, " address-space-%d", TYPE_ADDR_SPACE (node));
    }
    if (TREE_CODE (node) == IDENTIFIER_NODE)
        fprintf (file, " %s", IDENTIFIER_POINTER (node));

    /* We might as well always print the value of an integer or real.  */
    if (TREE_CODE (node) == INTEGER_CST)
    {
        if (TREE_OVERFLOW (node))
            fprintf (file, " overflow");

        fprintf (file, " ");
        print_dec (node, file, TYPE_SIGN (TREE_TYPE (node)));
    }
    if (TREE_CODE (node) == REAL_CST)
    {
        REAL_VALUE_TYPE d;

        if (TREE_OVERFLOW (node))
            fprintf (file, " overflow");

        d = TREE_REAL_CST (node);
        if (REAL_VALUE_ISINF (d))
            fprintf (file,  REAL_VALUE_NEGATIVE (d) ? " -Inf" : " Inf");
        else if (REAL_VALUE_ISNAN (d))
            fprintf (file, " Nan");
        else
        {
            char string[60];
            real_to_decimal (string, &d, sizeof (string), 0, 1);
            fprintf (file, " %s", string);
        }
    }
    if (TREE_CODE (node) == FIXED_CST)
    {
        FIXED_VALUE_TYPE f;
        char string[60];

        if (TREE_OVERFLOW (node))
            fprintf (file, " overflow");

        f = TREE_FIXED_CST (node);
        fixed_to_decimal (string, &f, sizeof (string));
        fprintf (file, " %s", string);
    }

    fprintf (file, ">");
}
示例#5
0
void
print_node (FILE *file, const char *prefix, tree node, int indent)
{
    int hash;
    struct bucket *b;
    machine_mode mode;
    enum tree_code_class tclass;
    int len;
    int i;
    expanded_location xloc;
    enum tree_code code;

    if (node == 0)
        return;

    code = TREE_CODE (node);
    tclass = TREE_CODE_CLASS (code);

    /* Don't get too deep in nesting.  If the user wants to see deeper,
       it is easy to use the address of a lowest-level node
       as an argument in another call to debug_tree.  */

    if (indent > 24)
    {
        print_node_brief (file, prefix, node, indent);
        return;
    }

    if (indent > 8 && (tclass == tcc_type || tclass == tcc_declaration))
    {
        print_node_brief (file, prefix, node, indent);
        return;
    }

    /* It is unsafe to look at any other fields of an ERROR_MARK node.  */
    if (code == ERROR_MARK)
    {
        print_node_brief (file, prefix, node, indent);
        return;
    }

    /* Allow this function to be called if the table is not there.  */
    if (table)
    {
        hash = ((uintptr_t) node) % HASH_SIZE;

        /* If node is in the table, just mention its address.  */
        for (b = table[hash]; b; b = b->next)
            if (b->node == node)
            {
                print_node_brief (file, prefix, node, indent);
                return;
            }

        /* Add this node to the table.  */
        b = XNEW (struct bucket);
        b->node = node;
        b->next = table[hash];
        table[hash] = b;
    }

    /* Indent to the specified column, since this is the long form.  */
    indent_to (file, indent);

    /* Print the slot this node is in, and its code, and address.  */
    fprintf (file, "%s <%s", prefix, get_tree_code_name (code));
    dump_addr (file, " ", node);

    /* Print the name, if any.  */
    if (tclass == tcc_declaration)
    {
        if (DECL_NAME (node))
            fprintf (file, " %s", IDENTIFIER_POINTER (DECL_NAME (node)));
        else if (code == LABEL_DECL
                 && LABEL_DECL_UID (node) != -1)
        {
            if (dump_flags & TDF_NOUID)
                fprintf (file, " L.xxxx");
            else
                fprintf (file, " L.%d", (int) LABEL_DECL_UID (node));
        }
        else
        {
            if (dump_flags & TDF_NOUID)
                fprintf (file, " %c.xxxx", code == CONST_DECL ? 'C' : 'D');
            else
                fprintf (file, " %c.%u", code == CONST_DECL ? 'C' : 'D',
                         DECL_UID (node));
        }
    }
    else if (tclass == tcc_type)
    {
        if (TYPE_NAME (node))
        {
            if (TREE_CODE (TYPE_NAME (node)) == IDENTIFIER_NODE)
                fprintf (file, " %s", IDENTIFIER_POINTER (TYPE_NAME (node)));
            else if (TREE_CODE (TYPE_NAME (node)) == TYPE_DECL
                     && DECL_NAME (TYPE_NAME (node)))
                fprintf (file, " %s",
                         IDENTIFIER_POINTER (DECL_NAME (TYPE_NAME (node))));
        }
    }
    if (code == IDENTIFIER_NODE)
        fprintf (file, " %s", IDENTIFIER_POINTER (node));

    if (code == INTEGER_CST)
    {
        if (indent <= 4)
            print_node_brief (file, "type", TREE_TYPE (node), indent + 4);
    }
    else if (CODE_CONTAINS_STRUCT (code, TS_TYPED))
    {
        print_node (file, "type", TREE_TYPE (node), indent + 4);
        if (TREE_TYPE (node))
            indent_to (file, indent + 3);
    }

    if (!TYPE_P (node) && TREE_SIDE_EFFECTS (node))
        fputs (" side-effects", file);

    if (TYPE_P (node) ? TYPE_READONLY (node) : TREE_READONLY (node))
        fputs (" readonly", file);
    if (TYPE_P (node) && TYPE_ATOMIC (node))
        fputs (" atomic", file);
    if (!TYPE_P (node) && TREE_CONSTANT (node))
        fputs (" constant", file);
    else if (TYPE_P (node) && TYPE_SIZES_GIMPLIFIED (node))
        fputs (" sizes-gimplified", file);

    if (TYPE_P (node) && !ADDR_SPACE_GENERIC_P (TYPE_ADDR_SPACE (node)))
        fprintf (file, " address-space-%d", TYPE_ADDR_SPACE (node));

    if (TREE_ADDRESSABLE (node))
        fputs (" addressable", file);
    if (TREE_THIS_VOLATILE (node))
        fputs (" volatile", file);
    if (TREE_ASM_WRITTEN (node))
        fputs (" asm_written", file);
    if (TREE_USED (node))
        fputs (" used", file);
    if (TREE_NOTHROW (node))
        fputs (" nothrow", file);
    if (TREE_PUBLIC (node))
        fputs (" public", file);
    if (TREE_PRIVATE (node))
        fputs (" private", file);
    if (TREE_PROTECTED (node))
        fputs (" protected", file);
    if (TREE_STATIC (node))
        fputs (code == CALL_EXPR ? " must-tail-call" : " static", file);
    if (TREE_DEPRECATED (node))
        fputs (" deprecated", file);
    if (TREE_VISITED (node))
        fputs (" visited", file);

    if (code != TREE_VEC && code != INTEGER_CST && code != SSA_NAME)
    {
        if (TREE_LANG_FLAG_0 (node))
            fputs (" tree_0", file);
        if (TREE_LANG_FLAG_1 (node))
            fputs (" tree_1", file);
        if (TREE_LANG_FLAG_2 (node))
            fputs (" tree_2", file);
        if (TREE_LANG_FLAG_3 (node))
            fputs (" tree_3", file);
        if (TREE_LANG_FLAG_4 (node))
            fputs (" tree_4", file);
        if (TREE_LANG_FLAG_5 (node))
            fputs (" tree_5", file);
        if (TREE_LANG_FLAG_6 (node))
            fputs (" tree_6", file);
    }

    /* DECL_ nodes have additional attributes.  */

    switch (TREE_CODE_CLASS (code))
    {
    case tcc_declaration:
        if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
        {
            if (DECL_UNSIGNED (node))
                fputs (" unsigned", file);
            if (DECL_IGNORED_P (node))
                fputs (" ignored", file);
            if (DECL_ABSTRACT_P (node))
                fputs (" abstract", file);
            if (DECL_EXTERNAL (node))
                fputs (" external", file);
            if (DECL_NONLOCAL (node))
                fputs (" nonlocal", file);
        }
        if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS))
        {
            if (DECL_WEAK (node))
                fputs (" weak", file);
            if (DECL_IN_SYSTEM_HEADER (node))
                fputs (" in_system_header", file);
        }
        if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL)
                && code != LABEL_DECL
                && code != FUNCTION_DECL
                && DECL_REGISTER (node))
            fputs (" regdecl", file);

        if (code == TYPE_DECL && TYPE_DECL_SUPPRESS_DEBUG (node))
            fputs (" suppress-debug", file);

        if (code == FUNCTION_DECL
                && DECL_FUNCTION_SPECIFIC_TARGET (node))
            fputs (" function-specific-target", file);
        if (code == FUNCTION_DECL
                && DECL_FUNCTION_SPECIFIC_OPTIMIZATION (node))
            fputs (" function-specific-opt", file);
        if (code == FUNCTION_DECL && DECL_DECLARED_INLINE_P (node))
            fputs (" autoinline", file);
        if (code == FUNCTION_DECL && DECL_BUILT_IN (node))
            fputs (" built-in", file);
        if (code == FUNCTION_DECL && DECL_STATIC_CHAIN (node))
            fputs (" static-chain", file);
        if (TREE_CODE (node) == FUNCTION_DECL && decl_is_tm_clone (node))
            fputs (" tm-clone", file);

        if (code == FIELD_DECL && DECL_PACKED (node))
            fputs (" packed", file);
        if (code == FIELD_DECL && DECL_BIT_FIELD (node))
            fputs (" bit-field", file);
        if (code == FIELD_DECL && DECL_NONADDRESSABLE_P (node))
            fputs (" nonaddressable", file);

        if (code == LABEL_DECL && EH_LANDING_PAD_NR (node))
            fprintf (file, " landing-pad:%d", EH_LANDING_PAD_NR (node));

        if (code == VAR_DECL && DECL_IN_TEXT_SECTION (node))
            fputs (" in-text-section", file);
        if (code == VAR_DECL && DECL_IN_CONSTANT_POOL (node))
            fputs (" in-constant-pool", file);
        if (code == VAR_DECL && DECL_COMMON (node))
            fputs (" common", file);
        if (code == VAR_DECL && DECL_THREAD_LOCAL_P (node))
        {
            fputs (" ", file);
            fputs (tls_model_names[DECL_TLS_MODEL (node)], file);
        }

        if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
        {
            if (DECL_VIRTUAL_P (node))
                fputs (" virtual", file);
            if (DECL_PRESERVE_P (node))
                fputs (" preserve", file);
            if (DECL_LANG_FLAG_0 (node))
                fputs (" decl_0", file);
            if (DECL_LANG_FLAG_1 (node))
                fputs (" decl_1", file);
            if (DECL_LANG_FLAG_2 (node))
                fputs (" decl_2", file);
            if (DECL_LANG_FLAG_3 (node))
                fputs (" decl_3", file);
            if (DECL_LANG_FLAG_4 (node))
                fputs (" decl_4", file);
            if (DECL_LANG_FLAG_5 (node))
                fputs (" decl_5", file);
            if (DECL_LANG_FLAG_6 (node))
                fputs (" decl_6", file);
            if (DECL_LANG_FLAG_7 (node))
                fputs (" decl_7", file);

            mode = DECL_MODE (node);
            fprintf (file, " %s", GET_MODE_NAME (mode));
        }

        if ((code == VAR_DECL || code == PARM_DECL || code == RESULT_DECL)
                && DECL_BY_REFERENCE (node))
            fputs (" passed-by-reference", file);

        if (CODE_CONTAINS_STRUCT (code, TS_DECL_WITH_VIS)  && DECL_DEFER_OUTPUT (node))
            fputs (" defer-output", file);


        xloc = expand_location (DECL_SOURCE_LOCATION (node));
        fprintf (file, " file %s line %d col %d", xloc.file, xloc.line,
                 xloc.column);

        if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
        {
            print_node (file, "size", DECL_SIZE (node), indent + 4);
            print_node (file, "unit size", DECL_SIZE_UNIT (node), indent + 4);

            if (code != FUNCTION_DECL || DECL_BUILT_IN (node))
                indent_to (file, indent + 3);

            if (DECL_USER_ALIGN (node))
                fprintf (file, " user");

            fprintf (file, " align %d", DECL_ALIGN (node));
            if (code == FIELD_DECL)
                fprintf (file, " offset_align " HOST_WIDE_INT_PRINT_UNSIGNED,
                         DECL_OFFSET_ALIGN (node));

            if (code == FUNCTION_DECL && DECL_BUILT_IN (node))
            {
                if (DECL_BUILT_IN_CLASS (node) == BUILT_IN_MD)
                    fprintf (file, " built-in BUILT_IN_MD %d", DECL_FUNCTION_CODE (node));
                else
                    fprintf (file, " built-in %s:%s",
                             built_in_class_names[(int) DECL_BUILT_IN_CLASS (node)],
                             built_in_names[(int) DECL_FUNCTION_CODE (node)]);
            }
        }
        if (code == FIELD_DECL)
        {
            print_node (file, "offset", DECL_FIELD_OFFSET (node), indent + 4);
            print_node (file, "bit offset", DECL_FIELD_BIT_OFFSET (node),
                        indent + 4);
            if (DECL_BIT_FIELD_TYPE (node))
                print_node (file, "bit_field_type", DECL_BIT_FIELD_TYPE (node),
                            indent + 4);
        }

        print_node_brief (file, "context", DECL_CONTEXT (node), indent + 4);

        if (CODE_CONTAINS_STRUCT (code, TS_DECL_COMMON))
        {
            print_node_brief (file, "attributes",
                              DECL_ATTRIBUTES (node), indent + 4);
            if (code != PARM_DECL)
                print_node_brief (file, "initial", DECL_INITIAL (node),
                                  indent + 4);
        }
        if (CODE_CONTAINS_STRUCT (code, TS_DECL_WRTL))
        {
            print_node_brief (file, "abstract_origin",
                              DECL_ABSTRACT_ORIGIN (node), indent + 4);
        }
        if (CODE_CONTAINS_STRUCT (code, TS_DECL_NON_COMMON))
        {
            print_node (file, "result", DECL_RESULT_FLD (node), indent + 4);
        }

        lang_hooks.print_decl (file, node, indent);

        if (DECL_RTL_SET_P (node))
        {
            indent_to (file, indent + 4);
            print_rtl (file, DECL_RTL (node));
        }

        if (code == PARM_DECL)
        {
            print_node (file, "arg-type", DECL_ARG_TYPE (node), indent + 4);

            if (DECL_INCOMING_RTL (node) != 0)
            {
                indent_to (file, indent + 4);
                fprintf (file, "incoming-rtl ");
                print_rtl (file, DECL_INCOMING_RTL (node));
            }
        }
        else if (code == FUNCTION_DECL
                 && DECL_STRUCT_FUNCTION (node) != 0)
        {
            print_node (file, "arguments", DECL_ARGUMENTS (node), indent + 4);
            indent_to (file, indent + 4);
            dump_addr (file, "struct-function ", DECL_STRUCT_FUNCTION (node));
        }

        if ((code == VAR_DECL || code == PARM_DECL)
                && DECL_HAS_VALUE_EXPR_P (node))
            print_node (file, "value-expr", DECL_VALUE_EXPR (node), indent + 4);

        /* Print the decl chain only if decl is at second level.  */
        if (indent == 4)
            print_node (file, "chain", TREE_CHAIN (node), indent + 4);
        else
            print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
        break;

    case tcc_type:
        if (TYPE_UNSIGNED (node))
            fputs (" unsigned", file);

        if (TYPE_NO_FORCE_BLK (node))
            fputs (" no-force-blk", file);

        if (TYPE_STRING_FLAG (node))
            fputs (" string-flag", file);

        if (TYPE_NEEDS_CONSTRUCTING (node))
            fputs (" needs-constructing", file);

        if ((code == RECORD_TYPE
                || code == UNION_TYPE
                || code == QUAL_UNION_TYPE
                || code == ARRAY_TYPE)
                && TYPE_REVERSE_STORAGE_ORDER (node))
            fputs (" reverse-storage-order", file);

        /* The transparent-union flag is used for different things in
        different nodes.  */
        if ((code == UNION_TYPE || code == RECORD_TYPE)
                && TYPE_TRANSPARENT_AGGR (node))
            fputs (" transparent-aggr", file);
        else if (code == ARRAY_TYPE
                 && TYPE_NONALIASED_COMPONENT (node))
            fputs (" nonaliased-component", file);

        if (TYPE_PACKED (node))
            fputs (" packed", file);

        if (TYPE_RESTRICT (node))
            fputs (" restrict", file);

        if (TYPE_LANG_FLAG_0 (node))
            fputs (" type_0", file);
        if (TYPE_LANG_FLAG_1 (node))
            fputs (" type_1", file);
        if (TYPE_LANG_FLAG_2 (node))
            fputs (" type_2", file);
        if (TYPE_LANG_FLAG_3 (node))
            fputs (" type_3", file);
        if (TYPE_LANG_FLAG_4 (node))
            fputs (" type_4", file);
        if (TYPE_LANG_FLAG_5 (node))
            fputs (" type_5", file);
        if (TYPE_LANG_FLAG_6 (node))
            fputs (" type_6", file);
        if (TYPE_LANG_FLAG_7 (node))
            fputs (" type_7", file);

        mode = TYPE_MODE (node);
        fprintf (file, " %s", GET_MODE_NAME (mode));

        print_node (file, "size", TYPE_SIZE (node), indent + 4);
        print_node (file, "unit size", TYPE_SIZE_UNIT (node), indent + 4);
        indent_to (file, indent + 3);

        if (TYPE_USER_ALIGN (node))
            fprintf (file, " user");

        fprintf (file, " align %d symtab %d alias set " HOST_WIDE_INT_PRINT_DEC,
                 TYPE_ALIGN (node), TYPE_SYMTAB_ADDRESS (node),
                 (HOST_WIDE_INT) TYPE_ALIAS_SET (node));

        if (TYPE_STRUCTURAL_EQUALITY_P (node))
            fprintf (file, " structural equality");
        else
            dump_addr (file, " canonical type ", TYPE_CANONICAL (node));

        print_node (file, "attributes", TYPE_ATTRIBUTES (node), indent + 4);

        if (INTEGRAL_TYPE_P (node) || code == REAL_TYPE
                || code == FIXED_POINT_TYPE)
        {
            fprintf (file, " precision %d", TYPE_PRECISION (node));
            print_node_brief (file, "min", TYPE_MIN_VALUE (node), indent + 4);
            print_node_brief (file, "max", TYPE_MAX_VALUE (node), indent + 4);
        }

        if (code == ENUMERAL_TYPE)
            print_node (file, "values", TYPE_VALUES (node), indent + 4);
        else if (code == ARRAY_TYPE)
            print_node (file, "domain", TYPE_DOMAIN (node), indent + 4);
        else if (code == VECTOR_TYPE)
            fprintf (file, " nunits %d", (int) TYPE_VECTOR_SUBPARTS (node));
        else if (code == RECORD_TYPE
                 || code == UNION_TYPE
                 || code == QUAL_UNION_TYPE)
            print_node (file, "fields", TYPE_FIELDS (node), indent + 4);
        else if (code == FUNCTION_TYPE
                 || code == METHOD_TYPE)
        {
            if (TYPE_METHOD_BASETYPE (node))
                print_node_brief (file, "method basetype",
                                  TYPE_METHOD_BASETYPE (node), indent + 4);
            print_node (file, "arg-types", TYPE_ARG_TYPES (node), indent + 4);
        }
        else if (code == OFFSET_TYPE)
            print_node_brief (file, "basetype", TYPE_OFFSET_BASETYPE (node),
                              indent + 4);

        if (TYPE_CONTEXT (node))
            print_node_brief (file, "context", TYPE_CONTEXT (node), indent + 4);

        lang_hooks.print_type (file, node, indent);

        if (TYPE_POINTER_TO (node) || TREE_CHAIN (node))
            indent_to (file, indent + 3);

        print_node_brief (file, "pointer_to_this", TYPE_POINTER_TO (node),
                          indent + 4);
        print_node_brief (file, "reference_to_this", TYPE_REFERENCE_TO (node),
                          indent + 4);
        print_node_brief (file, "chain", TREE_CHAIN (node), indent + 4);
        break;

    case tcc_expression:
    case tcc_comparison:
    case tcc_unary:
    case tcc_binary:
    case tcc_reference:
    case tcc_statement:
    case tcc_vl_exp:
        if (code == BIND_EXPR)
        {
            print_node (file, "vars", TREE_OPERAND (node, 0), indent + 4);
            print_node (file, "body", TREE_OPERAND (node, 1), indent + 4);
            print_node (file, "block", TREE_OPERAND (node, 2), indent + 4);
            break;
        }
        if (code == CALL_EXPR)
        {
            call_expr_arg_iterator iter;
            tree arg;
            print_node (file, "fn", CALL_EXPR_FN (node), indent + 4);
            print_node (file, "static_chain", CALL_EXPR_STATIC_CHAIN (node),
                        indent + 4);
            i = 0;
            FOR_EACH_CALL_EXPR_ARG (arg, iter, node)
            {
                char temp[10];
                sprintf (temp, "arg %d", i);
                print_node (file, temp, arg, indent + 4);
                i++;
            }
        }
示例#6
0
void
expr_hash_elt::print (FILE *stream)
{
  fprintf (stream, "STMT ");

  if (m_lhs)
    {
      print_generic_expr (stream, m_lhs, 0);
      fprintf (stream, " = ");
    }

  switch (m_expr.kind)
    {
      case EXPR_SINGLE:
        print_generic_expr (stream, m_expr.ops.single.rhs, 0);
        break;

      case EXPR_UNARY:
	fprintf (stream, "%s ", get_tree_code_name (m_expr.ops.unary.op));
        print_generic_expr (stream, m_expr.ops.unary.opnd, 0);
        break;

      case EXPR_BINARY:
        print_generic_expr (stream, m_expr.ops.binary.opnd0, 0);
	fprintf (stream, " %s ", get_tree_code_name (m_expr.ops.binary.op));
        print_generic_expr (stream, m_expr.ops.binary.opnd1, 0);
        break;

      case EXPR_TERNARY:
	fprintf (stream, " %s <", get_tree_code_name (m_expr.ops.ternary.op));
        print_generic_expr (stream, m_expr.ops.ternary.opnd0, 0);
	fputs (", ", stream);
        print_generic_expr (stream, m_expr.ops.ternary.opnd1, 0);
	fputs (", ", stream);
        print_generic_expr (stream, m_expr.ops.ternary.opnd2, 0);
	fputs (">", stream);
        break;

      case EXPR_CALL:
        {
          size_t i;
          size_t nargs = m_expr.ops.call.nargs;
          gcall *fn_from;

          fn_from = m_expr.ops.call.fn_from;
          if (gimple_call_internal_p (fn_from))
            fputs (internal_fn_name (gimple_call_internal_fn (fn_from)),
                   stream);
          else
            print_generic_expr (stream, gimple_call_fn (fn_from), 0);
          fprintf (stream, " (");
          for (i = 0; i < nargs; i++)
            {
              print_generic_expr (stream, m_expr.ops.call.args[i], 0);
              if (i + 1 < nargs)
                fprintf (stream, ", ");
            }
          fprintf (stream, ")");
        }
        break;

      case EXPR_PHI:
        {
          size_t i;
          size_t nargs = m_expr.ops.phi.nargs;

          fprintf (stream, "PHI <");
          for (i = 0; i < nargs; i++)
            {
              print_generic_expr (stream, m_expr.ops.phi.args[i], 0);
              if (i + 1 < nargs)
                fprintf (stream, ", ");
            }
          fprintf (stream, ">");
        }
        break;
    }

  if (m_vop)
    {
      fprintf (stream, " with ");
      print_generic_expr (stream, m_vop, 0);
    }

  fprintf (stream, "\n");
}
  template < class Context > Return call (tree t)
  {
    enum tree_code tc = t->typed.base.code;
    switch (tc)
      {

      case TC_IDENTIFIER_NODE::t_code_c:
	return ((Context *) this)->call_type_IDENTIFIER_NODE (t);
	break;


      case TC_TREE_LIST::t_code_c:
	return ((Context *) this)->call_type_TREE_LIST (t);
	break;


      case TC_TREE_VEC::t_code_c:
	return ((Context *) this)->call_type_TREE_VEC (t);
	break;


      case TC_BLOCK::t_code_c:
	return ((Context *) this)->call_type_BLOCK (t);
	break;


      case TC_OFFSET_TYPE::t_code_c:
	return ((Context *) this)->call_type_OFFSET_TYPE (t);
	break;


      case TC_ENUMERAL_TYPE::t_code_c:
	return ((Context *) this)->call_type_ENUMERAL_TYPE (t);
	break;


      case TC_BOOLEAN_TYPE::t_code_c:
	return ((Context *) this)->call_type_BOOLEAN_TYPE (t);
	break;


      case TC_INTEGER_TYPE::t_code_c:
	return ((Context *) this)->call_type_INTEGER_TYPE (t);
	break;


      case TC_REAL_TYPE::t_code_c:
	return ((Context *) this)->call_type_REAL_TYPE (t);
	break;


      case TC_POINTER_TYPE::t_code_c:
	return ((Context *) this)->call_type_POINTER_TYPE (t);
	break;


      case TC_REFERENCE_TYPE::t_code_c:
	return ((Context *) this)->call_type_REFERENCE_TYPE (t);
	break;


      case TC_NULLPTR_TYPE::t_code_c:
	return ((Context *) this)->call_type_NULLPTR_TYPE (t);
	break;


      case TC_FIXED_POINT_TYPE::t_code_c:
	return ((Context *) this)->call_type_FIXED_POINT_TYPE (t);
	break;


      case TC_COMPLEX_TYPE::t_code_c:
	return ((Context *) this)->call_type_COMPLEX_TYPE (t);
	break;


      case TC_VECTOR_TYPE::t_code_c:
	return ((Context *) this)->call_type_VECTOR_TYPE (t);
	break;


      case TC_ARRAY_TYPE::t_code_c:
	return ((Context *) this)->call_type_ARRAY_TYPE (t);
	break;


      case TC_RECORD_TYPE::t_code_c:
	return ((Context *) this)->call_type_RECORD_TYPE (t);
	break;


      case TC_UNION_TYPE::t_code_c:
	return ((Context *) this)->call_type_UNION_TYPE (t);
	break;


      case TC_QUAL_UNION_TYPE::t_code_c:
	return ((Context *) this)->call_type_QUAL_UNION_TYPE (t);
	break;


      case TC_VOID_TYPE::t_code_c:
	return ((Context *) this)->call_type_VOID_TYPE (t);
	break;


      case TC_POINTER_BOUNDS_TYPE::t_code_c:
	return ((Context *) this)->call_type_POINTER_BOUNDS_TYPE (t);
	break;


      case TC_FUNCTION_TYPE::t_code_c:
	return ((Context *) this)->call_type_FUNCTION_TYPE (t);
	break;


      case TC_METHOD_TYPE::t_code_c:
	return ((Context *) this)->call_type_METHOD_TYPE (t);
	break;


      case TC_LANG_TYPE::t_code_c:
	return ((Context *) this)->call_type_LANG_TYPE (t);
	break;


      case TC_VOID_CST::t_code_c:
	return ((Context *) this)->call_type_VOID_CST (t);
	break;


      case TC_INTEGER_CST::t_code_c:
	return ((Context *) this)->call_type_INTEGER_CST (t);
	break;


      case TC_REAL_CST::t_code_c:
	return ((Context *) this)->call_type_REAL_CST (t);
	break;


      case TC_FIXED_CST::t_code_c:
	return ((Context *) this)->call_type_FIXED_CST (t);
	break;


      case TC_COMPLEX_CST::t_code_c:
	return ((Context *) this)->call_type_COMPLEX_CST (t);
	break;


      case TC_VECTOR_CST::t_code_c:
	return ((Context *) this)->call_type_VECTOR_CST (t);
	break;


      case TC_STRING_CST::t_code_c:
	return ((Context *) this)->call_type_STRING_CST (t);
	break;


      case TC_FUNCTION_DECL::t_code_c:
	return ((Context *) this)->call_type_FUNCTION_DECL (t);
	break;


      case TC_LABEL_DECL::t_code_c:
	return ((Context *) this)->call_type_LABEL_DECL (t);
	break;


      case TC_FIELD_DECL::t_code_c:
	return ((Context *) this)->call_type_FIELD_DECL (t);
	break;


      case TC_VAR_DECL::t_code_c:
	return ((Context *) this)->call_type_VAR_DECL (t);
	break;


      case TC_CONST_DECL::t_code_c:
	return ((Context *) this)->call_type_CONST_DECL (t);
	break;


      case TC_PARM_DECL::t_code_c:
	return ((Context *) this)->call_type_PARM_DECL (t);
	break;


      case TC_TYPE_DECL::t_code_c:
	return ((Context *) this)->call_type_TYPE_DECL (t);
	break;


      case TC_RESULT_DECL::t_code_c:
	return ((Context *) this)->call_type_RESULT_DECL (t);
	break;


      case TC_DEBUG_EXPR_DECL::t_code_c:
	return ((Context *) this)->call_type_DEBUG_EXPR_DECL (t);
	break;


      case TC_NAMESPACE_DECL::t_code_c:
	return ((Context *) this)->call_type_NAMESPACE_DECL (t);
	break;


      case TC_IMPORTED_DECL::t_code_c:
	return ((Context *) this)->call_type_IMPORTED_DECL (t);
	break;


      case TC_NAMELIST_DECL::t_code_c:
	return ((Context *) this)->call_type_NAMELIST_DECL (t);
	break;


      case TC_TRANSLATION_UNIT_DECL::t_code_c:
	return ((Context *) this)->call_type_TRANSLATION_UNIT_DECL (t);
	break;


      case TC_COMPONENT_REF::t_code_c:
	return ((Context *) this)->call_type_COMPONENT_REF (t);
	break;


      case TC_BIT_FIELD_REF::t_code_c:
	return ((Context *) this)->call_type_BIT_FIELD_REF (t);
	break;


      case TC_ARRAY_REF::t_code_c:
	return ((Context *) this)->call_type_ARRAY_REF (t);
	break;


      case TC_ARRAY_RANGE_REF::t_code_c:
	return ((Context *) this)->call_type_ARRAY_RANGE_REF (t);
	break;


      case TC_REALPART_EXPR::t_code_c:
	return ((Context *) this)->call_type_REALPART_EXPR (t);
	break;


      case TC_IMAGPART_EXPR::t_code_c:
	return ((Context *) this)->call_type_IMAGPART_EXPR (t);
	break;


      case TC_VIEW_CONVERT_EXPR::t_code_c:
	return ((Context *) this)->call_type_VIEW_CONVERT_EXPR (t);
	break;


      case TC_INDIRECT_REF::t_code_c:
	return ((Context *) this)->call_type_INDIRECT_REF (t);
	break;


      case TC_OBJ_TYPE_REF::t_code_c:
	return ((Context *) this)->call_type_OBJ_TYPE_REF (t);
	break;


      case TC_CONSTRUCTOR::t_code_c:
	return ((Context *) this)->call_type_CONSTRUCTOR (t);
	break;


      case TC_COMPOUND_EXPR::t_code_c:
	return ((Context *) this)->call_type_COMPOUND_EXPR (t);
	break;


      case TC_MODIFY_EXPR::t_code_c:
	return ((Context *) this)->call_type_MODIFY_EXPR (t);
	break;


      case TC_INIT_EXPR::t_code_c:
	return ((Context *) this)->call_type_INIT_EXPR (t);
	break;


      case TC_TARGET_EXPR::t_code_c:
	return ((Context *) this)->call_type_TARGET_EXPR (t);
	break;


      case TC_COND_EXPR::t_code_c:
	return ((Context *) this)->call_type_COND_EXPR (t);
	break;


      case TC_VEC_COND_EXPR::t_code_c:
	return ((Context *) this)->call_type_VEC_COND_EXPR (t);
	break;


      case TC_VEC_PERM_EXPR::t_code_c:
	return ((Context *) this)->call_type_VEC_PERM_EXPR (t);
	break;


      case TC_BIND_EXPR::t_code_c:
	return ((Context *) this)->call_type_BIND_EXPR (t);
	break;


      case TC_CALL_EXPR::t_code_c:
	return ((Context *) this)->call_type_CALL_EXPR (t);
	break;


      case TC_WITH_CLEANUP_EXPR::t_code_c:
	return ((Context *) this)->call_type_WITH_CLEANUP_EXPR (t);
	break;


      case TC_CLEANUP_POINT_EXPR::t_code_c:
	return ((Context *) this)->call_type_CLEANUP_POINT_EXPR (t);
	break;


      case TC_PLACEHOLDER_EXPR::t_code_c:
	return ((Context *) this)->call_type_PLACEHOLDER_EXPR (t);
	break;


      case TC_PLUS_EXPR::t_code_c:
	return ((Context *) this)->call_type_PLUS_EXPR (t);
	break;


      case TC_MINUS_EXPR::t_code_c:
	return ((Context *) this)->call_type_MINUS_EXPR (t);
	break;


      case TC_MULT_EXPR::t_code_c:
	return ((Context *) this)->call_type_MULT_EXPR (t);
	break;


      case TC_POINTER_PLUS_EXPR::t_code_c:
	return ((Context *) this)->call_type_POINTER_PLUS_EXPR (t);
	break;


      case TC_MULT_HIGHPART_EXPR::t_code_c:
	return ((Context *) this)->call_type_MULT_HIGHPART_EXPR (t);
	break;


      case TC_TRUNC_DIV_EXPR::t_code_c:
	return ((Context *) this)->call_type_TRUNC_DIV_EXPR (t);
	break;


      case TC_CEIL_DIV_EXPR::t_code_c:
	return ((Context *) this)->call_type_CEIL_DIV_EXPR (t);
	break;


      case TC_FLOOR_DIV_EXPR::t_code_c:
	return ((Context *) this)->call_type_FLOOR_DIV_EXPR (t);
	break;


      case TC_ROUND_DIV_EXPR::t_code_c:
	return ((Context *) this)->call_type_ROUND_DIV_EXPR (t);
	break;


      case TC_TRUNC_MOD_EXPR::t_code_c:
	return ((Context *) this)->call_type_TRUNC_MOD_EXPR (t);
	break;


      case TC_CEIL_MOD_EXPR::t_code_c:
	return ((Context *) this)->call_type_CEIL_MOD_EXPR (t);
	break;


      case TC_FLOOR_MOD_EXPR::t_code_c:
	return ((Context *) this)->call_type_FLOOR_MOD_EXPR (t);
	break;


      case TC_ROUND_MOD_EXPR::t_code_c:
	return ((Context *) this)->call_type_ROUND_MOD_EXPR (t);
	break;


      case TC_RDIV_EXPR::t_code_c:
	return ((Context *) this)->call_type_RDIV_EXPR (t);
	break;


      case TC_EXACT_DIV_EXPR::t_code_c:
	return ((Context *) this)->call_type_EXACT_DIV_EXPR (t);
	break;


      case TC_FIX_TRUNC_EXPR::t_code_c:
	return ((Context *) this)->call_type_FIX_TRUNC_EXPR (t);
	break;


      case TC_FLOAT_EXPR::t_code_c:
	return ((Context *) this)->call_type_FLOAT_EXPR (t);
	break;


      case TC_NEGATE_EXPR::t_code_c:
	return ((Context *) this)->call_type_NEGATE_EXPR (t);
	break;


      case TC_MIN_EXPR::t_code_c:
	return ((Context *) this)->call_type_MIN_EXPR (t);
	break;


      case TC_MAX_EXPR::t_code_c:
	return ((Context *) this)->call_type_MAX_EXPR (t);
	break;


      case TC_ABS_EXPR::t_code_c:
	return ((Context *) this)->call_type_ABS_EXPR (t);
	break;


      case TC_LSHIFT_EXPR::t_code_c:
	return ((Context *) this)->call_type_LSHIFT_EXPR (t);
	break;


      case TC_RSHIFT_EXPR::t_code_c:
	return ((Context *) this)->call_type_RSHIFT_EXPR (t);
	break;


      case TC_LROTATE_EXPR::t_code_c:
	return ((Context *) this)->call_type_LROTATE_EXPR (t);
	break;


      case TC_RROTATE_EXPR::t_code_c:
	return ((Context *) this)->call_type_RROTATE_EXPR (t);
	break;


      case TC_BIT_IOR_EXPR::t_code_c:
	return ((Context *) this)->call_type_BIT_IOR_EXPR (t);
	break;


      case TC_BIT_XOR_EXPR::t_code_c:
	return ((Context *) this)->call_type_BIT_XOR_EXPR (t);
	break;


      case TC_BIT_AND_EXPR::t_code_c:
	return ((Context *) this)->call_type_BIT_AND_EXPR (t);
	break;


      case TC_BIT_NOT_EXPR::t_code_c:
	return ((Context *) this)->call_type_BIT_NOT_EXPR (t);
	break;


      case TC_TRUTH_ANDIF_EXPR::t_code_c:
	return ((Context *) this)->call_type_TRUTH_ANDIF_EXPR (t);
	break;


      case TC_TRUTH_ORIF_EXPR::t_code_c:
	return ((Context *) this)->call_type_TRUTH_ORIF_EXPR (t);
	break;


      case TC_TRUTH_AND_EXPR::t_code_c:
	return ((Context *) this)->call_type_TRUTH_AND_EXPR (t);
	break;


      case TC_TRUTH_OR_EXPR::t_code_c:
	return ((Context *) this)->call_type_TRUTH_OR_EXPR (t);
	break;


      case TC_TRUTH_XOR_EXPR::t_code_c:
	return ((Context *) this)->call_type_TRUTH_XOR_EXPR (t);
	break;


      case TC_TRUTH_NOT_EXPR::t_code_c:
	return ((Context *) this)->call_type_TRUTH_NOT_EXPR (t);
	break;


      case TC_LT_EXPR::t_code_c:
	return ((Context *) this)->call_type_LT_EXPR (t);
	break;


      case TC_LE_EXPR::t_code_c:
	return ((Context *) this)->call_type_LE_EXPR (t);
	break;


      case TC_GT_EXPR::t_code_c:
	return ((Context *) this)->call_type_GT_EXPR (t);
	break;


      case TC_GE_EXPR::t_code_c:
	return ((Context *) this)->call_type_GE_EXPR (t);
	break;


      case TC_EQ_EXPR::t_code_c:
	return ((Context *) this)->call_type_EQ_EXPR (t);
	break;


      case TC_NE_EXPR::t_code_c:
	return ((Context *) this)->call_type_NE_EXPR (t);
	break;


      case TC_UNORDERED_EXPR::t_code_c:
	return ((Context *) this)->call_type_UNORDERED_EXPR (t);
	break;


      case TC_ORDERED_EXPR::t_code_c:
	return ((Context *) this)->call_type_ORDERED_EXPR (t);
	break;


      case TC_UNLT_EXPR::t_code_c:
	return ((Context *) this)->call_type_UNLT_EXPR (t);
	break;


      case TC_UNLE_EXPR::t_code_c:
	return ((Context *) this)->call_type_UNLE_EXPR (t);
	break;


      case TC_UNGT_EXPR::t_code_c:
	return ((Context *) this)->call_type_UNGT_EXPR (t);
	break;


      case TC_UNGE_EXPR::t_code_c:
	return ((Context *) this)->call_type_UNGE_EXPR (t);
	break;


      case TC_UNEQ_EXPR::t_code_c:
	return ((Context *) this)->call_type_UNEQ_EXPR (t);
	break;


      case TC_LTGT_EXPR::t_code_c:
	return ((Context *) this)->call_type_LTGT_EXPR (t);
	break;


      case TC_RANGE_EXPR::t_code_c:
	return ((Context *) this)->call_type_RANGE_EXPR (t);
	break;


      case TC_PAREN_EXPR::t_code_c:
	return ((Context *) this)->call_type_PAREN_EXPR (t);
	break;


      case TC_CONVERT_EXPR::t_code_c:
	return ((Context *) this)->call_type_CONVERT_EXPR (t);
	break;


      case TC_ADDR_SPACE_CONVERT_EXPR::t_code_c:
	return ((Context *) this)->call_type_ADDR_SPACE_CONVERT_EXPR (t);
	break;


      case TC_FIXED_CONVERT_EXPR::t_code_c:
	return ((Context *) this)->call_type_FIXED_CONVERT_EXPR (t);
	break;


      case TC_NOP_EXPR::t_code_c:
	return ((Context *) this)->call_type_NOP_EXPR (t);
	break;


      case TC_NON_LVALUE_EXPR::t_code_c:
	return ((Context *) this)->call_type_NON_LVALUE_EXPR (t);
	break;


      case TC_COMPOUND_LITERAL_EXPR::t_code_c:
	return ((Context *) this)->call_type_COMPOUND_LITERAL_EXPR (t);
	break;


      case TC_SAVE_EXPR::t_code_c:
	return ((Context *) this)->call_type_SAVE_EXPR (t);
	break;


      case TC_ADDR_EXPR::t_code_c:
	return ((Context *) this)->call_type_ADDR_EXPR (t);
	break;


      case TC_FDESC_EXPR::t_code_c:
	return ((Context *) this)->call_type_FDESC_EXPR (t);
	break;


      case TC_COMPLEX_EXPR::t_code_c:
	return ((Context *) this)->call_type_COMPLEX_EXPR (t);
	break;


      case TC_CONJ_EXPR::t_code_c:
	return ((Context *) this)->call_type_CONJ_EXPR (t);
	break;


      case TC_PREDECREMENT_EXPR::t_code_c:
	return ((Context *) this)->call_type_PREDECREMENT_EXPR (t);
	break;


      case TC_PREINCREMENT_EXPR::t_code_c:
	return ((Context *) this)->call_type_PREINCREMENT_EXPR (t);
	break;


      case TC_POSTDECREMENT_EXPR::t_code_c:
	return ((Context *) this)->call_type_POSTDECREMENT_EXPR (t);
	break;


      case TC_POSTINCREMENT_EXPR::t_code_c:
	return ((Context *) this)->call_type_POSTINCREMENT_EXPR (t);
	break;


      case TC_VA_ARG_EXPR::t_code_c:
	return ((Context *) this)->call_type_VA_ARG_EXPR (t);
	break;


      case TC_TRY_CATCH_EXPR::t_code_c:
	return ((Context *) this)->call_type_TRY_CATCH_EXPR (t);
	break;


      case TC_TRY_FINALLY_EXPR::t_code_c:
	return ((Context *) this)->call_type_TRY_FINALLY_EXPR (t);
	break;


      case TC_DECL_EXPR::t_code_c:
	return ((Context *) this)->call_type_DECL_EXPR (t);
	break;


      case TC_LABEL_EXPR::t_code_c:
	return ((Context *) this)->call_type_LABEL_EXPR (t);
	break;


      case TC_GOTO_EXPR::t_code_c:
	return ((Context *) this)->call_type_GOTO_EXPR (t);
	break;


      case TC_RETURN_EXPR::t_code_c:
	return ((Context *) this)->call_type_RETURN_EXPR (t);
	break;


      case TC_EXIT_EXPR::t_code_c:
	return ((Context *) this)->call_type_EXIT_EXPR (t);
	break;


      case TC_LOOP_EXPR::t_code_c:
	return ((Context *) this)->call_type_LOOP_EXPR (t);
	break;


      case TC_SWITCH_EXPR::t_code_c:
	return ((Context *) this)->call_type_SWITCH_EXPR (t);
	break;


      case TC_CASE_LABEL_EXPR::t_code_c:
	return ((Context *) this)->call_type_CASE_LABEL_EXPR (t);
	break;


      case TC_ASM_EXPR::t_code_c:
	return ((Context *) this)->call_type_ASM_EXPR (t);
	break;


      case TC_SSA_NAME::t_code_c:
	return ((Context *) this)->call_type_SSA_NAME (t);
	break;


      case TC_CATCH_EXPR::t_code_c:
	return ((Context *) this)->call_type_CATCH_EXPR (t);
	break;


      case TC_EH_FILTER_EXPR::t_code_c:
	return ((Context *) this)->call_type_EH_FILTER_EXPR (t);
	break;


      case TC_SCEV_KNOWN::t_code_c:
	return ((Context *) this)->call_type_SCEV_KNOWN (t);
	break;


      case TC_SCEV_NOT_KNOWN::t_code_c:
	return ((Context *) this)->call_type_SCEV_NOT_KNOWN (t);
	break;


      case TC_POLYNOMIAL_CHREC::t_code_c:
	return ((Context *) this)->call_type_POLYNOMIAL_CHREC (t);
	break;


      case TC_STATEMENT_LIST::t_code_c:
	return ((Context *) this)->call_type_STATEMENT_LIST (t);
	break;


      case TC_ASSERT_EXPR::t_code_c:
	return ((Context *) this)->call_type_ASSERT_EXPR (t);
	break;


      case TC_TREE_BINFO::t_code_c:
	return ((Context *) this)->call_type_TREE_BINFO (t);
	break;


      case TC_WITH_SIZE_EXPR::t_code_c:
	return ((Context *) this)->call_type_WITH_SIZE_EXPR (t);
	break;


      case TC_REALIGN_LOAD_EXPR::t_code_c:
	return ((Context *) this)->call_type_REALIGN_LOAD_EXPR (t);
	break;


      case TC_TARGET_MEM_REF::t_code_c:
	return ((Context *) this)->call_type_TARGET_MEM_REF (t);
	break;


      case TC_MEM_REF::t_code_c:
	return ((Context *) this)->call_type_MEM_REF (t);
	break;


      case TC_OACC_PARALLEL::t_code_c:
	return ((Context *) this)->call_type_OACC_PARALLEL (t);
	break;


      case TC_OACC_KERNELS::t_code_c:
	return ((Context *) this)->call_type_OACC_KERNELS (t);
	break;


      case TC_OACC_DATA::t_code_c:
	return ((Context *) this)->call_type_OACC_DATA (t);
	break;


      case TC_OACC_HOST_DATA::t_code_c:
	return ((Context *) this)->call_type_OACC_HOST_DATA (t);
	break;


      case TC_OMP_PARALLEL::t_code_c:
	return ((Context *) this)->call_type_OMP_PARALLEL (t);
	break;


      case TC_OMP_TASK::t_code_c:
	return ((Context *) this)->call_type_OMP_TASK (t);
	break;


      case TC_OMP_FOR::t_code_c:
	return ((Context *) this)->call_type_OMP_FOR (t);
	break;


      case TC_OMP_SIMD::t_code_c:
	return ((Context *) this)->call_type_OMP_SIMD (t);
	break;


      case TC_CILK_SIMD::t_code_c:
	return ((Context *) this)->call_type_CILK_SIMD (t);
	break;


      case TC_CILK_FOR::t_code_c:
	return ((Context *) this)->call_type_CILK_FOR (t);
	break;


      case TC_OMP_DISTRIBUTE::t_code_c:
	return ((Context *) this)->call_type_OMP_DISTRIBUTE (t);
	break;


      case TC_OACC_LOOP::t_code_c:
	return ((Context *) this)->call_type_OACC_LOOP (t);
	break;


      case TC_OMP_TEAMS::t_code_c:
	return ((Context *) this)->call_type_OMP_TEAMS (t);
	break;


      case TC_OMP_TARGET_DATA::t_code_c:
	return ((Context *) this)->call_type_OMP_TARGET_DATA (t);
	break;


      case TC_OMP_TARGET::t_code_c:
	return ((Context *) this)->call_type_OMP_TARGET (t);
	break;


      case TC_OMP_SECTIONS::t_code_c:
	return ((Context *) this)->call_type_OMP_SECTIONS (t);
	break;


      case TC_OMP_SINGLE::t_code_c:
	return ((Context *) this)->call_type_OMP_SINGLE (t);
	break;


      case TC_OMP_SECTION::t_code_c:
	return ((Context *) this)->call_type_OMP_SECTION (t);
	break;


      case TC_OMP_MASTER::t_code_c:
	return ((Context *) this)->call_type_OMP_MASTER (t);
	break;


      case TC_OMP_TASKGROUP::t_code_c:
	return ((Context *) this)->call_type_OMP_TASKGROUP (t);
	break;


      case TC_OMP_ORDERED::t_code_c:
	return ((Context *) this)->call_type_OMP_ORDERED (t);
	break;


      case TC_OMP_CRITICAL::t_code_c:
	return ((Context *) this)->call_type_OMP_CRITICAL (t);
	break;


      case TC_OACC_CACHE::t_code_c:
	return ((Context *) this)->call_type_OACC_CACHE (t);
	break;


      case TC_OACC_DECLARE::t_code_c:
	return ((Context *) this)->call_type_OACC_DECLARE (t);
	break;


      case TC_OACC_ENTER_DATA::t_code_c:
	return ((Context *) this)->call_type_OACC_ENTER_DATA (t);
	break;


      case TC_OACC_EXIT_DATA::t_code_c:
	return ((Context *) this)->call_type_OACC_EXIT_DATA (t);
	break;


      case TC_OACC_UPDATE::t_code_c:
	return ((Context *) this)->call_type_OACC_UPDATE (t);
	break;


      case TC_OMP_TARGET_UPDATE::t_code_c:
	return ((Context *) this)->call_type_OMP_TARGET_UPDATE (t);
	break;


      case TC_OMP_ATOMIC::t_code_c:
	return ((Context *) this)->call_type_OMP_ATOMIC (t);
	break;


      case TC_OMP_ATOMIC_READ::t_code_c:
	return ((Context *) this)->call_type_OMP_ATOMIC_READ (t);
	break;


      case TC_OMP_ATOMIC_CAPTURE_OLD::t_code_c:
	return ((Context *) this)->call_type_OMP_ATOMIC_CAPTURE_OLD (t);
	break;


      case TC_OMP_ATOMIC_CAPTURE_NEW::t_code_c:
	return ((Context *) this)->call_type_OMP_ATOMIC_CAPTURE_NEW (t);
	break;


      case TC_OMP_CLAUSE::t_code_c:
	return ((Context *) this)->call_type_OMP_CLAUSE (t);
	break;


      case TC_TRANSACTION_EXPR::t_code_c:
	return ((Context *) this)->call_type_TRANSACTION_EXPR (t);
	break;


      case TC_REDUC_MAX_EXPR::t_code_c:
	return ((Context *) this)->call_type_REDUC_MAX_EXPR (t);
	break;


      case TC_REDUC_MIN_EXPR::t_code_c:
	return ((Context *) this)->call_type_REDUC_MIN_EXPR (t);
	break;


      case TC_REDUC_PLUS_EXPR::t_code_c:
	return ((Context *) this)->call_type_REDUC_PLUS_EXPR (t);
	break;


      case TC_DOT_PROD_EXPR::t_code_c:
	return ((Context *) this)->call_type_DOT_PROD_EXPR (t);
	break;


      case TC_WIDEN_SUM_EXPR::t_code_c:
	return ((Context *) this)->call_type_WIDEN_SUM_EXPR (t);
	break;


      case TC_SAD_EXPR::t_code_c:
	return ((Context *) this)->call_type_SAD_EXPR (t);
	break;


      case TC_WIDEN_MULT_EXPR::t_code_c:
	return ((Context *) this)->call_type_WIDEN_MULT_EXPR (t);
	break;


      case TC_WIDEN_MULT_PLUS_EXPR::t_code_c:
	return ((Context *) this)->call_type_WIDEN_MULT_PLUS_EXPR (t);
	break;


      case TC_WIDEN_MULT_MINUS_EXPR::t_code_c:
	return ((Context *) this)->call_type_WIDEN_MULT_MINUS_EXPR (t);
	break;


      case TC_WIDEN_LSHIFT_EXPR::t_code_c:
	return ((Context *) this)->call_type_WIDEN_LSHIFT_EXPR (t);
	break;


      case TC_FMA_EXPR::t_code_c:
	return ((Context *) this)->call_type_FMA_EXPR (t);
	break;


      case TC_VEC_WIDEN_MULT_HI_EXPR::t_code_c:
	return ((Context *) this)->call_type_VEC_WIDEN_MULT_HI_EXPR (t);
	break;


      case TC_VEC_WIDEN_MULT_LO_EXPR::t_code_c:
	return ((Context *) this)->call_type_VEC_WIDEN_MULT_LO_EXPR (t);
	break;


      case TC_VEC_WIDEN_MULT_EVEN_EXPR::t_code_c:
	return ((Context *) this)->call_type_VEC_WIDEN_MULT_EVEN_EXPR (t);
	break;


      case TC_VEC_WIDEN_MULT_ODD_EXPR::t_code_c:
	return ((Context *) this)->call_type_VEC_WIDEN_MULT_ODD_EXPR (t);
	break;


      case TC_VEC_UNPACK_HI_EXPR::t_code_c:
	return ((Context *) this)->call_type_VEC_UNPACK_HI_EXPR (t);
	break;


      case TC_VEC_UNPACK_LO_EXPR::t_code_c:
	return ((Context *) this)->call_type_VEC_UNPACK_LO_EXPR (t);
	break;


      case TC_VEC_UNPACK_FLOAT_HI_EXPR::t_code_c:
	return ((Context *) this)->call_type_VEC_UNPACK_FLOAT_HI_EXPR (t);
	break;


      case TC_VEC_UNPACK_FLOAT_LO_EXPR::t_code_c:
	return ((Context *) this)->call_type_VEC_UNPACK_FLOAT_LO_EXPR (t);
	break;


      case TC_VEC_PACK_TRUNC_EXPR::t_code_c:
	return ((Context *) this)->call_type_VEC_PACK_TRUNC_EXPR (t);
	break;


      case TC_VEC_PACK_SAT_EXPR::t_code_c:
	return ((Context *) this)->call_type_VEC_PACK_SAT_EXPR (t);
	break;


      case TC_VEC_PACK_FIX_TRUNC_EXPR::t_code_c:
	return ((Context *) this)->call_type_VEC_PACK_FIX_TRUNC_EXPR (t);
	break;


      case TC_VEC_WIDEN_LSHIFT_HI_EXPR::t_code_c:
	return ((Context *) this)->call_type_VEC_WIDEN_LSHIFT_HI_EXPR (t);
	break;


      case TC_VEC_WIDEN_LSHIFT_LO_EXPR::t_code_c:
	return ((Context *) this)->call_type_VEC_WIDEN_LSHIFT_LO_EXPR (t);
	break;


      case TC_PREDICT_EXPR::t_code_c:
	return ((Context *) this)->call_type_PREDICT_EXPR (t);
	break;


      case TC_OPTIMIZATION_NODE::t_code_c:
	return ((Context *) this)->call_type_OPTIMIZATION_NODE (t);
	break;


      case TC_TARGET_OPTION_NODE::t_code_c:
	return ((Context *) this)->call_type_TARGET_OPTION_NODE (t);
	break;


      case TC_ANNOTATE_EXPR::t_code_c:
	return ((Context *) this)->call_type_ANNOTATE_EXPR (t);
	break;


      case TC_CILK_SPAWN_STMT::t_code_c:
	return ((Context *) this)->call_type_CILK_SPAWN_STMT (t);
	break;


      case TC_CILK_SYNC_STMT::t_code_c:
	return ((Context *) this)->call_type_CILK_SYNC_STMT (t);
	break;

      default:
	enum tree_code tc = t->typed.base.code;
	cerr << "TODO: UKNOWN switchcall " << get_tree_code_name (tc) << endl;
	break;
      }

  }
示例#8
0
static void
dequeue_and_dump (dump_info_p di)
{
  dump_queue_p dq;
  splay_tree_node stn;
  dump_node_info_p dni;
  tree t;
  unsigned int index;
  enum tree_code code;
  enum tree_code_class code_class;
  const char* code_name;

  /* Get the next node from the queue.  */
  dq = di->queue;
  stn = dq->node;
  t = (tree) stn->key;
  dni = (dump_node_info_p) stn->value;
  index = dni->index;

  /* Remove the node from the queue, and put it on the free list.  */
  di->queue = dq->next;
  if (!di->queue)
    di->queue_end = 0;
  dq->next = di->free_list;
  di->free_list = dq;

  /* Print the node index.  */
  dump_index (di, index);
  /* And the type of node this is.  */
  if (dni->binfo_p)
    code_name = "binfo";
  else
    code_name = get_tree_code_name (TREE_CODE (t));
  fprintf (di->stream, "%-16s ", code_name);
  di->column = 25;

  /* Figure out what kind of node this is.  */
  code = TREE_CODE (t);
  code_class = TREE_CODE_CLASS (code);

  /* Although BINFOs are TREE_VECs, we dump them specially so as to be
     more informative.  */
  if (dni->binfo_p)
    {
      unsigned ix;
      tree base;
      vec<tree, va_gc> *accesses = BINFO_BASE_ACCESSES (t);

      dump_child ("type", BINFO_TYPE (t));

      if (BINFO_VIRTUAL_P (t))
	dump_string_field (di, "spec", "virt");

      dump_int (di, "bases", BINFO_N_BASE_BINFOS (t));
      for (ix = 0; BINFO_BASE_ITERATE (t, ix, base); ix++)
	{
	  tree access = (accesses ? (*accesses)[ix] : access_public_node);
	  const char *string = NULL;

	  if (access == access_public_node)
	    string = "pub";
	  else if (access == access_protected_node)
	    string = "prot";
	  else if (access == access_private_node)
	    string = "priv";
	  else
	    gcc_unreachable ();

	  dump_string_field (di, "accs", string);
	  queue_and_dump_index (di, "binf", base, DUMP_BINFO);
	}

      goto done;
    }

  /* We can knock off a bunch of expression nodes in exactly the same
     way.  */
  if (IS_EXPR_CODE_CLASS (code_class))
    {
      /* If we're dumping children, dump them now.  */
      queue_and_dump_type (di, t);

      switch (code_class)
	{
	case tcc_unary:
	  dump_child ("op 0", TREE_OPERAND (t, 0));
	  break;

	case tcc_binary:
	case tcc_comparison:
	  dump_child ("op 0", TREE_OPERAND (t, 0));
	  dump_child ("op 1", TREE_OPERAND (t, 1));
	  break;

	case tcc_expression:
	case tcc_reference:
	case tcc_statement:
	case tcc_vl_exp:
	  /* These nodes are handled explicitly below.  */
	  break;

	default:
	  gcc_unreachable ();
	}
    }
  else if (DECL_P (t))
    {
      expanded_location xloc;
      /* All declarations have names.  */
      if (DECL_NAME (t))
	dump_child ("name", DECL_NAME (t));
      if (DECL_ASSEMBLER_NAME_SET_P (t)
	  && DECL_ASSEMBLER_NAME (t) != DECL_NAME (t))
	dump_child ("mngl", DECL_ASSEMBLER_NAME (t));
      if (DECL_ABSTRACT_ORIGIN (t))
        dump_child ("orig", DECL_ABSTRACT_ORIGIN (t));
      /* And types.  */
      queue_and_dump_type (di, t);
      dump_child ("scpe", DECL_CONTEXT (t));
      /* And a source position.  */
      xloc = expand_location (DECL_SOURCE_LOCATION (t));
      if (xloc.file)
	{
	  const char *filename = lbasename (xloc.file);

	  dump_maybe_newline (di);
	  fprintf (di->stream, "srcp: %s:%-6d ", filename,
		   xloc.line);
	  di->column += 6 + strlen (filename) + 8;
	}
      /* And any declaration can be compiler-generated.  */
      if (CODE_CONTAINS_STRUCT (TREE_CODE (t), TS_DECL_COMMON)
	  && DECL_ARTIFICIAL (t))
	dump_string_field (di, "note", "artificial");
      if (DECL_CHAIN (t) && !dump_flag (di, TDF_SLIM, NULL))
	dump_child ("chain", DECL_CHAIN (t));
    }
  else if (code_class == tcc_type)
    {
      /* All types have qualifiers.  */
      int quals = lang_hooks.tree_dump.type_quals (t);

      if (quals != TYPE_UNQUALIFIED)
	{
	  fprintf (di->stream, "qual: %c%c%c     ",
		   (quals & TYPE_QUAL_CONST) ? 'c' : ' ',
		   (quals & TYPE_QUAL_VOLATILE) ? 'v' : ' ',
		   (quals & TYPE_QUAL_RESTRICT) ? 'r' : ' ');
	  di->column += 14;
	}

      /* All types have associated declarations.  */
      dump_child ("name", TYPE_NAME (t));

      /* All types have a main variant.  */
      if (TYPE_MAIN_VARIANT (t) != t)
	dump_child ("unql", TYPE_MAIN_VARIANT (t));

      /* And sizes.  */
      dump_child ("size", TYPE_SIZE (t));

      /* All types have alignments.  */
      dump_int (di, "algn", TYPE_ALIGN (t));
    }
  else if (code_class == tcc_constant)
    /* All constants can have types.  */
    queue_and_dump_type (di, t);

  /* Give the language-specific code a chance to print something.  If
     it's completely taken care of things, don't bother printing
     anything more ourselves.  */
  if (lang_hooks.tree_dump.dump_tree (di, t))
    goto done;

  /* Now handle the various kinds of nodes.  */
  switch (code)
    {
      int i;

    case IDENTIFIER_NODE:
      dump_string_field (di, "strg", IDENTIFIER_POINTER (t));
      dump_int (di, "lngt", IDENTIFIER_LENGTH (t));
      break;

    case TREE_LIST:
      dump_child ("purp", TREE_PURPOSE (t));
      dump_child ("valu", TREE_VALUE (t));
      dump_child ("chan", TREE_CHAIN (t));
      break;

    case STATEMENT_LIST:
      {
	tree_stmt_iterator it;
	for (i = 0, it = tsi_start (t); !tsi_end_p (it); tsi_next (&it), i++)
	  {
	    char buffer[32];
	    sprintf (buffer, "%u", i);
	    dump_child (buffer, tsi_stmt (it));
	  }
      }
      break;

    case TREE_VEC:
      dump_int (di, "lngt", TREE_VEC_LENGTH (t));
      for (i = 0; i < TREE_VEC_LENGTH (t); ++i)
	{
	  char buffer[32];
	  sprintf (buffer, "%u", i);
	  dump_child (buffer, TREE_VEC_ELT (t, i));
	}
      break;

    case INTEGER_TYPE:
    case ENUMERAL_TYPE:
      dump_int (di, "prec", TYPE_PRECISION (t));
      dump_string_field (di, "sign", TYPE_UNSIGNED (t) ? "unsigned": "signed");
      dump_child ("min", TYPE_MIN_VALUE (t));
      dump_child ("max", TYPE_MAX_VALUE (t));

      if (code == ENUMERAL_TYPE)
	dump_child ("csts", TYPE_VALUES (t));
      break;

    case REAL_TYPE:
      dump_int (di, "prec", TYPE_PRECISION (t));
      break;

    case FIXED_POINT_TYPE:
      dump_int (di, "prec", TYPE_PRECISION (t));
      dump_string_field (di, "sign", TYPE_UNSIGNED (t) ? "unsigned": "signed");
      dump_string_field (di, "saturating",
			 TYPE_SATURATING (t) ? "saturating": "non-saturating");
      break;

    case POINTER_TYPE:
      dump_child ("ptd", TREE_TYPE (t));
      break;

    case REFERENCE_TYPE:
      dump_child ("refd", TREE_TYPE (t));
      break;

    case METHOD_TYPE:
      dump_child ("clas", TYPE_METHOD_BASETYPE (t));
      /* Fall through.  */

    case FUNCTION_TYPE:
      dump_child ("retn", TREE_TYPE (t));
      dump_child ("prms", TYPE_ARG_TYPES (t));
      break;

    case ARRAY_TYPE:
      dump_child ("elts", TREE_TYPE (t));
      dump_child ("domn", TYPE_DOMAIN (t));
      break;

    case RECORD_TYPE:
    case UNION_TYPE:
      if (TREE_CODE (t) == RECORD_TYPE)
	dump_string_field (di, "tag", "struct");
      else
	dump_string_field (di, "tag", "union");

      dump_child ("flds", TYPE_FIELDS (t));
      dump_child ("fncs", TYPE_METHODS (t));
      queue_and_dump_index (di, "binf", TYPE_BINFO (t),
			    DUMP_BINFO);
      break;

    case CONST_DECL:
      dump_child ("cnst", DECL_INITIAL (t));
      break;

    case DEBUG_EXPR_DECL:
      dump_int (di, "-uid", DEBUG_TEMP_UID (t));
      /* Fall through.  */

    case VAR_DECL:
    case PARM_DECL:
    case FIELD_DECL:
    case RESULT_DECL:
      if (TREE_CODE (t) == PARM_DECL)
	dump_child ("argt", DECL_ARG_TYPE (t));
      else
	dump_child ("init", DECL_INITIAL (t));
      dump_child ("size", DECL_SIZE (t));
      dump_int (di, "algn", DECL_ALIGN (t));

      if (TREE_CODE (t) == FIELD_DECL)
	{
	  if (DECL_FIELD_OFFSET (t))
	    dump_child ("bpos", bit_position (t));
	}
      else if (TREE_CODE (t) == VAR_DECL
	       || TREE_CODE (t) == PARM_DECL)
	{
	  dump_int (di, "used", TREE_USED (t));
	  if (DECL_REGISTER (t))
	    dump_string_field (di, "spec", "register");
	}
      break;

    case FUNCTION_DECL:
      dump_child ("args", DECL_ARGUMENTS (t));
      if (DECL_EXTERNAL (t))
	dump_string_field (di, "body", "undefined");
      if (TREE_PUBLIC (t))
	dump_string_field (di, "link", "extern");
      else
	dump_string_field (di, "link", "static");
      if (DECL_SAVED_TREE (t) && !dump_flag (di, TDF_SLIM, t))
	dump_child ("body", DECL_SAVED_TREE (t));
      break;

    case INTEGER_CST:
      fprintf (di->stream, "int: ");
      print_decs (t, di->stream);
      break;

    case STRING_CST:
      fprintf (di->stream, "strg: %-7s ", TREE_STRING_POINTER (t));
      dump_int (di, "lngt", TREE_STRING_LENGTH (t));
      break;

    case REAL_CST:
      dump_real (di, "valu", TREE_REAL_CST_PTR (t));
      break;

    case FIXED_CST:
      dump_fixed (di, "valu", TREE_FIXED_CST_PTR (t));
      break;

    case TRUTH_NOT_EXPR:
    case ADDR_EXPR:
    case INDIRECT_REF:
    case CLEANUP_POINT_EXPR:
    case SAVE_EXPR:
    case REALPART_EXPR:
    case IMAGPART_EXPR:
      /* These nodes are unary, but do not have code class `1'.  */
      dump_child ("op 0", TREE_OPERAND (t, 0));
      break;

    case TRUTH_ANDIF_EXPR:
    case TRUTH_ORIF_EXPR:
    case INIT_EXPR:
    case MODIFY_EXPR:
    case COMPOUND_EXPR:
    case PREDECREMENT_EXPR:
    case PREINCREMENT_EXPR:
    case POSTDECREMENT_EXPR:
    case POSTINCREMENT_EXPR:
      /* These nodes are binary, but do not have code class `2'.  */
      dump_child ("op 0", TREE_OPERAND (t, 0));
      dump_child ("op 1", TREE_OPERAND (t, 1));
      break;

    case COMPONENT_REF:
    case BIT_FIELD_REF:
      dump_child ("op 0", TREE_OPERAND (t, 0));
      dump_child ("op 1", TREE_OPERAND (t, 1));
      dump_child ("op 2", TREE_OPERAND (t, 2));
      break;

    case ARRAY_REF:
    case ARRAY_RANGE_REF:
      dump_child ("op 0", TREE_OPERAND (t, 0));
      dump_child ("op 1", TREE_OPERAND (t, 1));
      dump_child ("op 2", TREE_OPERAND (t, 2));
      dump_child ("op 3", TREE_OPERAND (t, 3));
      break;

    case COND_EXPR:
      dump_child ("op 0", TREE_OPERAND (t, 0));
      dump_child ("op 1", TREE_OPERAND (t, 1));
      dump_child ("op 2", TREE_OPERAND (t, 2));
      break;

    case TRY_FINALLY_EXPR:
      dump_child ("op 0", TREE_OPERAND (t, 0));
      dump_child ("op 1", TREE_OPERAND (t, 1));
      break;

    case CALL_EXPR:
      {
	int i = 0;
	tree arg;
	call_expr_arg_iterator iter;
	dump_child ("fn", CALL_EXPR_FN (t));
	FOR_EACH_CALL_EXPR_ARG (arg, iter, t)
	  {
	    char buffer[32];
	    sprintf (buffer, "%u", i);
	    dump_child (buffer, arg);
	    i++;
	  }
      }
      break;

    case CONSTRUCTOR:
      {
	unsigned HOST_WIDE_INT cnt;
	tree index, value;
	dump_int (di, "lngt", vec_safe_length (CONSTRUCTOR_ELTS (t)));
	FOR_EACH_CONSTRUCTOR_ELT (CONSTRUCTOR_ELTS (t), cnt, index, value)
	  {
	    dump_child ("idx", index);
	    dump_child ("val", value);
	  }
      }