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
00041
00042
00043
00044
00045
00046
00047
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062
00063
00064
00065
00066
00067
00068
00069
00070
00071
00072
00073 static const char *source_file = __FILE__;
00074 #ifdef _KEEP_RCS_ID
00075 static char *rcs_id = "$Source: crayf90/sgi/SCCS/s.cwh_dst.cxx $ $Revision: 1.40 $";
00076 #endif
00077
00078
00079
00080 #include <limits.h>
00081 #include <sys/stat.h>
00082 #include <unistd.h>
00083
00084 #include "defs.h"
00085 #include "glob.h"
00086 #include "errors.h"
00087 #include "wn.h"
00088 #include "dwarf_DST_producer.h"
00089 #include "dwarf_DST_dump.h"
00090 #include "config_targ.h"
00091 #include "file_util.h"
00092
00093
00094
00095 #include "cwh_defines.h"
00096 #include "cwh_dst.h"
00097 #include "cwh_dst.i"
00098 #include "cwh_preg.h"
00099 #include "cwh_stab.h"
00100 #include "cwh_auxst.h"
00101 #include "cwh_types.h"
00102 #include "sgi_cmd_line.h"
00103 #ifdef KEY
00104
00105 #include <ctype.h>
00106 #include "stamp.h"
00107
00108
00109 #include <sys/param.h>
00110 #define MAX_CWD_CHARS (256 - (MAXHOSTNAMELEN+1))
00111 static char cwd_buffer[MAX_CWD_CHARS+MAXHOSTNAMELEN+1];
00112 #endif // KEY
00113 #ifdef KEY
00114 #include <string>
00115 #include <set>
00116 using namespace std;
00117
00118
00119
00120
00121 typedef set<string> module_set_t;
00122 static module_set_t module_set;
00123 #endif
00124
00125 char *FE_command_line = NULL;
00126
00127
00128
00129
00130
00131
00132
00133
00134
00135
00136
00137
00138
00139 extern void
00140 cwh_dst_init_file(char *src_path)
00141 {
00142 char *comp_info = NULL;
00143 #ifndef KEY
00144 char *file ;
00145 #endif
00146
00147 DST_Init(NULL,0) ;
00148
00149 #ifndef KEY
00150 file = strrchr(src_path,'/');
00151
00152 comp_info = cwh_dst_get_command_line_options();
00153
00154 comp_unit_idx = DST_mk_compile_unit(++(file),
00155 current_host_dir,
00156 comp_info,
00157 DW_LANG_Fortran90,
00158 DW_ID_case_insensitive);
00159 #else
00160
00161 comp_info = (char *)malloc(sizeof(char)*100);
00162 strcpy(comp_info, "pathf90 ");
00163 if (INCLUDE_STAMP)
00164 strcat(comp_info, INCLUDE_STAMP);
00165
00166
00167
00168
00169 if (Debug_Level > 0) {
00170 int host_name_length = 0;
00171
00172 current_host_dir = &cwd_buffer[0];
00173 if (gethostname(current_host_dir, MAXHOSTNAMELEN) == 0) {
00174
00175 host_name_length = strlen(current_host_dir);
00176 if(strchr(current_host_dir,'.')) {
00177
00178
00179
00180 } else {
00181 current_host_dir[host_name_length] = '.';
00182 if (getdomainname(¤t_host_dir[host_name_length+1],
00183 MAXHOSTNAMELEN-host_name_length) == 0) {
00184
00185 host_name_length += strlen(¤t_host_dir[host_name_length]);
00186 }
00187 }
00188 }
00189 current_host_dir[host_name_length++] = ':';
00190 current_working_dir = &cwd_buffer[host_name_length];
00191 } else {
00192 current_host_dir = NULL;
00193 current_working_dir = &cwd_buffer[0];
00194 }
00195 strcpy(current_working_dir, Get_Current_Working_Directory());
00196 if (current_working_dir == NULL) {
00197 perror("getcwd");
00198 exit(2);
00199 }
00200
00201
00202 comp_unit_idx = DST_mk_compile_unit(src_path,
00203 current_host_dir,
00204 comp_info,
00205 DW_LANG_Fortran90,
00206 DW_ID_case_insensitive);
00207 #endif
00208
00209 (void) cwh_dst_enter_path(src_path);
00210 free (comp_info);
00211 }
00212
00213
00214
00215
00216
00217
00218
00219
00220
00221
00222
00223 extern void
00224 cwh_dst_write(void)
00225 {
00226
00227 file_name_idx = DST_write_files();
00228 incl_dir_idx = DST_write_directories();
00229
00230 if (!DST_IS_NULL(comp_unit_idx))
00231 (void) DST_preorder_visit(comp_unit_idx, 0, &DST_set_assoc_idx);
00232
00233 if (DSTdump_File_Name != NULL) {
00234
00235 DST_set_dump_filename(DSTdump_File_Name);
00236 DST_dump(incl_dir_idx, file_name_idx, comp_unit_idx);
00237 }
00238
00239 }
00240
00241 #ifdef KEY
00242
00243 static char *
00244 downshift(char *name) {
00245 int len = strlen(name);
00246 for (int j = 0; j < len; j += 1) {
00247 name[j] = tolower(name[j]);
00248 }
00249 return name;
00250 }
00251
00252
00253
00254
00255
00256
00257 static char *
00258 delete_trailing_underscores(char *name) {
00259 int len = strlen(name);
00260 if (!option_underscoring) {
00261 return name;
00262 }
00263 if ('_' == name[len - 1]) {
00264 name[len - 1] = 0;
00265 if (!option_second_underscore) {
00266 return name;
00267 }
00268 if ('_' == name[len - 2]) {
00269 name[len - 2] = 0;
00270 }
00271 }
00272 return name;
00273 }
00274
00275 #endif
00276
00277 static void
00278 cwh_dst_process_var (UINT32, ST* st)
00279 {
00280 switch(ST_class(st)) {
00281
00282 case CLASS_VAR:
00283 cwh_dst_mk_var(st,current_scope_idx);
00284 break;
00285
00286 case CLASS_CONST:
00287 cwh_dst_mk_const(st,current_scope_idx);
00288 break;
00289 }
00290 }
00291
00292
00293
00294
00295
00296
00297
00298
00299
00300 static void
00301 cwh_dst_mk_const(ST * st,DST_INFO_IDX parent)
00302 {
00303 DST_CONST_VALUE cval;
00304 #ifdef KEY
00305 memset(&cval, 0, sizeof(cval));
00306 #endif
00307 USRCPOS s;
00308 int exit = 0;
00309 DST_INFO_IDX i,t ;
00310 char *ptr;
00311 TY_IDX ty;
00312 TYPE_ID type ;
00313 char *name;
00314 char *str;
00315
00316
00317
00318
00319
00320
00321
00322
00323 s = GET_ST_LINENUM(st);
00324
00325 ty = ST_type(st);
00326 type = TY_mtype(ty);
00327 t = cwh_dst_mk_type(ty);
00328
00329 switch(TY_mtype(ty)) {
00330
00331 case MTYPE_I1:
00332 case MTYPE_U1:
00333 DST_CONST_VALUE_form(cval) = DST_FORM_DATA1;
00334 DST_CONST_VALUE_form_data1(cval) = TCON_i0(Tcon_Table[ST_tcon(st)]);
00335 break;
00336
00337 case MTYPE_I2:
00338 case MTYPE_U2:
00339 DST_CONST_VALUE_form(cval) = DST_FORM_DATA2;
00340 DST_CONST_VALUE_form_data2(cval) = TCON_i0(Tcon_Table[ST_tcon(st)]);
00341 break;
00342
00343 case MTYPE_I4:
00344 case MTYPE_U4:
00345 DST_CONST_VALUE_form(cval) = DST_FORM_DATA4;
00346 DST_CONST_VALUE_form_data4(cval) = TCON_i0(Tcon_Table[ST_tcon(st)]);
00347 break;
00348
00349 case MTYPE_I8:
00350 case MTYPE_U8:
00351 DST_CONST_VALUE_form(cval) = DST_FORM_DATA8;
00352 DST_CONST_VALUE_form_data8(cval) = TCON_i0(Tcon_Table[ST_tcon(st)]);
00353 break;
00354
00355 case MTYPE_F4:
00356 DST_CONST_VALUE_form(cval) = DST_FORM_DATA4;
00357 DST_CONST_VALUE_form_data4(cval) = TCON_ival(Tcon_Table[ST_tcon(st)]);
00358 break;
00359
00360 case MTYPE_F8:
00361 DST_CONST_VALUE_form(cval) = DST_FORM_DATA8;
00362 DST_CONST_VALUE_form_data8(cval) = TCON_i0(Tcon_Table[ST_tcon(st)]);
00363 break;
00364
00365 case MTYPE_F16:
00366 case MTYPE_FQ:
00367 exit = 1;
00368 break;
00369
00370 case MTYPE_STR:
00371 exit = 1;
00372 break;
00373
00374 # if 0
00375 DST_CONST_VALUE_form(cval) = DST_FORM_STRING;
00376 DST_CONST_VALUE_form_string(cval) =
00377 DST_mk_string (Index_to_char_array (TCON_str_idx (ST_tcon_val(st))));
00378 # endif
00379
00380 case MTYPE_UNKNOWN:
00381
00382 if (TY_kind(ty) == KIND_ARRAY && TY_is_character(ty)) {
00383 DST_CONST_VALUE_form(cval) = DST_FORM_STRING;
00384 DST_CONST_VALUE_form_string(cval) =
00385 DST_mk_string (Index_to_char_array (TCON_str_idx (ST_tcon_val(st))));
00386 }
00387 break;
00388 #ifdef KEY
00389
00390
00391
00392
00393 case MTYPE_C4:
00394 DST_CONST_VALUE_form(cval) = DST_FORM_DATAC4;
00395 DST_CONST_VALUE_form_crdata4(cval) = TCON_ival(Tcon_Table[ST_tcon(st)]);
00396 DST_CONST_VALUE_form_cidata4(cval) = TCON_cival(Tcon_Table[ST_tcon(st)]);
00397 break;
00398
00399 case MTYPE_C8:
00400 DST_CONST_VALUE_form(cval) = DST_FORM_DATAC8;
00401 DST_CONST_VALUE_form_crdata8(cval) = TCON_i0(Tcon_Table[ST_tcon(st)]);
00402 DST_CONST_VALUE_form_cidata8(cval) = TCON_ci0(Tcon_Table[ST_tcon(st)]);
00403 break;
00404 #endif // KEY
00405 }
00406
00407 if (exit == 1) return;
00408
00409 name = NULL;
00410 name = cwh_auxst_stem_name(st, name);
00411
00412 ptr = strtok(name, " ");
00413
00414 while (ptr != NULL) {
00415 #ifndef KEY
00416 i = DST_mk_constant_def(s,
00417 ptr,
00418 t,
00419 cval,
00420 FALSE);
00421 #else
00422 INT j;
00423 for (j = 0; ptr && j < strlen(ptr); j ++)
00424 ptr[ j ] = tolower(ptr[ j ]);
00425 i = DST_mk_variable_const(s,
00426 ptr,
00427 t,
00428 TRUE,
00429 FALSE,
00430 cval);
00431 #endif
00432 DST_append_child(current_scope_idx,i);
00433 ptr = strtok(NULL, " ");
00434 }
00435 #ifdef KEY
00436
00437
00438
00439
00440 cwh_auxst_clear_stem_name(st);
00441 #endif
00442 return;
00443 }
00444
00445 #ifdef KEY
00446
00447
00448
00449
00450
00451
00452
00453
00454 extern void
00455 cwh_dst_enter_module(char *module_name, char *file_name, INT32 local_lineno) {
00456 USRCPOS s;
00457 INT32 file_num = cwh_dst_enter_path(file_name);
00458 USRCPOS_filenum(s) = file_num;
00459 USRCPOS_linenum(s) = local_lineno;
00460 current_module_name = downshift(strdup(module_name));
00461 current_module_idx = DST_mk_module(s, current_module_name);
00462 DST_append_child(comp_unit_idx,current_module_idx);
00463 }
00464
00465
00466
00467
00468
00469
00470
00471
00472
00473
00474 extern void
00475 cwh_dst_exit_module(void) {
00476 current_module_idx = DST_INVALID_IDX;
00477 free(current_module_name);
00478 current_module_name = 0;
00479 }
00480
00481
00482
00483
00484
00485
00486
00487
00488
00489
00490 extern void
00491 cwh_dst_module_vars(ST *en)
00492 {
00493 if (Debug_Level <= 0) {
00494 return;
00495 }
00496 ITEM *com = NULL;
00497 ITEM *parm = NULL;
00498 DST_INFO_IDX save_current_scope_idx = current_scope_idx;
00499 current_scope_idx = current_module_idx;
00500 while ((com = GET_NEXT_COMMON(en,com)) != NULL) {
00501 cwh_dst_mk_var(I_element(com),current_module_idx);
00502 }
00503 while ((parm = GET_NEXT_PARAMETER(en,parm)) != NULL) {
00504 cwh_dst_process_var(1, I_element(parm));
00505 }
00506 For_all (St_Table, CURRENT_SYMTAB, &cwh_dst_process_var);
00507 current_scope_idx = save_current_scope_idx;
00508 }
00509
00510
00511
00512
00513
00514 static int
00515 unnamed_main(PU &pu, ST *st) {
00516 if (!PU_is_mainpu(pu)) {
00517 return 0;
00518 }
00519 char *unmangled_name = GET_MODIFIED_NAME(st);
00520 # define ANON_NAME "main___"
00521 return unmangled_name && 0 == strcmp(unmangled_name, ANON_NAME);
00522 }
00523 #endif
00524
00525
00526
00527
00528
00529
00530
00531
00532
00533
00534
00535
00536 extern DST_IDX
00537 cwh_dst_enter_pu(ST *en)
00538 {
00539
00540 ITEM * al;
00541 ITEM * com;
00542 ITEM * parm;
00543 ST * st;
00544 DST_INFO_IDX i;
00545 PU& pu = Pu_Table[ST_pu(en)];
00546
00547
00548 DST_begin_PU();
00549 cwh_dst_struct_clear_DSTs();
00550
00551 current_scope_idx = cwh_dst_mk_func(en);
00552
00553 #ifdef KEY
00554 DST_INFO_IDX parent_idx = ( !DST_ARE_EQUAL(DST_INVALID_IDX,current_module_idx)) ?
00555 current_module_idx :
00556 comp_unit_idx;
00557 module_set.clear();
00558
00559
00560
00561 if (0)
00562 #else
00563 if (PU_is_mainpu(pu))
00564 #endif
00565 cwh_dst_mk_MAIN(GET_MAIN_ST(),current_scope_idx);
00566
00567
00568
00569 if (PU_is_nested_func(pu))
00570 cwh_dst_inner_add_DST(current_scope_idx);
00571
00572 else {
00573
00574 cwh_dst_inner_read_DSTs(current_scope_idx);
00575 cwh_dst_inner_clear_DSTs();
00576 #ifdef KEY
00577 DST_append_child(parent_idx,current_scope_idx);
00578 #else
00579 DST_append_child(comp_unit_idx,current_scope_idx);
00580 #endif
00581 }
00582
00583 al = NULL ;
00584 while ((al = GET_NEXT_ALTENTRY(en,al)) != NULL) {
00585 i = cwh_dst_mk_func(I_element(al));
00586 #ifdef KEY
00587 DST_append_child(parent_idx,i);
00588 #else
00589 DST_append_child(comp_unit_idx,i);
00590 #endif
00591 }
00592
00593
00594 if (Debug_Level > 0) {
00595
00596
00597
00598
00599 (void) cwh_dst_basetype(Be_Type_Tbl(MTYPE_I4));
00600 (void) cwh_dst_basetype(Be_Type_Tbl(MTYPE_I8));
00601
00602 For_all (St_Table, CURRENT_SYMTAB, &cwh_dst_process_var);
00603
00604
00605
00606
00607 ITEM * com = NULL;
00608 ITEM * parm = NULL;
00609
00610 if (PU_lexical_level(pu) == 2)
00611 while ((com = GET_NEXT_COMMON(en,com)) != NULL)
00612 cwh_dst_mk_var(I_element(com),current_scope_idx);
00613
00614 if (PU_lexical_level(pu) == 2)
00615 while ((parm = GET_NEXT_PARAMETER(en,parm)) != NULL)
00616 #ifdef KEY
00617 {
00618 #endif
00619 cwh_dst_process_var(1, I_element(parm));
00620 #ifdef KEY
00621 }
00622 #endif
00623
00624 }
00625
00626 DST_end_PU();
00627
00628 return(current_scope_idx);
00629 }
00630
00631
00632
00633
00634
00635
00636
00637
00638
00639
00640
00641
00642
00643
00644
00645 static DST_IDX
00646 cwh_dst_mk_func(ST * st)
00647 {
00648
00649 DST_INFO_IDX t;
00650 DST_INFO_IDX i;
00651
00652 USRCPOS s;
00653 char *p ;
00654 char *r ;
00655 char *l ;
00656 INT32 n ;
00657 TY_IDX ty;
00658 PU& pu = Pu_Table[ST_pu(st)];
00659
00660 s = GET_ST_LINENUM(st);
00661
00662 l = NULL;
00663 #ifdef KEY
00664
00665
00666
00667 int is_unnamed_main = unnamed_main(pu, st);
00668 if (is_unnamed_main)
00669 p = ST_name(st);
00670 else
00671 p = GET_MODIFIED_NAME(st);
00672 #else
00673 p = GET_MODIFIED_NAME(st);
00674 #endif
00675 if (p != NULL) {
00676 #ifdef KEY
00677
00678
00679
00680 r = downshift(l = strdup(p));
00681 #else
00682 r = p ;
00683 #endif
00684
00685 } else {
00686 r = ST_name(st);
00687 n = strlen(r);
00688
00689 if (r[n-1] == '_') {
00690 #ifdef KEY
00691 r = delete_trailing_underscores(l = strdup(r));
00692 #else
00693 l = strdup(r);
00694 l[n-1] = '\0';
00695 r = l ;
00696 #endif
00697 }
00698 }
00699
00700 ty = PU_prototype(Pu_Table[ST_pu(st)]);
00701 t = cwh_dst_mk_subroutine_type(ty);
00702
00703 if (IS_ALTENTRY(st))
00704 i = DST_mk_entry_point(s,r,t,ST_st_idx(st));
00705
00706 else {
00707 i = DST_mk_subprogram(s,
00708 r,
00709 t,
00710 DST_INVALID_IDX,
00711 ST_st_idx(st),
00712 DW_INL_not_inlined,
00713 DW_VIRTUALITY_none,
00714 0,
00715 FALSE,
00716 FALSE,
00717 #ifdef KEY
00718 FALSE,
00719 #endif
00720 TRUE);
00721
00722 #ifdef KEY
00723 if (p != NULL && !is_unnamed_main)
00724 #else
00725 if (p != NULL && !PU_is_mainpu(pu))
00726 #endif
00727 DST_add_linkage_name_to_subprogram(i,ST_name(st));
00728 }
00729
00730 if (l != NULL)
00731 free(l);
00732
00733 return i;
00734 }
00735
00736
00737
00738
00739
00740
00741
00742
00743
00744
00745
00746
00747
00748
00749
00750 static void
00751 cwh_dst_mk_MAIN(ST *mn, DST_INFO_IDX en_idx)
00752 {
00753 DST_INFO_IDX t;
00754 DST_INFO_IDX i;
00755 USRCPOS s;
00756 TY_IDX ty;
00757
00758 if (mn != NULL) {
00759
00760 s = GET_ST_LINENUM(mn);
00761 ty = PU_prototype(Pu_Table[ST_pu(mn)]);
00762 t = cwh_dst_mk_subroutine_type(ty);
00763 i = DST_mk_subprogram(s,
00764 ST_name(mn),
00765 t,
00766 en_idx,
00767 ST_st_idx(mn),
00768 DW_INL_not_inlined,
00769 DW_VIRTUALITY_none,
00770 0,
00771 TRUE,
00772 FALSE,
00773 #ifdef KEY
00774 FALSE,
00775 #endif
00776 TRUE);
00777
00778 DST_append_child(comp_unit_idx,i);
00779 }
00780 }
00781
00782 #ifdef KEY
00783
00784
00785 static void
00786 cwh_dst_mk_namelist(ST *st, DST_INFO_IDX parent)
00787 {
00788 USRCPOS s;
00789 DST_INFO_IDX i ;
00790
00791 s = GET_ST_LINENUM(st);
00792 INT len = ST_name(st)?strlen(ST_name(st))+1:0;
00793 INT j;
00794 char name[len];
00795 if (len) {
00796 strcpy(name, ST_name(st));
00797 for (j=0; j < len; j ++)
00798 name[j] = tolower(name[j]);
00799 }
00800 i = DST_mk_namelist(s, name);
00801 DST_append_child(parent,i);
00802 return;
00803 }
00804
00805 static void
00806 cwh_dst_mk_namelist_item(ST *st, DST_INFO_IDX parent)
00807 {
00808 USRCPOS s;
00809 DST_INFO_IDX i ;
00810
00811 s = GET_ST_LINENUM(st);
00812 INT len = ST_name(st)?strlen(ST_name(st))+1:0;
00813 INT j;
00814 char name[len];
00815 if (len) {
00816 strcpy(name, ST_name(st));
00817 for (j=0; j < len; j ++)
00818 name[j] = tolower(name[j]);
00819 }
00820 i = DST_mk_namelist_item(s, name);
00821 DST_append_child(parent,i);
00822 return;
00823 }
00824 #endif
00825
00826 #ifdef KEY
00827
00828
00829
00830
00831
00832
00833
00834
00835
00836
00837
00838
00839
00840
00841
00842
00843
00844
00845
00846
00847
00848
00849
00850
00851
00852
00853
00854
00855
00856
00857
00858
00859
00860
00861
00862
00863
00864
00865
00866
00867
00868
00869
00870
00871
00872
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882
00883
00884
00885
00886
00887 static int
00888 procedure_static_local_common_name(ST *st) {
00889 #define DOT_HOST ".host.in."
00890 return 0 == strncmp(DOT_HOST, ST_name(st), (sizeof DOT_HOST) - 1);
00891 }
00892
00893
00894
00895
00896
00897 static int
00898 module_common_name(ST *st) {
00899 #define DOT_DATA ".data"
00900 char *name = ST_name(st);
00901 return 0 == strncmp(DOT_DATA, name, (sizeof DOT_DATA) - 1);
00902 }
00903
00904
00905
00906
00907
00908
00909 static char *extract_module_name(ST *st) {
00910 #define DOT_IN_DOT ".in."
00911 char *name = ST_name(st);
00912 if (0 != strncmp(DOT_DATA, name, (sizeof DOT_DATA) - 1) &&
00913 0 != strncmp(DOT_HOST, name, (sizeof DOT_HOST) - 1) &&
00914 0 == strstr(name, DOT_IN_DOT))
00915 {
00916 return 0;
00917 }
00918
00919 char *modulename = strrchr(name, '.');
00920 if (0 == modulename) {
00921 return 0;
00922 }
00923
00924 int length = strlen(modulename += 1);
00925 char *result = new char[length + sizeof '\0'];
00926 strcpy(result, modulename);
00927 return downshift(delete_trailing_underscores(result));
00928 }
00929
00930
00931
00932
00933
00934
00935
00936 static void
00937 emit_import(ST *st, char *module_name, DST_INFO_IDX parent)
00938 {
00939 if (module_set.find(module_name) == module_set.end()) {
00940 module_set.insert(string(module_name));
00941 DST_INFO_IDX j = DST_mk_imported_decl(ST_name(st), module_name);
00942 DST_append_child(parent, j);
00943 }
00944 }
00945 #endif
00946
00947
00948
00949
00950
00951
00952
00953
00954
00955
00956
00957
00958
00959
00960
00961
00962
00963 static void
00964 cwh_dst_mk_var(ST * st,DST_INFO_IDX parent)
00965 {
00966
00967 DST_INFO_IDX i ;
00968 DST_INFO_IDX j ;
00969
00970 #ifdef KEY
00971 if (ST_is_namelist(st)) {
00972 LIST* l;
00973 ITEM* item;
00974 INT item_num = 0;
00975 INT num_items;
00976 ST* item_st;
00977 cwh_dst_mk_namelist(st, parent);
00978 l = cwh_auxst_get_list(st, l_NAMELIST);
00979 num_items = L_num(l);
00980 FmtAssert(num_items != 0, ("Namelist item list is empty."));
00981 item = L_first(l);
00982 while (item_num < num_items) {
00983 item_st = I_element(item);
00984 cwh_dst_mk_namelist_item(item_st, parent);
00985 item = I_next(item);
00986 item_num ++;
00987 }
00988 return;
00989 }
00990 #endif
00991 Top_ST = st ;
00992 Making_FLD_DST = FALSE;
00993
00994 switch(ST_sclass(st)) {
00995
00996 case SCLASS_FORMAL:
00997 case SCLASS_FORMAL_REF:
00998 if (!ST_is_temp_var(st)) {
00999 Top_ST_has_dope = cwh_dst_has_dope(ST_type(st));
01000 i = cwh_dst_mk_formal(st) ;
01001 DST_append_child(parent,i);
01002 }
01003 break;
01004
01005 case SCLASS_COMMON:
01006 case SCLASS_DGLOBAL:
01007 #ifdef KEY
01008
01009
01010
01011
01012
01013 if (procedure_static_local_common_name(st)) {
01014 (void) cwh_dst_mk_common(st, parent);
01015 }
01016
01017
01018
01019
01020
01021
01022 else if (module_common_name(st)) {
01023 char *module_name = extract_module_name(st);
01024 if (current_module_name) {
01025 if ( DST_ARE_EQUAL(parent,current_module_idx) ) {
01026
01027
01028 (void) cwh_dst_mk_common(st, parent);
01029 }
01030 else if (0 == strcmp(module_name, current_module_name)) {
01031
01032
01033 }
01034 else {
01035
01036
01037 emit_import(st, module_name, parent);
01038 }
01039 }
01040 else {
01041 emit_import(st, module_name, parent);
01042 }
01043 delete [] module_name;
01044 }
01045
01046
01047
01048
01049 else {
01050 i = cwh_dst_mk_common(st, DST_INVALID_IDX);
01051 if (!DST_IS_NULL(i)) {
01052
01053 DST_append_child(parent,i);
01054 }
01055 }
01056 #else
01057 i = cwh_dst_mk_common(st);
01058 if (!DST_IS_NULL(i)) {
01059 j = cwh_dst_mk_common_inclusion(st,i);
01060
01061 DST_append_child(parent,j);
01062 DST_append_child(parent,i);
01063 }
01064 #endif
01065 break;
01066
01067 default:
01068 if (Has_Base_Block(st)) {
01069 if ((ST_sclass(ST_base(st)) != SCLASS_COMMON) &&
01070 (ST_sclass(ST_base(st)) != SCLASS_DGLOBAL)) {
01071 Top_ST_has_dope = cwh_dst_has_dope(ST_type(st));
01072 i = cwh_dst_mk_variable(st);
01073 DST_append_child(parent,i);
01074 }
01075 } else if (!ST_is_temp_var(st)) {
01076 #ifndef KEY
01077 if (* ST_name(st) != '@')
01078 #else
01079
01080
01081 if (* ST_name(st) != '@' &&
01082 strncmp(ST_name(st), "t$", sizeof(char)*2) != 0)
01083 #endif
01084 {
01085 Top_ST_has_dope = cwh_dst_has_dope(ST_type(st));
01086 i = cwh_dst_mk_variable(st);
01087 DST_append_child(parent,i);
01088 }
01089 }
01090 break;
01091 }
01092 }
01093
01094
01095
01096
01097
01098
01099
01100
01101
01102
01103
01104
01105
01106
01107 static DST_INFO_IDX
01108 cwh_dst_mk_variable(ST * st)
01109 {
01110 TY_IDX d;
01111 DST_VARIABLE *def_attr;
01112 DST_ATTR_IDX def_attr_idx;
01113 DST_INFO *def_info;
01114 BOOL dr;
01115 DST_INFO_IDX dope_ty;
01116 DST_INFO_IDX i;
01117 USRCPOS s;
01118 DST_INFO_IDX t;
01119
01120
01121 s = GET_ST_LINENUM(st);
01122 d = ST_type(st) ;
01123
01124 dr = (Has_Base_Block(st)) && ST_auxst_is_auto_or_cpointer(st) ;
01125
01126 if (IS_DOPE_TY(d)) {
01127 t = cwh_dst_dope_type(ST_type(st),
01128 st,
01129 ST_ofst(st),
01130 current_scope_idx,
01131 FALSE,
01132 &dope_ty);
01133 dr = TRUE ;
01134 } else
01135 t = cwh_dst_mk_type(d);
01136
01137 #ifdef KEY
01138 INT len = ST_name(st)?strlen(ST_name(st))+1:0;
01139 INT j;
01140 char name[len];
01141 if (len) {
01142 strcpy(name, ST_name(st));
01143 for (j=0; j < len; j ++)
01144 name[j] = tolower(name[j]);
01145 }
01146 i = DST_mk_variable(s,
01147 name,
01148 t,
01149 0,
01150 ST_st_idx(st),
01151 DST_INVALID_IDX,
01152 FALSE,
01153 ST_sclass(st) == SCLASS_AUTO,
01154 FALSE,
01155 ST_auxst_is_tmp(st));
01156 #else
01157 i = DST_mk_variable(s,
01158 ST_name(st),
01159 t,
01160 0,
01161 ST_st_idx(st),
01162 DST_INVALID_IDX,
01163 FALSE,
01164 ST_sclass(st) == SCLASS_AUTO,
01165 FALSE,
01166 ST_auxst_is_tmp(st));
01167 #endif
01168 if (ST_auxst_is_assumed_size(st)) {
01169 DST_SET_assumed_size(DST_INFO_flag(DST_INFO_IDX_TO_PTR(i)));
01170 }
01171
01172 #ifndef TARG_X8664
01173 if (IS_DOPE_TY(d)) {
01174 def_info = DST_INFO_IDX_TO_PTR(i);
01175 def_attr_idx = DST_INFO_attributes(def_info);
01176 def_attr = DST_ATTR_IDX_TO_PTR(def_attr_idx, DST_VARIABLE);
01177
01178 DST_VARIABLE_def_dopetype(def_attr) = dope_ty;
01179
01180 if (ST_auxst_is_assumed_shape(st)) {
01181 DST_SET_assumed_shape(DST_INFO_flag(def_info));
01182 }
01183 else if (ST_auxst_is_allocatable(st)) {
01184 DST_SET_allocatable(DST_INFO_flag(def_info));
01185 }
01186 else if (ST_auxst_is_f90_pointer(st)) {
01187 DST_SET_f90_pointer(DST_INFO_flag(def_info));
01188 }
01189 }
01190 #endif
01191
01192 if (dr)
01193 DST_SET_deref(DST_INFO_flag(DST_INFO_IDX_TO_PTR(i)));
01194
01195 return i ;
01196
01197 }
01198
01199
01200
01201
01202
01203
01204
01205
01206
01207
01208 static DST_INFO_IDX
01209 cwh_dst_mk_formal(ST * st)
01210 {
01211 ST_IDX ba;
01212 DST_FORMAL_PARAMETER *def_attr;
01213 DST_ATTR_IDX def_attr_idx;
01214 DST_INFO *def_info;
01215 DST_INFO_IDX dope_ty;
01216 BOOL dr ;
01217 DST_INFO_IDX t;
01218 TY_IDX ta;
01219 TY_IDX ty;
01220
01221 BOOL c_pointee = FALSE;
01222 BOOL generated = FALSE ;
01223 DST_INFO_IDX i = DST_INVALID_IDX ;
01224
01225 USRCPOS s;
01226
01227
01228 s = GET_ST_LINENUM(st);
01229
01230 ty = ST_type(st);
01231 ta = ty ;
01232 dr = FALSE ;
01233 ba = ST_st_idx(st) ;
01234
01235
01236
01237 if (Has_Base_Block(st)) {
01238 ba = ST_st_idx(ST_base(st)) ;
01239 c_pointee = TRUE;
01240 }
01241
01242
01243
01244
01245
01246 if (ST_sclass(st) == SCLASS_FORMAL)
01247 if (!ST_is_value_parm(st))
01248 ta = TY_pointed(ty);
01249 else if (TY_kind(ty) == KIND_POINTER)
01250 ta = TY_pointed(ty);
01251
01252
01253 if (IS_DOPE_TY(ta)) {
01254 t = cwh_dst_dope_type(ST_type(st),
01255 st,
01256 ST_ofst(st),
01257 current_scope_idx,
01258 FALSE,
01259 &dope_ty);
01260 dr = TRUE ;
01261 } else
01262 t = cwh_dst_mk_type(ta);
01263
01264 #ifdef KEY
01265 INT j;
01266 INT len = ST_name(st) ? strlen(ST_name(st))+1:0;
01267 char name[len];
01268 if (len) {
01269 strcpy(name, ST_name(st));
01270 for (j = 0; j < len; j ++)
01271 name[ j ] = tolower(name[ j ]);
01272 }
01273 i = DST_mk_formal_parameter(s,
01274 name,
01275 t,
01276 ba,
01277 DST_INVALID_IDX,
01278 DST_INVALID_IDX,
01279 FALSE,
01280 FALSE,
01281 generated,
01282 FALSE);
01283 #else
01284 i = DST_mk_formal_parameter(s,
01285 ST_name(st),
01286 t,
01287 (void *)(INTPTR) ba,
01288 DST_INVALID_IDX,
01289 DST_INVALID_IDX,
01290 FALSE,
01291 FALSE,
01292 generated,
01293 FALSE);
01294 #endif
01295
01296 #ifndef TARG_X8664
01297 if (IS_DOPE_TY(ta)) {
01298 def_info = DST_INFO_IDX_TO_PTR(i);
01299 def_attr_idx = DST_INFO_attributes(def_info);
01300 def_attr = DST_ATTR_IDX_TO_PTR(def_attr_idx, DST_FORMAL_PARAMETER);
01301
01302 DST_FORMAL_PARAMETER_dopetype(def_attr) = dope_ty;
01303
01304 if (ST_auxst_is_assumed_shape(st)) {
01305 DST_SET_assumed_shape(DST_INFO_flag(def_info));
01306 }
01307 else if (ST_auxst_is_f90_pointer(st)) {
01308 DST_SET_f90_pointer(DST_INFO_flag(def_info));
01309 }
01310 }
01311 #endif
01312
01313 if (ST_auxst_is_assumed_size(st)) {
01314 DST_SET_assumed_size(DST_INFO_flag(DST_INFO_IDX_TO_PTR(i)));
01315 }
01316
01317 if ( dr ||
01318 (TY_kind(ty) == KIND_POINTER) ||
01319 (ST_sclass(st) == SCLASS_FORMAL_REF))
01320 DST_SET_deref(DST_INFO_flag( DST_INFO_IDX_TO_PTR(i)));
01321
01322 if (dr || c_pointee)
01323 DST_SET_base_deref(DST_INFO_flag( DST_INFO_IDX_TO_PTR(i)));
01324
01325 return i;
01326 }
01327
01328
01329
01330
01331
01332
01333
01334
01335
01336
01337 static DST_INFO_IDX
01338 cwh_dst_mk_common_inclusion(ST * com, DST_INFO_IDX c)
01339 {
01340 DST_INFO_IDX i;
01341
01342 USRCPOS s;
01343
01344 s = GET_ST_LINENUM(com);
01345
01346 i = DST_mk_common_incl(s,c);
01347
01348 return i;
01349 }
01350
01351
01352
01353
01354
01355
01356
01357
01358
01359
01360
01361 static DST_INFO_IDX
01362 #ifdef KEY
01363
01364
01365
01366
01367 cwh_dst_mk_common(ST * st, DST_INFO_IDX parent)
01368 #else
01369 cwh_dst_mk_common(ST * st)
01370 #endif
01371 {
01372 BOOL dr;
01373 DST_VARIABLE *def_attr;
01374 DST_ATTR_IDX def_attr_idx;
01375 DST_INFO *def_info;
01376 DST_INFO_IDX dope_ty;
01377 ITEM *e;
01378 ST *el;
01379 DST_INFO_IDX i;
01380 DST_INFO_IDX m;
01381 DST_INFO_IDX t;
01382 USRCPOS s;
01383 TY_IDX te;
01384 TY_IDX ty;
01385
01386
01387 ty = ST_type(st);
01388
01389 DevAssert((TY_kind(ty) == KIND_STRUCT),("DST complains about common"));
01390
01391 #ifdef KEY
01392 INT j;
01393 INT len = ST_name(st) ? strlen(ST_name(st))+1:0;
01394 char name[len];
01395 if (len) {
01396 strcpy(name, ST_name(st));
01397 #ifdef KEY
01398 downshift(delete_trailing_underscores(name));
01399 #else
01400 for (j = 0; j < len; j ++)
01401 name[ j ] = tolower(name[ j ]);
01402 #endif
01403 }
01404 # ifdef KEY
01405 if ( DST_ARE_EQUAL(DST_INVALID_IDX,parent) ) {
01406 i = DST_mk_common_block(name,ST_st_idx(st));
01407 }
01408 else {
01409 i = parent;
01410 }
01411 # else
01412 i = DST_mk_common_block(name,(void*) ST_st_idx(st));
01413 # endif
01414 #else
01415 i = DST_mk_common_block(ST_name(st),(void*) (INTPTR)ST_st_idx(st));
01416 #endif
01417
01418 e = NULL ;
01419
01420 while ((e = GET_NEXT_ELEMENT_ST(st,e)) != NULL) {
01421
01422 el = I_element(e);
01423 s = GET_ST_LINENUM(st);
01424 te = ST_type(el);
01425
01426 Top_ST = el;
01427 Top_ST_has_dope = cwh_dst_has_dope(te);
01428
01429 dr = IS_DOPE_TY(te);
01430
01431 if (dr) {
01432 t = cwh_dst_dope_type(ST_type(el),
01433 el,
01434 ST_ofst(el),
01435 i,
01436 FALSE,
01437 &dope_ty);
01438 } else
01439 t = cwh_dst_mk_type(te);
01440
01441 #ifdef KEY
01442 INT j;
01443 INT len = ST_name(el) ? strlen(ST_name(el))+1:0;
01444 char name[len];
01445 if (len) {
01446 strcpy(name, ST_name(el));
01447 for (j = 0; j < len; j ++)
01448 name[ j ] = tolower(name[ j ]);
01449 }
01450 m = DST_mk_variable_comm(s,
01451 name,
01452 t,
01453 ST_st_idx(st),
01454 ST_ofst(el)) ;
01455 #else
01456 m = DST_mk_variable_comm(s,
01457 ST_name(el),
01458 t,
01459 (void *)(INTPTR) ST_st_idx(st),
01460 ST_ofst(el)) ;
01461 #endif
01462
01463 if (dr) {
01464 def_info = DST_INFO_IDX_TO_PTR(m);
01465 def_attr_idx = DST_INFO_attributes(def_info);
01466 def_attr = DST_ATTR_IDX_TO_PTR(def_attr_idx, DST_VARIABLE);
01467
01468 DST_VARIABLE_comm_dopetype(def_attr) = dope_ty;
01469
01470 if (ST_auxst_is_assumed_shape(el)) {
01471 DST_SET_assumed_shape(DST_INFO_flag(def_info));
01472 }
01473 else if (ST_auxst_is_allocatable(el)) {
01474 DST_SET_allocatable(DST_INFO_flag(def_info));
01475 }
01476 else if (ST_auxst_is_f90_pointer(el)) {
01477 DST_SET_f90_pointer(DST_INFO_flag(def_info));
01478 }
01479 }
01480
01481 if (ST_auxst_is_assumed_size(el)) {
01482 DST_SET_assumed_size(DST_INFO_flag(DST_INFO_IDX_TO_PTR(m)));
01483 }
01484
01485 if (dr)
01486 DST_SET_deref(DST_INFO_flag( DST_INFO_IDX_TO_PTR(m)));
01487
01488 DST_append_child(i,m);
01489 }
01490
01491 return i;
01492 }
01493
01494
01495
01496
01497
01498
01499
01500
01501
01502 static DST_INFO_IDX
01503 cwh_dst_mk_type(TY_IDX ty)
01504 {
01505 DST_INFO_IDX i;
01506
01507 switch (TY_kind(ty)) {
01508 case KIND_VOID:
01509 i = DST_INVALID_IDX;
01510 break;
01511
01512 case KIND_SCALAR:
01513 i = cwh_dst_basetype(ty);
01514 break ;
01515
01516 case KIND_ARRAY:
01517 i = cwh_dst_array_type(ty);
01518 break ;
01519
01520 case KIND_STRUCT:
01521 i = cwh_dst_struct_type(ty);
01522 break;
01523
01524 case KIND_POINTER:
01525 i = cwh_dst_pointer_type(ty);
01526 break;
01527
01528 case KIND_FUNCTION:
01529 i = cwh_dst_mk_subroutine_type(ty);
01530 break ;
01531
01532 default:
01533 DevAssert((0),("DST TY"));
01534 }
01535
01536 return i;
01537 }
01538
01539
01540
01541
01542
01543
01544
01545
01546
01547
01548
01549 static DST_INFO_IDX
01550 cwh_dst_basetype(TY_IDX ty)
01551 {
01552 TYPE_ID bt ;
01553 DST_INFO_IDX i ;
01554
01555 bt = TY_mtype(ty);
01556
01557 if (bt == MTYPE_V) return(DST_INVALID_IDX);
01558
01559 if (TY_is_logical(Ty_Table[ty]))
01560 bt = bt -MTYPE_I1 + MTYPE_V + 1 ;
01561
01562 if (!DST_IS_NULL(base_types[bt]))
01563 return base_types[bt];
01564
01565 i = DST_mk_basetype(ate_types[bt].name,
01566 ate_types[bt].encoding,
01567 ate_types[bt].size);
01568
01569 base_types[bt] = i;
01570 DST_append_child(comp_unit_idx,i);
01571 return i;
01572 }
01573
01574
01575
01576
01577
01578
01579
01580
01581
01582
01583 static DST_INFO_IDX
01584 cwh_dst_pointer_type(TY_IDX ty)
01585 {
01586 DST_INFO_IDX i;
01587 DST_INFO_IDX t;
01588
01589 t = cwh_dst_mk_type(TY_pointed(ty));
01590 i = DST_mk_pointer_type(t,
01591 DW_ADDR_none,
01592 TY_size(ty));
01593
01594 DST_append_child(current_scope_idx,i);
01595 return i ;
01596
01597 }
01598
01599
01600
01601
01602
01603
01604
01605
01606
01607 static DST_INFO_IDX
01608 cwh_dst_mk_subroutine_type(TY_IDX ty)
01609 {
01610 DST_INFO_IDX t ;
01611
01612
01613 t = cwh_dst_basetype(Be_Type_Tbl(MTYPE_V));
01614
01615
01616 #if 0
01617 if (!DST_IS_NULL(t)) {
01618
01619 USRCPOS_clear(s);
01620
01621 i = DST_mk_subroutine_type(s,
01622 NULL,
01623 t,
01624 DST_INVALID_IDX,
01625 FALSE);
01626
01627 }
01628 DST_append_child(current_scope_idx,i);
01629 return i;
01630 #endif
01631 return t ;
01632 }
01633
01634
01635
01636
01637
01638
01639
01640
01641
01642
01643 static DST_INFO_IDX
01644 cwh_dst_array_type(TY_IDX ty)
01645 {
01646
01647 DST_INFO_IDX i ;
01648 DST_INFO_IDX t ;
01649 DST_INFO_IDX d ;
01650
01651 USRCPOS s;
01652 INT32 j;
01653 INT idx;
01654
01655 USRCPOS_clear(s);
01656
01657 if (cwh_dst_is_character_TY(ty)) {
01658 i = cwh_dst_substring_type(ty);
01659
01660 } else {
01661
01662 t = cwh_dst_mk_type(TY_AR_etype(ty));
01663 i = DST_mk_array_type(s,
01664 TY_name(ty),
01665 t,
01666 0,
01667 DST_INVALID_IDX,
01668 TRUE);
01669
01670 TY& tt = Ty_Table[ty];
01671 ARB_HANDLE arb = TY_arb(ty);
01672 for (idx = TY_AR_ndims(ty) - 1; idx >=0 ; idx--) {
01673 d = cwh_dst_subrange(arb[idx]) ;
01674 DST_append_child(i,d);
01675 }
01676 }
01677 DST_append_child(current_scope_idx,i);
01678 return i;
01679 }
01680
01681
01682
01683
01684
01685
01686
01687
01688
01689
01690
01691
01692
01693 static DST_INFO_IDX
01694 cwh_dst_struct_type(TY_IDX ty)
01695 {
01696 DST_INFO_IDX i ;
01697
01698 USRCPOS s;
01699
01700 USRCPOS_clear(s);
01701
01702 i = cwh_dst_struct_has_DST(ty);
01703
01704 if (DST_IS_NULL(i) || Top_ST_has_dope) {
01705
01706 #ifdef KEY
01707 INT len = TY_name(ty)?strlen(TY_name(ty))+1:0;
01708 INT j;
01709 char name[len];
01710 if (len) {
01711 strcpy(name, TY_name(ty));
01712 for (j=0; j < len; j ++)
01713 name[j] = tolower(name[j]);
01714 }
01715 i = DST_mk_structure_type(s,
01716 name,
01717 TY_size(ty),
01718 DST_INVALID_IDX,
01719 FALSE);
01720 #else
01721 i = DST_mk_structure_type(s,
01722 TY_name(ty),
01723 TY_size(ty),
01724 DST_INVALID_IDX,
01725 FALSE);
01726 #endif
01727
01728 Top_ST_has_dope = FALSE;
01729 cwh_dst_struct_set_DST(ty,i) ;
01730
01731 FLD_HANDLE f = TY_fld(Ty_Table[ty]);
01732
01733 while (!f.Is_Null ()) {
01734 (void) cwh_dst_member(f,i);
01735 f = FLD_next(f);
01736 }
01737
01738 DST_append_child(current_scope_idx, i);
01739 }
01740
01741 return i;
01742 }
01743
01744
01745
01746
01747
01748
01749
01750
01751
01752
01753 static DST_INFO_IDX
01754 cwh_dst_substring_type(TY_IDX ty)
01755 {
01756
01757 DST_INFO_IDX i ;
01758 DST_cval_ref len ;
01759 DST_flag const_len ;
01760 USRCPOS s;
01761
01762 USRCPOS_clear(s);
01763
01764 ARB_HANDLE arb = TY_arb(ty);
01765
01766 const_len = ARB_const_ubnd(arb);
01767
01768 if (const_len)
01769 len.cval = ARB_ubnd_val(arb);
01770 else {
01771 len.ref = cwh_dst_mk_variable(&St_Table[ARB_ubnd_var(arb)]);
01772 DST_append_child(current_scope_idx,len.ref);
01773 }
01774
01775 i = DST_mk_string_type(s,
01776 TY_name(ty),
01777 const_len,
01778 len);
01779
01780 DST_append_child(current_scope_idx, i);
01781 return i;
01782 }
01783
01784
01785
01786
01787
01788
01789
01790
01791
01792
01793
01794
01795 static BOOL
01796 cwh_dst_is_character_TY(TY_IDX ty)
01797 {
01798 TY_IDX ts ;
01799 BOOL rs ;
01800
01801 DevAssert((TY_kind(ty) == KIND_ARRAY),("bad char ty"));
01802
01803 rs = FALSE;
01804 ts = TY_AR_etype(ty);
01805
01806 if (TY_is_character(Ty_Table[ts]))
01807 if (TY_kind(ts) == KIND_SCALAR)
01808 rs = TRUE;
01809
01810 return rs ;
01811 }
01812
01813
01814
01815
01816
01817
01818
01819
01820
01821
01822
01823
01824
01825
01826
01827
01828
01829
01830
01831
01832
01833
01834 static DST_INFO_IDX
01835 cwh_dst_dope_type(TY_IDX td , ST * st, mINT64 off, DST_INFO_IDX parent, BOOL comp, DST_INFO_IDX *dope_ty)
01836 {
01837 DST_INFO_IDX i ;
01838 DST_INFO_IDX t ;
01839
01840 USRCPOS s;
01841 TY_IDX ty;
01842
01843 char *n = '\0';
01844
01845 USRCPOS_clear(s);
01846
01847
01848
01849
01850 *dope_ty = cwh_dst_mk_type(td);
01851
01852 ty = GET_DOPE_BASE_TY(td);
01853
01854 if (TY_kind(ty) == KIND_ARRAY) {
01855 ty = TY_AR_etype(ty);
01856
01857 t = cwh_dst_mk_type(ty);
01858 i = DST_mk_array_type(s,n,t,0,DST_INVALID_IDX,TRUE);
01859
01860 cwh_dst_dope_bounds(td,st,off,i,parent, comp);
01861 DST_append_child(parent,i);
01862
01863 } else {
01864
01865 i = cwh_dst_mk_type(ty);
01866
01867 }
01868
01869 if (comp) {
01870 i = DST_mk_pointer_type(i,
01871 DW_ADDR_none,
01872 Pointer_Size);
01873 DST_append_child(parent,i);
01874 }
01875
01876 return i ;
01877 }
01878
01879
01880
01881
01882
01883
01884
01885
01886
01887
01888
01889
01890
01891
01892
01893
01894
01895
01896
01897 static void
01898 cwh_dst_dope_bounds(TY_IDX td, ST * st, mINT64 off, DST_INFO_IDX arr, DST_INFO_IDX p, BOOL comp)
01899 {
01900 TY_IDX tf;
01901
01902 DST_cval_ref u ;
01903 DST_cval_ref l ;
01904
01905 DST_INFO_IDX i ;
01906 DST_INFO_IDX t ;
01907 DST_INFO_IDX s ;
01908 DST_INFO_IDX x ;
01909
01910 INT32 rnk,k,sz;
01911 BOOL str = FALSE;
01912 enum str_knd kind;
01913
01914 FLD_HANDLE fld = GET_DOPE_BOUNDS(td);
01915
01916 if (st != NULL)
01917 str = (ST_sclass(st) == SCLASS_FORMAL) || (ST_sclass(st) == SCLASS_FORMAL_REF) ;
01918
01919 str = TY_is_f90_pointer(Ty_Table[td]) || str;
01920 kind = cwh_dst_stride_kind(GET_DOPE_BASE_TY(td));
01921
01922
01923
01924
01925 if (!fld.Is_Null ()) {
01926
01927 off = FLD_ofst(fld) + off;
01928 tf = FLD_type(fld);
01929 rnk = TY_AR_ubnd_val(tf,0);
01930 FLD_HANDLE bnd_fld = TY_fld(Ty_Table[TY_AR_etype(tf)]);
01931 t = cwh_dst_mk_type(FLD_type(bnd_fld));
01932 sz = FLD_ofst(FLD_next(bnd_fld))- FLD_ofst(bnd_fld);
01933
01934 for (k = 0 ; k <= rnk ; k ++) {
01935
01936 l.ref = cwh_dst_mk_dope_bound(st,off,t,p,comp);
01937 off += sz ;
01938 u.ref = cwh_dst_mk_dope_bound(st,off,t,p,comp);
01939 off += sz ;
01940
01941 i = DST_mk_subrange_type(FALSE,l,FALSE,u);
01942 DST_SET_count(DST_INFO_flag(DST_INFO_IDX_TO_PTR(i))) ;
01943
01944 if (str) {
01945 s = cwh_dst_mk_dope_bound(st,off,t,p,comp);
01946 x = DST_INFO_attributes(DST_INFO_IDX_TO_PTR(i)) ;
01947 DST_SUBRANGE_TYPE_stride_ref(DST_ATTR_IDX_TO_PTR(x,DST_SUBRANGE_TYPE)) = s ;
01948
01949 if (kind == s_TWO_BYTE)
01950 DST_SET_stride_2byte(DST_INFO_flag(DST_INFO_IDX_TO_PTR(i))) ;
01951 else if ((kind == s_BYTE) || (kind == s_CHAR))
01952 DST_SET_stride_1byte(DST_INFO_flag(DST_INFO_IDX_TO_PTR(i))) ;
01953 }
01954
01955 off += sz ;
01956
01957 DST_append_child(arr,i);
01958 }
01959 }
01960 }
01961
01962
01963
01964
01965
01966
01967
01968
01969
01970
01971
01972
01973
01974
01975 static enum str_knd
01976 cwh_dst_stride_kind(TY_IDX ty)
01977 {
01978 enum str_knd rt = s_NONE;
01979 enum str_knd at ;
01980
01981 switch (TY_kind(ty)) {
01982 case KIND_ARRAY:
01983 rt = cwh_dst_stride_kind(TY_AR_etype(ty));
01984 break;
01985
01986 case KIND_STRUCT:
01987 if (IS_DOPE_TY(ty))
01988 rt = s_WORD ;
01989 else {
01990
01991 FLD_HANDLE f = TY_fld(Ty_Table[ty]);
01992 while ((!f.Is_Null ()) && ((rt == s_CHAR) || (rt == s_NONE))) {
01993
01994 at = cwh_dst_stride_kind(FLD_type(f)) ;
01995
01996 if (at == s_CHAR)
01997 rt = s_CHAR ;
01998 else
01999 rt = s_WORD;
02000
02001 f = FLD_next(f);
02002 }
02003 }
02004 break;
02005
02006
02007 case KIND_SCALAR:
02008 if (cwh_types_is_character(ty))
02009 rt = s_CHAR;
02010 else if ((TY_mtype(ty) == MTYPE_I1) || (TY_mtype(ty) == MTYPE_U1))
02011 rt = s_BYTE ;
02012 else if ((TY_mtype(ty) == MTYPE_I2) || (TY_mtype(ty) == MTYPE_U2))
02013 rt = s_TWO_BYTE ;
02014 else
02015 rt = s_WORD;
02016 break ;
02017
02018 case KIND_POINTER:
02019 rt = cwh_dst_stride_kind(TY_pointed(ty));
02020 break ;
02021
02022 default:
02023 DevAssert((0),(" dope type"));
02024
02025 }
02026
02027 return rt ;
02028 }
02029
02030
02031
02032
02033
02034
02035
02036
02037
02038
02039
02040
02041
02042 static DST_INFO_IDX
02043 cwh_dst_member(FLD_HANDLE fld, DST_INFO_IDX parent)
02044 {
02045 DST_MEMBER *def_attr;
02046 DST_ATTR_IDX def_attr_idx;
02047 DST_INFO *def_info;
02048 DST_INFO_IDX dope_ty;
02049 BOOL dope ;
02050 DST_INFO_IDX i ;
02051 DST_INFO_IDX t ;
02052 TY_IDX ty;
02053
02054 USRCPOS s;
02055
02056
02057 USRCPOS_clear(s);
02058
02059 Making_FLD_DST=TRUE ;
02060
02061 ty = FLD_type(fld);
02062 dope = IS_DOPE_TY(ty);
02063
02064 if (dope)
02065 t = cwh_dst_dope_type(ty,
02066 Top_ST,
02067 FLD_ofst(fld),
02068 parent,
02069 TRUE,
02070 &dope_ty);
02071 else
02072 t = cwh_dst_mk_type(ty);
02073
02074 #ifdef KEY
02075 INT len = FLD_name(fld)?strlen(FLD_name(fld))+1:0;
02076 INT j;
02077 char name[len];
02078 if (len) {
02079 strcpy(name, FLD_name(fld));
02080 for (j=0; j < len; j ++)
02081 name[j] = tolower(name[j]);
02082 }
02083 i = DST_mk_member(s,
02084 name,
02085 t,
02086 FLD_ofst(fld),
02087 0,
02088 FLD_bofst(fld),
02089 FLD_bsize(fld),
02090 FLD_is_bit_field(fld),
02091 FALSE,
02092 FALSE,
02093 FALSE);
02094 #else
02095 i = DST_mk_member(s,
02096 FLD_name(fld),
02097 t,
02098 FLD_ofst(fld),
02099 0,
02100 FLD_bofst(fld),
02101 FLD_bsize(fld),
02102 FLD_is_bit_field(fld),
02103 FALSE,
02104 FALSE,
02105 FALSE);
02106 #endif
02107
02108 if (dope) {
02109 def_info = DST_INFO_IDX_TO_PTR(i);
02110 def_attr_idx = DST_INFO_attributes(def_info);
02111 def_attr = DST_ATTR_IDX_TO_PTR(def_attr_idx, DST_MEMBER);
02112
02113 DST_MEMBER_dopetype(def_attr) = dope_ty;
02114 DST_SET_f90_pointer(DST_INFO_flag(def_info));
02115 }
02116
02117 DST_append_child(parent,i);
02118
02119 Making_FLD_DST=FALSE ;
02120 return i;
02121
02122 }
02123
02124
02125
02126
02127
02128
02129
02130
02131
02132
02133
02134
02135
02136
02137
02138
02139
02140
02141
02142
02143
02144
02145
02146
02147
02148 static DST_INFO_IDX
02149 cwh_dst_struct_has_DST(TY_IDX ty)
02150 {
02151 INT32 i ;
02152 TY_IDX ts ;
02153 FLD_HANDLE fld ;
02154 BOOL has_ptr_array_dope = FALSE;
02155
02156 if (!IS_DOPE_TY(ty)) {
02157
02158 ts = ty ;
02159
02160 fld = TY_fld(Ty_Table[ts]);
02161
02162 while (!fld.Is_Null () && !has_ptr_array_dope) {
02163
02164 ts = FLD_type(fld) ;
02165
02166 TY& t = Ty_Table[ts];
02167
02168 if (IS_DOPE_TY(ts))
02169 if (TY_is_f90_pointer(t)) {
02170 ts = GET_DOPE_BASE_TY(ts);
02171 if (TY_kind(ts) == KIND_ARRAY)
02172 if (TY_kind(TY_AR_etype(Ty_Table[ts])) == KIND_STRUCT)
02173 if (!Making_FLD_DST)
02174 has_ptr_array_dope = TRUE;
02175 }
02176
02177 fld = FLD_next(fld);
02178 }
02179 }
02180
02181 if (! has_ptr_array_dope) {
02182
02183
02184
02185 for(i = Struct_Top ; i >= 0 ; i --)
02186 if (ty == Struct_DSTs[i].ty)
02187 return Struct_DSTs[i].idx;
02188
02189 }
02190
02191 return (DST_INVALID_IDX);
02192 }
02193
02194
02195
02196
02197
02198
02199
02200
02201
02202
02203
02204
02205
02206
02207 static void
02208 cwh_dst_struct_set_DST(TY_IDX ty, DST_INFO_IDX i)
02209 {
02210 Struct_Top ++ ;
02211 if (Struct_Top >= Struct_Current_Size) {
02212 Struct_Current_Size += STRUCT_DST_SIZE_CHANGE;
02213 Struct_DSTs = (TYIDX *) realloc(Struct_DSTs,sizeof(TYIDX)*Struct_Current_Size);
02214 }
02215
02216 Struct_DSTs[Struct_Top].ty = ty;
02217 Struct_DSTs[Struct_Top].idx = i;
02218 }
02219
02220
02221
02222
02223
02224
02225
02226
02227
02228 static void
02229 cwh_dst_struct_clear_DSTs(void)
02230 {
02231 Struct_Top = -1 ;
02232 }
02233
02234
02235
02236
02237
02238
02239
02240
02241
02242
02243 static void
02244 cwh_dst_inner_add_DST(DST_INFO_IDX i)
02245 {
02246
02247 Inner_Top ++ ;
02248
02249 if (Inner_Top >= Inner_Current_Size) {
02250 Inner_Current_Size += INNER_DST_SIZE_CHANGE;
02251 Inner_DSTs = (DST_INFO_IDX *) realloc(Inner_DSTs,sizeof(DST_INFO_IDX)*Inner_Current_Size);
02252 }
02253
02254 Inner_DSTs[Inner_Top] = i;
02255 }
02256
02257
02258
02259
02260
02261
02262
02263
02264
02265 static void
02266 cwh_dst_inner_clear_DSTs(void)
02267 {
02268 Inner_Top = -1 ;
02269 }
02270
02271
02272
02273
02274
02275
02276
02277
02278
02279
02280 static void
02281 cwh_dst_inner_read_DSTs(DST_INFO_IDX parent)
02282 {
02283 INT32 i ;
02284
02285 for(i = 0 ; i <= Inner_Top ; i ++)
02286 DST_append_child(parent,Inner_DSTs[i]);
02287 }
02288
02289
02290
02291
02292
02293
02294
02295
02296
02297 static DST_INFO_IDX
02298 cwh_dst_subrange(ARB_HANDLE ar)
02299 {
02300 DST_INFO_IDX i ;
02301 DST_cval_ref lb,ub;
02302 DST_flag const_lb,const_ub ;
02303 BOOL extent = FALSE ;
02304 const_lb = ARB_const_lbnd(ar) ;
02305 const_ub = ARB_const_ubnd(ar) ;
02306
02307 if (const_lb)
02308 lb.cval = ARB_lbnd_val(ar) ;
02309 else {
02310 lb.ref = cwh_dst_mk_variable(&St_Table[ARB_lbnd_var(ar)]);
02311 DST_append_child(current_scope_idx,lb.ref);
02312 }
02313
02314 if (const_ub)
02315 ub.cval = ARB_ubnd_val(ar) ;
02316 else {
02317 ub.ref = cwh_dst_mk_variable(&St_Table[ARB_ubnd_var(ar)]);
02318 DST_append_child(current_scope_idx,ub.ref);
02319 }
02320
02321 i = DST_mk_subrange_type(const_lb,
02322 lb,
02323 const_ub,
02324 ub);
02325
02326 if (extent)
02327 DST_SET_count(DST_INFO_flag(DST_INFO_IDX_TO_PTR(i))) ;
02328
02329 return i;
02330 }
02331
02332
02333
02334
02335
02336
02337
02338
02339
02340
02341
02342
02343
02344
02345
02346
02347
02348
02349
02350
02351
02352
02353
02354
02355 static DST_INFO_IDX
02356 cwh_dst_mk_dope_bound(ST *dp, mINT64 offset, DST_INFO_IDX t, DST_INFO_IDX p, BOOL component)
02357 {
02358 DST_INFO_IDX i ;
02359
02360 TY_IDX ty ;
02361 BOOL dr = FALSE;
02362 BOOL ce = FALSE;
02363 BOOL dapc= FALSE;
02364 char *n = '\0';
02365 USRCPOS s;
02366
02367 USRCPOS_clear(s);
02368
02369 DevAssert((dp != NULL),(" missing dope ST "));
02370
02371 BOOL class_based = (ST_base_idx(dp) != ST_st_idx(dp));
02372 ce = (class_based &&
02373 ((ST_sclass(ST_base(dp)) == SCLASS_COMMON) ||
02374 (ST_sclass(ST_base(dp)) == SCLASS_DGLOBAL))) ;
02375
02376 dr = (ST_sclass(dp) == SCLASS_FORMAL) || (ST_sclass(dp) == SCLASS_FORMAL_REF);
02377
02378
02379
02380
02381
02382 dr |= (class_based && !ce) ||
02383 ((component && ST_auxst_is_f90_pointer(dp))) ;
02384
02385
02386
02387
02388
02389
02390 ty = ST_type(dp);
02391 dapc = TY_kind(ty) == KIND_ARRAY && Making_FLD_DST ;
02392
02393
02394
02395
02396
02397 dapc = FALSE;
02398
02399 if (!dapc) {
02400
02401 if (ce) {
02402
02403 i = DST_mk_variable_comm(s,
02404 NULL,
02405 t,
02406 ST_st_idx(ST_base(dp)),
02407 offset);
02408
02409 } else {
02410
02411 i = DST_mk_variable(s,
02412 n,
02413 t,
02414 offset,
02415 ST_st_idx(dp),
02416 DST_INVALID_IDX,
02417 FALSE,
02418 ST_sclass(dp) == SCLASS_AUTO,
02419 FALSE,
02420 TRUE);
02421 }
02422
02423 if (dr)
02424 DST_SET_base_deref(DST_INFO_flag(DST_INFO_IDX_TO_PTR(i)));
02425
02426 } else {
02427
02428 i = DST_mk_member(s,
02429 n,
02430 t,
02431 offset,
02432 Pointer_Size,
02433 0,FALSE,FALSE,FALSE,FALSE,FALSE);
02434
02435 }
02436 DST_append_child(p,i);
02437
02438 return i ;
02439 }
02440
02441
02442
02443
02444
02445
02446
02447
02448
02449
02450
02451
02452
02453 static BOOL
02454 cwh_dst_has_dope(TY_IDX ty)
02455 {
02456 while(TY_kind(ty) == KIND_POINTER)
02457 ty = TY_pointed(ty);
02458
02459 if (!IS_DOPE_TY(ty)) {
02460
02461 if (TY_kind(ty) == KIND_STRUCT) {
02462
02463 FLD_HANDLE fld = TY_fld(Ty_Table[ty]);
02464
02465 while (!fld.Is_Null ()) {
02466 if (IS_DOPE_TY(FLD_type(fld)))
02467 if (!GET_DOPE_BOUNDS(FLD_type(fld)).Is_Null ())
02468 return(TRUE);
02469
02470 fld = FLD_next(fld);
02471 }
02472 }
02473 }
02474
02475 return (FALSE);
02476 }
02477
02478
02479
02480
02481
02482
02483
02484
02485
02486
02487
02488
02489 static INT32
02490 DST_set_assoc_idx(INT32 dummy,
02491 DST_DW_tag tag,
02492 DST_flag flag,
02493 DST_ATTR_IDX iattr,
02494 DST_INFO_IDX inode)
02495 {
02496 DST_INFO *node;
02497 #ifdef KEY
02498 DST_ASSOC_INFO *assoc = 0;
02499 #else
02500 DST_ASSOC_INFO *assoc;
02501 #endif
02502 mINT32 level, index;
02503 ST_IDX st;
02504
02505 if (DST_IS_assoc_fe(flag))
02506 {
02507
02508
02509
02510
02511
02512 switch (tag)
02513 {
02514 case DW_TAG_subprogram:
02515 if (DST_IS_memdef(flag))
02516 {
02517 assoc = &DST_SUBPROGRAM_memdef_st(
02518 DST_ATTR_IDX_TO_PTR(iattr, DST_SUBPROGRAM));
02519 }
02520 else if (!DST_IS_declaration(flag))
02521 {
02522 assoc = &DST_SUBPROGRAM_def_st(
02523 DST_ATTR_IDX_TO_PTR(iattr, DST_SUBPROGRAM));
02524 }
02525 else
02526 {
02527 DevAssert((FALSE), ("Illegal subprogram DST_ASSOC_INFO"));
02528 }
02529 st = (ST_IDX)(INTPTR) pDST_ASSOC_INFO_fe_ptr(assoc);
02530 Get_ST_Id( st, &level, &index );
02531 pDST_ASSOC_INFO_st_idx(assoc) = st;
02532 break;
02533
02534 case DW_TAG_entry_point:
02535 assoc = &DST_ENTRY_POINT_st(
02536 DST_ATTR_IDX_TO_PTR(iattr, DST_ENTRY_POINT));
02537 st = (ST_IDX)(INTPTR) pDST_ASSOC_INFO_fe_ptr(assoc);
02538 Get_ST_Id( st, &level, &index );
02539 pDST_ASSOC_INFO_st_idx(assoc) = st;
02540 break;
02541
02542 case DW_TAG_formal_parameter:
02543 assoc = &DST_FORMAL_PARAMETER_st(
02544 DST_ATTR_IDX_TO_PTR(iattr, DST_FORMAL_PARAMETER));
02545 st = (ST_IDX)(INTPTR) pDST_ASSOC_INFO_fe_ptr(assoc);
02546 Get_ST_Id( st, &level, &index );
02547 pDST_ASSOC_INFO_st_idx(assoc) = st;
02548 break;
02549
02550 case DW_TAG_common_block:
02551 assoc = &DST_COMMON_BLOCK_st(
02552 DST_ATTR_IDX_TO_PTR(iattr, DST_COMMON_BLOCK ) );
02553 st = (ST_IDX)(INTPTR) pDST_ASSOC_INFO_fe_ptr(assoc);
02554 Get_ST_Id( st, &level, &index );
02555 pDST_ASSOC_INFO_st_idx(assoc) = st;
02556 break;
02557
02558 case DW_TAG_variable:
02559 if (DST_IS_comm(flag)) {
02560 assoc = &DST_VARIABLE_comm_st(
02561 DST_ATTR_IDX_TO_PTR(iattr, DST_VARIABLE));
02562 }
02563 else if (DST_IS_memdef(flag))
02564 {
02565 assoc = &DST_VARIABLE_memdef_st(
02566 DST_ATTR_IDX_TO_PTR(iattr, DST_VARIABLE));
02567 }
02568 else if (!DST_IS_declaration(flag))
02569 {
02570 assoc = &DST_VARIABLE_def_st(
02571 DST_ATTR_IDX_TO_PTR(iattr, DST_VARIABLE));
02572 }
02573 else
02574 {
02575 DevAssert((FALSE), ("Illegal DST variable assoc ptr"));
02576 }
02577
02578
02579 st = (ST_IDX)(INTPTR) pDST_ASSOC_INFO_fe_ptr(assoc);
02580
02581 Get_ST_Id( st, &level, &index );
02582 pDST_ASSOC_INFO_st_idx(assoc) = st;
02583 break;
02584
02585 case DW_TAG_label:
02586 assoc = &DST_LABEL_low_pc(DST_ATTR_IDX_TO_PTR(iattr, DST_LABEL));
02587 DevAssert((0),("NEW_SYMTAB: DW_TAG_label"));
02588 pDST_ASSOC_INFO_st_idx(assoc) = make_ST_IDX(index,level);
02589 break;
02590
02591 case DW_TAG_lexical_block:
02592 assoc = &DST_LEXICAL_BLOCK_low_pc(
02593 DST_ATTR_IDX_TO_PTR(iattr, DST_LEXICAL_BLOCK));
02594 DevAssert((0),("NEW_SYMTAB: DW_TAG_lexical_block"));
02595 pDST_ASSOC_INFO_st_idx(assoc) = make_ST_IDX(index,level);
02596 assoc = &DST_LEXICAL_BLOCK_high_pc(
02597 DST_ATTR_IDX_TO_PTR(iattr, DST_LEXICAL_BLOCK));
02598 DevAssert((0),("NEW_SYMTAB: DW_TAG_lexical_block"));
02599 pDST_ASSOC_INFO_st_idx(assoc) = make_ST_IDX(index,level);
02600 break;
02601
02602 case DW_TAG_inlined_subroutine:
02603 assoc = &DST_INLINED_SUBROUTINE_low_pc(
02604 DST_ATTR_IDX_TO_PTR(iattr, DST_INLINED_SUBROUTINE));
02605 st = (ST_IDX)(INTPTR) pDST_ASSOC_INFO_fe_ptr(assoc);
02606 Get_ST_Id( st, &level, &index );
02607 pDST_ASSOC_INFO_st_idx(assoc) = st;
02608 assoc = &DST_INLINED_SUBROUTINE_high_pc(
02609 DST_ATTR_IDX_TO_PTR(iattr, DST_INLINED_SUBROUTINE));
02610 st = (ST_IDX)(INTPTR) pDST_ASSOC_INFO_fe_ptr(assoc);
02611 Get_ST_Id( st, &level, &index );
02612 pDST_ASSOC_INFO_st_idx(assoc) = st;
02613 break;
02614
02615 default:
02616 DevAssert((FALSE),("Invalid DST_ASSOC_INFO field access"));
02617 break;
02618 }
02619 node = DST_INFO_IDX_TO_PTR(inode);
02620 DST_SET_assoc_idx(DST_INFO_flag(node));
02621 DST_RESET_assoc_fe(DST_INFO_flag(node));
02622 }
02623
02624 return dummy;
02625 }
02626
02627
02628
02629
02630
02631
02632
02633
02634
02635
02636
02637
02638
02639 static mUINT16
02640 DST_get_ordinal_num(char *the_name,
02641 char ***the_list,
02642 mUINT16 *the_next,
02643 mUINT16 *the_size)
02644 {
02645 mUINT16 idx, next = *the_next, size = *the_size;
02646 char **list = *the_list;
02647
02648
02649
02650 if ((the_name == NULL) || (the_name[0] == '\0'))
02651 idx = 0;
02652 else {
02653 for (idx = 0; (idx < next) && (strcmp(the_name, list[idx]) != 0); idx += 1);
02654
02655
02656
02657 if (idx == next) {
02658 if (next >= size) {
02659 size += DST_NAME_TABLE_SIZE;
02660 *the_size = size;
02661 if (next == 0)
02662 list = (char **)malloc(size*sizeof(char *));
02663 else
02664 list = (char **)realloc((char *)list,size*sizeof(char *));
02665
02666 *the_list = list;
02667 }
02668 list[next] = the_name;
02669 *the_next += 1;
02670 }
02671 idx += 1;
02672 }
02673 return idx;
02674 }
02675
02676
02677
02678
02679
02680
02681
02682
02683
02684
02685
02686 static DST_FILE_IDX
02687 DST_write_files(void)
02688 {
02689 struct stat fstat;
02690 char *dir_name, *file_name;
02691 UINT64 file_size ;
02692 UINT64 fmod_time ;
02693 DST_FILE_IDX file_idx, first_file_idx = DST_INVALID_INIT;
02694 UINT32 dir_length;
02695 INT32 name_idx;
02696
02697 for (name_idx = 0; name_idx < next_file_idx; name_idx += 1)
02698 {
02699 file_name = file_list[name_idx];
02700
02701 if (stat(file_name, &fstat) == 0) {
02702 file_size = (UINT64)fstat.st_size;
02703 fmod_time = (UINT64)fstat.st_mtime;
02704
02705 } else {
02706 file_size = 0ll;
02707 fmod_time = 0ll;
02708 }
02709 DST_directory_of(file_name, &dir_name, &dir_length);
02710 file_idx = DST_mk_file_name(
02711 &file_name[dir_length],
02712 DST_get_ordinal_num(dir_name,
02713 &dir_list,
02714 &next_dir_idx,
02715 &dir_list_size),
02716 file_size,
02717 fmod_time);
02718 if (name_idx == 0)
02719 first_file_idx = file_idx;
02720 }
02721 return first_file_idx;
02722 }
02723
02724
02725
02726
02727
02728
02729
02730
02731
02732
02733
02734
02735 static void
02736 DST_directory_of(char *file_path, char **dir_name, UINT32 *dir_length)
02737 {
02738 char *dir;
02739
02740 *dir_name = strdup(file_path);
02741 dir= strrchr(*dir_name,'/') ;
02742
02743 *dir = '\0';
02744 *dir_length = dir - *dir_name + 1 ;
02745 }
02746
02747
02748
02749
02750
02751
02752
02753
02754
02755
02756 static DST_DIR_IDX
02757 DST_write_directories(void)
02758 {
02759 mUINT16 name_idx;
02760 DST_DIR_IDX dir_idx, first_idx = DST_INVALID_INIT;
02761
02762 for (name_idx = 0; name_idx < next_dir_idx; name_idx += 1) {
02763
02764 dir_idx = DST_mk_include_dir(dir_list[name_idx]);
02765 if (name_idx == 0)
02766 first_idx = dir_idx;
02767 }
02768
02769 return first_idx;
02770 }
02771
02772
02773
02774
02775
02776
02777
02778
02779
02780
02781 extern mUINT16
02782 cwh_dst_enter_path(char * fname)
02783 {
02784 mUINT16 idx;
02785 mUINT16 old;
02786 char *file_name;
02787
02788 file_name = Make_Absolute_Path(fname);
02789
02790 old = next_file_idx;
02791 idx = DST_get_ordinal_num(file_name,
02792 &file_list,
02793 &next_file_idx,
02794 &file_list_size);
02795
02796 if (next_file_idx == old)
02797 free(file_name);
02798
02799 return idx ;
02800 }
02801
02802
02803
02804
02805
02806
02807
02808
02809
02810
02811
02812
02813
02814
02815
02816 static char *
02817 cwh_dst_get_command_line_options(void)
02818 {
02819 INT32 i,
02820 strlength = 0;
02821 INT32 num_opts = 0;
02822 char **selected_opt;
02823 INT32 *opt_size;
02824 char *rtrn, *cp;
02825 char ch;
02826 BOOL record_option;
02827
02828 if (FE_command_line != NULL) {
02829
02830
02831
02832
02833
02834
02835
02836
02837
02838
02839
02840
02841
02842
02843
02844 struct stat statb;
02845 FILE *cmdfile;
02846
02847 if ((cmdfile = fopen(FE_command_line, "r")) != NULL) {
02848 if (fstat(fileno(cmdfile), &statb) == 0) {
02849 char *endcp;
02850
02851
02852 rtrn = (char *) malloc(statb.st_size+1);
02853
02854
02855 fgets(rtrn, statb.st_size, cmdfile);
02856
02857
02858
02859 for (cp = rtrn, endcp = rtrn+statb.st_size;
02860 *cp != 0 && *cp != '\n' && cp < endcp;
02861 cp++);
02862 *cp = '\0';
02863 fclose(cmdfile);
02864 return rtrn;
02865 }
02866
02867
02868
02869
02870 fclose(cmdfile);
02871 }
02872 }
02873
02874
02875 selected_opt = (char **)malloc(sizeof(char*) * save_argc);
02876 opt_size = (INT32 *)malloc(sizeof(INT32) * save_argc);
02877
02878 for (i = 1; i < save_argc; i++)
02879 {
02880 if (save_argv[i] != NULL && save_argv[i][0] == '-')
02881 {
02882 ch = save_argv[i][1];
02883 if (Debug_Level <= 0)
02884
02885 record_option = (ch == 'g' ||
02886 ch == 'O');
02887 else
02888
02889 record_option = (ch == 'D' ||
02890 ch == 'g' ||
02891 ch == 'I' ||
02892 ch == 'O' ||
02893 ch == 'U');
02894 if (record_option)
02895 {
02896 opt_size[num_opts] = strlen(save_argv[i]) + 1;
02897 selected_opt[num_opts] = save_argv[i];
02898 strlength += opt_size[num_opts];
02899 num_opts += 1;
02900 }
02901 }
02902 }
02903
02904 if (strlength == 0)
02905 {
02906 rtrn = (char *)calloc(1, 1);
02907 }
02908 else
02909 {
02910 rtrn = (char *)malloc(strlength);
02911 cp = rtrn;
02912
02913
02914 for (i = 0; i < num_opts; i++)
02915 if (opt_size[i] > 0)
02916 {
02917 cp = strcpy(cp, selected_opt[i]) + opt_size[i];
02918 cp[-1] = ' ';
02919 }
02920 cp[-1] = '\0';
02921 }
02922
02923 free(selected_opt);
02924 free(opt_size);
02925 return rtrn;
02926 }
02927
02928 static char
02929 Get_ST_Id (ST_IDX st_idx, INT *level, INT *index)
02930 {
02931 if (st_idx) {
02932
02933 *level = ST_IDX_level(st_idx);
02934 *index = ST_IDX_index(st_idx);
02935 }
02936
02937 else {
02938
02939 *level = 0;
02940 *index = 0;
02941 }
02942
02943 return 0;
02944 }
02945
02946
02947
02948
02949
02950
02951
02952
02953
02954 extern char *
02955 cwh_dst_filename_from_filenum(INT idx)
02956 {
02957 Is_True((idx > 0 && idx <= next_file_idx),("Bad file number (%d)\n",idx));
02958 return file_list[idx-1];
02959 }