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
00033
00034
00035
00036
00037
00038
00039
00040 #ifdef _KEEP_RCS_ID
00041 static const char source_file[] = __FILE__;
00042 static const char rcs_id[] = "$Source: common/com/SCCS/s.dwarf_DST_dump.cxx $ $Revision: 1.13 $";
00043 #endif
00044
00045 #include <stdio.h>
00046 #include <cmplrs/rcodes.h>
00047 #define USE_DST_INTERNALS
00048 #include "dwarf_DST.h"
00049 #include "dwarf_DST_dump.h"
00050 #include "errors.h"
00051
00052 #define DST_DUMP_LINELENGTH 1024
00053 #define DST_TMP_BUF_LENGTH 256
00054
00055
00056
00057
00058
00059 #define DST_CHARS_DO_FIT(n) (n <= (DST_DUMP_LINELENGTH - next_char - 5))
00060
00061 static char line_buffer[DST_DUMP_LINELENGTH];
00062 static char tmp_buffer[DST_TMP_BUF_LENGTH];
00063 static UINT32 next_char;
00064 static FILE *dumpf = NULL;
00065 static char *dumpf_name = NULL;
00066 static BOOL end_of_line = FALSE;
00067
00068
00069 #define DST_ASSERT(truth, msg) Is_True(truth, (msg))
00070
00071
00072
00073
00074
00075
00076
00077
00078
00079
00080 static void
00081 DST_write_line(void)
00082 {
00083 size_t status;
00084
00085 line_buffer[next_char] = '\n';
00086 status = fwrite(line_buffer, sizeof(char), next_char + 1, dumpf);
00087 DST_ASSERT(status >= next_char, "Write error while dumping DST");
00088 next_char = 0;
00089 end_of_line = FALSE;
00090 }
00091
00092
00093
00094 static void
00095 DST_line_overflow(void)
00096 {
00097 line_buffer[next_char++] = ' ';
00098 line_buffer[next_char++] = '.';
00099 line_buffer[next_char++] = '.';
00100 line_buffer[next_char++] = '.';
00101 end_of_line = TRUE;
00102 }
00103
00104
00105
00106 static void
00107 DST_nput_char(size_t n, const char c)
00108 {
00109 size_t c_idx;
00110
00111 if (!end_of_line)
00112 {
00113 if (DST_CHARS_DO_FIT(n))
00114 {
00115 for (c_idx = 0; c_idx < n; c_idx += 1)
00116 {
00117 line_buffer[next_char + c_idx] = c;
00118 }
00119 next_char = next_char + n;
00120 }
00121 else
00122 DST_line_overflow();
00123 }
00124 }
00125
00126
00127
00128 static void
00129 DST_put_string(const char *c)
00130 {
00131 size_t length, c_idx;
00132
00133 if (!end_of_line)
00134 {
00135 if (c != NULL)
00136 {
00137 length = strlen(c);
00138 if (DST_CHARS_DO_FIT(length))
00139 {
00140 for (c_idx = 0; c_idx < length; c_idx += 1)
00141 {
00142 line_buffer[next_char + c_idx] = c[c_idx];
00143 }
00144 next_char = next_char + length;
00145 }
00146 else
00147 DST_line_overflow();
00148 }
00149 else
00150 {
00151 if (DST_CHARS_DO_FIT(2))
00152 {
00153 line_buffer[next_char++] = '<';
00154 line_buffer[next_char++] = '>';
00155 }
00156 else
00157 DST_line_overflow();
00158 }
00159 }
00160 }
00161
00162
00163
00164 static void
00165 DST_put_idx(DST_IDX i)
00166 {
00167 sprintf(&tmp_buffer[0], "[%d,%d]", i.block_idx, i.byte_idx);
00168 DST_put_string(&tmp_buffer[0]);
00169 }
00170
00171 static void
00172 DST_put_st_id (INT32 level, INT32 index)
00173 {
00174 sprintf(&tmp_buffer[0], "(%d,%d)", level, index);
00175 DST_put_string(&tmp_buffer[0]);
00176 }
00177
00178 static void
00179 DST_put_string_attribute(const char *at_name, DST_STR_IDX istr)
00180 {
00181 if (!DST_IS_NULL(istr))
00182 {
00183 DST_put_string(at_name);
00184 DST_nput_char(1, '(');
00185 DST_put_string(DST_STR_IDX_TO_PTR(istr));
00186 DST_nput_char(1, ')');
00187 }
00188 }
00189
00190
00191 static void
00192 DST_put_idx_attribute(const char *at_name, DST_IDX i, BOOL is_type)
00193 {
00194 if (DST_IS_FOREIGN_OBJ(i)) {
00195 DST_put_string(at_name);
00196 DST_put_string("[foreign]");
00197 }
00198 else if (!DST_IS_NULL(i))
00199 {
00200 DST_put_string(at_name);
00201 DST_put_idx(i);
00202 }
00203 else if (is_type)
00204 {
00205 DST_put_string(at_name);
00206 DST_put_string("(void)");
00207 }
00208 }
00209
00210
00211
00212 static void
00213 DST_put_hex64_attribute(const char *at_name, UINT64 num)
00214 {
00215 DST_put_string(at_name);
00216 sprintf(&tmp_buffer[0], "(0x%llx)", num);
00217 DST_put_string(&tmp_buffer[0]);
00218 }
00219
00220
00221 static void
00222 DST_put_INT32_attribute(const char *at_name, INT32 num)
00223 {
00224 DST_put_string(at_name);
00225 sprintf(&tmp_buffer[0], "(%d)", num);
00226 DST_put_string(&tmp_buffer[0]);
00227 }
00228
00229 static void
00230 DST_put_UINT32_attribute(const char *at_name, UINT32 num)
00231 {
00232 DST_put_string(at_name);
00233 sprintf(&tmp_buffer[0], "(%u)", num);
00234 DST_put_string(&tmp_buffer[0]);
00235 }
00236
00237 #ifdef KEY
00238 static void
00239 DST_put_C4_attribute(const char *at_name, UINT32 real, UINT32 imag)
00240 {
00241 DST_put_string(at_name);
00242 sprintf(&tmp_buffer[0], "(%u, %u)", real, imag);
00243 DST_put_string(&tmp_buffer[0]);
00244 }
00245
00246 static void
00247 DST_put_C8_attribute(const char *at_name, UINT64 real, UINT64 imag)
00248 {
00249 DST_put_string(at_name);
00250 sprintf(&tmp_buffer[0], "(%llu, %llu)", real, imag);
00251 DST_put_string(&tmp_buffer[0]);
00252 }
00253 #endif // KEY
00254
00255 static void
00256 DST_put_INT64_attribute(const char *at_name, INT64 num)
00257 {
00258 DST_put_string(at_name);
00259 sprintf(&tmp_buffer[0], "(%lld)", num);
00260 DST_put_string(&tmp_buffer[0]);
00261 }
00262
00263 static void
00264 DST_put_UINT64_attribute(const char *at_name, UINT64 num)
00265 {
00266 DST_put_string(at_name);
00267 sprintf(&tmp_buffer[0], "(%llu)", num);
00268 DST_put_string(&tmp_buffer[0]);
00269 }
00270
00271
00272
00273 static void
00274 DST_put_inline_attribute(const char *at_name, DST_inline inlin)
00275 {
00276 DST_put_string(at_name);
00277 DST_nput_char(1, '(');
00278 switch (inlin) {
00279 case DW_INL_not_inlined:
00280 DST_put_string ("DW_INL_not_inlined");
00281 break;
00282 case DW_INL_inlined:
00283 DST_put_string ("DW_INL_inlined");
00284 break;
00285 case DW_INL_declared_not_inlined:
00286 DST_put_string ("DW_INL_declared_not_inlined");
00287 break;
00288 case DW_INL_declared_inlined:
00289 DST_put_string ("DW_INL_declared_inlined");
00290 break;
00291 }
00292 DST_nput_char(1, ')');
00293 }
00294
00295
00296 static void
00297 DST_put_virtuality_attribute(const char *at_name, DST_virtuality virtuality)
00298 {
00299 DST_put_string(at_name);
00300 DST_nput_char(1, '(');
00301 switch (virtuality) {
00302 case DW_VIRTUALITY_none:
00303 DST_put_string ("DW_VIRTUALITY_none");
00304 break;
00305 case DW_VIRTUALITY_virtual:
00306 DST_put_string("DW_VIRTUALITY_virtual");
00307 break;
00308 case DW_VIRTUALITY_pure_virtual:
00309 DST_put_string ("DW_VIRTUALITY_pure_virtual");
00310 break;
00311 }
00312 DST_nput_char(1, ')');
00313 }
00314
00315 #ifdef KEY
00316 static void
00317 DST_put_accessibility_attribute(const char *at_name,
00318 DST_accessibility accessibility)
00319 {
00320 DST_put_string(at_name);
00321 DST_nput_char(1, '(');
00322 switch (accessibility) {
00323 case DW_ACCESS_public:
00324 DST_put_string("DW_ACCESS_public");
00325 break;
00326 case DW_ACCESS_private:
00327 DST_put_string("DW_ACCESS_private");
00328 break;
00329 case DW_ACCESS_protected:
00330 DST_put_string("DW_ACCESS_protected");
00331 break;
00332 }
00333 DST_nput_char(1, ')');
00334 }
00335 #endif
00336
00337 static void
00338 DST_put_language_attribute(const char *at_name, DST_language lang_code)
00339 {
00340 DST_put_string(at_name);
00341 DST_nput_char(1, '(');
00342 switch (lang_code)
00343 {
00344 case DW_LANG_C89:
00345 DST_put_string("C89");
00346 break;
00347 case DW_LANG_Ada83:
00348 DST_put_string("Ada83");
00349 break;
00350 case DW_LANG_C_plus_plus:
00351 DST_put_string("C_plus_plus");
00352 break;
00353 case DW_LANG_Cobol74:
00354 DST_put_string("Cobol74");
00355 break;
00356 case DW_LANG_Cobol85:
00357 DST_put_string("Cobol85");
00358 break;
00359 case DW_LANG_Fortran77:
00360 DST_put_string("Fortran77");
00361 break;
00362 case DW_LANG_Fortran90:
00363 DST_put_string("Fortran90");
00364 break;
00365 case DW_LANG_Pascal83:
00366 DST_put_string("Pascal83");
00367 break;
00368 case DW_LANG_Modula2:
00369 DST_put_string("Modula2");
00370 break;
00371 }
00372 DST_nput_char(1, ')');
00373 }
00374
00375 static void
00376 DST_put_id_case_attribute(const char *at_name, DST_identifier_case id_case)
00377 {
00378 DST_put_string(at_name);
00379 DST_nput_char(1, '(');
00380 switch (id_case)
00381 {
00382 case DW_ID_case_sensitive:
00383 DST_put_string("case_sensitive");
00384 break;
00385 case DW_ID_up_case:
00386 DST_put_string("upper_case");
00387 break;
00388 case DW_ID_down_case:
00389 DST_put_string("lower_case");
00390 break;
00391 case DW_ID_case_insensitive:
00392 DST_put_string("case_insensitive");
00393 break;
00394 }
00395 DST_nput_char(1, ')');
00396 }
00397
00398
00399 static void
00400 DST_put_decl(USRCPOS decl)
00401 {
00402 DST_put_UINT32_attribute(" file", (UINT32)USRCPOS_filenum(decl));
00403 DST_put_UINT32_attribute(" line", (UINT32)USRCPOS_linenum(decl));
00404 DST_put_UINT32_attribute(" column", (UINT32)USRCPOS_column(decl));
00405 }
00406
00407
00408 static void
00409 DST_put_assoc(const char *at_name, DST_flag flag, DST_ASSOC_INFO assoc)
00410 {
00411 DST_put_string(at_name);
00412 DST_nput_char(1, '(');
00413 #if 0
00414 if (DST_IS_assoc_fe(flag))
00415 DST_put_hex64_attribute("FE", assoc.st_u.fe_uint);
00416 else {
00417 #endif
00418 {
00419 DST_put_string("ST");
00420 DST_put_st_id (DST_ASSOC_INFO_st_level(assoc), DST_ASSOC_INFO_st_index(assoc));
00421 }
00422 DST_nput_char(1, ')');
00423 }
00424
00425
00426 static void
00427 DST_put_const_attribute(const char *at_name, DST_CONST_VALUE cval)
00428 {
00429 switch(DST_CONST_VALUE_form(cval))
00430 {
00431 case DST_FORM_STRING:
00432 DST_put_idx_attribute(at_name, DST_CONST_VALUE_form_string(cval), FALSE);
00433 break;
00434
00435 case DST_FORM_DATA1:
00436 DST_put_UINT32_attribute(at_name,
00437 (UINT32)DST_CONST_VALUE_form_data1(cval));
00438 break;
00439
00440 case DST_FORM_DATA2:
00441 DST_put_UINT32_attribute(at_name,
00442 (UINT32)DST_CONST_VALUE_form_data2(cval));
00443 break;
00444
00445 case DST_FORM_DATA4:
00446 DST_put_UINT32_attribute(at_name,
00447 (UINT32)DST_CONST_VALUE_form_data4(cval));
00448 break;
00449
00450 case DST_FORM_DATA8:
00451 DST_put_UINT64_attribute(at_name,
00452 (UINT64)DST_CONST_VALUE_form_data8(cval));
00453 break;
00454 #ifdef KEY
00455 case DST_FORM_DATAC4:
00456 DST_put_C4_attribute(at_name,
00457 (UINT32)DST_CONST_VALUE_form_crdata4(cval),
00458 (UINT32)DST_CONST_VALUE_form_cidata4(cval));
00459 break;
00460
00461 case DST_FORM_DATAC8:
00462 DST_put_C8_attribute(at_name,
00463 (UINT64)DST_CONST_VALUE_form_crdata8(cval),
00464 (UINT64)DST_CONST_VALUE_form_cidata8(cval));
00465 break;
00466 #endif // KEY
00467 }
00468 }
00469
00470
00471
00472
00473
00474
00475
00476
00477 static void
00478 DST_put_compile_unit(DST_flag flag, DST_COMPILE_UNIT *attr)
00479 {
00480 DST_put_string(":compile_unit:");
00481 DST_put_string_attribute(" name", DST_COMPILE_UNIT_name(attr));
00482 DST_put_string_attribute(" comp_dir", DST_COMPILE_UNIT_comp_dir(attr));
00483 DST_put_string_attribute(" producer", DST_COMPILE_UNIT_producer(attr));
00484 DST_put_language_attribute(" language", DST_COMPILE_UNIT_language(attr));
00485 DST_put_id_case_attribute(" case", DST_COMPILE_UNIT_identifier_case(attr));
00486 }
00487
00488 #ifdef KEY
00489 static void
00490 DST_put_module(DST_flag flag, DST_MODULE *attr)
00491 {
00492 DST_put_string(":module:");
00493 DST_put_decl(DST_MODULE_decl(attr));
00494 DST_put_string_attribute(" name", DST_MODULE_name(attr));
00495 }
00496
00497 static void
00498 DST_put_imported_decl(DST_flag flag, DST_IMPORTED_DECL *attr)
00499 {
00500 DST_put_string(":imported declaration");
00501 DST_put_string_attribute(" name", DST_IMPORTED_DECL_name(attr));
00502 DST_put_assoc(" import", flag, DST_IMPORTED_DECL_import(attr));
00503 }
00504 #endif
00505
00506 static void
00507 DST_put_subprogram(DST_flag flag, DST_SUBPROGRAM *attr)
00508 {
00509 DST_put_string(":subprogram:");
00510 if (DST_IS_memdef(flag))
00511 {
00512 DST_put_string(" a class member with AT_specification!");
00513 }
00514 else if (DST_IS_declaration(flag))
00515 {
00516 DST_put_decl(DST_SUBPROGRAM_decl_decl(attr));
00517 DST_put_string_attribute(" name", DST_SUBPROGRAM_decl_name(attr));
00518 DST_put_string_attribute(" linkage_name",
00519 DST_SUBPROGRAM_decl_linkage_name(attr));
00520 DST_put_string(" declaration");
00521 if (DST_IS_external(flag))
00522 DST_put_string(" external");
00523 if (DST_IS_prototyped(flag))
00524 DST_put_string(" prototyped");
00525 DST_put_idx_attribute(" type", DST_SUBPROGRAM_decl_type(attr), TRUE);
00526 DST_put_idx_attribute(" origin", DST_SUBPROGRAM_decl_origin(attr), FALSE);
00527 DST_put_inline_attribute (" inline", DST_SUBPROGRAM_decl_inline(attr));
00528 DST_put_virtuality_attribute(" virtuality",
00529 DST_SUBPROGRAM_decl_virtuality(attr));
00530 DST_put_INT32_attribute(" vtable_elem_location",
00531 DST_SUBPROGRAM_decl_vtable_elem_location(attr));
00532 }
00533 else
00534 {
00535 DST_put_decl(DST_SUBPROGRAM_def_decl(attr));
00536 DST_put_string_attribute(" name", DST_SUBPROGRAM_def_name(attr));
00537 DST_put_string_attribute(" linkage_name",
00538 DST_SUBPROGRAM_def_linkage_name(attr));
00539 DST_put_string_attribute(" pubname", DST_SUBPROGRAM_def_pubname(attr));
00540 if (DST_IS_external(flag))
00541 DST_put_string(" external");
00542 if (DST_IS_prototyped(flag))
00543 DST_put_string(" prototyped");
00544 DST_put_idx_attribute(" type", DST_SUBPROGRAM_def_type(attr), TRUE);
00545 DST_put_idx_attribute(" specification",
00546 DST_SUBPROGRAM_def_specification(attr), TRUE);
00547 DST_put_idx_attribute(" clone_origin",
00548 DST_SUBPROGRAM_def_clone_origin(attr),
00549 FALSE);
00550 DST_put_inline_attribute (" inline", DST_SUBPROGRAM_def_inline(attr));
00551 DST_put_virtuality_attribute(" virtuality",
00552 DST_SUBPROGRAM_def_virtuality(attr));
00553 DST_put_INT32_attribute(" vtable_elem_location",
00554 DST_SUBPROGRAM_def_vtable_elem_location(attr));
00555
00556 DST_put_assoc(" pc", flag, DST_SUBPROGRAM_def_st(attr));
00557 }
00558 }
00559
00560 static void
00561 DST_put_inlined_subroutine(DST_flag flag, DST_INLINED_SUBROUTINE *attr)
00562 {
00563 DST_put_string(":inlined_subroutine:");
00564 if (DST_IS_FOREIGN_OBJ(DST_INLINED_SUBROUTINE_abstract_origin(attr)))
00565 DST_put_decl(DST_INLINED_SUBROUTINE_decl(attr));
00566 DST_put_assoc(" low_pc", flag, DST_INLINED_SUBROUTINE_low_pc(attr));
00567 DST_put_assoc(" high_pc", flag, DST_INLINED_SUBROUTINE_high_pc(attr));
00568 DST_put_idx_attribute(" abstract_origin",
00569 DST_INLINED_SUBROUTINE_abstract_origin(attr),
00570 FALSE);
00571 if (DST_IS_FOREIGN_OBJ(DST_INLINED_SUBROUTINE_abstract_origin(attr)))
00572 DST_put_string_attribute(" abstract_name", DST_INLINED_SUBROUTINE_abstract_name(attr));
00573 }
00574
00575 static void
00576 DST_put_entry_point(DST_flag flag, DST_ENTRY_POINT *attr)
00577 {
00578 DST_put_string(":entry point:");
00579 DST_put_decl(DST_ENTRY_POINT_decl(attr));
00580 DST_put_string_attribute(" name", DST_ENTRY_POINT_name(attr));
00581 DST_put_idx_attribute(" type", DST_ENTRY_POINT_type(attr), TRUE);
00582 DST_put_assoc(" pc", flag, DST_ENTRY_POINT_st(attr));
00583 }
00584
00585 static void
00586 DST_put_common_block(DST_flag flag, DST_COMMON_BLOCK *attr)
00587 {
00588 DST_put_string(":common blk:");
00589 DST_put_string_attribute(" name", DST_ENTRY_POINT_name(attr));
00590 DST_put_assoc(" pc", flag, DST_ENTRY_POINT_st(attr));
00591 }
00592
00593 static void
00594 DST_put_common_inclusion(DST_flag flag, DST_COMMON_INCL *attr)
00595 {
00596 DST_put_string(":common incl:");
00597 DST_put_decl(DST_COMMON_INCL_decl(attr));
00598 DST_put_idx_attribute(" type", DST_COMMON_INCL_com_blk(attr), TRUE);
00599 }
00600
00601 static void
00602 DST_put_lexical_block(DST_flag flag, DST_LEXICAL_BLOCK *attr)
00603 {
00604 DST_put_string(":lexical_block:");
00605 DST_put_string_attribute(" name", DST_LEXICAL_BLOCK_name(attr));
00606 DST_put_assoc(" low_pc", flag, DST_LEXICAL_BLOCK_low_pc(attr));
00607 DST_put_assoc(" high_pc", flag, DST_LEXICAL_BLOCK_high_pc(attr));
00608 }
00609
00610
00611 static void
00612 DST_put_label(DST_flag flag, DST_LABEL *attr)
00613 {
00614 DST_put_string(":label:");
00615 DST_put_string_attribute(" name", DST_LABEL_name(attr));
00616 DST_put_assoc(" low_pc", flag, DST_LABEL_low_pc(attr));
00617 }
00618
00619
00620 static void
00621 DST_put_variable(DST_flag flag, DST_VARIABLE *attr)
00622 {
00623 DST_put_string(":variable:");
00624 if (DST_IS_artificial(flag))
00625 DST_put_string(" artificial");
00626 if (DST_IS_const(flag))
00627 {
00628 #ifdef KEY
00629 DST_put_decl(DST_VARIABLE_decl_decl(attr));
00630 DST_put_string_attribute(" name", DST_VARIABLE_decl_name(attr));
00631 #endif
00632 DST_put_string(" a constant variable!");
00633 }
00634 else if (DST_IS_comm(flag))
00635 {
00636 DST_put_string("var in common:");
00637 if (DST_IS_deref(flag))
00638 DST_put_string(" deref");
00639 if (DST_IS_f90_pointer(flag))
00640 DST_put_string(" f90_pointer");
00641 if (DST_IS_allocatable(flag))
00642 DST_put_string(" allocatable");
00643 if (DST_IS_assumed_shape(flag))
00644 DST_put_string(" assumed_shape");
00645 if (DST_IS_assumed_size(flag))
00646 DST_put_string(" assumed_size");
00647 DST_put_decl(DST_VARIABLE_comm_decl(attr));
00648 DST_put_string_attribute(" name", DST_VARIABLE_comm_name(attr));
00649 DST_put_idx_attribute(" type", DST_VARIABLE_comm_type(attr), TRUE);
00650 DST_put_UINT64_attribute(" offset", DST_VARIABLE_comm_offs(attr));
00651 DST_put_assoc(" location", flag, DST_VARIABLE_comm_st(attr));
00652 DST_put_idx_attribute(" dopetype", DST_VARIABLE_comm_dopetype(attr),TRUE);
00653 }
00654 else if (DST_IS_memdef(flag))
00655 {
00656 DST_put_string(" a class member with AT_specification!");
00657 }
00658 else if (DST_IS_declaration(flag))
00659 {
00660 DST_put_decl(DST_VARIABLE_decl_decl(attr));
00661 DST_put_string_attribute(" name", DST_VARIABLE_decl_name(attr));
00662 DST_put_string(" declaration");
00663 if (DST_IS_external(flag))
00664 DST_put_string(" external");
00665 if (DST_IS_automatic(flag))
00666 DST_put_string(" <auto>");
00667 DST_put_idx_attribute(" type", DST_VARIABLE_decl_type(attr), TRUE);
00668 #ifdef KEY
00669 DST_put_string_attribute(" linkage_name",
00670 DST_VARIABLE_decl_linkage_name(attr));
00671 #endif
00672 }
00673 else
00674 {
00675 DST_put_decl(DST_VARIABLE_def_decl(attr));
00676 DST_put_string_attribute(" name", DST_VARIABLE_def_name(attr));
00677 if (DST_IS_external(flag))
00678 DST_put_string(" external");
00679 if (DST_IS_automatic(flag))
00680 DST_put_string(" <auto>");
00681 if (DST_IS_deref(flag))
00682 DST_put_string(" deref");
00683 if (DST_IS_base_deref(flag))
00684 DST_put_string(" base_deref");
00685 if (DST_IS_f90_pointer(flag))
00686 DST_put_string(" f90_pointer");
00687 if (DST_IS_allocatable(flag))
00688 DST_put_string(" allocatable");
00689 if (DST_IS_assumed_shape(flag))
00690 DST_put_string(" assumed shape");
00691 if (DST_IS_assumed_size(flag))
00692 DST_put_string(" assumed_size");
00693
00694 DST_put_UINT64_attribute(" offset", DST_VARIABLE_def_offs(attr));
00695 DST_put_idx_attribute(" type", DST_VARIABLE_def_type(attr), TRUE);
00696 DST_put_assoc(" location", flag, DST_VARIABLE_def_st(attr));
00697 DST_put_idx_attribute(" abstract_origin",
00698 DST_VARIABLE_def_abstract_origin(attr), FALSE);
00699 DST_put_idx_attribute(" dopetype", DST_VARIABLE_def_dopetype(attr), TRUE);
00700 #ifdef KEY
00701 DST_put_string_attribute(" linkage_name",
00702 DST_VARIABLE_def_linkage_name(attr));
00703 #endif
00704 }
00705 }
00706
00707
00708 static void
00709 DST_put_formal_parameter(DST_flag flag, DST_FORMAL_PARAMETER *attr)
00710 {
00711 DST_put_string(":formal_parameter:");
00712 if (DST_IS_artificial(flag))
00713 DST_put_string(" artificial");
00714 if (DST_IS_base_deref(flag))
00715 DST_put_string(" base_deref");
00716 if (DST_IS_deref(flag))
00717 DST_put_string(" deref");
00718 if (DST_IS_f90_pointer(flag))
00719 DST_put_string(" f90_pointer");
00720 if (DST_IS_allocatable(flag))
00721 DST_put_string(" allocatable");
00722 if (DST_IS_assumed_shape(flag))
00723 DST_put_string(" assumed shape");
00724 if (DST_IS_assumed_size(flag))
00725 DST_put_string(" assumed_size");
00726 DST_put_decl(DST_FORMAL_PARAMETER_decl(attr));
00727 DST_put_string_attribute(" name", DST_FORMAL_PARAMETER_name(attr));
00728 if (DST_IS_optional_parm(flag))
00729 DST_put_string(" is_optional");
00730 if (DST_IS_variable_parm(flag))
00731 DST_put_string(" variable_parameter");
00732 DST_put_idx_attribute(" type", DST_FORMAL_PARAMETER_type(attr), TRUE);
00733 DST_put_idx_attribute(" default_value",
00734 DST_FORMAL_PARAMETER_default_val(attr), FALSE);
00735 DST_put_idx_attribute(" abstract_origin",
00736 DST_FORMAL_PARAMETER_abstract_origin(attr), FALSE);
00737 DST_put_assoc(" location", flag, DST_FORMAL_PARAMETER_st(attr));
00738 DST_put_idx_attribute(" dopetype", DST_FORMAL_PARAMETER_dopetype(attr),TRUE);
00739 }
00740
00741
00742 static void
00743 DST_put_unspecified_parameters(DST_flag flag, DST_UNSPECIFIED_PARAMETERS *attr)
00744 {
00745 DST_put_string(":unspecified_parameters:");
00746 DST_put_decl(DST_FORMAL_PARAMETER_decl(attr));
00747 }
00748
00749
00750 static void
00751 DST_put_basetype(DST_flag flag, DST_BASETYPE *attr)
00752 {
00753 DST_put_string(":basetype:");
00754 DST_put_string_attribute(" name", DST_FORMAL_PARAMETER_name(attr));
00755 DST_put_INT32_attribute(" encoding", DST_BASETYPE_encoding(attr));
00756 DST_put_INT32_attribute(" byte_size", DST_BASETYPE_byte_size(attr));
00757 }
00758
00759
00760 static void
00761 DST_put_const_type(DST_flag flag, DST_CONST_TYPE *attr)
00762 {
00763 DST_put_string(":const_type:");
00764 DST_put_idx_attribute(" type", DST_CONST_TYPE_type(attr), TRUE);
00765 }
00766
00767 static void
00768 DST_put_constant(DST_flag flag, DST_CONSTANT *attr)
00769 {
00770 DST_put_string(":constant:");
00771 DST_put_decl(DST_CONSTANT_def_decl(attr));
00772 DST_put_string_attribute(" name", DST_CONSTANT_def_name(attr));
00773 DST_put_idx_attribute(" type", DST_CONSTANT_def_type(attr), TRUE);
00774 DST_put_const_attribute(" value", DST_CONSTANT_def_cval(attr));
00775 }
00776
00777
00778 static void
00779 DST_put_volatile_type(DST_flag flag, DST_VOLATILE_TYPE *attr)
00780 {
00781 DST_put_string(":volatile_type:");
00782 DST_put_idx_attribute(" type", DST_VOLATILE_TYPE_type(attr), TRUE);
00783 }
00784
00785
00786 static void
00787 DST_put_pointer_type(DST_flag flag, DST_POINTER_TYPE *attr)
00788 {
00789 DST_put_string(":pointer_type:");
00790 DST_put_idx_attribute(" type", DST_POINTER_TYPE_type(attr), TRUE);
00791 DST_put_INT32_attribute(" address_class",
00792 DST_POINTER_TYPE_address_class(attr));
00793 DST_put_INT32_attribute(" byte_size", DST_POINTER_TYPE_byte_size(attr));
00794 }
00795
00796
00797 static void
00798 DST_put_reference_type(DST_flag flag, DST_REFERENCE_TYPE *attr)
00799 {
00800 DST_put_string(":reference_type:");
00801 DST_put_idx_attribute(" type", DST_REFERENCE_TYPE_type(attr), TRUE);
00802 DST_put_INT32_attribute(" address_class",
00803 DST_REFERENCE_TYPE_address_class(attr));
00804 DST_put_INT32_attribute(" byte_size", DST_REFERENCE_TYPE_byte_size(attr));
00805 }
00806
00807
00808 static void
00809 DST_put_typedef(DST_flag flag, DST_TYPEDEF *attr)
00810 {
00811 DST_put_string(":typedef:");
00812 DST_put_decl(DST_TYPEDEF_decl(attr));
00813 DST_put_string_attribute(" name", DST_TYPEDEF_name(attr));
00814 DST_put_idx_attribute(" type", DST_TYPEDEF_type(attr), TRUE);
00815 DST_put_idx_attribute(" abstract_origin",
00816 DST_TYPEDEF_abstract_origin(attr), FALSE);
00817 }
00818
00819
00820 static void
00821 DST_put_array_type(DST_flag flag, DST_ARRAY_TYPE *attr)
00822 {
00823 DST_put_string(":array_type:");
00824 DST_put_decl(DST_ARRAY_TYPE_decl(attr));
00825 DST_put_string_attribute(" name", DST_ARRAY_TYPE_name(attr));
00826 DST_put_idx_attribute(" type", DST_ARRAY_TYPE_type(attr), TRUE);
00827 DST_put_INT32_attribute(" byte_size", DST_ARRAY_TYPE_byte_size(attr));
00828 DST_put_idx_attribute(" abstract_origin",
00829 DST_ARRAY_TYPE_abstract_origin(attr), FALSE);
00830 if (DST_IS_declaration(flag))
00831 DST_put_string(" declaration");
00832 #ifdef TARG_X8664
00833 if (DST_IS_GNU_vector(flag))
00834 DST_put_string(" GNU_vector");
00835 #endif
00836 }
00837
00838
00839 static void
00840 DST_put_subrange_type(DST_flag flag, DST_SUBRANGE_TYPE *attr)
00841 {
00842 const char * p;
00843 DST_put_string(":subrange_type:");
00844 if (DST_IS_lb_cval(flag))
00845 DST_put_INT32_attribute(" lower",
00846 DST_SUBRANGE_TYPE_lower_cval(attr));
00847 else
00848 DST_put_idx_attribute(" lower",
00849 DST_SUBRANGE_TYPE_lower_ref(attr), FALSE);
00850
00851 p = " upper";
00852 if (DST_IS_count(flag))
00853 p = " count";
00854
00855 if (DST_IS_ub_cval(flag))
00856 DST_put_INT32_attribute(p,
00857 DST_SUBRANGE_TYPE_upper_cval(attr));
00858 else
00859 DST_put_idx_attribute(p,
00860 DST_SUBRANGE_TYPE_upper_ref(attr), FALSE);
00861
00862
00863 if (DST_IS_stride_1byte(flag))
00864 p = " stride_1byte" ;
00865
00866 else if (DST_IS_stride_2byte(flag))
00867 p = " stride_2byte" ;
00868
00869 else
00870 p = " stride" ;
00871
00872 DST_put_idx_attribute(p,DST_SUBRANGE_TYPE_stride_ref(attr), FALSE);
00873 }
00874
00875 static void
00876 DST_put_string_type(DST_flag flag, DST_STRING_TYPE *attr)
00877 {
00878 DST_put_string(":string_type:");
00879 DST_put_decl(DST_STRING_TYPE_decl(attr));
00880 DST_put_string_attribute(" name", DST_STRING_TYPE_name(attr));
00881 if (DST_IS_cval(flag))
00882 DST_put_INT32_attribute(" length",
00883 DST_STRING_TYPE_len_cval(attr));
00884 else
00885 DST_put_idx_attribute(" length",
00886 DST_STRING_TYPE_len_ref(attr), FALSE);
00887 }
00888
00889 static void
00890 DST_put_structure_type(DST_flag flag, DST_STRUCTURE_TYPE *attr)
00891 {
00892 DST_put_string(":structure_type:");
00893 DST_put_decl(DST_STRUCTURE_TYPE_decl(attr));
00894 DST_put_string_attribute(" name", DST_STRUCTURE_TYPE_name(attr));
00895 DST_put_INT32_attribute(" byte_size", DST_STRUCTURE_TYPE_byte_size(attr));
00896 DST_put_idx_attribute(" abstract_origin",
00897 DST_STRUCTURE_TYPE_abstract_origin(attr), FALSE);
00898 if (DST_IS_declaration(flag))
00899 DST_put_string(" declaration");
00900 }
00901
00902 static void
00903 DST_put_class_type(DST_flag flag, DST_CLASS_TYPE *attr)
00904 {
00905 DST_put_string(":class_type:");
00906 DST_put_decl(DST_CLASS_TYPE_decl(attr));
00907 DST_put_string_attribute(" name", DST_CLASS_TYPE_name(attr));
00908 DST_put_INT32_attribute(" byte_size", DST_CLASS_TYPE_byte_size(attr));
00909 DST_put_idx_attribute(" abstract_origin",
00910 DST_CLASS_TYPE_abstract_origin(attr), FALSE);
00911 if (DST_IS_declaration(flag))
00912 DST_put_string(" declaration");
00913 }
00914
00915
00916 static void
00917 DST_put_union_type(DST_flag flag, DST_UNION_TYPE *attr)
00918 {
00919 DST_put_string(":union_type:");
00920 DST_put_decl(DST_UNION_TYPE_decl(attr));
00921 DST_put_string_attribute(" name", DST_UNION_TYPE_name(attr));
00922 DST_put_INT32_attribute(" byte_size", DST_UNION_TYPE_byte_size(attr));
00923 DST_put_idx_attribute(" abstract_origin",
00924 DST_UNION_TYPE_abstract_origin(attr), FALSE);
00925 if (DST_IS_declaration(flag))
00926 DST_put_string(" declaration");
00927 }
00928
00929
00930 static void
00931 DST_put_member(DST_flag flag, DST_MEMBER *attr)
00932 {
00933 DST_put_string(":member:");
00934 DST_put_decl(DST_MEMBER_decl(attr));
00935 DST_put_string_attribute(" name", DST_MEMBER_name(attr));
00936 DST_put_idx_attribute(" type", DST_MEMBER_type(attr), TRUE);
00937 DST_put_INT32_attribute(" data_member_location",
00938 DST_MEMBER_memb_loc(attr));
00939 DST_put_idx_attribute(" dopetype", DST_MEMBER_dopetype(attr),TRUE);
00940
00941 if (DST_IS_bitfield(flag))
00942 {
00943 DST_put_INT32_attribute(" byte_size", DST_MEMBER_byte_size(attr));
00944 DST_put_INT32_attribute(" bit_offset", DST_MEMBER_bit_offset(attr));
00945 DST_put_INT32_attribute(" bit_size", DST_MEMBER_bit_size(attr));
00946 }
00947 if (DST_IS_declaration(flag))
00948 DST_put_string(" declaration");
00949 if (DST_IS_f90_pointer(flag))
00950 DST_put_string(" f90_pointer");
00951 if (DST_IS_allocatable(flag))
00952 DST_put_string(" allocatable");
00953 if (DST_IS_assumed_shape(flag))
00954 DST_put_string(" assumed shape");
00955 }
00956
00957 static void
00958 DST_put_inheritance(DST_flag flag, DST_INHERITANCE *attr)
00959 {
00960 DST_put_string(":inheritance:");
00961 DST_put_idx_attribute(" type", DST_INHERITANCE_type(attr), TRUE);
00962 DST_put_INT32_attribute(" data_member_location",
00963 DST_INHERITANCE_memb_loc(attr));
00964 #ifdef KEY
00965 DST_put_accessibility_attribute(" accessibility",
00966 DST_INHERITANCE_accessibility(attr));
00967 #endif
00968 }
00969
00970
00971 static void
00972 DST_put_template_type_param(DST_flag flag,
00973 DST_TEMPLATE_TYPE_PARAMETER *attr)
00974 {
00975 DST_put_string(":template_type_param:");
00976 DST_put_string_attribute(" name", DST_TEMPLATE_TYPE_PARAMETER_name(attr));
00977 DST_put_idx_attribute(" type", DST_TEMPLATE_TYPE_PARAMETER_type(attr),
00978 TRUE);
00979 }
00980
00981
00982 static void
00983 DST_put_template_value_param(DST_flag flag,
00984 DST_TEMPLATE_VALUE_PARAMETER *attr)
00985 {
00986 DST_put_string(":template_value_param:");
00987 DST_put_string_attribute(" name", DST_TEMPLATE_VALUE_PARAMETER_name(attr));
00988 DST_put_const_attribute(" value", DST_TEMPLATE_VALUE_PARAMETER_cval(attr));
00989 }
00990
00991
00992 static void
00993 DST_put_enumeration_type(DST_flag flag, DST_ENUMERATION_TYPE *attr)
00994 {
00995 DST_put_string(":enumeration_type:");
00996 DST_put_decl(DST_ENUMERATION_TYPE_decl(attr));
00997 DST_put_string_attribute(" name", DST_ENUMERATION_TYPE_name(attr));
00998 DST_put_INT32_attribute(" byte_size", DST_ENUMERATION_TYPE_byte_size(attr));
00999 DST_put_idx_attribute(" abstract_origin",
01000 DST_ENUMERATION_TYPE_abstract_origin(attr), FALSE);
01001 if (DST_IS_declaration(flag))
01002 DST_put_string(" declaration");
01003 }
01004
01005
01006 static void
01007 DST_put_enumerator(DST_flag flag, DST_ENUMERATOR *attr)
01008 {
01009 DST_put_string(":enumerator:");
01010 DST_put_decl(DST_ENUMERATOR_decl(attr));
01011 DST_put_string_attribute(" name", DST_ENUMERATOR_name(attr));
01012 DST_put_const_attribute(" const_value", DST_ENUMERATOR_cval(attr));
01013 }
01014
01015
01016 static void
01017 DST_put_subroutine_type(DST_flag flag, DST_SUBROUTINE_TYPE *attr)
01018 {
01019 DST_put_string(":subroutine_type:");
01020 DST_put_decl(DST_SUBROUTINE_TYPE_decl(attr));
01021 DST_put_string_attribute(" name", DST_SUBROUTINE_TYPE_name(attr));
01022 DST_put_idx_attribute(" type", DST_SUBROUTINE_TYPE_type(attr), TRUE);
01023 DST_put_idx_attribute(" abstract_origin",
01024 DST_SUBROUTINE_TYPE_abstract_origin(attr), FALSE);
01025 if (DST_IS_prototyped(flag))
01026 DST_put_string(" prototyped");
01027 }
01028
01029
01030
01031
01032
01033
01034
01035
01036 static INT32
01037 DST_dump_info(INT32 indentation,
01038 DST_DW_tag tag,
01039 DST_flag flag,
01040 DST_ATTR_IDX iattr,
01041 DST_INFO_IDX iinfo)
01042 {
01043 DST_write_line();
01044
01045 if (indentation > 80) {
01046 DST_put_string("infinite loop while dumping DST?");
01047 DST_write_line();
01048 exit(RC_INTERNAL_ERROR);
01049 }
01050
01051
01052 DST_nput_char(indentation, ' ');
01053 DST_put_idx(iinfo);
01054
01055 switch (tag)
01056 {
01057 case DW_TAG_compile_unit:
01058 DST_put_compile_unit(flag,
01059 DST_ATTR_IDX_TO_PTR(iattr, DST_COMPILE_UNIT));
01060 break;
01061 #ifdef KEY
01062 case DW_TAG_module:
01063 DST_put_module(flag,
01064 DST_ATTR_IDX_TO_PTR(iattr, DST_MODULE));
01065 break;
01066 case DW_TAG_imported_declaration:
01067 DST_put_imported_decl(flag,
01068 DST_ATTR_IDX_TO_PTR(iattr, DST_IMPORTED_DECL));
01069 break;
01070 #endif
01071 case DW_TAG_subprogram:
01072 DST_put_subprogram(flag,
01073 DST_ATTR_IDX_TO_PTR(iattr, DST_SUBPROGRAM));
01074 break;
01075 case DW_TAG_inlined_subroutine:
01076 DST_put_inlined_subroutine(flag,
01077 DST_ATTR_IDX_TO_PTR(iattr,
01078 DST_INLINED_SUBROUTINE));
01079 break;
01080 case DW_TAG_entry_point:
01081 DST_put_entry_point(flag,
01082 DST_ATTR_IDX_TO_PTR(iattr, DST_ENTRY_POINT));
01083 break;
01084 case DW_TAG_common_block:
01085 DST_put_common_block(flag,
01086 DST_ATTR_IDX_TO_PTR(iattr, DST_COMMON_BLOCK));
01087 break;
01088 case DW_TAG_common_inclusion:
01089 DST_put_common_inclusion(flag,
01090 DST_ATTR_IDX_TO_PTR(iattr, DST_COMMON_INCL));
01091 break;
01092 case DW_TAG_lexical_block:
01093 DST_put_lexical_block(flag,
01094 DST_ATTR_IDX_TO_PTR(iattr, DST_LEXICAL_BLOCK));
01095 break;
01096 case DW_TAG_label:
01097 DST_put_label(flag,
01098 DST_ATTR_IDX_TO_PTR(iattr, DST_LABEL));
01099 break;
01100 case DW_TAG_variable:
01101 DST_put_variable(flag,
01102 DST_ATTR_IDX_TO_PTR(iattr, DST_VARIABLE));
01103 break;
01104 case DW_TAG_formal_parameter:
01105 DST_put_formal_parameter(
01106 flag,
01107 DST_ATTR_IDX_TO_PTR(iattr, DST_FORMAL_PARAMETER));
01108 break;
01109 case DW_TAG_unspecified_parameters:
01110 DST_put_unspecified_parameters(
01111 flag,
01112 DST_ATTR_IDX_TO_PTR(iattr, DST_UNSPECIFIED_PARAMETERS));
01113 break;
01114 case DW_TAG_base_type:
01115 DST_put_basetype(flag,
01116 DST_ATTR_IDX_TO_PTR(iattr, DST_BASETYPE));
01117 break;
01118 case DW_TAG_const_type:
01119 DST_put_const_type(flag,
01120 DST_ATTR_IDX_TO_PTR(iattr, DST_CONST_TYPE));
01121 break;
01122 case DW_TAG_constant:
01123 DST_put_constant(flag,
01124 DST_ATTR_IDX_TO_PTR(iattr, DST_CONSTANT));
01125 break;
01126 case DW_TAG_volatile_type:
01127 DST_put_volatile_type(flag,
01128 DST_ATTR_IDX_TO_PTR(iattr, DST_VOLATILE_TYPE));
01129 break;
01130 case DW_TAG_pointer_type:
01131 DST_put_pointer_type(flag,
01132 DST_ATTR_IDX_TO_PTR(iattr, DST_POINTER_TYPE));
01133 break;
01134 case DW_TAG_reference_type:
01135 DST_put_reference_type(flag,
01136 DST_ATTR_IDX_TO_PTR(iattr, DST_REFERENCE_TYPE));
01137 break;
01138 case DW_TAG_typedef:
01139 DST_put_typedef(flag,
01140 DST_ATTR_IDX_TO_PTR(iattr, DST_TYPEDEF));
01141 break;
01142 case DW_TAG_array_type:
01143 DST_put_array_type(flag,
01144 DST_ATTR_IDX_TO_PTR(iattr, DST_ARRAY_TYPE));
01145 break;
01146 case DW_TAG_subrange_type:
01147 DST_put_subrange_type(flag,
01148 DST_ATTR_IDX_TO_PTR(iattr, DST_SUBRANGE_TYPE));
01149 break;
01150 case DW_TAG_string_type:
01151 DST_put_string_type(flag,
01152 DST_ATTR_IDX_TO_PTR(iattr, DST_STRING_TYPE));
01153 break;
01154 case DW_TAG_structure_type:
01155 DST_put_structure_type(flag,
01156 DST_ATTR_IDX_TO_PTR(iattr, DST_STRUCTURE_TYPE));
01157 break;
01158 case DW_TAG_class_type:
01159 DST_put_class_type(flag,
01160 DST_ATTR_IDX_TO_PTR(iattr, DST_CLASS_TYPE));
01161 break;
01162 case DW_TAG_union_type:
01163 DST_put_union_type(flag,
01164 DST_ATTR_IDX_TO_PTR(iattr, DST_UNION_TYPE));
01165 break;
01166 case DW_TAG_member:
01167 DST_put_member(flag,
01168 DST_ATTR_IDX_TO_PTR(iattr, DST_MEMBER));
01169 break;
01170 case DW_TAG_inheritance:
01171 DST_put_inheritance(flag,
01172 DST_ATTR_IDX_TO_PTR(iattr, DST_INHERITANCE));
01173 break;
01174 case DW_TAG_template_type_param:
01175 DST_put_template_type_param(flag,
01176 DST_ATTR_IDX_TO_PTR(iattr,
01177 DST_TEMPLATE_TYPE_PARAMETER));
01178 break;
01179 case DW_TAG_template_value_param:
01180 DST_put_template_value_param(flag,
01181 DST_ATTR_IDX_TO_PTR(iattr,
01182 DST_TEMPLATE_VALUE_PARAMETER));
01183 break;
01184 case DW_TAG_enumeration_type:
01185 DST_put_enumeration_type(
01186 flag,
01187 DST_ATTR_IDX_TO_PTR(iattr, DST_ENUMERATION_TYPE));
01188 break;
01189 case DW_TAG_enumerator:
01190 DST_put_enumerator(flag,
01191 DST_ATTR_IDX_TO_PTR(iattr, DST_ENUMERATOR));
01192 break;
01193 case DW_TAG_subroutine_type:
01194 DST_put_subroutine_type(
01195 flag,
01196 DST_ATTR_IDX_TO_PTR(iattr, DST_SUBROUTINE_TYPE));
01197 break;
01198 default:
01199 DST_put_INT32_attribute(">>> Unprintable DW_TAG", tag);
01200 break;
01201 }
01202 DST_write_line();
01203 return indentation + 2;
01204 }
01205
01206
01207
01208 static void
01209 DST_dump_include_dirs(DST_DIR_IDX dir_idx, INT32 indentation)
01210 {
01211 DST_DIR_IDX idx = dir_idx;
01212 mUINT16 num = 0;
01213 DST_INCLUDE_DIR *dir;
01214
01215 DST_write_line();
01216 if (!DST_IS_NULL(idx))
01217 dir = DST_DIR_IDX_TO_PTR(idx);
01218 else
01219 dir = NULL;
01220
01221 while(dir != NULL)
01222 {
01223 num += 1;
01224 DST_put_idx(idx);
01225 DST_put_UINT32_attribute(" ordinal", num);
01226 DST_put_string_attribute(" path", DST_INCLUDE_DIR_path(dir));
01227 DST_write_line();
01228 idx = DST_INCLUDE_DIR_next(dir);
01229 if (!DST_IS_NULL(idx))
01230 dir = DST_DIR_IDX_TO_PTR(idx);
01231 else
01232 dir = NULL;
01233 }
01234 }
01235
01236
01237
01238 static void
01239 DST_dump_files(DST_FILE_IDX file_idx, INT32 indentation)
01240 {
01241 DST_FILE_IDX idx = file_idx;
01242 mUINT16 num = 0;
01243 DST_FILE_NAME *f;
01244
01245 DST_write_line();
01246 if (!DST_IS_NULL(idx))
01247 f = DST_FILE_IDX_TO_PTR(idx);
01248 else
01249 f = NULL;
01250
01251 while(f != NULL)
01252 {
01253 num += 1;
01254 DST_put_idx(idx);
01255 DST_put_UINT32_attribute(" ordinal", num);
01256 DST_put_string_attribute(" name", DST_FILE_NAME_name(f));
01257 DST_put_UINT32_attribute(" path", DST_FILE_NAME_dir(f));
01258 DST_put_UINT64_attribute(" size", DST_FILE_NAME_size(f));
01259 DST_put_UINT64_attribute(" modt", DST_FILE_NAME_modt(f));
01260 DST_write_line();
01261 idx = DST_FILE_NAME_next(f);
01262 if (!DST_IS_NULL(idx))
01263 f = DST_FILE_IDX_TO_PTR(idx);
01264 else
01265 f = NULL;
01266 }
01267 }
01268
01269 static void
01270 DST_dump_block_kind (DST_BLOCK_KIND k)
01271 {
01272 switch (k) {
01273 case DST_include_dirs_block:
01274 DST_put_string("include_dirs");
01275 break;
01276 case DST_file_names_block:
01277 DST_put_string("file_names");
01278 break;
01279 case DST_macro_info_block:
01280 DST_put_string("macro_info");
01281 break;
01282 case DST_file_scope_block:
01283 DST_put_string("file_scope");
01284 break;
01285 case DST_local_scope_block:
01286 DST_put_string("local_scope");
01287 break;
01288 }
01289 }
01290
01291
01292
01293
01294 void
01295 DST_dump(DST_DIR_IDX incl_dirs,
01296 DST_FILE_IDX files,
01297 DST_INFO_IDX compile_unit)
01298 {
01299 DST_BLOCK_IDX i;
01300
01301
01302 next_char = 0;
01303 if (dumpf_name != NULL) {
01304 dumpf = fopen(dumpf_name, "w");
01305 }
01306 DST_ASSERT(dumpf, "Cannot open DST dump file");
01307
01308
01309 if (!DST_IS_NULL(incl_dirs))
01310 {
01311 DST_write_line();
01312 DST_put_string("------------ INCLUDE_DIRECTORIES ------------");
01313 DST_write_line();
01314 DST_dump_include_dirs(incl_dirs, 0);
01315 }
01316 if (!DST_IS_NULL(files))
01317 {
01318 DST_write_line();
01319 DST_put_string("------------<<<<<<< FILES >>>>>>>------------");
01320 DST_write_line();
01321 DST_dump_files(files, 0);
01322 }
01323 if (!DST_IS_NULL(compile_unit))
01324 {
01325 DST_write_line();
01326 DST_put_string("------------<<<<<< DST INFO >>>>>------------");
01327 DST_write_line();
01328 DST_preorder_visit(compile_unit, 0, &DST_dump_info);
01329 }
01330 DST_put_string("------------<<<< BLOCK INFO >>>------------");
01331 DST_write_line();
01332 FOREACH_DST_BLOCK(i) {
01333 sprintf(&tmp_buffer[0], "block %d: ", i);
01334 DST_put_string(&tmp_buffer[0]);
01335 DST_dump_block_kind (((DST_Type *)Current_DST)->dst_blocks[i].kind);
01336 sprintf(&tmp_buffer[0], ", size = %d",
01337 ((DST_Type *)Current_DST)->dst_blocks[i].size);
01338 DST_put_string(&tmp_buffer[0]);
01339 DST_write_line();
01340 }
01341
01342 }
01343
01344
01345 void
01346 Dump_DST (FILE *f)
01347 {
01348 DST_IDX inc, fn, cmp;
01349 if (f == NULL) dumpf = stdout;
01350 else dumpf = f;
01351 inc = DST_get_include_dirs();
01352 fn = DST_get_file_names();
01353 cmp = DST_get_compile_unit();
01354 DST_dump (inc, fn, cmp);
01355 }
01356
01357 void
01358 DST_set_dump_filename(char *file_name)
01359 {
01360 dumpf_name = file_name;
01361 }