00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022 #include "config.h"
00023 #include "system.h"
00024 #include "tree.h"
00025 #include "cp-tree.h"
00026 #include "tree-dump.h"
00027
00028 static void dump_access
00029 PARAMS ((dump_info_p, tree));
00030
00031 static void dump_op
00032 PARAMS ((dump_info_p, tree));
00033
00034
00035
00036
00037 static void
00038 dump_access (di, t)
00039 dump_info_p di;
00040 tree t;
00041 {
00042 if (TREE_PROTECTED(t))
00043 dump_string (di, "protected");
00044 else if (TREE_PRIVATE(t))
00045 dump_string (di, "private");
00046 else
00047 dump_string (di, "public");
00048 }
00049
00050
00051
00052
00053 static void
00054 dump_op (di, t)
00055 dump_info_p di;
00056 tree t;
00057 {
00058 switch (DECL_OVERLOADED_OPERATOR_P (t)) {
00059 case NEW_EXPR:
00060 dump_string (di, "new");
00061 break;
00062 case VEC_NEW_EXPR:
00063 dump_string (di, "vecnew");
00064 break;
00065 case DELETE_EXPR:
00066 dump_string (di, "delete");
00067 break;
00068 case VEC_DELETE_EXPR:
00069 dump_string (di, "vecdelete");
00070 break;
00071 case CONVERT_EXPR:
00072 dump_string (di, "pos");
00073 break;
00074 case NEGATE_EXPR:
00075 dump_string (di, "neg");
00076 break;
00077 case ADDR_EXPR:
00078 dump_string (di, "addr");
00079 break;
00080 case INDIRECT_REF:
00081 dump_string(di, "deref");
00082 break;
00083 case BIT_NOT_EXPR:
00084 dump_string(di, "not");
00085 break;
00086 case TRUTH_NOT_EXPR:
00087 dump_string(di, "lnot");
00088 break;
00089 case PREINCREMENT_EXPR:
00090 dump_string(di, "preinc");
00091 break;
00092 case PREDECREMENT_EXPR:
00093 dump_string(di, "predec");
00094 break;
00095 case PLUS_EXPR:
00096 if (DECL_ASSIGNMENT_OPERATOR_P (t))
00097 dump_string (di, "plusassign");
00098 else
00099 dump_string(di, "plus");
00100 break;
00101 case MINUS_EXPR:
00102 if (DECL_ASSIGNMENT_OPERATOR_P (t))
00103 dump_string (di, "minusassign");
00104 else
00105 dump_string(di, "minus");
00106 break;
00107 case MULT_EXPR:
00108 if (DECL_ASSIGNMENT_OPERATOR_P (t))
00109 dump_string (di, "multassign");
00110 else
00111 dump_string (di, "mult");
00112 break;
00113 case TRUNC_DIV_EXPR:
00114 if (DECL_ASSIGNMENT_OPERATOR_P (t))
00115 dump_string (di, "divassign");
00116 else
00117 dump_string (di, "div");
00118 break;
00119 case TRUNC_MOD_EXPR:
00120 if (DECL_ASSIGNMENT_OPERATOR_P (t))
00121 dump_string (di, "modassign");
00122 else
00123 dump_string (di, "mod");
00124 break;
00125 case BIT_AND_EXPR:
00126 if (DECL_ASSIGNMENT_OPERATOR_P (t))
00127 dump_string (di, "andassign");
00128 else
00129 dump_string (di, "and");
00130 break;
00131 case BIT_IOR_EXPR:
00132 if (DECL_ASSIGNMENT_OPERATOR_P (t))
00133 dump_string (di, "orassign");
00134 else
00135 dump_string (di, "or");
00136 break;
00137 case BIT_XOR_EXPR:
00138 if (DECL_ASSIGNMENT_OPERATOR_P (t))
00139 dump_string (di, "xorassign");
00140 else
00141 dump_string (di, "xor");
00142 break;
00143 case LSHIFT_EXPR:
00144 if (DECL_ASSIGNMENT_OPERATOR_P (t))
00145 dump_string (di, "lshiftassign");
00146 else
00147 dump_string (di, "lshift");
00148 break;
00149 case RSHIFT_EXPR:
00150 if (DECL_ASSIGNMENT_OPERATOR_P (t))
00151 dump_string (di, "rshiftassign");
00152 else
00153 dump_string (di, "rshift");
00154 break;
00155 case EQ_EXPR:
00156 dump_string (di, "eq");
00157 break;
00158 case NE_EXPR:
00159 dump_string (di, "ne");
00160 break;
00161 case LT_EXPR:
00162 dump_string (di, "lt");
00163 break;
00164 case GT_EXPR:
00165 dump_string (di, "gt");
00166 break;
00167 case LE_EXPR:
00168 dump_string (di, "le");
00169 break;
00170 case GE_EXPR:
00171 dump_string (di, "ge");
00172 break;
00173 case TRUTH_ANDIF_EXPR:
00174 dump_string (di, "land");
00175 break;
00176 case TRUTH_ORIF_EXPR:
00177 dump_string (di, "lor");
00178 break;
00179 case COMPOUND_EXPR:
00180 dump_string (di, "compound");
00181 break;
00182 case MEMBER_REF:
00183 dump_string (di, "memref");
00184 break;
00185 case COMPONENT_REF:
00186 dump_string (di, "ref");
00187 break;
00188 case ARRAY_REF:
00189 dump_string (di, "subs");
00190 break;
00191 case POSTINCREMENT_EXPR:
00192 dump_string (di, "postinc");
00193 break;
00194 case POSTDECREMENT_EXPR:
00195 dump_string (di, "postdec");
00196 break;
00197 case CALL_EXPR:
00198 dump_string (di, "call");
00199 break;
00200 case NOP_EXPR:
00201 if (DECL_ASSIGNMENT_OPERATOR_P (t))
00202 dump_string (di, "assign");
00203 break;
00204 default:
00205 break;
00206 }
00207 }
00208
00209 int
00210 cp_dump_tree (dump_info, t)
00211 void *dump_info;
00212 tree t;
00213 {
00214 enum tree_code code;
00215 dump_info_p di = (dump_info_p) dump_info;
00216
00217
00218 code = TREE_CODE (t);
00219
00220 if (DECL_P (t))
00221 {
00222 if (DECL_LANG_SPECIFIC (t) && DECL_LANGUAGE (t) != lang_cplusplus)
00223 dump_string (di, language_to_string (DECL_LANGUAGE (t), 0));
00224 }
00225
00226 switch (code)
00227 {
00228 case IDENTIFIER_NODE:
00229 if (IDENTIFIER_OPNAME_P (t))
00230 {
00231 dump_string (di, "operator");
00232 return 1;
00233 }
00234 else if (IDENTIFIER_TYPENAME_P (t))
00235 {
00236 dump_child ("tynm", TREE_TYPE (t));
00237 return 1;
00238 }
00239 else if (t == anonymous_namespace_name)
00240 {
00241 dump_string (di, "unnamed");
00242 return 1;
00243 }
00244 break;
00245
00246 case POINTER_TYPE:
00247 if (TYPE_PTRMEM_P (t))
00248 {
00249 dump_string (di, "ptrmem");
00250 dump_child ("ptd", TYPE_PTRMEM_POINTED_TO_TYPE (t));
00251 dump_child ("cls", TYPE_PTRMEM_CLASS_TYPE (t));
00252 return 1;
00253 }
00254 break;
00255
00256 case RECORD_TYPE:
00257 case UNION_TYPE:
00258 if (TYPE_PTRMEMFUNC_P (t))
00259 {
00260 dump_string (di, "ptrmem");
00261 dump_child ("ptd", TYPE_PTRMEM_POINTED_TO_TYPE (t));
00262 dump_child ("cls", TYPE_PTRMEM_CLASS_TYPE (t));
00263 return 1;
00264 }
00265
00266
00267 if (TYPE_CONTEXT (t) && TREE_CODE (TYPE_CONTEXT (t)) == TREE_CODE (t)
00268 && CLASSTYPE_AS_BASE (TYPE_CONTEXT (t)) == t)
00269 {
00270 dump_child ("bfld", TYPE_CONTEXT (t));
00271 return 1;
00272 }
00273
00274 dump_child ("vfld", TYPE_VFIELD (t));
00275 if (CLASSTYPE_TEMPLATE_SPECIALIZATION(t))
00276 dump_string(di, "spec");
00277
00278 if (!dump_flag (di, TDF_SLIM, t))
00279 {
00280 int i;
00281
00282 for (i = 0; i < CLASSTYPE_N_BASECLASSES (t); ++i)
00283 {
00284 tree base_binfo = BINFO_BASETYPE (TYPE_BINFO (t), i);
00285 dump_child ("base", BINFO_TYPE (base_binfo));
00286 if (TREE_VIA_VIRTUAL (base_binfo))
00287 dump_string (di, "virtual");
00288 dump_access (di, base_binfo);
00289 }
00290 }
00291 break;
00292
00293 case FIELD_DECL:
00294 dump_access (di, t);
00295 if (DECL_MUTABLE_P (t))
00296 dump_string(di, "mutable");
00297 break;
00298
00299 case VAR_DECL:
00300 if (TREE_CODE (CP_DECL_CONTEXT (t)) == RECORD_TYPE)
00301 dump_access (di, t);
00302 if (TREE_STATIC (t) && !TREE_PUBLIC (t))
00303 dump_string (di, "static");
00304 break;
00305
00306 case FUNCTION_DECL:
00307 if (!DECL_THUNK_P (t))
00308 {
00309 if (DECL_OVERLOADED_OPERATOR_P (t)) {
00310 dump_string (di, "operator");
00311 dump_op (di, t);
00312 }
00313 if (DECL_FUNCTION_MEMBER_P (t))
00314 {
00315 dump_string (di, "member");
00316 dump_access (di, t);
00317 }
00318 if (DECL_PURE_VIRTUAL_P (t))
00319 dump_string (di, "pure");
00320 if (DECL_VIRTUAL_P (t))
00321 dump_string (di, "virtual");
00322 if (DECL_CONSTRUCTOR_P (t))
00323 dump_string (di, "constructor");
00324 if (DECL_DESTRUCTOR_P (t))
00325 dump_string (di, "destructor");
00326 if (DECL_CONV_FN_P (t))
00327 dump_string (di, "conversion");
00328 if (DECL_GLOBAL_CTOR_P (t) || DECL_GLOBAL_DTOR_P (t))
00329 {
00330 if (DECL_GLOBAL_CTOR_P (t))
00331 dump_string (di, "global init");
00332 if (DECL_GLOBAL_DTOR_P (t))
00333 dump_string (di, "global fini");
00334 }
00335 if (DECL_FRIEND_PSEUDO_TEMPLATE_INSTANTIATION (t))
00336 dump_string (di, "pseudo tmpl");
00337 }
00338 else
00339 {
00340 dump_string (di, "thunk");
00341 dump_int (di, "dlta", THUNK_DELTA (t));
00342 dump_child ("vcll", THUNK_VCALL_OFFSET (t));
00343 dump_child ("fn", DECL_INITIAL (t));
00344 }
00345 break;
00346
00347 case NAMESPACE_DECL:
00348 if (DECL_NAMESPACE_ALIAS (t))
00349 dump_child ("alis", DECL_NAMESPACE_ALIAS (t));
00350 else if (!dump_flag (di, TDF_SLIM, t))
00351 dump_child ("dcls", cp_namespace_decls (t));
00352 break;
00353
00354 case TEMPLATE_DECL:
00355 dump_child ("rslt", DECL_TEMPLATE_RESULT (t));
00356 dump_child ("inst", DECL_TEMPLATE_INSTANTIATIONS (t));
00357 dump_child ("spcs", DECL_TEMPLATE_SPECIALIZATIONS (t));
00358 dump_child ("prms", DECL_TEMPLATE_PARMS (t));
00359 break;
00360
00361 case OVERLOAD:
00362 dump_child ("crnt", OVL_CURRENT (t));
00363 dump_child ("chan", OVL_CHAIN (t));
00364 break;
00365
00366 case TRY_BLOCK:
00367 dump_stmt (di, t);
00368 if (CLEANUP_P (t))
00369 dump_string (di, "cleanup");
00370 dump_child ("body", TRY_STMTS (t));
00371 dump_child ("hdlr", TRY_HANDLERS (t));
00372 dump_next_stmt (di, t);
00373 break;
00374
00375 case EH_SPEC_BLOCK:
00376 dump_stmt (di, t);
00377 dump_child ("body", EH_SPEC_STMTS (t));
00378 dump_child ("raises", EH_SPEC_RAISES (t));
00379 dump_next_stmt (di, t);
00380 break;
00381
00382 case PTRMEM_CST:
00383 dump_child ("clas", PTRMEM_CST_CLASS (t));
00384 dump_child ("mbr", PTRMEM_CST_MEMBER (t));
00385 break;
00386
00387 case THROW_EXPR:
00388
00389 dump_child ("op 0", TREE_OPERAND (t, 0));
00390 break;
00391
00392 case AGGR_INIT_EXPR:
00393 dump_int (di, "ctor", AGGR_INIT_VIA_CTOR_P (t));
00394 dump_child ("fn", TREE_OPERAND (t, 0));
00395 dump_child ("args", TREE_OPERAND (t, 1));
00396 dump_child ("decl", TREE_OPERAND (t, 2));
00397 break;
00398
00399 case HANDLER:
00400 dump_stmt (di, t);
00401 dump_child ("parm", HANDLER_PARMS (t));
00402 dump_child ("body", HANDLER_BODY (t));
00403 dump_next_stmt (di, t);
00404 break;
00405
00406 case MUST_NOT_THROW_EXPR:
00407 dump_stmt (di, t);
00408 dump_child ("body", TREE_OPERAND (t, 0));
00409 dump_next_stmt (di, t);
00410 break;
00411
00412 case USING_STMT:
00413 dump_stmt (di, t);
00414 dump_child ("nmsp", USING_STMT_NAMESPACE (t));
00415 dump_next_stmt (di, t);
00416 break;
00417
00418 default:
00419 break;
00420 }
00421
00422 return c_dump_tree (di, t);
00423 }