00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032 #include "gnu_config.h"
00033
00034 #include <assert.h>
00035 #include <limits.h>
00036 #include <stdio.h>
00037
00038 extern "C" {
00039 #include "gnu/tree.h"
00040 #include "cp-tree.h"
00041 }
00042
00043 #include <hash_map>
00044 #include <hash_set>
00045 #include <vector>
00046
00047
00048
00049
00050
00051
00052
00053 void verify_namespace(tree ns);
00054 void verify_global_namespace(tree ns);
00055 enum scope { namespace_scope, class_scope, function_scope };
00056 void verify_decl(tree decl, scope sc);
00057 void verify_template_decl(tree decl, scope sc);
00058 void verity_overload(tree ovl);
00059 const char* verify_identifier(tree id);
00060 const char* verity_ordinary_identifier(tree id);
00061 void verify_function(tree fn);
00062 void verify_ctor_initializer(tree ctor);
00063 void verify_overload(tree fn, tree ns);
00064 tree verify_label_decl(tree);
00065 void verify_const_decl(tree);
00066 void verify_var_decl(tree);
00067 void verify_parm_decl(tree);
00068 void verify_field_decl(tree);
00069
00070
00071 void verify_expr(tree expr);
00072 void verify_integer_cst(tree);
00073 void verify_string_cst(tree);
00074 void verify_simple_string_cst(tree);
00075 void verify_ptrmem_cst(tree);
00076 void verify_negate_expr(tree);
00077 void verify_bit_not_expr(tree);
00078 void verify_truth_not_expr(tree);
00079 void verify_incr_or_decr(tree);
00080 void verify_addr_expr(tree);
00081 void verify_indirect_ref(tree);
00082 void verify_trunc_expr(tree);
00083 void verify_float_expr(tree);
00084 void verify_nop_expr(tree);
00085 void verify_convert_expr(tree);
00086 void verify_throw_expr(tree);
00087 void verify_shift_expr(tree);
00088 void verify_bitwise_binary_op(tree);
00089 void verify_logical_binary_op(tree);
00090 void verify_arithmetic_binary_op(tree);
00091 void verify_comparison(tree);
00092 void verify_modify_expr(tree);
00093 void verify_component_ref(tree);
00094 void verify_compound_expr(tree);
00095 void verify_cond_expr(tree);
00096 void verify_call_expr(tree);
00097 void verify_bind_expr(tree);
00098 void verify_constructor_expr(tree);
00099 void verify_init_expr(tree);
00100 void verify_save_expr(tree);
00101 void verify_target_expr(tree);
00102 void verify_array_ref(tree);
00103 bool is_expr_code(tree_code);
00104
00105
00106 void verify_statement(tree stmt);
00107 void verify_asm_statement(tree);
00108 void verify_case_label(tree);
00109 void verify_decl_statement(tree);
00110 void verify_var_decl_statement(tree);
00111 void verify_do_statement(tree);
00112 void verify_for_statement(tree);
00113 void verify_goto_statement(tree);
00114 void verify_if_statement(tree);
00115 void verify_return_statement(tree);
00116 void verify_switch_statement(tree);
00117 void verify_try_block(tree);
00118 void verify_while_statement(tree);
00119 void verify_compound_statement(tree stmt);
00120 void verify_cleanup_statement(tree);
00121 void verify_scope_statement(tree);
00122 void verify_controlling_expr(tree parent, tree t);
00123
00124
00125 void verify_type(tree type);
00126 void verify_integer_type(tree);
00127 void verify_real_type(tree);
00128 void verify_complex_type(tree);
00129 void verify_enumeral_type(tree);
00130 void verify_pointer_type(tree);
00131 void verify_reference_type(tree);
00132 void verify_function_type(tree);
00133 void verify_method_type(tree);
00134 void verify_function_arguments(tree);
00135 void verify_array_type(tree);
00136 void verify_class_type(tree);
00137 const char* verify_named_type(tree);
00138 void verify_type_name_is(tree, const char*);
00139
00140
00141 const char* verify_ordinary_identifier(tree);
00142 const char* verify_identifier(tree id);
00143
00144
00145 tree ancestor_is_function(tree);
00146 bool ancestor_is_loop(tree);
00147 bool ancestor_is_switch(tree);
00148 bool is_integral_type(tree);
00149 bool is_numeric_scalar_type(tree);
00150 bool is_integral_constant_expression(tree);
00151 unsigned long integer_cst_remainder(tree a, unsigned long N);
00152 bool integer_cst_le(size_t x, tree y);
00153
00154
00155
00156
00157
00158
00159
00160
00161
00162
00163
00164
00165
00166
00167
00168
00169
00170
00171
00172 tree get_parent(tree);
00173 tree get_parent_or_null(tree);
00174 void verify_parentless(tree);
00175 void add_child_to_map(tree parent, tree child);
00176
00177 bool tree_node_already_seen(tree);
00178 void mark_tree_node_as_seen(tree);
00179
00180
00181
00182
00183 void verify_global_namespace(tree ns)
00184 {
00185
00186 assert(ns != NULL_TREE);
00187 assert(TREE_CODE(ns) == NAMESPACE_DECL);
00188
00189
00190 assert(ns == global_namespace);
00191
00192
00193 assert(get_parent_or_null(ns) == NULL_TREE);
00194 assert(DECL_CONTEXT(ns) == NULL_TREE);
00195
00196
00197 assert(strcmp(verify_ordinary_identifier(DECL_NAME(ns)), "::") == 0);
00198 }
00199
00200 void verify_namespace(tree ns)
00201 {
00202
00203 assert(ns != NULL_TREE);
00204 assert(TREE_CODE(ns) == NAMESPACE_DECL);
00205
00206
00207 if (ns == std_node) {
00208
00209 assert(!flag_honor_std);
00210
00211
00212 verify_global_namespace(get_parent(ns));
00213 }
00214
00215
00216 else {
00217
00218 const char* name = verify_ordinary_identifier(DECL_NAME(ns));
00219
00220
00221 if (ns == global_namespace ||
00222 get_parent_or_null(ns) == NULL_TREE ||
00223 DECL_CONTEXT(ns) == NULL_TREE ||
00224 strcmp(name, "::") == 0)
00225 verify_global_namespace(ns);
00226
00227
00228 for (tree t = cp_namespace_decls(ns) ; t != NULL_TREE ; t = TREE_CHAIN(t)) {
00229
00230
00231 assert(TREE_CODE_CLASS(TREE_CODE(t)) == 'd' || TREE_CODE(t) == TREE_LIST);
00232
00233
00234 if (TREE_CODE(t) == TREE_LIST) {
00235 verify_overload(TREE_VALUE(t), ns);
00236 assert(TREE_PURPOSE(t) == NULL_TREE);
00237 }
00238
00239
00240 else {
00241 add_child_to_map(ns, t);
00242 verify_decl(t, namespace_scope);
00243 }
00244 }
00245 }
00246 }
00247
00248 void verify_decl(tree decl, scope sc) {
00249
00250
00251
00252
00253 assert(decl != NULL_TREE);
00254 const tree_code code = TREE_CODE(decl);
00255 assert(TREE_CODE_CLASS(code) == 'd');
00256
00257
00258
00259
00260 if (code != FUNCTION_DECL && code != TYPE_DECL)
00261 verify_ordinary_identifier(DECL_NAME(decl));
00262
00263
00264 tree type = TREE_TYPE(decl);
00265 assert(type != NULL_TREE);
00266 bool is_integer = TREE_CODE(type) == INTEGER_TYPE;
00267 verify_type(type);
00268
00269
00270 const char* file = DECL_SOURCE_FILE(decl);
00271 assert(file != 0);
00272 assert(strlen(file) != 0);
00273 assert(DECL_SOURCE_LINE(decl) >= 0);
00274
00275
00276 switch(code) {
00277 case FUNCTION_DECL:
00278
00279 assert(sc == namespace_scope || sc == class_scope);
00280
00281 verify_function(decl);
00282 break;
00283
00284 case LABEL_DECL:
00285 assert(sc == function_scope);
00286 verify_label_decl(decl);
00287 break;
00288
00289 case CONST_DECL:
00290 assert(sc == namespace_scope || sc == class_scope || sc == function_scope);
00291 verify_const_decl(decl);
00292 break;
00293
00294 case TYPE_DECL:
00295 assert(sc == namespace_scope || sc == class_scope || sc == function_scope);
00296
00297
00298
00299 if (is_integer && DECL_NAME(type) == NULL_TREE) {
00300 }
00301 else
00302 verify_ordinary_identifier(DECL_NAME(decl));
00303 break;
00304
00305 case VAR_DECL:
00306
00307 assert(sc == namespace_scope || sc == function_scope);
00308 verify_var_decl(decl);
00309 break;
00310
00311 case PARM_DECL:
00312 assert(sc == function_scope);
00313 verify_parm_decl(decl);
00314 break;
00315
00316 case RESULT_DECL:
00317 assert(sc == function_scope);
00318 fprintf(stderr, "RESULT_DECLs should never occur in the IR\n");
00319 assert(0);
00320
00321 case FIELD_DECL:
00322 assert(sc == class_scope);
00323 verify_field_decl(decl);
00324 break;
00325
00326 case NAMESPACE_DECL:
00327 assert(sc == namespace_scope);
00328 verify_namespace(decl);
00329 break;
00330
00331 case TEMPLATE_DECL:
00332 assert(sc == namespace_scope || sc == class_scope || sc == function_scope);
00333 verify_template_decl(decl, sc);
00334 break;
00335
00336 case THUNK_DECL:
00337 assert(sc == class_scope || sc == namespace_scope);
00338 fprintf(stderr, "THUNK_DECLs should never occur in the IR\n");
00339 assert(0);
00340
00341 case USING_DECL:
00342 assert(sc == namespace_scope || sc == class_scope || sc == function_scope);
00343
00344 break;
00345
00346 default:
00347 fprintf(stderr, "Unknown tree code %d\n", (int) code);
00348 assert(0);
00349 }
00350 }
00351
00352 void verify_template_decl(tree tmpl, scope sc)
00353 {
00354 assert(tmpl != NULL_TREE);
00355 assert(TREE_CODE(tmpl) == TEMPLATE_DECL);
00356
00357
00358 tree spec = DECL_TEMPLATE_SPECIALIZATIONS(tmpl);
00359 while (spec != NULL_TREE) {
00360 assert(TREE_CODE(spec) == TREE_LIST);
00361 tree decl = TREE_VALUE(spec);
00362 assert(decl != NULL_TREE);
00363
00364 switch(TREE_CODE(decl)) {
00365 case TEMPLATE_DECL:
00366 break;
00367 case FUNCTION_DECL:
00368 add_child_to_map(tmpl, decl);
00369 verify_decl(decl, sc);
00370 break;
00371 default:
00372 fprintf(stderr, "Unknown tree code in tmpl specialization list",
00373 (int) TREE_CODE(decl));
00374 assert(0);
00375 }
00376
00377 spec = TREE_CHAIN(spec);
00378 }
00379 }
00380
00381
00382
00383
00384 void verify_overload(tree ovl, tree enclosing_namespace)
00385 {
00386 assert(ovl != NULL_TREE);
00387 assert(enclosing_namespace != NULL_TREE);
00388 assert(TREE_CODE(enclosing_namespace) == NAMESPACE_DECL);
00389
00390 while (ovl != NULL_TREE) {
00391 assert(TREE_CODE(ovl) == OVERLOAD);
00392
00393 tree fn = OVL_CURRENT(ovl);
00394 assert(fn != NULL_TREE);
00395 assert(TREE_CODE(fn) == FUNCTION_DECL);
00396 add_child_to_map(enclosing_namespace, fn);
00397 verify_decl(fn, namespace_scope);
00398
00399 ovl = OVL_NEXT(ovl);
00400 }
00401 }
00402
00403 void verify_function(tree fn)
00404 {
00405
00406 assert(fn != NULL_TREE);
00407 assert(TREE_CODE(fn) == FUNCTION_DECL);
00408
00409 if (tree_node_already_seen(fn))
00410 return;
00411 mark_tree_node_as_seen(fn);
00412
00413
00414 if (!DECL_CONSTRUCTOR_P(fn) &&
00415 !DECL_DESTRUCTOR_P(fn) &&
00416 !DECL_OVERLOADED_OPERATOR_P(fn) &&
00417 !DECL_CONV_FN_P(fn) &&
00418 !DECL_ARTIFICIAL(fn))
00419 verify_ordinary_identifier(DECL_NAME(fn));
00420
00421
00422 tree id = DECL_ASSEMBLER_NAME(fn);
00423 assert(id != NULL_TREE);
00424 assert(TREE_CODE(id) == IDENTIFIER_NODE);
00425 assert(IDENTIFIER_LENGTH(id) > 0);
00426 assert(IDENTIFIER_POINTER(id) != 0);
00427 assert(IDENTIFIER_LENGTH(id) == strlen(IDENTIFIER_POINTER(id)));
00428
00429 #if 0
00430
00431
00432 assert((DECL_EXTERNAL_LINKAGE_P(fn) && !DECL_INTERNAL_LINKAGE_P(fn)) ||
00433 (DECL_INTERNAL_LINKAGE_P(fn) && !DECL_EXTERNAL_LINKAGE_P(fn)));
00434 if (DECL_LINKONCE_P(fn))
00435 assert(DECL_EXTERNAL_LINKAGE_P(fn));
00436 #endif
00437
00438
00439 if (DECL_CONSTRUCTOR_P(fn) || DECL_DESTRUCTOR_P(fn) || DECL_CONV_FN_P(fn))
00440 assert(DECL_FUNCTION_MEMBER_P(fn));
00441
00442
00443
00444
00445
00446 tree context = DECL_CONTEXT(fn);
00447 if (DECL_FUNCTION_MEMBER_P(fn)) {
00448 assert(context != NULL_TREE);
00449 assert(TREE_CODE(context) == RECORD_TYPE ||
00450 TREE_CODE(context) == UNION_TYPE);
00451 }
00452 else
00453 assert(context == NULL_TREE);
00454
00455 tree parent = get_parent_or_null(fn);
00456 if (parent != NULL_TREE) {
00457 const tree_code parent_code = TREE_CODE(parent);
00458 if (DECL_FUNCTION_MEMBER_P(fn)) {
00459 assert(parent_code == RECORD_TYPE || parent_code == UNION_TYPE);
00460 assert(context != NULL_TREE);
00461 assert(same_type_p(TYPE_MAIN_VARIANT(context),
00462 TYPE_MAIN_VARIANT(parent)));
00463 }
00464 else if (parent_code == TEMPLATE_DECL)
00465 assert(TREE_CODE(get_parent(parent)) == NAMESPACE_DECL);
00466 else
00467 assert(parent_code == NAMESPACE_DECL);
00468 }
00469
00470
00471 for (tree arg = DECL_ARGUMENTS(fn); arg ; arg = TREE_CHAIN(arg)) {
00472
00473
00474 assert(TREE_CODE(arg) == PARM_DECL);
00475
00476
00477 add_child_to_map(fn, arg);
00478
00479
00480 verify_decl(arg, function_scope);
00481 }
00482
00483
00484
00485 tree init = DECL_INITIAL(fn);
00486 assert((init == NULL_TREE) == (DECL_SAVED_TREE(fn) == NULL_TREE));
00487 assert(init == NULL_TREE || init == error_mark_node ||
00488 TREE_CODE(init) == BLOCK);
00489
00490 tree body = DECL_SAVED_TREE(fn);
00491 if (body != NULL_TREE) {
00492
00493
00494
00495
00496 if (TREE_CODE(body) == RETURN_INIT) {
00497
00498 assert(!DECL_CONSTRUCTOR_P(fn));
00499
00500
00501 add_child_to_map(fn, body);
00502
00503
00504
00505 body = TREE_CHAIN(body);
00506 assert(body != NULL_TREE);
00507 }
00508
00509 while (body != NULL_TREE) {
00510 add_child_to_map(fn, body);
00511 verify_statement(body);
00512 body = TREE_CHAIN(body);
00513 }
00514
00515
00516 }
00517 }
00518
00519 void verify_ctor_initializer(tree ctor)
00520 {
00521 assert(ctor != NULL_TREE);
00522 assert(TREE_CODE(ctor) == CTOR_INITIALIZER);
00523
00524
00525
00526 tree ctor_body = TREE_CHAIN(ctor);
00527 assert(ctor_body != NULL_TREE);
00528 assert(TREE_CODE(ctor_body) == COMPOUND_STMT);
00529 add_child_to_map(ctor, ctor_body);
00530 verify_compound_statement(ctor_body);
00531 }
00532
00533
00534 tree verify_label_decl(tree decl)
00535 {
00536 assert(decl != NULL_TREE);
00537 assert(TREE_CODE(decl) == LABEL_DECL);
00538
00539 verify_ordinary_identifier(DECL_NAME(decl));
00540
00541 tree fn = ancestor_is_function(decl);
00542 assert(fn != NULL_TREE);
00543 return fn;
00544 }
00545
00546 void verify_const_decl(tree decl)
00547 {
00548 assert(decl != NULL_TREE);
00549 assert(TREE_CODE(decl) == CONST_DECL);
00550
00551
00552 verify_ordinary_identifier(DECL_NAME(decl));
00553
00554
00555 tree decl_type = TREE_TYPE(decl);
00556 assert(decl_type != NULL_TREE);
00557 assert(TREE_CODE_CLASS(TREE_CODE(decl_type)) == 't');
00558
00559
00560 tree value = DECL_INITIAL(decl);
00561 assert(value != NULL_TREE);
00562 assert(TREE_CODE(value) == INTEGER_CST);
00563
00564
00565 tree value_type = TREE_TYPE(value);
00566 assert(value_type != NULL_TREE);
00567 assert(TREE_CODE_CLASS(TREE_CODE(value_type)) == 't');
00568
00569
00570 assert(same_type_p(decl_type, value_type));
00571 }
00572
00573 void verify_var_decl(tree decl)
00574 {
00575 assert(decl != NULL_TREE);
00576 assert(TREE_CODE(decl) == VAR_DECL);
00577
00578
00579 tree var_type = TREE_TYPE(decl);
00580 assert(var_type != NULL_TREE);
00581 assert(TREE_CODE_CLASS(TREE_CODE(var_type)) == 't');
00582
00583
00584 assert(!tree_int_cst_lt(DECL_SIZE(decl), TYPE_SIZE(var_type)));
00585
00586
00587 assert(DECL_ALIGN(decl) > 0);
00588 assert((DECL_ALIGN(decl) % CHAR_BIT) == 0);
00589
00590
00591
00592 tree initializer = DECL_INITIAL(decl);
00593 if (initializer != NULL_TREE) {
00594
00595
00596
00597 assert(is_expr_code(TREE_CODE(initializer)));
00598
00599
00600 tree initializer_type = TREE_TYPE(initializer);
00601 assert(initializer_type != NULL_TREE);
00602 assert(TREE_CODE_CLASS(TREE_CODE(initializer_type)) == 't');
00603 verify_type(initializer_type);
00604 assert(same_type_p(var_type, initializer_type));
00605
00606
00607 verify_expr(initializer);
00608 }
00609 }
00610
00611 void verify_parm_decl(tree decl)
00612 {
00613 assert(decl != NULL_TREE);
00614 assert(TREE_CODE(decl) == PARM_DECL);
00615
00616
00617 tree var_type = TREE_TYPE(decl);
00618 assert(var_type != NULL_TREE);
00619 assert(TREE_CODE_CLASS(TREE_CODE(var_type)) == 't');
00620
00621
00622 assert(!tree_int_cst_lt(DECL_SIZE(decl), TYPE_SIZE(var_type)));
00623
00624
00625 assert(DECL_ALIGN(decl) > 0);
00626 assert((DECL_ALIGN(decl) % CHAR_BIT) == 0);
00627
00628
00629
00630
00631
00632 tree chain = TREE_CHAIN(decl);
00633 assert(chain == NULL_TREE || TREE_CODE(chain) == PARM_DECL);
00634
00635
00636 tree fn = get_parent(decl);
00637 assert(TREE_CODE(fn) == FUNCTION_DECL);
00638
00639 tree cur = DECL_ARGUMENTS(fn);
00640 while (cur != NULL_TREE && cur != decl)
00641 cur = TREE_CHAIN(cur);
00642 assert(cur == decl);
00643 }
00644
00645 void verify_field_decl(tree decl)
00646 {
00647 assert(decl != NULL_TREE);
00648 assert(TREE_CODE(decl) == FIELD_DECL);
00649
00650
00651 tree field_type = TREE_TYPE(decl);
00652 assert(field_type != NULL_TREE);
00653 assert(TREE_CODE_CLASS(TREE_CODE(field_type)) == 't');
00654
00655
00656
00657
00658 assert(!tree_int_cst_lt(DECL_SIZE(decl), integer_zero_node));
00659 assert(DECL_ALIGN(decl) > 0);
00660 assert((DECL_ALIGN(decl) % CHAR_BIT) == 0);
00661
00662 tree offset = DECL_FIELD_BITPOS(decl);
00663 assert(offset != NULL_TREE);
00664 assert(TREE_CODE(offset) == INTEGER_CST);
00665 assert(tree_int_cst_sgn(offset) >= 0);
00666 assert(integer_cst_remainder(offset, DECL_ALIGN(decl)) == 0);
00667
00668
00669 tree chain = TREE_CHAIN(decl);
00670 assert(chain == NULL_TREE ||
00671 TREE_CODE(chain) == FIELD_DECL ||
00672 TREE_CODE(chain) == VAR_DECL ||
00673 TREE_CODE(chain) == TYPE_DECL ||
00674 TREE_CODE(chain) == CONST_DECL);
00675
00676
00677 tree parent = get_parent(decl);
00678 tree context = DECL_CONTEXT(decl);
00679 assert(context != NULL_TREE);
00680 assert(TREE_CODE(parent) == RECORD_TYPE || TREE_CODE(parent) == UNION_TYPE);
00681 assert(TREE_CODE(context) == RECORD_TYPE ||
00682 TREE_CODE(context) == UNION_TYPE);
00683 assert(same_type_p(TYPE_MAIN_VARIANT(parent), TYPE_MAIN_VARIANT(context)));
00684
00685 tree cur = TYPE_FIELDS(parent);
00686 while (cur != NULL_TREE && cur != decl)
00687 cur = TREE_CHAIN(cur);
00688 assert(cur == decl);
00689 }
00690
00691
00692
00693 void verify_statement(tree st)
00694 {
00695
00696
00697 assert(st != NULL_TREE);
00698 const tree_code code = TREE_CODE(st);
00699 assert(code == CASE_LABEL || code == LABEL_DECL ||
00700 TREE_CODE_CLASS(code) == 'e');
00701
00702
00703
00704 if (code == LABEL_DECL)
00705 assert(DECL_SOURCE_LINE(st) >= 0);
00706 else if (code != CASE_LABEL)
00707 assert(STMT_LINENO(st) >= 0);
00708
00709
00710 assert(ancestor_is_function(st));
00711
00712
00713 switch(code) {
00714 case ASM_STMT:
00715 verify_asm_statement(st);
00716 break;
00717
00718 case BREAK_STMT:
00719 assert(ancestor_is_loop(st) || ancestor_is_switch(st));
00720 break;
00721
00722 case CASE_LABEL:
00723 verify_case_label(st);
00724 break;
00725
00726 case COMPOUND_STMT:
00727 verify_compound_statement(st);
00728 break;
00729
00730 case CONTINUE_STMT:
00731 assert(ancestor_is_loop(st));
00732 break;
00733
00734 case DECL_STMT:
00735 verify_decl_statement(st);
00736 break;
00737
00738 case DO_STMT:
00739 verify_do_statement(st);
00740 break;
00741
00742 case EXPR_STMT:
00743 break;
00744
00745 case FOR_STMT:
00746 verify_for_statement(st);
00747 break;
00748
00749 case GOTO_STMT:
00750 verify_goto_statement(st);
00751 break;
00752
00753 case IF_STMT:
00754 verify_if_statement(st);
00755 break;
00756
00757 case LABEL_DECL:
00758 verify_label_decl(st);
00759 break;
00760
00761 case LABEL_STMT:
00762 {
00763 tree label = LABEL_STMT_LABEL(st);
00764 assert(label != NULL_TREE);
00765 assert(TREE_CODE(label) == LABEL_DECL);
00766 add_child_to_map(st, label);
00767 verify_label_decl(label);
00768 }
00769 break;
00770
00771 case RETURN_STMT:
00772 verify_return_statement(st);
00773 break;
00774
00775 case SWITCH_STMT:
00776 verify_switch_statement(st);
00777 break;
00778
00779 case TRY_BLOCK:
00780 verify_try_block(st);
00781 break;
00782
00783 case WHILE_STMT:
00784 verify_while_statement(st);
00785 break;
00786
00787 case CLEANUP_STMT:
00788 verify_cleanup_statement(st);
00789 break;
00790
00791 case SCOPE_STMT:
00792 verify_scope_statement(st);
00793 break;
00794
00795 default:
00796 fprintf(stderr, "Unknown tree code for statement, %d\n",
00797 (int) code);
00798 assert(0);
00799 }
00800 }
00801
00802 void verify_asm_statement(tree st)
00803 {
00804 verify_simple_string_cst(ASM_STRING(st));
00805
00806
00807
00808 if (ASM_OUTPUTS(st) != NULL_TREE)
00809 verify_simple_string_cst(ASM_OUTPUTS(st));
00810 if (ASM_INPUTS(st) != NULL_TREE)
00811 verify_simple_string_cst(ASM_INPUTS(st));
00812 if (ASM_CLOBBERS(st) != NULL_TREE)
00813 verify_simple_string_cst(ASM_CLOBBERS(st));
00814 }
00815
00816 void verify_case_label(tree st)
00817 {
00818 assert(ancestor_is_switch(st));
00819
00820 tree low = CASE_LOW(st);
00821 tree high = CASE_HIGH(st);
00822
00823 if (low == NULL_TREE)
00824 assert(high == NULL_TREE);
00825 else if (high == NULL_TREE) {
00826 verify_expr(low);
00827 assert(is_integral_constant_expression(low));
00828 }
00829 else {
00830 verify_expr(low);
00831 verify_expr(high);
00832 assert(is_integral_constant_expression(low));
00833 assert(is_integral_constant_expression(high));
00834 assert(same_type_p(TREE_TYPE(low), TREE_TYPE(high)));
00835 }
00836 }
00837
00838 void verify_compound_statement(tree st)
00839 {
00840
00841 assert(st != NULL_TREE);
00842 assert(TREE_CODE(st) == COMPOUND_STMT);
00843
00844
00845 assert(STMT_LINENO(st) >= 0);
00846
00847
00848 ancestor_is_function(st);
00849
00850
00851 for (tree cur = COMPOUND_BODY(st) ; cur ; cur = TREE_CHAIN(cur)) {
00852
00853 add_child_to_map(st, cur);
00854
00855
00856 verify_statement(cur);
00857 }
00858 }
00859
00860 void verify_decl_statement(tree st)
00861 {
00862 assert(st != NULL_TREE);
00863 assert(TREE_CODE(st) == DECL_STMT);
00864
00865 tree decl = DECL_STMT_DECL(st);
00866 assert(decl != NULL_TREE);
00867 assert(TREE_CODE_CLASS(TREE_CODE(decl)) == 'd');
00868
00869
00870 add_child_to_map(st, decl);
00871
00872 verify_decl(decl, function_scope);
00873 }
00874
00875
00876
00877 void verify_var_decl_statement(tree st)
00878 {
00879 assert(st != NULL_TREE);
00880 assert(TREE_CODE(st) == DECL_STMT);
00881
00882 tree decl = DECL_STMT_DECL(st);
00883 assert(decl != NULL_TREE);
00884 assert(TREE_CODE_CLASS(TREE_CODE(decl)) == 'd');
00885 assert(TREE_CODE(decl) == VAR_DECL);
00886
00887
00888 add_child_to_map(st, decl);
00889
00890 verify_decl(decl, function_scope);
00891 }
00892
00893 void verify_do_statement(tree st)
00894 {
00895 assert(st != NULL_TREE);
00896 assert(TREE_CODE(st) == DO_STMT);
00897
00898 tree body = DO_BODY(st);
00899 tree test = DO_COND(st);
00900
00901 assert(body != NULL_TREE);
00902 assert(test != NULL_TREE);
00903
00904 add_child_to_map(st, body);
00905
00906 verify_statement(body);
00907 verify_controlling_expr(st, test);
00908 }
00909
00910 void verify_for_statement(tree st)
00911 {
00912 assert(st != NULL_TREE);
00913 assert(TREE_CODE(st) == FOR_STMT);
00914
00915 tree init = FOR_INIT_STMT(st);
00916 tree test = FOR_COND(st);
00917 tree iter = FOR_EXPR(st);
00918 tree body = FOR_BODY(st);
00919
00920 if (init != NULL_TREE) {
00921 add_child_to_map(st, init);
00922 verify_statement(init);
00923 }
00924
00925 if (test != NULL_TREE) {
00926 verify_controlling_expr(st, test);
00927 }
00928
00929 if (iter != NULL_TREE) {
00930 verify_expr(iter);
00931 }
00932
00933 assert(body != NULL_TREE);
00934 add_child_to_map(st, body);
00935 verify_statement(body);
00936 }
00937
00938 void verify_goto_statement(tree st)
00939 {
00940 assert(st != NULL_TREE);
00941 assert(TREE_CODE(st) == GOTO_STMT);
00942
00943
00944 tree parent_fn = ancestor_is_function(st);
00945 assert(parent_fn != NULL_TREE);
00946
00947
00948 tree dest = GOTO_DESTINATION(st);
00949 assert(dest != NULL_TREE);
00950
00951
00952 if (TREE_CODE(dest) == LABEL_DECL) {
00953 verify_ordinary_identifier(DECL_NAME(dest));
00954 }
00955
00956
00957
00958 else {
00959 verify_expr(dest);
00960 assert(TREE_CODE(TREE_TYPE(dest)) == POINTER_TYPE);
00961 }
00962 }
00963
00964 void verify_if_statement(tree st)
00965 {
00966 assert(st != NULL_TREE);
00967 assert(TREE_CODE(st) == IF_STMT);
00968
00969 tree cond = IF_COND(st);
00970 tree then_st = THEN_CLAUSE(st);
00971 tree else_st = ELSE_CLAUSE(st);
00972
00973 assert(cond != NULL_TREE);
00974 verify_controlling_expr(st, cond);
00975
00976 assert(then_st != NULL_TREE);
00977 add_child_to_map(st, then_st);
00978 verify_statement(then_st);
00979
00980 if (else_st != NULL_TREE) {
00981 add_child_to_map(st, else_st);
00982 verify_statement(else_st);
00983 }
00984 }
00985
00986 void verify_return_statement(tree st)
00987 {
00988 assert(st != NULL_TREE);
00989 assert(TREE_CODE(st) == RETURN_STMT);
00990
00991 tree retval = RETURN_EXPR(st);
00992 if (retval) {
00993 verify_expr(retval);
00994 }
00995 }
00996
00997 void verify_switch_statement(tree st)
00998 {
00999 assert(st != NULL_TREE);
01000 assert(TREE_CODE(st) == SWITCH_STMT);
01001
01002 tree cond = SWITCH_COND(st);
01003 tree body = SWITCH_BODY(st);
01004
01005 assert(cond != NULL_TREE);
01006 assert(body != NULL_TREE);
01007
01008 add_child_to_map(st, body);
01009
01010
01011 if (TREE_CODE(cond) == DECL_STMT)
01012 verify_var_decl_statement(cond);
01013 else
01014 verify_controlling_expr(st, cond);
01015
01016
01017 assert(TREE_CODE(body) == COMPOUND_STMT);
01018 verify_statement(body);
01019 }
01020
01021 void verify_try_block(tree st) {
01022 assert(st != NULL_TREE);
01023 assert(TREE_CODE(st) == TRY_BLOCK);
01024
01025
01026 tree body = TRY_STMTS(st);
01027 assert(body != NULL_TREE);
01028 add_child_to_map(st, body);
01029 assert(TREE_CODE(body) == COMPOUND_STMT);
01030 verify_statement(body);
01031
01032
01033 for (tree cur = TRY_HANDLERS(st) ; cur != NULL_TREE ; cur = TREE_CHAIN(cur)) {
01034 assert(TREE_CODE(cur) == HANDLER);
01035 add_child_to_map(st, cur);
01036
01037
01038
01039
01040 tree hb = HANDLER_BODY(cur);
01041 assert(hb != NULL_TREE);
01042 add_child_to_map(st, hb);
01043 assert(TREE_CODE(hb) == COMPOUND_STMT);
01044 verify_statement(hb);
01045 }
01046
01047 }
01048
01049 void verify_while_statement(tree st)
01050 {
01051 assert(st != NULL_TREE);
01052 assert(TREE_CODE(st) == WHILE_STMT);
01053
01054 tree cond = WHILE_COND(st);
01055 tree body = WHILE_BODY(st);
01056
01057 assert(cond != NULL_TREE);
01058 assert(body != NULL_TREE);
01059
01060 add_child_to_map(st, body);
01061
01062
01063 if (TREE_CODE(cond) == DECL_STMT)
01064 verify_var_decl_statement(cond);
01065 else
01066 verify_controlling_expr(st, cond);
01067
01068 verify_statement(body);
01069 }
01070
01071 void verify_cleanup_statement(tree st)
01072 {
01073 assert(st != NULL_TREE);
01074 assert(TREE_CODE(st) == CLEANUP_STMT);
01075
01076 tree decl = CLEANUP_DECL(st);
01077 tree expr = CLEANUP_EXPR(st);
01078
01079 assert(decl != NULL_TREE);
01080 assert(expr != NULL_TREE);
01081 assert(TREE_CODE(decl) == VAR_DECL);
01082 assert(is_expr_code(TREE_CODE(expr)));
01083
01084 verify_decl(decl, function_scope);
01085 verify_expr(expr);
01086 }
01087
01088 void verify_scope_statement(tree st)
01089 {
01090 assert(st != NULL_TREE);
01091 assert(TREE_CODE(st) == SCOPE_STMT);
01092
01093 }
01094
01095
01096
01097
01098
01099 void verify_controlling_expr(tree parent, tree t)
01100 {
01101 assert (t != NULL_TREE);
01102 tree expr = t;
01103
01104
01105
01106
01107 if (TREE_CODE(t) == TREE_LIST) {
01108 tree st = TREE_PURPOSE(t);
01109 while (st != NULL_TREE) {
01110 add_child_to_map(parent, st);
01111 verify_statement(st);
01112 st = TREE_CHAIN(st);
01113 }
01114
01115 expr = TREE_VALUE(t);
01116 }
01117
01118
01119 verify_expr(expr);
01120
01121
01122 tree type = TREE_TYPE(expr);
01123 tree_code code = TREE_CODE(type);
01124 assert(code == INTEGER_TYPE || code == BOOLEAN_TYPE ||
01125 code == ENUMERAL_TYPE);
01126 }
01127
01128
01129
01130 void verify_expr(tree expr)
01131 {
01132
01133 assert(expr != NULL_TREE);
01134 const tree_code code = TREE_CODE(expr);
01135 assert(is_expr_code(code));
01136
01137
01138 tree type = TREE_TYPE(expr);
01139 assert(type != NULL_TREE);
01140 verify_type(type);
01141
01142 switch(code) {
01143 case INTEGER_CST:
01144 verify_integer_cst(expr);
01145 break;
01146
01147 case REAL_CST:
01148
01149 break;
01150
01151 case STRING_CST:
01152 verify_string_cst(expr);
01153 break;
01154
01155 case PTRMEM_CST:
01156 verify_ptrmem_cst(expr);
01157 break;
01158
01159 case VAR_DECL:
01160 verify_var_decl(expr);
01161 break;
01162
01163 case PARM_DECL:
01164 verify_parm_decl(expr);
01165 break;
01166
01167 case NEGATE_EXPR:
01168 verify_negate_expr(expr);
01169 break;
01170
01171 case BIT_NOT_EXPR:
01172 verify_bit_not_expr(expr);
01173 break;
01174
01175 case TRUTH_NOT_EXPR:
01176 verify_truth_not_expr(expr);
01177 break;
01178
01179 case PREDECREMENT_EXPR:
01180 case POSTDECREMENT_EXPR:
01181 case PREINCREMENT_EXPR:
01182 case POSTINCREMENT_EXPR:
01183 verify_incr_or_decr(expr);
01184 break;
01185
01186 case ADDR_EXPR:
01187 verify_addr_expr(expr);
01188 break;
01189
01190 case INDIRECT_REF:
01191 verify_indirect_ref(expr);
01192 break;
01193
01194 case FIX_TRUNC_EXPR:
01195 verify_trunc_expr(expr);
01196 break;
01197
01198 case FLOAT_EXPR:
01199 verify_float_expr(expr);
01200 break;
01201
01202 case NOP_EXPR:
01203 case NON_LVALUE_EXPR:
01204 verify_nop_expr(expr);
01205 break;
01206
01207 case CONVERT_EXPR:
01208 verify_convert_expr(expr);
01209 break;
01210
01211 case THROW_EXPR:
01212 verify_throw_expr(expr);
01213 break;
01214
01215 case LSHIFT_EXPR:
01216 case RSHIFT_EXPR:
01217 verify_shift_expr(expr);
01218 break;
01219
01220 case BIT_IOR_EXPR:
01221 case BIT_XOR_EXPR:
01222 case BIT_AND_EXPR:
01223 verify_bitwise_binary_op(expr);
01224 break;
01225
01226 case TRUTH_ANDIF_EXPR:
01227 case TRUTH_ORIF_EXPR:
01228 verify_logical_binary_op(expr);
01229 break;
01230
01231 case PLUS_EXPR:
01232 case MINUS_EXPR:
01233 case MULT_EXPR:
01234 case TRUNC_DIV_EXPR:
01235 case TRUNC_MOD_EXPR:
01236 case RDIV_EXPR:
01237 verify_arithmetic_binary_op(expr);
01238 break;
01239
01240 case LT_EXPR:
01241 case LE_EXPR:
01242 case GT_EXPR:
01243 case GE_EXPR:
01244 case EQ_EXPR:
01245 case NE_EXPR:
01246 verify_comparison(expr);
01247 break;
01248
01249 case MODIFY_EXPR:
01250 verify_modify_expr(expr);
01251 break;
01252
01253 case COMPONENT_REF:
01254 verify_component_ref(expr);
01255 break;
01256
01257 case COMPOUND_EXPR:
01258 verify_compound_expr(expr);
01259 break;
01260
01261 case COND_EXPR:
01262 verify_cond_expr(expr);
01263 break;
01264
01265 case CALL_EXPR:
01266 verify_call_expr(expr);
01267 break;
01268
01269 case BIND_EXPR:
01270 verify_bind_expr(expr);
01271 break;
01272
01273 case CONSTRUCTOR:
01274 verify_constructor_expr(expr);
01275 break;
01276
01277 case INIT_EXPR:
01278 verify_init_expr(expr);
01279 break;
01280
01281 case SAVE_EXPR:
01282 verify_save_expr(expr);
01283 break;
01284
01285 case TARGET_EXPR:
01286 verify_target_expr(expr);
01287 break;
01288
01289 case ARRAY_REF:
01290 verify_array_ref(expr);
01291 break;
01292
01293 case AGGR_INIT_EXPR:
01294 fprintf(stderr,
01295 "AGGR_INIT_EXPR may only appear as 2nd operand of TARGET_EXPR\n");
01296 assert(0);
01297
01298 default:
01299 fprintf(stderr, "Unknown tree code for expression, %d\n",
01300 (int) code);
01301 assert(0);
01302 }
01303 }
01304
01305 void verify_integer_cst(tree cst)
01306 {
01307 assert(cst != NULL_TREE);
01308 assert(TREE_CODE(cst) == INTEGER_CST);
01309
01310
01311 tree type = TREE_TYPE(cst);
01312 assert(is_integral_type(type));
01313
01314
01315 assert(!tree_int_cst_lt(cst, TYPE_MIN_VALUE(type)));
01316 assert(!tree_int_cst_lt(TYPE_MAX_VALUE(type), cst));
01317 }
01318
01319 void verify_string_cst(tree s)
01320 {
01321 assert(s != NULL_TREE);
01322 assert(TREE_CODE(s) == STRING_CST);
01323
01324 int n = TREE_STRING_LENGTH(s);
01325 assert(n >= 0);
01326
01327 char* p = TREE_STRING_POINTER(s);
01328 assert(p != 0);
01329 }
01330
01331
01332
01333 void verify_simple_string_cst(tree s)
01334 {
01335 assert(s != NULL_TREE);
01336 assert(TREE_CODE(s) == STRING_CST);
01337
01338 int n = TREE_STRING_LENGTH(s);
01339 assert(n > 0);
01340
01341 char* p = TREE_STRING_POINTER(s);
01342 assert(p != 0);
01343
01344 assert(p[n-1] == '\0');
01345 assert(strlen(p) == n-1);
01346 }
01347
01348
01349 void verify_ptrmem_cst(tree ptr)
01350 {
01351 assert(ptr != NULL_TREE);
01352 assert(TREE_CODE(ptr) == PTRMEM_CST);
01353
01354
01355 tree field = PTRMEM_CST_MEMBER(ptr);
01356 assert(field != NULL_TREE);
01357 assert(TREE_CODE(field) == FIELD_DECL);
01358 assert(TREE_CODE(DECL_CONTEXT(field)) == RECORD_TYPE ||
01359 TREE_CODE(DECL_CONTEXT(field)) == UNION_TYPE);
01360
01361
01362 tree field_type = TREE_TYPE(field);
01363 assert(field_type != NULL_TREE);
01364 assert(TREE_CODE_CLASS(TREE_CODE(field_type)) == 't');
01365
01366
01367 tree ptrmem_type = TREE_TYPE(ptr);
01368 assert(ptrmem_type != NULL_TREE);
01369 assert(TREE_CODE(ptrmem_type) == POINTER_TYPE);
01370 assert(TYPE_PTRMEM_P(ptrmem_type));
01371
01372
01373 tree class_type = PTRMEM_CST_CLASS(ptr);
01374 assert(class_type != NULL_TREE);
01375 assert(TREE_CODE(class_type) == RECORD_TYPE ||
01376 TREE_CODE(class_type) == UNION_TYPE);
01377
01378
01379 assert(same_type_p(class_type, TYPE_PTRMEM_CLASS_TYPE(ptrmem_type)));
01380
01381
01382 assert(same_type_p(field_type, TYPE_PTRMEM_POINTED_TO_TYPE(ptrmem_type)));
01383 }
01384
01385 void verify_negate_expr(tree expr)
01386 {
01387 assert(expr != NULL_TREE);
01388 assert(TREE_CODE(expr) == NEGATE_EXPR);
01389
01390
01391 tree expr_type = TREE_TYPE(expr);
01392 assert(is_numeric_scalar_type(expr_type));
01393
01394
01395 tree operand = TREE_OPERAND(expr, 0);
01396 assert(operand != NULL_TREE);
01397 verify_expr(operand);
01398
01399
01400 assert(same_type_p(expr_type, TREE_TYPE(operand)));
01401 }
01402
01403 void verify_bit_not_expr(tree expr)
01404 {
01405 assert(expr != NULL_TREE);
01406 assert(TREE_CODE(expr) == BIT_NOT_EXPR);
01407
01408
01409 tree expr_type = TREE_TYPE(expr);
01410 assert(is_integral_type(expr_type));
01411
01412
01413 tree operand = TREE_OPERAND(expr, 0);
01414 assert(operand != NULL_TREE);
01415 verify_expr(operand);
01416
01417
01418 assert(same_type_p(expr_type, TREE_TYPE(operand)));
01419 }
01420
01421 void verify_truth_not_expr(tree expr)
01422 {
01423 assert(expr != NULL_TREE);
01424 assert(TREE_CODE(expr) == TRUTH_NOT_EXPR);
01425
01426
01427 tree expr_type = TREE_TYPE(expr);
01428 assert(is_integral_type(expr_type));
01429
01430
01431 tree operand = TREE_OPERAND(expr, 0);
01432 assert(operand != NULL_TREE);
01433 verify_expr(operand);
01434 assert(is_integral_type(TREE_TYPE(operand)));
01435 }
01436
01437 void verify_incr_or_decr(tree expr)
01438 {
01439 assert(expr != NULL_TREE);
01440 assert(TREE_CODE(expr) == PREINCREMENT_EXPR ||
01441 TREE_CODE(expr) == PREDECREMENT_EXPR ||
01442 TREE_CODE(expr) == POSTINCREMENT_EXPR ||
01443 TREE_CODE(expr) == POSTDECREMENT_EXPR);
01444
01445
01446 tree expr_type = TREE_TYPE(expr);
01447 assert(is_numeric_scalar_type(expr_type));
01448
01449
01450 tree operand = TREE_OPERAND(expr, 0);
01451 assert(operand != NULL_TREE);
01452 verify_expr(operand);
01453
01454
01455 assert(same_type_p(expr_type, TREE_TYPE(operand)));
01456 }
01457
01458 void verify_addr_expr(tree expr)
01459 {
01460 assert(expr != NULL_TREE);
01461 assert(TREE_CODE(expr) == ADDR_EXPR);
01462
01463 tree operand = TREE_OPERAND(expr, 0);
01464 assert(operand != NULL_TREE);
01465
01466 tree type = TREE_TYPE(expr);
01467 assert(type != NULL_TREE);
01468 assert(TREE_CODE(type) == POINTER_TYPE ||
01469 TREE_CODE(type) == REFERENCE_TYPE);
01470 if (TREE_CODE(type) == POINTER_TYPE)
01471 assert(!TYPE_PTRMEM_P(type));
01472 tree pointed_to_type = TREE_TYPE(type);
01473 assert(pointed_to_type != NULL_TREE);
01474
01475
01476 if (TREE_CODE(operand) == LABEL_DECL) {
01477 verify_label_decl(operand);
01478
01479
01480 assert(TREE_CODE(type) == POINTER_TYPE);
01481 assert(TREE_CODE(pointed_to_type) == VOID_TYPE);
01482 }
01483
01484
01485 else if (TREE_CODE(operand) == FUNCTION_DECL) {
01486 verify_function(operand);
01487
01488 assert(TREE_CODE(type) == POINTER_TYPE);
01489 assert(TREE_CODE(pointed_to_type) == FUNCTION_TYPE);
01490 assert(same_type_p(TYPE_MAIN_VARIANT(TREE_TYPE(operand)),
01491 TYPE_MAIN_VARIANT(pointed_to_type)));
01492 }
01493
01494
01495 else {
01496 verify_expr(operand);
01497
01498
01499 tree operand_type = TREE_TYPE(operand);
01500 assert(operand_type != NULL_TREE);
01501 assert(same_type_p(operand_type, pointed_to_type));
01502 }
01503 }
01504
01505
01506 void verify_indirect_ref(tree expr)
01507 {
01508 assert(expr != NULL_TREE);
01509 assert(TREE_CODE(expr) == INDIRECT_REF);
01510
01511 tree type = TREE_TYPE(expr);
01512 assert(type != NULL_TREE);
01513
01514 tree operand = TREE_OPERAND(expr, 0);
01515 assert(operand != NULL_TREE);
01516 verify_expr(operand);
01517
01518
01519 tree operand_type = TREE_TYPE(operand);
01520 assert(TREE_CODE(operand_type) == POINTER_TYPE ||
01521 TREE_CODE(operand_type) == REFERENCE_TYPE);
01522
01523 tree pointed_to_type = TREE_TYPE(operand_type);
01524 assert(pointed_to_type != NULL_TREE);
01525 assert(same_type_p(type, pointed_to_type));
01526 }
01527
01528
01529 void verify_trunc_expr(tree expr)
01530 {
01531 assert(expr != NULL_TREE);
01532 assert(TREE_CODE(expr) == FIX_TRUNC_EXPR);
01533
01534 tree operand = TREE_OPERAND(expr, 0);
01535 assert(operand != NULL_TREE);
01536 verify_expr(operand);
01537
01538 assert(TREE_CODE(TREE_TYPE(operand)) == REAL_TYPE);
01539 assert(is_integral_type(TREE_TYPE(expr)));
01540 }
01541
01542
01543 void verify_float_expr(tree expr)
01544 {
01545 assert(expr != NULL_TREE);
01546 assert(TREE_CODE(expr) == FLOAT_EXPR);
01547
01548 tree operand = TREE_OPERAND(expr, 0);
01549 assert(operand != NULL_TREE);
01550 verify_expr(operand);
01551
01552 assert(is_integral_type(TREE_TYPE(operand)));
01553 assert(TREE_CODE(TREE_TYPE(expr)) == REAL_TYPE);
01554 }
01555
01556
01557 void verify_nop_expr(tree expr)
01558 {
01559 assert(expr != NULL_TREE);
01560 assert(TREE_CODE(expr) == NOP_EXPR || TREE_CODE(expr) == NON_LVALUE_EXPR);
01561
01562 tree operand = TREE_OPERAND(expr, 0);
01563 assert(operand != NULL_TREE);
01564 verify_expr(operand);
01565
01566
01567
01568
01569 }
01570
01571 void verify_convert_expr(tree expr)
01572 {
01573 assert(expr != NULL_TREE);
01574 assert(TREE_CODE(expr) == CONVERT_EXPR);
01575
01576 tree operand = TREE_OPERAND(expr, 0);
01577 assert(operand != NULL_TREE);
01578 verify_expr(operand);
01579
01580
01581
01582
01583 }
01584
01585 void verify_throw_expr(tree expr)
01586 {
01587 assert(expr != NULL_TREE);
01588 assert(TREE_CODE(expr) == THROW_EXPR);
01589
01590 tree operand = TREE_OPERAND(expr, 0);
01591
01592
01593 if (operand != NULL_TREE) {
01594 verify_expr(operand);
01595 }
01596
01597
01598 assert(ancestor_is_function(expr));
01599 }
01600
01601
01602 void verify_shift_expr(tree expr)
01603 {
01604 assert(expr != NULL_TREE);
01605 assert(TREE_CODE(expr) == LSHIFT_EXPR || TREE_CODE(expr) == RSHIFT_EXPR);
01606
01607 tree lhs = TREE_OPERAND(expr, 0);
01608 tree rhs = TREE_OPERAND(expr, 1);
01609
01610 assert(lhs != NULL_TREE);
01611 assert(rhs != NULL_TREE);
01612 verify_expr(lhs);
01613 verify_expr(rhs);
01614
01615 assert(is_integral_type(TREE_TYPE(lhs)));
01616 assert(is_integral_type(TREE_TYPE(rhs)));
01617 assert(same_type_p(TREE_TYPE(expr), TREE_TYPE(lhs)));
01618 }
01619
01620
01621 void verify_bitwise_binary_op(tree expr)
01622 {
01623 assert(expr != NULL_TREE);
01624 assert(TREE_CODE(expr) == BIT_IOR_EXPR ||
01625 TREE_CODE(expr) == BIT_XOR_EXPR ||
01626 TREE_CODE(expr) == BIT_AND_EXPR);
01627
01628 tree lhs = TREE_OPERAND(expr, 0);
01629 tree rhs = TREE_OPERAND(expr, 1);
01630
01631 assert(lhs != NULL_TREE);
01632 assert(rhs != NULL_TREE);
01633 verify_expr(lhs);
01634 verify_expr(rhs);
01635
01636 assert(is_integral_type(TREE_TYPE(lhs)));
01637 assert(is_integral_type(TREE_TYPE(rhs)));
01638 assert(same_type_p(TREE_TYPE(lhs), TREE_TYPE(rhs)));
01639 assert(same_type_p(TREE_TYPE(expr), TREE_TYPE(lhs)));
01640 }
01641
01642
01643 void verify_logical_binary_op(tree expr)
01644 {
01645 assert(expr != NULL_TREE);
01646 assert(TREE_CODE(expr) == TRUTH_ANDIF_EXPR ||
01647 TREE_CODE(expr) == TRUTH_ORIF_EXPR);
01648
01649 tree lhs = TREE_OPERAND(expr, 0);
01650 tree rhs = TREE_OPERAND(expr, 1);
01651
01652 assert(lhs != NULL_TREE);
01653 assert(rhs != NULL_TREE);
01654 verify_expr(lhs);
01655 verify_expr(rhs);
01656
01657 assert(is_integral_type(TREE_TYPE(lhs)));
01658 assert(is_integral_type(TREE_TYPE(rhs)));
01659 assert(is_integral_type(TREE_TYPE(expr)));
01660 }
01661
01662
01663 void verify_arithmetic_binary_op(tree expr)
01664 {
01665 assert(expr != NULL_TREE);
01666 assert(TREE_CODE(expr) == PLUS_EXPR ||
01667 TREE_CODE(expr) == MINUS_EXPR ||
01668 TREE_CODE(expr) == MULT_EXPR ||
01669 TREE_CODE(expr) == TRUNC_DIV_EXPR ||
01670 TREE_CODE(expr) == TRUNC_MOD_EXPR ||
01671 TREE_CODE(expr) == RDIV_EXPR);
01672
01673 tree lhs = TREE_OPERAND(expr, 0);
01674 tree rhs = TREE_OPERAND(expr, 1);
01675
01676 assert(lhs != NULL_TREE);
01677 assert(rhs != NULL_TREE);
01678 verify_expr(lhs);
01679 verify_expr(rhs);
01680
01681
01682 assert(is_numeric_scalar_type(TREE_TYPE(lhs)));
01683 assert(is_numeric_scalar_type(TREE_TYPE(rhs)));
01684 assert(is_numeric_scalar_type(TREE_TYPE(expr)));
01685
01686
01687 assert(same_type_p(TREE_TYPE(lhs), TREE_TYPE(rhs)));
01688 assert(same_type_p(TREE_TYPE(lhs), TREE_TYPE(expr)));
01689
01690
01691 if (TREE_CODE(expr) == TRUNC_DIV_EXPR ||
01692 TREE_CODE(expr) == TRUNC_MOD_EXPR) {
01693 assert(is_integral_type(TREE_TYPE(lhs)));
01694 }
01695
01696
01697 else if (TREE_CODE(expr) == RDIV_EXPR) {
01698 assert(TREE_CODE(TREE_TYPE(lhs)) == REAL_TYPE);
01699 }
01700 }
01701
01702
01703 void verify_comparison(tree expr)
01704 {
01705 assert(expr != NULL_TREE);
01706 assert(TREE_CODE(expr) == LT_EXPR ||
01707 TREE_CODE(expr) == LE_EXPR ||
01708 TREE_CODE(expr) == GT_EXPR ||
01709 TREE_CODE(expr) == GE_EXPR ||
01710 TREE_CODE(expr) == EQ_EXPR ||
01711 TREE_CODE(expr) == NE_EXPR);
01712
01713 tree lhs = TREE_OPERAND(expr, 0);
01714 tree rhs = TREE_OPERAND(expr, 1);
01715
01716 assert(lhs != NULL_TREE);
01717 assert(rhs != NULL_TREE);
01718 verify_expr(lhs);
01719 verify_expr(rhs);
01720
01721
01722
01723 assert(is_numeric_scalar_type(TREE_TYPE(lhs)));
01724 assert(is_numeric_scalar_type(TREE_TYPE(rhs)));
01725
01726
01727 assert(same_type_p(TREE_TYPE(lhs), TREE_TYPE(rhs)));
01728
01729
01730 assert(is_integral_type(TREE_TYPE(expr)));
01731 }
01732
01733
01734
01735 void verify_modify_expr(tree expr)
01736 {
01737 assert(expr != NULL_TREE);
01738 assert(TREE_CODE(expr) == MODIFY_EXPR);
01739
01740 tree lhs = TREE_OPERAND(expr, 0);
01741 tree rhs = TREE_OPERAND(expr, 1);
01742
01743 assert(lhs != NULL_TREE);
01744 assert(rhs != NULL_TREE);
01745 verify_expr(lhs);
01746 verify_expr(rhs);
01747
01748
01749
01750
01751 assert(same_type_p(TYPE_MAIN_VARIANT(TREE_TYPE(lhs)),
01752 TYPE_MAIN_VARIANT(TREE_TYPE(rhs))));
01753 }
01754
01755
01756 void verify_component_ref(tree expr)
01757 {
01758 assert(expr != NULL_TREE);
01759 assert(TREE_CODE(expr) == COMPONENT_REF);
01760
01761 tree lhs = TREE_OPERAND(expr, 0);
01762 tree rhs = TREE_OPERAND(expr, 1);
01763
01764 assert(lhs != NULL_TREE);
01765 assert(rhs != NULL_TREE);
01766
01767
01768 verify_expr(lhs);
01769 tree lhs_type = TREE_TYPE(lhs);
01770 assert(TREE_CODE(lhs_type) == RECORD_TYPE ||
01771 TREE_CODE(lhs_type) == UNION_TYPE);
01772
01773
01774 verify_field_decl(rhs);
01775
01776
01777
01778
01779 }
01780
01781
01782 void verify_compound_expr(tree expr)
01783 {
01784 assert(expr != NULL_TREE);
01785 assert(TREE_CODE(expr) == COMPOUND_EXPR);
01786
01787 tree lhs = TREE_OPERAND(expr, 0);
01788 tree rhs = TREE_OPERAND(expr, 1);
01789
01790 assert(lhs != NULL_TREE);
01791 assert(rhs != NULL_TREE);
01792
01793
01794 verify_expr(lhs);
01795
01796
01797 verify_expr(rhs);
01798 assert(same_type_p(TREE_TYPE(expr), TREE_TYPE(rhs)));
01799 }
01800
01801
01802 void verify_cond_expr(tree expr)
01803 {
01804 assert(expr != NULL_TREE);
01805 assert(TREE_CODE(expr) == COND_EXPR);
01806
01807 tree cond = TREE_OPERAND(expr, 0);
01808 tree if_true = TREE_OPERAND(expr, 1);
01809 tree if_false = TREE_OPERAND(expr, 2);
01810
01811 assert(cond != NULL_TREE);
01812 assert(if_true != NULL_TREE);
01813 assert(if_false != NULL_TREE);
01814
01815
01816 verify_expr(cond);
01817 assert(is_integral_type(TREE_TYPE(cond)));
01818
01819 verify_expr(if_true);
01820 verify_expr(if_false);
01821
01822
01823
01824
01825
01826 assert(same_type_p(TREE_TYPE(if_true), TREE_TYPE(if_false)));
01827 assert(same_type_p(TREE_TYPE(if_true), TREE_TYPE(expr)));
01828 }
01829
01830
01831 void verify_call_expr(tree expr)
01832 {
01833 assert(expr != NULL_TREE);
01834 assert(TREE_CODE(expr) == CALL_EXPR);
01835
01836 tree fptr = TREE_OPERAND(expr, 0);
01837 tree args = TREE_OPERAND(expr, 1);
01838
01839 assert(fptr != NULL_TREE);
01840 assert(args != NULL_TREE);
01841
01842
01843 verify_expr(fptr);
01844 assert(TREE_CODE(TREE_TYPE(fptr)) == POINTER_TYPE);
01845
01846 tree fn_type = TREE_TYPE(TREE_TYPE(fptr));
01847 assert(fn_type != NULL_TREE);
01848 assert(TREE_CODE(fn_type) == FUNCTION_TYPE ||
01849 TREE_CODE(fn_type) == METHOD_TYPE);
01850
01851
01852 for (tree cur = args ; cur != NULL_TREE ; cur = TREE_CHAIN(cur)) {
01853 assert(TREE_CODE(cur) == TREE_LIST);
01854 tree arg = TREE_VALUE(cur);
01855 verify_expr(arg);
01856 }
01857
01858
01859 }
01860
01861
01862 void verify_bind_expr(tree expr)
01863 {
01864 assert(expr != NULL_TREE);
01865 assert(TREE_CODE(expr) == BIND_EXPR);
01866
01867
01868 }
01869
01870
01871 void verify_constructor_expr(tree expr)
01872 {
01873 assert(expr != NULL_TREE);
01874 assert(TREE_CODE(expr) == CONSTRUCTOR);
01875
01876 tree type = TREE_TYPE(expr);
01877 assert(type != NULL_TREE);
01878 verify_type(type);
01879
01880
01881 tree initializers = TREE_OPERAND(expr, 1);
01882
01883 assert(TREE_CODE(type) == RECORD_TYPE || TREE_CODE(type) == UNION_TYPE ||
01884 TREE_CODE(type) == ARRAY_TYPE);
01885
01886
01887 if (TREE_CODE(type) == ARRAY_TYPE) {
01888 tree element_type = TYPE_MAIN_VARIANT(TREE_TYPE(type));
01889
01890
01891
01892 size_t num_initializers = 0;
01893 tree cur = initializers;
01894 while (cur != NULL_TREE) {
01895 assert(TREE_CODE(cur) == TREE_LIST);
01896
01897 tree index = TREE_PURPOSE(cur);
01898 tree value = TREE_VALUE(cur);
01899
01900
01901
01902
01903 assert(index == NULL_TREE);
01904
01905
01906 assert(value != NULL_TREE);
01907 verify_expr(value);
01908 assert(same_type_p(TYPE_MAIN_VARIANT(TREE_TYPE(value)), element_type));
01909
01910 cur = TREE_CHAIN(cur);
01911 ++num_initializers;
01912 }
01913
01914
01915 tree bounds = TYPE_DOMAIN(type);
01916 assert(bounds != NULL_TREE);
01917 assert(TREE_CODE(bounds) == INTEGER_TYPE);
01918 tree max_index = TYPE_MAX_VALUE(bounds);
01919 assert(max_index != NULL_TREE);
01920 assert(TREE_CODE(max_index) == INTEGER_CST);
01921 assert(num_initializers == 0 ||
01922 integer_cst_le(num_initializers - 1, max_index));
01923 }
01924
01925
01926 else {
01927 for (tree cur = initializers ; cur != NULL_TREE ; cur = TREE_CHAIN(cur)) {
01928 assert(TREE_CODE(cur) == TREE_LIST);
01929
01930 tree field = TREE_PURPOSE(cur);
01931 tree value = TREE_VALUE(cur);
01932 assert(field != NULL_TREE);
01933 assert(value != NULL_TREE);
01934
01935
01936
01937 tree class_fields = TYPE_FIELDS(type);
01938 while (class_fields != NULL_TREE && class_fields != field)
01939 class_fields = TREE_CHAIN(class_fields);
01940 assert(class_fields == field);
01941
01942
01943 verify_expr(value);
01944
01945
01946 assert(same_type_p(TYPE_MAIN_VARIANT(TREE_TYPE(field)),
01947 TYPE_MAIN_VARIANT(TREE_TYPE(value))));
01948 }
01949 }
01950 }
01951
01952 void verify_init_expr(tree expr)
01953 {
01954 assert(expr != NULL_TREE);
01955 assert(TREE_CODE(expr) == INIT_EXPR);
01956
01957
01958 }
01959
01960 void verify_save_expr(tree expr)
01961 {
01962 assert(expr != NULL_TREE);
01963 assert(TREE_CODE(expr) == SAVE_EXPR);
01964
01965
01966 }
01967
01968
01969
01970 void verify_target_expr(tree expr)
01971 {
01972 assert(expr != NULL_TREE);
01973 assert(TREE_CODE(expr) == TARGET_EXPR);
01974
01975 tree var = TREE_OPERAND(expr, 0);
01976 tree ini = TREE_OPERAND(expr, 1);
01977
01978
01979 assert(var != NULL_TREE);
01980 assert(ini != NULL_TREE);
01981 assert(TREE_CODE(var) == VAR_DECL);
01982 verify_expr(var);
01983
01984
01985
01986
01987 if (TREE_CODE(ini) == AGGR_INIT_EXPR) {
01988 tree fptr = TREE_OPERAND(ini, 0);
01989 tree args = TREE_OPERAND(ini, 1);
01990
01991
01992 assert(fptr != NULL_TREE);
01993 verify_expr(fptr);
01994 assert(TREE_CODE(TREE_TYPE(fptr)) == POINTER_TYPE);
01995
01996 tree fn_type = TREE_TYPE(TREE_TYPE(fptr));
01997 assert(fn_type != NULL_TREE);
01998 assert(TREE_CODE(fn_type) == FUNCTION_TYPE ||
01999 TREE_CODE(fn_type) == METHOD_TYPE);
02000
02001
02002 assert(same_type_p(TREE_TYPE(fn_type), TREE_TYPE(ini)));
02003
02004
02005
02006 for (tree cur = args ; cur != NULL_TREE ; cur = TREE_CHAIN(cur)) {
02007 assert(TREE_CODE(cur) == TREE_LIST);
02008 tree arg = TREE_VALUE(cur);
02009 verify_expr(arg);
02010 }
02011
02012 if (AGGR_INIT_VIA_CTOR_P(ini)) {
02013
02014
02015
02016
02017
02018
02019
02020
02021
02022 }
02023
02024 }
02025 else
02026 verify_expr(ini);
02027
02028
02029 assert(DECL_ARTIFICIAL(var));
02030
02031
02032 assert(same_type_p(TYPE_MAIN_VARIANT(TREE_TYPE(var)),
02033 TYPE_MAIN_VARIANT(TREE_TYPE(ini))));
02034 }
02035
02036 void verify_array_ref(tree expr)
02037 {
02038 assert(expr != NULL_TREE);
02039 assert(TREE_CODE(expr) == ARRAY_REF);
02040
02041 tree array = TREE_OPERAND(expr, 0);
02042 tree index = TREE_OPERAND(expr, 1);
02043 assert(array != NULL_TREE);
02044 assert(index != NULL_TREE);
02045
02046 verify_expr(array);
02047 verify_expr(index);
02048
02049 assert(TREE_CODE(TREE_TYPE(array)) == ARRAY_TYPE);
02050 assert(TREE_CODE(TREE_TYPE(index)) == INTEGER_TYPE);
02051
02052
02053
02054 }
02055
02056
02057
02058
02059 bool is_expr_code(tree_code code)
02060 {
02061 char cls = TREE_CODE_CLASS(code);
02062 return code == VAR_DECL || code == PARM_DECL ||
02063 cls == 'c' || cls == '<' || cls == '1' || cls == '2' || cls == 'e' ||
02064 cls == 'r';
02065 }
02066
02067
02068
02069
02070 void verify_type(tree type)
02071 {
02072
02073 assert(type != NULL_TREE);
02074 const tree_code code = TREE_CODE(type);
02075 assert(TREE_CODE_CLASS(code) == 't');
02076
02077
02078
02079 if (!CP_TYPE_CONST_P(type) &&
02080 !CP_TYPE_VOLATILE_P(type) &&
02081 !CP_TYPE_RESTRICT_P(type))
02082 assert(same_type_p(TYPE_MAIN_VARIANT(type), type));
02083
02084
02085
02086 tree size = TYPE_SIZE(type);
02087
02088
02089 if (size == NULL_TREE) {
02090
02091
02092 assert(code == ARRAY_TYPE || code == RECORD_TYPE || code == UNION_TYPE
02093 || code == VOID_TYPE);
02094 }
02095
02096 else if (code != VOID_TYPE && code != LANG_TYPE) {
02097 verify_integer_cst(size);
02098 assert(tree_int_cst_lt(integer_zero_node, size));
02099 assert(TYPE_ALIGN(type) > 0);
02100 assert((TYPE_ALIGN(type) % CHAR_BIT) == 0);
02101 }
02102
02103 switch(code) {
02104 case VOID_TYPE:
02105 assert(same_type_p(TYPE_MAIN_VARIANT(type), void_type_node));
02106
02107
02108 assert(TYPE_ALIGN(type) == 8);
02109 assert(tree_int_cst_equal(integer_zero_node, size));
02110 verify_type_name_is(type, "void");
02111
02112 break;
02113
02114 case INTEGER_TYPE:
02115 verify_integer_type(type);
02116 break;
02117
02118 case REAL_TYPE:
02119 verify_real_type(type);
02120 break;
02121
02122 case COMPLEX_TYPE:
02123 verify_complex_type(type);
02124 break;
02125
02126 case ENUMERAL_TYPE:
02127 verify_enumeral_type(type);
02128 break;
02129
02130 case BOOLEAN_TYPE:
02131 verify_named_type(type);
02132 break;
02133
02134 case POINTER_TYPE:
02135 verify_pointer_type(type);
02136 break;
02137
02138 case REFERENCE_TYPE:
02139 verify_reference_type(type);
02140 break;
02141
02142 case FUNCTION_TYPE:
02143 verify_function_type(type);
02144 break;
02145
02146 case METHOD_TYPE:
02147 verify_method_type(type);
02148 break;
02149
02150 case ARRAY_TYPE:
02151 verify_array_type(type);
02152 break;
02153
02154 case RECORD_TYPE:
02155 case UNION_TYPE:
02156 verify_class_type(type);
02157 break;
02158
02159 case LANG_TYPE:
02160
02161 break;
02162
02163 default:
02164 fprintf(stderr, "Unknown tree code for type, %d\n", (int) code);
02165 assert(0);
02166 }
02167
02168 }
02169
02170 void verify_integer_type(tree type)
02171 {
02172 assert(type != NULL_TREE);
02173 assert(TREE_CODE(type) == INTEGER_TYPE);
02174
02175
02176
02177
02178
02179
02180 tree size = TYPE_SIZE(type);
02181 verify_integer_cst(size);
02182 assert(tree_int_cst_lt(integer_zero_node, size));
02183 assert(TREE_INT_CST_HIGH(size) == 0);
02184 assert(TYPE_PRECISION(type) <= TREE_INT_CST_LOW(size));
02185
02186
02187 tree min_value = TYPE_MIN_VALUE(type);
02188 tree max_value = TYPE_MAX_VALUE(type);
02189 verify_integer_cst(min_value);
02190 verify_integer_cst(max_value);
02191
02192 assert(tree_int_cst_lt(min_value, max_value));
02193
02194 if (TREE_UNSIGNED(type))
02195 assert(tree_int_cst_equal(min_value, integer_zero_node));
02196 else
02197 assert(tree_int_cst_lt(min_value, integer_zero_node));
02198 }
02199
02200 void verify_real_type(tree type)
02201 {
02202 assert(type != NULL_TREE);
02203 assert(TREE_CODE(type) == REAL_TYPE);
02204
02205
02206 verify_named_type(type);
02207
02208
02209 tree size = TYPE_SIZE(type);
02210 verify_integer_cst(size);
02211 assert(tree_int_cst_lt(integer_zero_node, size));
02212 assert(TREE_INT_CST_HIGH(size) == 0);
02213 assert(TYPE_PRECISION(type) <= TREE_INT_CST_LOW(size));
02214
02215 }
02216
02217 void verify_complex_type(tree type)
02218 {
02219 assert(type != NULL_TREE);
02220 assert(TREE_CODE(type) == COMPLEX_TYPE);
02221
02222
02223 }
02224
02225 void verify_enumeral_type(tree type)
02226 {
02227 assert(type != NULL_TREE);
02228 assert(TREE_CODE(type) == ENUMERAL_TYPE);
02229
02230
02231 if (TYPE_NAME(type) != NULL_TREE)
02232 verify_named_type(type);
02233
02234
02235 tree size = TYPE_SIZE(type);
02236 verify_integer_cst(size);
02237 assert(tree_int_cst_lt(integer_zero_node, size));
02238 assert(TREE_INT_CST_HIGH(size) == 0);
02239 assert(TYPE_PRECISION(type) <= TREE_INT_CST_LOW(size));
02240
02241
02242 tree min_value = TYPE_MIN_VALUE(type);
02243 tree max_value = TYPE_MAX_VALUE(type);
02244 verify_integer_cst(min_value);
02245 verify_integer_cst(max_value);
02246
02247 assert(tree_int_cst_lt(min_value, max_value));
02248
02249 if (TREE_UNSIGNED(type))
02250 assert(!tree_int_cst_lt(min_value, integer_zero_node));
02251 else
02252 assert(tree_int_cst_lt(min_value, integer_zero_node));
02253
02254
02255
02256
02257
02258 bool min_seen = false;
02259 bool max_seen = false;
02260
02261 for (tree cur = TYPE_VALUES(type); cur != NULL_TREE; cur = TREE_CHAIN(cur)) {
02262 assert(TREE_CODE(cur) == TREE_LIST);
02263
02264 tree name = TREE_PURPOSE(cur);
02265 tree value = TREE_VALUE(cur);
02266
02267 verify_ordinary_identifier(name);
02268 verify_integer_cst(value);
02269
02270 assert(same_type_p(TREE_TYPE(value), type));
02271
02272 assert(!tree_int_cst_lt(value, min_value));
02273 assert(!tree_int_cst_lt(max_value, value));
02274
02275 min_seen = min_seen || tree_int_cst_equal(value, min_value);
02276 max_seen = min_seen || tree_int_cst_equal(value, max_value);
02277 }
02278
02279 assert(min_seen);
02280 assert(max_seen);
02281 }
02282
02283 void verify_pointer_type(tree type)
02284 {
02285 assert(type != NULL_TREE);
02286 assert(TREE_CODE(type) == POINTER_TYPE);
02287
02288
02289 if (TYPE_PTRMEM_P(type)) {
02290 tree T = TYPE_PTRMEM_POINTED_TO_TYPE(type);
02291 tree X = TYPE_PTRMEM_CLASS_TYPE(type);
02292
02293 assert(T != NULL_TREE);
02294 assert(X != NULL_TREE);
02295 assert(TREE_CODE(X) == RECORD_TYPE || TREE_CODE(X) == UNION_TYPE);
02296 verify_type(T);
02297 verify_type(X);
02298 }
02299
02300
02301 else {
02302 tree pointed_to = TREE_TYPE(type);
02303 assert(pointed_to != NULL_TREE);
02304 verify_type(pointed_to);
02305 }
02306 }
02307
02308 void verify_reference_type(tree type)
02309 {
02310 assert(type != NULL_TREE);
02311 assert(TREE_CODE(type) == REFERENCE_TYPE);
02312
02313 tree pointed_to = TREE_TYPE(type);
02314 assert(pointed_to != NULL_TREE);
02315 verify_type(pointed_to);
02316 }
02317
02318 void verify_function_type(tree type)
02319 {
02320 assert(type != NULL_TREE);
02321 assert(TREE_CODE(type) == FUNCTION_TYPE);
02322
02323 tree return_type = TREE_TYPE(type);
02324 assert(return_type != NULL_TREE);
02325 verify_type(return_type);
02326
02327 verify_function_arguments(TYPE_ARG_TYPES(type));
02328 }
02329
02330 void verify_method_type(tree type)
02331 {
02332 assert(type != NULL_TREE);
02333 assert(TREE_CODE(type) == METHOD_TYPE);
02334
02335
02336 tree enclosing_class = TYPE_METHOD_BASETYPE(type);
02337 assert(enclosing_class != NULL_TREE);
02338 assert(TREE_CODE(enclosing_class) == RECORD_TYPE ||
02339 TREE_CODE(enclosing_class) == UNION_TYPE);
02340
02341
02342 tree methods = TYPE_METHODS(enclosing_class);
02343 while (methods != NULL_TREE) {
02344 assert(TREE_CODE(methods) == FUNCTION_DECL);
02345 assert(DECL_FUNCTION_MEMBER_P(methods));
02346 if (same_type_p(type, TREE_TYPE(methods)))
02347 break;
02348
02349 methods = TREE_CHAIN(methods);
02350 }
02351 assert(methods != NULL_TREE);
02352
02353 verify_function_arguments(TYPE_ARG_TYPES(type));
02354 }
02355
02356
02357 void verify_function_arguments(tree args)
02358 {
02359 while (args != NULL_TREE) {
02360 assert(TREE_CODE(args) == TREE_LIST);
02361 tree arg_type = TREE_VALUE(args);
02362 tree default_arg = TREE_PURPOSE(args);
02363 tree next = TREE_CHAIN(args);
02364
02365 assert(arg_type != NULL_TREE);
02366 verify_type(arg_type);
02367
02368
02369 if (default_arg != NULL_TREE) {
02370 verify_expr(default_arg);
02371 assert(same_type_p(TREE_TYPE(default_arg), arg_type));
02372 }
02373
02374
02375
02376 if (same_type_p(arg_type, void_type_node))
02377 assert(next == NULL_TREE);
02378
02379 args = next;
02380 }
02381 }
02382
02383
02384 void verify_array_type(tree type)
02385 {
02386 assert(type != NULL_TREE);
02387 assert(TREE_CODE(type) == ARRAY_TYPE);
02388
02389
02390 assert(TYPE_NAME(type) == NULL_TREE);
02391
02392
02393 tree element_type = TREE_TYPE(type);
02394 assert(element_type != NULL_TREE);
02395 verify_type(element_type);
02396 assert(TYPE_SIZE(element_type) != NULL_TREE);
02397
02398
02399
02400
02401
02402 if (TYPE_SIZE(type) == NULL_TREE) {
02403 assert(TYPE_DOMAIN(type) == NULL_TREE);
02404 }
02405
02406
02407 else {
02408 tree bounds = TYPE_DOMAIN(type);
02409 assert(bounds != NULL_TREE);
02410 assert(TREE_CODE(bounds) == INTEGER_TYPE);
02411
02412
02413 tree min_value = TYPE_MIN_VALUE(bounds);
02414 tree max_value = TYPE_MAX_VALUE(bounds);
02415
02416 assert(min_value != NULL_TREE);
02417 assert(max_value != NULL_TREE);
02418 assert(TREE_CODE(min_value) == INTEGER_CST);
02419 assert(TREE_CODE(max_value) == INTEGER_CST);
02420
02421 assert(tree_int_cst_equal(min_value, integer_zero_node));
02422 assert(!tree_int_cst_lt(max_value, min_value));
02423
02424
02425
02426
02427
02428 if (TREE_INT_CST_HIGH(TYPE_SIZE(type)) == 0) {
02429 assert(TREE_INT_CST_HIGH(TYPE_SIZE(element_type)) == 0);
02430 assert(TREE_INT_CST_HIGH(max_value) == 0);
02431
02432 HOST_WIDE_INT n = TREE_INT_CST_LOW(max_value) + 1;
02433 HOST_WIDE_INT esize = TREE_INT_CST_HIGH(TYPE_SIZE(element_type));
02434 HOST_WIDE_INT asize = TREE_INT_CST_HIGH(TYPE_SIZE(type));
02435 assert(asize == esize * n);
02436 }
02437 }
02438 }
02439
02440 void verify_class_type(tree type)
02441 {
02442 assert(type != NULL_TREE);
02443 assert(TREE_CODE(type) == RECORD_TYPE || TREE_CODE(type) == UNION_TYPE);
02444
02445 if (tree_node_already_seen(type))
02446 return;
02447 mark_tree_node_as_seen(type);
02448
02449
02450 if (TREE_CODE(type) == RECORD_TYPE && TYPE_PTRMEMFUNC_P(type)) {
02451 tree fptr_type = TYPE_PTRMEMFUNC_FN_TYPE(type);
02452 assert(fptr_type != NULL_TREE);
02453 assert(TREE_CODE(fptr_type) == POINTER_TYPE);
02454
02455 tree pointed_to = TREE_TYPE(fptr_type);
02456 assert(pointed_to != NULL_TREE);
02457 assert(TREE_CODE(pointed_to) == METHOD_TYPE);
02458 verify_type(fptr_type);
02459 }
02460
02461
02462 else {
02463
02464
02465 tree fn = TYPE_METHODS(type);
02466 while (fn != NULL_TREE) {
02467 assert(TREE_CODE(fn) == FUNCTION_DECL);
02468
02469
02470
02471 tree fn_parent = get_parent_or_null(fn);
02472 if (fn_parent) {
02473 assert(TREE_CODE(fn_parent) == RECORD_TYPE ||
02474 TREE_CODE(fn_parent) == UNION_TYPE);
02475 assert(type != fn_parent);
02476 assert(tree_node_already_seen(fn_parent));
02477 assert(same_type_p(TYPE_MAIN_VARIANT(type),
02478 TYPE_MAIN_VARIANT(fn_parent)));
02479 }
02480 else
02481 add_child_to_map(type, fn);
02482
02483 verify_decl(fn, class_scope);
02484 fn = TREE_CHAIN(fn);
02485 }
02486
02487
02488 tree mem = TYPE_FIELDS(type);
02489 while (mem) {
02490
02491 const tree_code code = TREE_CODE(mem);
02492 assert(code == FIELD_DECL ||
02493 code == VAR_DECL ||
02494 code == TYPE_DECL ||
02495 code == CONST_DECL);
02496
02497
02498
02499 tree mem_parent = get_parent_or_null(mem);
02500 if (mem_parent) {
02501 assert(TREE_CODE(mem_parent) == RECORD_TYPE ||
02502 TREE_CODE(mem_parent) == UNION_TYPE);
02503 assert(type != mem_parent);
02504 assert(tree_node_already_seen(mem_parent));
02505 assert(same_type_p(TYPE_MAIN_VARIANT(type),
02506 TYPE_MAIN_VARIANT(mem_parent)));
02507 }
02508 else
02509 add_child_to_map(type, mem);
02510
02511
02512 verify_decl(mem, class_scope);
02513
02514
02515
02516
02517 if (code == CONST_DECL) {
02518 tree enum_type = TREE_TYPE(mem);
02519 tree cur = TYPE_FIELDS(type);
02520 while (cur) {
02521 if (TREE_CODE(cur) == TYPE_DECL);
02522 tree t1 = TREE_TYPE(cur);
02523 assert(t1 != NULL_TREE);
02524 if (TREE_CODE(t1) == ENUMERAL_TYPE && same_type_p(enum_type, t1))
02525 break;
02526 cur = TREE_CHAIN(cur);
02527 }
02528 assert(cur != NULL_TREE);
02529 }
02530
02531 mem = TREE_CHAIN(mem);
02532 }
02533
02534
02535 tree binfo = TYPE_BINFO(type);
02536 assert(binfo != NULL_TREE);
02537 assert(TREE_CODE(binfo) == TREE_VEC);
02538 tree binfo_type = BINFO_TYPE(binfo);
02539 assert(binfo_type != NULL_TREE);
02540 assert(TREE_CODE(binfo_type) == RECORD_TYPE ||
02541 TREE_CODE(binfo_type) == UNION_TYPE);
02542
02543 assert(same_type_p(TYPE_MAIN_VARIANT(type),
02544 TYPE_MAIN_VARIANT(binfo_type)));
02545
02546 tree basetypes = BINFO_BASETYPES(binfo);
02547
02548
02549 if (basetypes != NULL_TREE) {
02550 assert(TREE_CODE(basetypes) == TREE_VEC);
02551
02552
02553 size_t n = TREE_VEC_LENGTH(basetypes);
02554 assert(n != 0);
02555
02556 for(size_t i = 0; i < n; ++i) {
02557 tree base_binfo = TREE_VEC_ELT(basetypes, i);
02558 assert(base_binfo != NULL_TREE);
02559 assert(TREE_CODE(base_binfo) == TREE_VEC);
02560
02561
02562 int num_access_types = 0;
02563 num_access_types += TREE_VIA_PUBLIC(base_binfo) ? 1 : 0;
02564 num_access_types += TREE_VIA_PROTECTED(base_binfo) ? 1 : 0;
02565 num_access_types += TREE_VIA_PRIVATE(base_binfo) ? 1 : 0;
02566 assert(num_access_types == 1);
02567
02568
02569 tree base_class = BINFO_TYPE(base_binfo);
02570 assert(base_class != NULL_TREE);
02571 assert(TREE_CODE(base_class) == RECORD_TYPE ||
02572 TREE_CODE(base_class) == UNION_TYPE);
02573 if (TREE_CODE(base_class) == RECORD_TYPE)
02574 assert(!TYPE_PTRMEMFUNC_P(type));
02575 verify_type(base_class);
02576 }
02577 }
02578 }
02579 }
02580
02581
02582 const char* verify_named_type(tree type)
02583 {
02584 assert(type != NULL_TREE);
02585 assert(TREE_CODE_CLASS(TREE_CODE(type)) == 't');
02586
02587
02588 tree decl = TYPE_NAME(type);
02589 assert(decl != NULL_TREE);
02590 assert(TREE_CODE(decl) == TYPE_DECL);
02591
02592 tree id = DECL_NAME(decl);
02593 assert(id != NULL_TREE);
02594 return verify_ordinary_identifier(id);
02595 }
02596
02597
02598 void verify_type_name_is(tree type, const char* s)
02599 {
02600 assert(s != 0);
02601 size_t len = strlen(s);
02602
02603 const char* name = verify_named_type(type);
02604 assert(strncmp(name, s, len) == 0);
02605 assert(name[len] == '\0');
02606 }
02607
02608
02609
02610
02611 struct void_ptr_hash {
02612 size_t operator()(void* p) const { return reinterpret_cast<size_t>(p); }
02613 };
02614
02615
02616 std::hash_map<tree, tree, void_ptr_hash> parent_map;
02617 std::hash_set<tree, void_ptr_hash> seen_map;
02618
02619
02620
02621 tree get_parent(tree t)
02622 {
02623 assert(t != NULL_TREE);
02624 assert(parent_map.find(t) != parent_map.end());
02625
02626 tree result = parent_map[t];
02627 assert(result != NULL_TREE);
02628 return result;
02629 }
02630
02631
02632 tree get_parent_or_null(tree t)
02633 {
02634 assert(t != NULL_TREE);
02635 if (parent_map.find(t) == parent_map.end())
02636 return NULL_TREE;
02637 else {
02638 tree result = parent_map[t];
02639 assert(result != NULL_TREE);
02640 return result;
02641 }
02642 }
02643
02644
02645 void verify_parentless(tree t)
02646 {
02647 assert(t != NULL_TREE);
02648 assert(parent_map.find(t) == parent_map.end());
02649 }
02650
02651
02652
02653
02654
02655 void add_child_to_map(tree parent, tree child)
02656 {
02657 assert(parent != NULL_TREE);
02658 assert(child != NULL_TREE);
02659 assert(parent_map.find(child) == parent_map.end());
02660 parent_map[child] = parent;
02661 }
02662
02663 bool tree_node_already_seen(tree t)
02664 {
02665 return seen_map.find(t) != seen_map.end();
02666 }
02667
02668 void mark_tree_node_as_seen(tree t)
02669 {
02670 seen_map.insert(t);
02671 }
02672
02673
02674
02675
02676
02677
02678 const char* verify_ordinary_identifier(tree id) {
02679 assert(id != NULL_TREE);
02680
02681
02682 assert(TREE_CODE(id) == IDENTIFIER_NODE);
02683
02684
02685 assert(!IDENTIFIER_OPNAME_P(id));
02686
02687
02688 const char* s = IDENTIFIER_POINTER(id);
02689 assert(s != 0);
02690
02691
02692 assert(IDENTIFIER_LENGTH(id) == strlen(s));
02693
02694 return s;
02695 }
02696
02697
02698
02699
02700 const char* verify_identifier(tree id) {
02701 assert(id != NULL_TREE);
02702
02703
02704 assert(TREE_CODE(id) == IDENTIFIER_NODE);
02705
02706
02707
02708 return IDENTIFIER_OPNAME_P(id)
02709 ? (const char*) 0
02710 : verify_ordinary_identifier(id);
02711 }
02712
02713
02714
02715
02716
02717
02718
02719 tree ancestor_is_function(tree t)
02720 {
02721 tree cur = get_parent(t);
02722 while (cur != NULL_TREE) {
02723 const tree_code c = TREE_CODE(cur);
02724 if (c == FUNCTION_DECL)
02725 return cur;
02726 else if (c == NAMESPACE_DECL || c == RECORD_TYPE || c == UNION_TYPE)
02727 return NULL_TREE;
02728
02729 cur = get_parent(cur);
02730 }
02731
02732 return NULL_TREE;
02733 }
02734
02735
02736
02737
02738 bool ancestor_is_loop(tree t)
02739 {
02740 tree cur = get_parent(t);
02741 while (cur != NULL_TREE) {
02742 const tree_code c = TREE_CODE(cur);
02743 if (c == DO_STMT || c == FOR_STMT || c == WHILE_STMT)
02744 return true;
02745 else if (c == NAMESPACE_DECL ||
02746 c == RECORD_TYPE || c == UNION_TYPE ||
02747 c == FUNCTION_DECL)
02748 return false;
02749
02750 cur = get_parent(cur);
02751 }
02752
02753 return false;
02754 }
02755
02756
02757
02758
02759
02760 bool ancestor_is_switch(tree t)
02761 {
02762 tree cur = get_parent(t);
02763 while (cur != NULL_TREE) {
02764 const tree_code c = TREE_CODE(cur);
02765 if (c == SWITCH_STMT)
02766 return true;
02767 else if (c == NAMESPACE_DECL ||
02768 c == RECORD_TYPE || c == UNION_TYPE ||
02769 c == FUNCTION_DECL)
02770 return false;
02771
02772 cur = get_parent(cur);
02773 }
02774
02775 return false;
02776 }
02777
02778 bool is_integral_type(tree type)
02779 {
02780 assert(type != NULL_TREE);
02781 const tree_code c = TREE_CODE(type);
02782 return c == INTEGER_TYPE || c == ENUMERAL_TYPE || c == BOOLEAN_TYPE;
02783 }
02784
02785 bool is_numeric_scalar_type(tree type)
02786 {
02787 assert(type != NULL_TREE);
02788 return is_integral_type(type) || TREE_CODE(type) == REAL_TYPE;
02789 }
02790
02791 bool is_integral_constant_expression(tree expr)
02792 {
02793 assert(expr != NULL_TREE);
02794 return is_integral_type(TREE_TYPE(expr)) && TREE_CONSTANT(expr);
02795 }
02796
02797
02798 unsigned long integer_cst_remainder(tree a, unsigned long N)
02799 {
02800 assert(a != NULL_TREE);
02801 assert(TREE_CODE(a) == INTEGER_CST);
02802 assert(tree_int_cst_sgn(a) >= 0);
02803 assert(N != 0);
02804
02805
02806
02807
02808
02809 assert(HOST_BITS_PER_WIDE_INT % 2 == 0);
02810 assert(N < (1 << (sizeof(long) * CHAR_BIT / 2)));
02811
02812 const unsigned long rhalf = (1 << (HOST_BITS_PER_WIDE_INT/2)) % N;
02813
02814 unsigned long rhigh = TREE_INT_CST_HIGH(a) % N;
02815 unsigned long rlow = TREE_INT_CST_LOW(a) % N;
02816
02817 unsigned long result = (rhalf * rhalf) % N;
02818 result = (result * rhigh) % N;
02819 result = (result + rlow) % N;
02820
02821 return result;
02822 }
02823
02824
02825 bool integer_cst_le(size_t x, tree y)
02826 {
02827 assert(y != NULL_TREE);
02828 assert(TREE_CODE(y) == INTEGER_CST);
02829 assert(!tree_int_cst_lt(y, integer_zero_node));
02830
02831 HOST_WIDE_INT x_low;
02832 HOST_WIDE_INT x_high;
02833
02834 if (sizeof(HOST_WIDE_INT) >= sizeof(size_t)) {
02835 x_low = x;
02836 x_high = 0;
02837 }
02838
02839 else {
02840 x_low = (HOST_WIDE_INT) x;
02841 x_high = (HOST_WIDE_INT)
02842 (x >> CHAR_BIT * (sizeof(size_t) - sizeof(HOST_WIDE_INT)));
02843 }
02844
02845 return x_high <= TREE_INT_CST_HIGH(y) &&
02846 x_low <= TREE_INT_CST_LOW(y);
02847 }