📄 error.c
字号:
case REAL_CST:#ifndef REAL_IS_NOT_DOUBLE sprintf (digit_buffer, "%g", TREE_REAL_CST (t));#else { unsigned char *p = (unsigned char *) &TREE_REAL_CST (t); int i; strcpy (digit_buffer, "0x"); for (i = 0; i < sizeof TREE_REAL_CST (t); i++) sprintf (digit_buffer + 2 + 2*i, "%02x", *p++); }#endif OB_PUTCP (digit_buffer); break; case STRING_CST: { char *p = TREE_STRING_POINTER (t); int len = TREE_STRING_LENGTH (t) - 1; int i; OB_PUTC ('\"'); for (i = 0; i < len; i++) dump_char (p[i]); OB_PUTC ('\"'); } break; case COMPOUND_EXPR: dump_binary_op (",", t); break; case COND_EXPR: OB_PUTC ('('); dump_expr (TREE_OPERAND (t, 0), 0); OB_PUTS (" ? "); dump_expr (TREE_OPERAND (t, 1), 0); OB_PUTS (" : "); dump_expr (TREE_OPERAND (t, 2), 0); OB_PUTC (')'); break; case SAVE_EXPR: if (TREE_HAS_CONSTRUCTOR (t)) { OB_PUTS ("new "); dump_type (TREE_TYPE (TREE_TYPE (t)), 0); PARM_DECL_EXPR (t) = 1; } else { dump_expr (TREE_OPERAND (t, 0), 0); } break; case NEW_EXPR: OB_PUTID (TYPE_IDENTIFIER (TREE_TYPE (t))); OB_PUTC ('('); dump_expr_list (TREE_CHAIN (TREE_OPERAND (t, 1))); OB_PUTC (')'); break; case CALL_EXPR: { tree fn = TREE_OPERAND (t, 0); tree args = TREE_OPERAND (t, 1); if (TREE_CODE (fn) == ADDR_EXPR) fn = TREE_OPERAND (fn, 0); if (NEXT_CODE (fn) == METHOD_TYPE) { tree ob = TREE_VALUE (args); if (TREE_CODE (ob) == ADDR_EXPR) { dump_expr (TREE_OPERAND (ob, 0), 0); OB_PUTC ('.'); } else if (TREE_CODE (ob) != PARM_DECL || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this")) { dump_expr (ob, 0); OB_PUTC2 ('-', '>'); } args = TREE_CHAIN (args); } dump_expr (fn, 0); OB_PUTC('('); dump_expr_list (args); OB_PUTC (')'); } break; case WITH_CLEANUP_EXPR: /* Note that this only works for G++ cleanups. If somebody builds a general cleanup, there's no way to represent it. */ dump_expr (TREE_OPERAND (t, 0), 0); break; case TARGET_EXPR: /* Note that this only works for G++ target exprs. If somebody builds a general TARGET_EXPR, there's no way to represent that it initializes anything other that the parameter slot for the default argument. Note we may have cleared out the first operand in expand_expr, so don't go killing ourselves. */ if (TREE_OPERAND (t, 1)) dump_expr (TREE_OPERAND (t, 1), 0); break; case MODIFY_EXPR: case PLUS_EXPR: case MINUS_EXPR: case MULT_EXPR: case TRUNC_DIV_EXPR: case TRUNC_MOD_EXPR: case MIN_EXPR: case MAX_EXPR: case LSHIFT_EXPR: case RSHIFT_EXPR: case BIT_IOR_EXPR: case BIT_XOR_EXPR: case BIT_AND_EXPR: case BIT_ANDTC_EXPR: case TRUTH_ANDIF_EXPR: case TRUTH_ORIF_EXPR: case LT_EXPR: case LE_EXPR: case GT_EXPR: case GE_EXPR: case EQ_EXPR: case NE_EXPR: dump_binary_op (opname_tab[(int) TREE_CODE (t)], t); break; case CEIL_DIV_EXPR: case FLOOR_DIV_EXPR: case ROUND_DIV_EXPR: dump_binary_op ("/", t); break; case CEIL_MOD_EXPR: case FLOOR_MOD_EXPR: case ROUND_MOD_EXPR: dump_binary_op ("%", t); break; case COMPONENT_REF: { tree ob = TREE_OPERAND (t, 0); if (TREE_CODE (ob) == INDIRECT_REF) { ob = TREE_OPERAND (ob, 0); if (TREE_CODE (ob) != PARM_DECL || strcmp (IDENTIFIER_POINTER (DECL_NAME (ob)), "this")) { dump_expr (ob, 0); OB_PUTC2 ('-', '>'); } } else { dump_expr (ob, 0); OB_PUTC ('.'); } dump_expr (TREE_OPERAND (t, 1), 1); } break; case ARRAY_REF: dump_expr (TREE_OPERAND (t, 0), 0); OB_PUTC ('['); dump_expr (TREE_OPERAND (t, 1), 0); OB_PUTC (']'); break; case CONVERT_EXPR: dump_unary_op ("+", t, nop); break; case ADDR_EXPR: if (TREE_CODE (TREE_OPERAND (t, 0)) == FUNCTION_DECL || TREE_CODE (TREE_OPERAND (t, 0)) == STRING_CST) dump_expr (TREE_OPERAND (t, 0), 0); else dump_unary_op ("&", t, nop); break; case INDIRECT_REF: if (TREE_HAS_CONSTRUCTOR (t)) { t = TREE_OPERAND (t, 0); my_friendly_assert (TREE_CODE (t) == CALL_EXPR, 237); dump_expr (TREE_OPERAND (t, 0), 0); OB_PUTC ('('); dump_expr_list (TREE_CHAIN (TREE_OPERAND (t, 1))); OB_PUTC (')'); } else { if (NEXT_CODE (TREE_OPERAND (t, 0)) == REFERENCE_TYPE) dump_expr (TREE_OPERAND (t, 0), nop); else dump_unary_op ("*", t, nop); } break; case NEGATE_EXPR: case BIT_NOT_EXPR: case TRUTH_NOT_EXPR: case PREDECREMENT_EXPR: case PREINCREMENT_EXPR: dump_unary_op (opname_tab [(int)TREE_CODE (t)], t, nop); break; case POSTDECREMENT_EXPR: case POSTINCREMENT_EXPR: OB_PUTC ('('); dump_expr (TREE_OPERAND (t, 0), 0); OB_PUTCP (opname_tab[(int)TREE_CODE (t)]); OB_PUTC (')'); break; case NON_LVALUE_EXPR: /* FIXME: This is a KLUDGE workaround for a parsing problem. There should be another level of INDIRECT_REF so that I don't have to do this. */ if (NEXT_CODE (t) == POINTER_TYPE) { tree next = TREE_TYPE (TREE_TYPE (t)); while (TREE_CODE (next) == POINTER_TYPE) next = TREE_TYPE (next); if (TREE_CODE (next) == FUNCTION_TYPE) { if (!nop) OB_PUTC ('('); OB_PUTC ('*'); dump_expr (TREE_OPERAND (t, 0), 1); if (!nop) OB_PUTC (')'); break; } /* else FALLTHRU */ } dump_expr (TREE_OPERAND (t, 0), 0); break; case NOP_EXPR: dump_expr (TREE_OPERAND (t, 0), nop); break; case CONSTRUCTOR: OB_PUTC ('{'); dump_expr_list (CONSTRUCTOR_ELTS (t), 0); OB_PUTC ('}'); break; case OFFSET_REF: { tree ob = TREE_OPERAND (t, 0); if (TREE_CODE (ob) == NOP_EXPR && TREE_OPERAND (ob, 0) == error_mark_node && TREE_CODE (TREE_OPERAND (t, 1)) == FUNCTION_DECL) /* A::f */ dump_expr (TREE_OPERAND (t, 1), 0); else { sorry ("operand of OFFSET_REF not understood"); goto error; } break; } case TREE_LIST: if (TREE_VALUE (t) && TREE_CODE (TREE_VALUE (t)) == FUNCTION_DECL) { OB_PUTID (DECL_NAME (TREE_VALUE (t))); break; } /* else fall through */ /* This list is incomplete, but should suffice for now. It is very important that `sorry' does not call `report_error_function'. That could cause an infinite loop. */ default: sorry ("`%s' not supported by dump_expr", tree_code_name[(int) TREE_CODE (t)]); /* fall through to ERROR_MARK... */ case ERROR_MARK: error: OB_PUTCP ("{error}"); break; }}static voiddump_binary_op (opstring, t) char *opstring; tree t;{ OB_PUTC ('('); dump_expr (TREE_OPERAND (t, 0), 1); OB_PUTC (' '); OB_PUTCP (opstring); OB_PUTC (' '); dump_expr (TREE_OPERAND (t, 1), 1); OB_PUTC (')');}static voiddump_unary_op (opstring, t, nop) char *opstring; tree t; int nop;{ if (!nop) OB_PUTC ('('); OB_PUTCP (opstring); dump_expr (TREE_OPERAND (t, 0), 1); if (!nop) OB_PUTC (')');}char *fndecl_as_string (cname, fndecl, print_ret_type_p) tree cname, fndecl; int print_ret_type_p;{ return decl_as_string (fndecl, print_ret_type_p);}/* Same, but handtype a _TYPE. Called from convert_to_reference, mangle_class_name_for_template, build_unary_op, and GNU_xref_decl. */char *type_as_string (typ, v) tree typ; int v;{ OB_INIT (); dump_type (typ, v); OB_FINISH (); return (char *)obstack_base (&scratch_obstack);}char *expr_as_string (decl, v) tree decl; int v;{ OB_INIT (); dump_expr (decl, 1); OB_FINISH (); return (char *)obstack_base (&scratch_obstack);}/* A cross between type_as_string and fndecl_as_string. Only called from substitute_nice_name. */char *decl_as_string (decl, v) tree decl; int v;{ OB_INIT (); dump_decl (decl, v); OB_FINISH (); return (char *)obstack_base (&scratch_obstack);}char *cp_file_of (t) tree t;{ if (TREE_CODE (t) == PARM_DECL) return DECL_SOURCE_FILE (DECL_CONTEXT (t)); else if (TREE_CODE_CLASS (TREE_CODE (t)) == 't') return DECL_SOURCE_FILE (TYPE_NAME (t)); else return DECL_SOURCE_FILE (t);}intcp_line_of (t) tree t;{ int line = 0; if (TREE_CODE (t) == PARM_DECL) line = DECL_SOURCE_LINE (DECL_CONTEXT (t)); if (TREE_CODE (t) == TYPE_DECL && DECL_ARTIFICIAL (t)) t = TREE_TYPE (t); if (TREE_CODE_CLASS (TREE_CODE (t)) == 't') { if (IS_AGGR_TYPE (t)) line = CLASSTYPE_SOURCE_LINE (t); else line = DECL_SOURCE_LINE (TYPE_NAME (t)); } else line = DECL_SOURCE_LINE (t); if (line == 0) return lineno; return line;}char *code_as_string (c, v) enum tree_code c; int v;{ return tree_code_name [c];}char *language_as_string (c, v) enum languages c; int v;{ switch (c) { case lang_c: return "C"; case lang_cplusplus: return "C++"; default: my_friendly_abort (355); return 0; }}/* Return the proper printed version of a parameter to a C++ function. */char *parm_as_string (p, v) int p, v;{ if (p < 0) return "`this'"; sprintf (digit_buffer, "%d", p+1); return digit_buffer;}char *op_as_string (p, v) enum tree_code p; int v;{ static char buf[] = "operator "; if (p == 0) return "{unknown}"; strcpy (buf + 9, opname_tab [p]); return buf;}char *args_as_string (p, v) tree p; int v;{ if (p == NULL_TREE) return "..."; return type_as_string (p, v);}char *cv_as_string (p, v) tree p; int v;{ OB_INIT (); dump_readonly_or_volatile (p, before); OB_FINISH (); return (char *)obstack_base (&scratch_obstack);}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -