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
00074
00075
00076
00077
00078 #ifdef _KEEP_RCS_ID
00079 static char *rcs_id = "$Source: /var/local/cvs/compilers/open64/osprey1.0/be/whirl2c/w2cf_symtab.cxx,v $ $Revision: 1.11 $";
00080
00081 #endif
00082
00083 #include <ctype.h>
00084 #include <string.h>
00085
00086 #ifdef BUILD_WHIRL2C
00087 #include "whirl2c_common.h"
00088 #define W2FC_Valid_Name(x,b) WHIRL2C_make_valid_c_name(x)
00089 #else
00090 #include "whirl2f_common.h"
00091 #define W2FC_Valid_Name(x,b) WHIRL2F_make_valid_name(x,b)
00092 #endif
00093
00094 #include "mempool.h"
00095 #include "w2cf_symtab.h"
00096
00097
00098
00099
00100
00101 #define MAX_LABEL_NUMBER 99999U
00102
00103 typedef UINT32 W2CF_STR_IDX;
00104 typedef struct W2CF_Stringbuf W2CF_STRINGBUF;
00105 struct W2CF_Stringbuf
00106 {
00107 W2CF_STR_IDX size;
00108 W2CF_STR_IDX next_char;
00109 char *chars;
00110 };
00111 #define W2CF_STRINGBUF_size(s) (s).size
00112 #define W2CF_STRINGBUF_next_char(s) (s).next_char
00113 #define W2CF_STRINGBUF_chars(s) (s).chars
00114
00115
00116 typedef struct W2CF_Symtab W2CF_SYMTAB;
00117 typedef struct W2CF_Symtab_Stack
00118 {
00119 W2CF_SYMTAB *top;
00120 W2CF_SYMTAB *bot;
00121 } W2CF_SYMTAB_STACK;
00122 #define W2CF_SYMTAB_STACK_top(s) (s).top
00123 #define W2CF_SYMTAB_STACK_bot(s) (s).bot
00124
00125
00126 typedef struct W2CF_Symhdr W2CF_SYMHDR;
00127 struct W2CF_Symtab
00128 {
00129 UINT32 unique_label;
00130 INT32 size;
00131 W2CF_SYMHDR **hash_tbl;
00132 W2CF_STRINGBUF strbuf;
00133 W2CF_SYMTAB *up;
00134 W2CF_SYMTAB *down;
00135 };
00136 #define W2CF_SYMTAB_unique_label(s) (s)->unique_label
00137 #define W2CF_SYMTAB_size(s) (s)->size
00138 #define W2CF_SYMTAB_hash_tbl(s) (s)->hash_tbl
00139 #define W2CF_SYMTAB_strbuf(s) (s)->strbuf
00140 #define W2CF_SYMTAB_up(s) (s)->up
00141 #define W2CF_SYMTAB_down(s) (s)->down
00142 #define W2CF_SYMTAB_next(s) (s)->down
00143
00144
00145 typedef struct W2CF_Symbol W2CF_SYMBOL;
00146 struct W2CF_Symhdr
00147 {
00148 UINT64 hashval;
00149 INT32 next_symid;
00150 W2CF_STR_IDX basename;
00151 W2CF_SYMBOL *symbol;
00152 W2CF_SYMHDR *next;
00153 };
00154 #define W2CF_SYMHDR_hashval(s) (s)->hashval
00155 #define W2CF_SYMHDR_next_symid(s) (s)->next_symid
00156 #define W2CF_SYMHDR_basename(s) (s)->basename
00157 #define W2CF_SYMHDR_symbol(s) (s)->symbol
00158 #define W2CF_SYMHDR_next(s) (s)->next
00159
00160
00161 typedef enum W2CF_Symbol_Kind
00162 {
00163 SYMKIND_UNKNOWN,
00164 SYMKIND_UNIQUE,
00165 SYMKIND_FLD,
00166 SYMKIND_FLD_POINTEE,
00167 SYMKIND_TY,
00168 SYMKIND_ST,
00169 SYMKIND_ST_POINTEE,
00170 SYMKIND_TEMPVAR,
00171 SYMKIND_PREG
00172 } W2CF_SYMBOL_KIND;
00173
00174
00175 struct W2CF_Symbol
00176 {
00177 W2CF_SYMBOL_KIND kind;
00178 INT32 symid;
00179 W2CF_STR_IDX name;
00180 W2CF_SYMBOL *next;
00181 union
00182 {
00183 FLD_IDX fld;
00184 FLD_IDX fld_ptr;
00185 TY_IDX ty;
00186 const ST *st;
00187 const ST *st_ptr;
00188 INT32 tempvar_id;
00189 struct
00190 {
00191 TY_IDX preg_ty;
00192
00193 PREG_NUM preg_num;
00194 } preg;
00195 } attr;
00196 };
00197 #define W2CF_SYMBOL_kind(s) (s)->kind
00198 #define W2CF_SYMBOL_symid(s) (s)->symid
00199 #define W2CF_SYMBOL_name(s) (s)->name
00200 #define W2CF_SYMBOL_next(s) (s)->next
00201 #define W2CF_SYMBOL_attr(s) (s)->attr
00202 #define W2CF_SYMBOL_fld(s) (s)->attr.fld
00203 #define W2CF_SYMBOL_fld_ptr(s) (s)->attr.fld_ptr
00204 #define W2CF_SYMBOL_ty(s) (s)->attr.ty
00205 #define W2CF_SYMBOL_st(s) (s)->attr.st
00206 #define W2CF_SYMBOL_st_ptr(s) (s)->attr.st_ptr
00207 #define W2CF_SYMBOL_tempvar_id(s) (s)->attr.tempvar_id
00208
00209
00210 #define W2CF_SYMBOL_preg_ty(s) (s)->attr.preg.preg_ty
00211 #define W2CF_SYMBOL_preg_num(s) (s)->attr.preg.preg_num
00212
00213
00214
00215 #define W2CF_INVALID_SYMID -2
00216 #define W2CF_FIRST_VALID_SYMID -1
00217 #define W2CF_NOSUFFIX_SYMID W2CF_FIRST_VALID_SYMID
00218
00219
00220 static void W2CF_Dump_Symbol(W2CF_SYMBOL *sym,W2CF_SYMTAB *symtab=NULL);
00221 static void W2CF_Dump_Symtab(W2CF_SYMTAB *symtab) ;
00222 static void W2CF_Dump_Symhdr(W2CF_SYMHDR *symhdr,W2CF_SYMTAB *symtab=NULL) ;
00223
00224
00225
00226
00227
00228
00229
00230 #define INITIAL_STRING_BUFFER_SIZE 1024
00231 #define INITIAL_SYMTAB_SIZE 1024
00232
00233
00234
00235
00236 #define W2CF_SYMTAB_strbuf_size(s) \
00237 W2CF_STRINGBUF_size(W2CF_SYMTAB_strbuf(s))
00238 #define W2CF_SYMTAB_strbuf_next(s) \
00239 W2CF_STRINGBUF_next_char(W2CF_SYMTAB_strbuf(s))
00240 #define W2CF_SYMTAB_strbuf_chars(s) \
00241 W2CF_STRINGBUF_chars(W2CF_SYMTAB_strbuf(s))
00242
00243 #define W2CF_SYMHDR_basename_string(symtab, symhdr) \
00244 &W2CF_SYMTAB_strbuf_chars(symtab)[W2CF_SYMHDR_basename(symhdr)]
00245 #define W2CF_SYMBOL_name_string(symtab, symbol) \
00246 &W2CF_SYMTAB_strbuf_chars(symtab)[W2CF_SYMBOL_name(symbol)]
00247
00248
00249
00250
00251 static W2CF_SYMTAB_STACK Symtab_Stack = {NULL, NULL};
00252 static W2CF_SYMTAB *Symtab_Free_List = NULL;
00253 static W2CF_SYMHDR *Symhdr_Free_List = NULL;
00254 static W2CF_SYMBOL *Symbol_Free_List = NULL;
00255
00256 static const char W2CF_Anonymous_Fld[] = "fld";
00257 static const char W2CF_Anonymous_Ty[] = "ty";
00258 static const char W2CF_Anonymous_St[] = "anon";
00259 static const char W2CF_Anonymous_Tempvar[] = "_tmp";
00260 static const char W2CF_Anonymous_Preg[] = "reg";
00261
00262
00263
00264
00265
00266 static W2CF_STR_IDX
00267 W2CF_Symtab_Alloc_Chars(W2CF_SYMTAB *symtab, UINT32 size)
00268 {
00269
00270
00271
00272 UINT32 new_bufsize = W2CF_SYMTAB_strbuf_size(symtab);
00273 UINT32 next_char = W2CF_SYMTAB_strbuf_next(symtab);
00274
00275
00276
00277
00278 while (new_bufsize < next_char + size)
00279 new_bufsize += new_bufsize/2 + INITIAL_STRING_BUFFER_SIZE;
00280
00281 if (W2CF_SYMTAB_strbuf_size(symtab) == 0)
00282 {
00283 W2CF_SYMTAB_strbuf_chars(symtab) = TYPE_ALLOC_N(char, new_bufsize);
00284 }
00285 else if (new_bufsize > W2CF_SYMTAB_strbuf_size(symtab))
00286 {
00287 W2CF_SYMTAB_strbuf_chars(symtab) =
00288 TYPE_REALLOC_N(char,
00289 W2CF_SYMTAB_strbuf_chars(symtab),
00290 W2CF_SYMTAB_strbuf_size(symtab),
00291 new_bufsize);
00292 }
00293 W2CF_SYMTAB_strbuf_size(symtab) = new_bufsize;
00294 W2CF_SYMTAB_strbuf_next(symtab) += size;
00295
00296 return next_char;
00297 }
00298
00299
00300 static void
00301 W2CF_Get_Basename(const char *original_name, char *basename, INT32 *sym_id)
00302 {
00303
00304
00305
00306
00307
00308 #define MAX_NUMERIC_SUFFIX_SIZE 8
00309
00310 const char *valid_name = W2FC_Valid_Name(original_name,WN2F_F90_pu);
00311 INT32 name_size, suffix_size;
00312 UINT32 numeric_suffix = 0;
00313 UINT32 suffix_exponent;
00314
00315
00316 for (name_size = 0; valid_name[name_size] != '\0'; name_size++)
00317 basename[name_size] = valid_name[name_size];
00318
00319
00320 for (suffix_size = 0, name_size--, suffix_exponent = 1;
00321 (name_size >= 0 &&
00322 suffix_size <= MAX_NUMERIC_SUFFIX_SIZE &&
00323 isdigit(basename[name_size]));
00324 suffix_size++, name_size--, suffix_exponent *= 10)
00325 {
00326 numeric_suffix += suffix_exponent*(basename[name_size] - '0');
00327 }
00328 while (name_size >= 0 && isdigit(basename[name_size]))
00329 name_size--;
00330 while (basename[name_size+1] == '0' && suffix_size > 0)
00331 {
00332 suffix_size--;
00333 name_size++;
00334 }
00335
00336 basename[name_size+1] = '\0';
00337 if (suffix_size > 0)
00338 *sym_id = numeric_suffix;
00339 else
00340 *sym_id = W2CF_INVALID_SYMID;
00341 }
00342
00343
00344 static const char *
00345 W2CF_Get_Ftn_St_Name(const ST *st, const char *original_name)
00346 {
00347 const char *extern_name;
00348
00349 #ifdef BUILD_WHIRL2F
00350 char *name_ptr;
00351
00352 if (Stab_External_Linkage(st) &&
00353 !Stab_Is_Based_At_Common_Or_Equivalence(st) &&
00354 !(ST_sym_class(st) == CLASS_VAR && ST_is_namelist(st)))
00355 {
00356
00357
00358
00359
00360
00361
00362
00363
00364
00365
00366
00367
00368 extern_name = name_ptr =
00369 strcpy(Get_Name_Buf_Slot(strlen(original_name)+2), original_name);
00370
00371
00372 while (name_ptr[1] != '\0')
00373 name_ptr++;
00374
00375
00376 if (extern_name[0] != '_' && name_ptr[0] == '_')
00377 {
00378 if (name_ptr[-1] == '_')
00379 name_ptr[-1] = '\0';
00380 else
00381 name_ptr[0] = '\0';
00382 }
00383 else if (!WN2F_F90_pu)
00384 {
00385 name_ptr[1] = '$';
00386 name_ptr[2] = '\0';
00387 }
00388 }
00389 else
00390 #endif
00391 extern_name = original_name;
00392
00393 return extern_name;
00394
00395 }
00396
00397
00398
00399
00400
00401
00402 static BOOL
00403 W2CF_Avoid_Suffix(W2CF_SYMBOL *symbol )
00404 {
00405
00406
00407
00408
00409 BOOL avoid = FALSE;
00410
00411 #ifdef BUILD_WHIRL2F
00412 if (W2CF_SYMBOL_kind(symbol) == SYMKIND_ST)
00413 {
00414 const ST * st = W2CF_SYMBOL_st(symbol);
00415
00416 if (Stab_Is_Common_Block(st))
00417 avoid = TRUE;
00418 }
00419 #endif
00420
00421
00422 if (W2CF_SYMBOL_kind(symbol) == SYMKIND_TY) {
00423 avoid = TRUE;
00424 }
00425
00426 return avoid;
00427 }
00428
00429 static BOOL
00430 W2CF_Identical_Symkinds(W2CF_SYMBOL *sym1, W2CF_SYMBOL *sym2)
00431 {
00432 BOOL identical = W2CF_SYMBOL_kind(sym1) == W2CF_SYMBOL_kind(sym2);
00433
00434 if (identical)
00435 {
00436 switch (W2CF_SYMBOL_kind(sym1))
00437 {
00438 case SYMKIND_UNIQUE:
00439 identical = FALSE;
00440 break;
00441 case SYMKIND_FLD:
00442 identical = W2CF_SYMBOL_fld(sym1) == W2CF_SYMBOL_fld(sym2);
00443 break;
00444 case SYMKIND_FLD_POINTEE:
00445 identical = W2CF_SYMBOL_fld_ptr(sym1) == W2CF_SYMBOL_fld_ptr(sym2);
00446 break;
00447 case SYMKIND_TY:
00448 identical = W2CF_SYMBOL_ty(sym1) == W2CF_SYMBOL_ty(sym2);
00449 break;
00450 case SYMKIND_ST:
00451 identical = W2CF_SYMBOL_st(sym1) == W2CF_SYMBOL_st(sym2);
00452 break;
00453 case SYMKIND_ST_POINTEE:
00454 identical = W2CF_SYMBOL_st_ptr(sym1) == W2CF_SYMBOL_st_ptr(sym2);
00455 break;
00456 case SYMKIND_TEMPVAR:
00457 identical =
00458 W2CF_SYMBOL_tempvar_id(sym1) == W2CF_SYMBOL_tempvar_id(sym2);
00459 break;
00460 case SYMKIND_PREG:
00461 identical =
00462 (W2CF_SYMBOL_preg_num(sym1) == W2CF_SYMBOL_preg_num(sym2) &&
00463 W2CF_SYMBOL_preg_ty(sym1) == W2CF_SYMBOL_preg_ty(sym2));
00464 break;
00465 default:
00466 Is_True(FALSE, ("Illegal W2CF_SYMKIND"));
00467 break;
00468 }
00469 }
00470
00471 return identical;
00472
00473 }
00474
00475
00476 static void
00477 W2CF_Insert_Symbol(W2CF_SYMHDR *symhdr,
00478 W2CF_SYMBOL *symbol)
00479 {
00480
00481
00482
00483
00484
00485 W2CF_SYMBOL *before_sym, *after_sym;
00486 INT32 symid;
00487 INT32 next_symid;
00488
00489
00490
00491
00492 symid = W2CF_SYMBOL_symid(symbol);
00493 if (symid < W2CF_SYMHDR_next_symid(symhdr))
00494 symid = W2CF_SYMHDR_next_symid(symhdr);
00495
00496
00497
00498 for ((before_sym = W2CF_SYMHDR_symbol(symhdr), after_sym = NULL);
00499 before_sym != NULL && W2CF_SYMBOL_symid(before_sym) < symid;
00500 (after_sym = before_sym, before_sym = W2CF_SYMBOL_next(after_sym)));
00501
00502 if (before_sym != NULL && W2CF_SYMBOL_symid(before_sym) == symid)
00503 {
00504
00505
00506
00507
00508
00509
00510 symid = W2CF_SYMHDR_next_symid(symhdr);
00511 for ((before_sym = W2CF_SYMHDR_symbol(symhdr), after_sym = NULL);
00512 before_sym != NULL && W2CF_SYMBOL_symid(before_sym) < symid;
00513 (after_sym = before_sym, before_sym = W2CF_SYMBOL_next(after_sym)));
00514 }
00515
00516
00517
00518 W2CF_SYMBOL_symid(symbol) = symid;
00519 W2CF_SYMBOL_next(symbol) = before_sym;
00520 if (after_sym == NULL)
00521 W2CF_SYMHDR_symbol(symhdr) = symbol;
00522 else
00523 W2CF_SYMBOL_next(after_sym) = symbol;
00524
00525
00526
00527
00528
00529 if (symid == W2CF_SYMHDR_next_symid(symhdr))
00530 {
00531 next_symid = symid + 1;
00532 for (before_sym = W2CF_SYMHDR_symbol(symhdr);
00533 before_sym != NULL && W2CF_SYMBOL_symid(before_sym) <= next_symid;
00534 before_sym = W2CF_SYMBOL_next(before_sym))
00535 {
00536 if (W2CF_SYMBOL_symid(before_sym) == next_symid)
00537 next_symid++;
00538 }
00539 W2CF_SYMHDR_next_symid(symhdr) = next_symid;
00540 }
00541
00542 }
00543
00544
00545 static W2CF_SYMHDR *
00546 W2CF_Search_Symhdr(W2CF_SYMTAB *symtab, const char *basename)
00547 {
00548
00549
00550
00551
00552 const UINT64 hashval = Get_Hash_Value_For_Name(basename);
00553 const UINT32 hashidx = Name_Hash_Idx(hashval, W2CF_SYMTAB_size(symtab));
00554 W2CF_SYMHDR *symhdr;
00555
00556
00557 for (symhdr = W2CF_SYMTAB_hash_tbl(symtab)[hashidx];
00558 (symhdr != NULL &&
00559 (hashval != W2CF_SYMHDR_hashval(symhdr) ||
00560 strcmp(basename, W2CF_SYMHDR_basename_string(symtab, symhdr)) != 0));
00561 symhdr = W2CF_SYMHDR_next(symhdr));
00562
00563 return symhdr;
00564
00565 }
00566
00567
00568 static W2CF_SYMBOL *
00569 W2CF_Search_Symbol(W2CF_SYMHDR *symhdr, W2CF_SYMBOL *match_symbol)
00570 {
00571
00572
00573
00574 W2CF_SYMBOL *symbol;
00575
00576
00577 for (symbol = W2CF_SYMHDR_symbol(symhdr);
00578 symbol != NULL && !W2CF_Identical_Symkinds(symbol, match_symbol);
00579 symbol = W2CF_SYMBOL_next(symbol));
00580
00581 return symbol;
00582 }
00583
00584
00585 static W2CF_SYMHDR *
00586 W2CF_Create_Symhdr(W2CF_SYMTAB *symtab, const char *basename)
00587 {
00588
00589
00590
00591
00592 const UINT64 hashval = Get_Hash_Value_For_Name(basename);
00593 const UINT32 hashidx = Name_Hash_Idx(hashval, W2CF_SYMTAB_size(symtab));
00594 W2CF_SYMHDR *symhdr = TYPE_ALLOC_N(W2CF_SYMHDR, 1);
00595 W2CF_SYMTAB *symtab2;
00596 W2CF_SYMHDR *symhdr2;
00597 W2CF_SYMBOL *symbol2;
00598
00599
00600 W2CF_SYMHDR_next(symhdr) = W2CF_SYMTAB_hash_tbl(symtab)[hashidx];
00601 W2CF_SYMHDR_next_symid(symhdr) = W2CF_FIRST_VALID_SYMID;
00602 W2CF_SYMHDR_symbol(symhdr) = 0;
00603 W2CF_SYMHDR_symbol(symhdr) = 0;
00604 W2CF_SYMHDR_hashval(symhdr) = hashval;
00605 W2CF_SYMHDR_basename(symhdr) =
00606 W2CF_Symtab_Alloc_Chars(symtab, strlen(basename)+1);
00607
00608 (void)strcpy(W2CF_SYMHDR_basename_string(symtab, symhdr), basename);
00609
00610
00611 W2CF_SYMTAB_hash_tbl(symtab)[hashidx] = symhdr;
00612
00613
00614
00615
00616 symtab2 = W2CF_SYMTAB_up(symtab);
00617 while (symtab2 != NULL)
00618 {
00619 symhdr2 = W2CF_Search_Symhdr(symtab2, basename);
00620 if (symhdr2 != NULL)
00621 {
00622 symbol2 = W2CF_SYMHDR_symbol(symhdr2);
00623 if (symbol2 != NULL)
00624 {
00625
00626 while (W2CF_SYMBOL_next(symbol2) != NULL)
00627 symbol2 = W2CF_SYMBOL_next(symbol2);
00628
00629
00630
00631
00632 if (W2CF_SYMBOL_symid(symbol2) >= W2CF_SYMHDR_next_symid(symhdr))
00633 W2CF_SYMHDR_next_symid(symhdr) = W2CF_SYMBOL_symid(symbol2)+1;
00634 }
00635 }
00636 symtab2 = W2CF_SYMTAB_up(symtab2);
00637 }
00638
00639 return symhdr;
00640 }
00641
00642
00643 static W2CF_SYMBOL *
00644 W2CF_Create_Symbol(W2CF_SYMTAB *symtab,
00645 W2CF_SYMHDR *symhdr,
00646 W2CF_SYMBOL *match_symbol)
00647 {
00648
00649
00650
00651
00652
00653 W2CF_SYMBOL *symbol = TYPE_ALLOC_N(W2CF_SYMBOL, 1);
00654 char *symname;
00655
00656 W2CF_SYMBOL_kind(symbol) = W2CF_SYMBOL_kind(match_symbol);
00657 W2CF_SYMBOL_attr(symbol) = W2CF_SYMBOL_attr(match_symbol);
00658 W2CF_SYMBOL_symid(symbol) = W2CF_SYMBOL_symid(match_symbol);
00659
00660
00661
00662
00663 W2CF_Insert_Symbol(symhdr, symbol);
00664
00665
00666
00667
00668
00669 if (W2CF_SYMBOL_symid(symbol) == W2CF_NOSUFFIX_SYMID)
00670 {
00671 W2CF_SYMBOL_name(symbol) = W2CF_SYMHDR_basename(symhdr);
00672 }
00673 else
00674 {
00675 symname = W2CF_SYMHDR_basename_string(symtab, symhdr);
00676
00677 if (!W2CF_Avoid_Suffix(symbol))
00678 {
00679 symname = Get_Name_Buf_Slot(strlen(symname) + 32);
00680 sprintf(symname, "%s%d",
00681 W2CF_SYMHDR_basename_string(symtab, symhdr),
00682 W2CF_SYMBOL_symid(symbol));
00683 }
00684 W2CF_SYMBOL_name(symbol) = W2CF_Symtab_Alloc_Chars(symtab, strlen(symname)+1);
00685 (void)strcpy(W2CF_SYMBOL_name_string(symtab, symbol), symname);
00686 }
00687
00688
00689
00690 return symbol;
00691
00692 }
00693
00694
00695 static void
00696 W2CF_Get_Symbol(W2CF_SYMTAB **found_symtab,
00697 W2CF_SYMHDR **found_symhdr,
00698 W2CF_SYMBOL **found_symbol,
00699 W2CF_SYMBOL *match_symbol,
00700 const char *basename)
00701 {
00702
00703
00704
00705
00706
00707
00708 W2CF_SYMTAB *symtab;
00709 W2CF_SYMHDR *symhdr = NULL;
00710 W2CF_SYMBOL *symbol = NULL;
00711 W2CF_SYMHDR *top_symhdr;
00712
00713
00714
00715
00716 symtab = W2CF_SYMTAB_STACK_top(Symtab_Stack);
00717 top_symhdr = W2CF_Search_Symhdr(symtab, basename);
00718 if (top_symhdr != NULL)
00719 symbol = W2CF_Search_Symbol(top_symhdr, match_symbol);
00720
00721
00722
00723
00724 symtab = W2CF_SYMTAB_up(symtab);
00725 while (symtab != NULL && symbol == NULL)
00726 {
00727 symhdr = W2CF_Search_Symhdr(symtab, basename);
00728 if (symhdr != NULL)
00729 symbol = W2CF_Search_Symbol(symhdr, match_symbol);
00730 symtab = W2CF_SYMTAB_up(symtab);
00731 }
00732
00733
00734
00735 if (symtab != NULL)
00736 symtab = W2CF_SYMTAB_down(symtab);
00737 else if (symbol != NULL)
00738 symtab = W2CF_SYMTAB_STACK_bot(Symtab_Stack);
00739 else
00740 symtab = W2CF_SYMTAB_STACK_top(Symtab_Stack);
00741
00742
00743
00744
00745 if (symbol == NULL)
00746 {
00747 if (top_symhdr == NULL)
00748 symhdr = W2CF_Create_Symhdr(symtab, basename);
00749 else
00750 symhdr = top_symhdr;
00751 symbol = W2CF_Create_Symbol(symtab, symhdr, match_symbol);
00752 }
00753 *found_symtab = symtab;
00754 *found_symhdr = symhdr;
00755 *found_symbol = symbol;
00756 }
00757
00758
00759
00760
00761
00762
00763 void
00764 W2CF_Symtab_Push(void)
00765 {
00766
00767 W2CF_SYMTAB *symtab;
00768 INT32 hash_idx;
00769
00770 if (Symtab_Free_List == NULL)
00771 {
00772 symtab = TYPE_ALLOC_N(W2CF_SYMTAB, 1);
00773 W2CF_SYMTAB_strbuf_size(symtab) = 0;
00774 W2CF_SYMTAB_strbuf_next(symtab) = 0;
00775 W2CF_SYMTAB_strbuf_chars(symtab) = NULL;
00776 W2CF_SYMTAB_hash_tbl(symtab) =
00777 TYPE_ALLOC_N(W2CF_SYMHDR*, INITIAL_SYMTAB_SIZE);
00778 W2CF_SYMTAB_size(symtab) = INITIAL_SYMTAB_SIZE;
00779 for (hash_idx = 0; hash_idx < INITIAL_SYMTAB_SIZE; hash_idx++)
00780 W2CF_SYMTAB_hash_tbl(symtab)[hash_idx] = NULL;
00781 }
00782 else
00783 {
00784
00785 symtab = Symtab_Free_List;
00786 W2CF_SYMTAB_strbuf_next(symtab) = 0;
00787 Symtab_Free_List = W2CF_SYMTAB_down(Symtab_Free_List);
00788 }
00789 W2CF_SYMTAB_unique_label(symtab) = MAX_LABEL_NUMBER;
00790 W2CF_SYMTAB_down(symtab) = NULL;
00791 W2CF_SYMTAB_up(symtab) = W2CF_SYMTAB_STACK_top(Symtab_Stack);
00792 if (W2CF_SYMTAB_STACK_top(Symtab_Stack) != NULL)
00793 W2CF_SYMTAB_down(W2CF_SYMTAB_STACK_top(Symtab_Stack)) = symtab;
00794
00795 W2CF_SYMTAB_STACK_top(Symtab_Stack) = symtab;
00796 if (W2CF_SYMTAB_STACK_bot(Symtab_Stack) == NULL)
00797 W2CF_SYMTAB_STACK_bot(Symtab_Stack) = symtab;
00798
00799 }
00800
00801
00802
00803 void
00804 W2CF_Symtab_Pop(void)
00805 {
00806
00807
00808
00809
00810
00811
00812
00813 W2CF_SYMTAB *symtab = W2CF_SYMTAB_STACK_top(Symtab_Stack);
00814 W2CF_SYMHDR *symhdr;
00815 W2CF_SYMBOL *symbol;
00816 INT32 tbl_idx;
00817
00818
00819
00820
00821 W2CF_SYMTAB_STACK_top(Symtab_Stack) = W2CF_SYMTAB_up(symtab);
00822
00823
00824
00825
00826 if (W2CF_SYMTAB_STACK_top(Symtab_Stack) != NULL)
00827 W2CF_SYMTAB_down(W2CF_SYMTAB_STACK_top(Symtab_Stack)) = NULL;
00828 else
00829 W2CF_SYMTAB_STACK_bot(Symtab_Stack) = NULL;
00830
00831
00832
00833 W2CF_SYMTAB_next(symtab) = Symtab_Free_List;
00834 Symtab_Free_List = symtab;
00835
00836
00837
00838 for (tbl_idx = 0; tbl_idx < W2CF_SYMTAB_size(symtab); tbl_idx++)
00839 {
00840 symhdr = W2CF_SYMTAB_hash_tbl(symtab)[tbl_idx];
00841 while (W2CF_SYMTAB_hash_tbl(symtab)[tbl_idx] != NULL)
00842 {
00843 symhdr = W2CF_SYMTAB_hash_tbl(symtab)[tbl_idx];
00844 W2CF_SYMTAB_hash_tbl(symtab)[tbl_idx] = W2CF_SYMHDR_next(symhdr);
00845 W2CF_SYMHDR_next(symhdr) = Symhdr_Free_List;
00846 Symhdr_Free_List = symhdr;
00847 while (W2CF_SYMHDR_symbol(symhdr) != NULL)
00848 {
00849 symbol = W2CF_SYMHDR_symbol(symhdr);
00850 W2CF_SYMHDR_symbol(symhdr) = W2CF_SYMBOL_next(symbol);
00851 W2CF_SYMBOL_next(symbol) = Symbol_Free_List;
00852 Symbol_Free_List = symbol;
00853 }
00854 }
00855 }
00856 }
00857
00858
00859 const char *
00860 W2CF_Symtab_Nameof_St(const ST *st)
00861 {
00862 const char *valid_name = NULL ;
00863 char *symname;
00864 INT32 symid;
00865 W2CF_SYMTAB *symtab;
00866 W2CF_SYMHDR *symhdr;
00867 W2CF_SYMBOL *symbol;
00868 W2CF_SYMBOL match_symbol;
00869
00870
00871
00872
00873
00874
00875 if (ST_sym_class(st) != CLASS_CONST)
00876 valid_name = W2FC_Valid_Name(ST_name(st),WN2F_F90_pu && !ST_is_temp_var(st));
00877
00878 if (valid_name == NULL || valid_name[0] == '\0')
00879 {
00880 valid_name = W2CF_Anonymous_St;
00881 }
00882 else
00883 {
00884 valid_name = W2CF_Get_Ftn_St_Name(st, valid_name);
00885 }
00886
00887
00888 if (ST_sym_class(st) == CLASS_FUNC) {
00889 return valid_name;
00890 }
00891
00892 symname = Get_Name_Buf_Slot(strlen(valid_name) + 32);
00893 W2CF_Get_Basename(valid_name, symname, &symid);
00894
00895
00896
00897 W2CF_SYMBOL_symid(&match_symbol) = symid;
00898 W2CF_SYMBOL_kind(&match_symbol) = SYMKIND_ST;
00899 W2CF_SYMBOL_st(&match_symbol) = st;
00900 W2CF_Get_Symbol(&symtab, &symhdr, &symbol, &match_symbol, symname);
00901
00902
00903
00904 char * name = W2CF_SYMBOL_name_string(symtab, symbol);
00905 if (!ST_is_temp_var(st) && strcmp(name, ST_name(st)) != 0) {
00906
00907
00908
00909
00910 static char buf[256];
00911 BZERO(buf, sizeof(buf));
00912 strcpy(buf, "_w2c_");
00913 strncat(buf, W2CF_SYMBOL_name_string(symtab, symbol), 248);
00914 return buf;
00915 }
00916
00917
00918 return name;
00919
00920 }
00921
00922
00923 const char *
00924 W2CF_Symtab_Nameof_St_Pointee(const ST *st)
00925 {
00926 const char *pointee_name;
00927 char *symname;
00928 INT32 symid;
00929 W2CF_SYMTAB *symtab;
00930 W2CF_SYMHDR *symhdr;
00931 W2CF_SYMBOL *symbol;
00932 W2CF_SYMBOL match_symbol;
00933
00934
00935
00936
00937
00938 pointee_name = Concat2_Strings("deref_", W2CF_Symtab_Nameof_St(st));
00939 symname = Get_Name_Buf_Slot(strlen(pointee_name) + 32);
00940 W2CF_Get_Basename(pointee_name, symname, &symid);
00941
00942
00943
00944 W2CF_SYMBOL_symid(&match_symbol) = symid;
00945 W2CF_SYMBOL_kind(&match_symbol) = SYMKIND_ST_POINTEE;
00946 W2CF_SYMBOL_st_ptr(&match_symbol) = st;
00947 W2CF_Get_Symbol(&symtab, &symhdr, &symbol, &match_symbol, symname);
00948
00949
00950 return W2CF_SYMBOL_name_string(symtab, symbol);
00951
00952 }
00953
00954
00955 const char *
00956 W2CF_Symtab_Nameof_Ty(TY_IDX ty)
00957 {
00958 const char *valid_name;
00959 char *symname;
00960 INT32 symid;
00961 W2CF_SYMTAB *symtab;
00962 W2CF_SYMHDR *symhdr;
00963 W2CF_SYMBOL *symbol;
00964 W2CF_SYMBOL match_symbol;
00965
00966
00967
00968
00969
00970 valid_name = W2FC_Valid_Name(TY_name(ty),FALSE);
00971 if (valid_name == NULL || valid_name[0] == '\0')
00972 {
00973 valid_name = W2CF_Anonymous_Ty;
00974 }
00975 symname = Get_Name_Buf_Slot(strlen(valid_name) + 32);
00976 W2CF_Get_Basename(valid_name, symname, &symid);
00977
00978
00979
00980 W2CF_SYMBOL_symid(&match_symbol) = symid;
00981 W2CF_SYMBOL_kind(&match_symbol) = SYMKIND_TY;
00982 W2CF_SYMBOL_ty(&match_symbol) = ty;
00983 W2CF_Get_Symbol(&symtab, &symhdr, &symbol, &match_symbol, symname);
00984
00985
00986
00987 if (TY_kind(ty) == KIND_STRUCT) {
00988 return valid_name;
00989 }
00990
00991
00992 return W2CF_SYMBOL_name_string(symtab, symbol);
00993
00994 }
00995
00996
00997 const char *
00998 W2CF_Symtab_Nameof_Fld(FLD_HANDLE fld)
00999 {
01000 const char *valid_name;
01001 char *symname;
01002 INT32 symid;
01003 W2CF_SYMTAB *symtab;
01004 W2CF_SYMHDR *symhdr;
01005 W2CF_SYMBOL *symbol;
01006 W2CF_SYMBOL match_symbol;
01007
01008
01009
01010
01011
01012 valid_name = W2FC_Valid_Name(FLD_name(fld),FALSE);
01013 if (valid_name == NULL || valid_name[0] == '\0')
01014 {
01015 valid_name = W2CF_Anonymous_Fld;
01016 }
01017 symname = Get_Name_Buf_Slot(strlen(valid_name) + 32);
01018 W2CF_Get_Basename(valid_name, symname, &symid);
01019
01020 return valid_name;
01021
01022
01023
01024
01025
01026 W2CF_SYMBOL_symid(&match_symbol) = symid;
01027 W2CF_SYMBOL_kind(&match_symbol) = SYMKIND_FLD;
01028 W2CF_SYMBOL_fld(&match_symbol) = fld.Idx ();
01029 W2CF_Get_Symbol(&symtab, &symhdr, &symbol, &match_symbol, symname);
01030
01031
01032 return W2CF_SYMBOL_name_string(symtab, symbol);
01033
01034 }
01035
01036
01037 const char *
01038 W2CF_Symtab_Nameof_Fld_Pointee(FLD_HANDLE fld)
01039 {
01040 const char *pointee_name;
01041 char *symname;
01042 INT32 symid;
01043 W2CF_SYMTAB *symtab;
01044 W2CF_SYMHDR *symhdr;
01045 W2CF_SYMBOL *symbol;
01046 W2CF_SYMBOL match_symbol;
01047
01048
01049
01050
01051
01052 pointee_name = Concat2_Strings("deref_", W2CF_Symtab_Nameof_Fld(fld));
01053 symname = Get_Name_Buf_Slot(strlen(pointee_name) + 32);
01054 W2CF_Get_Basename(pointee_name, symname, &symid);
01055
01056
01057
01058 W2CF_SYMBOL_symid(&match_symbol) = symid;
01059 W2CF_SYMBOL_kind(&match_symbol) = SYMKIND_FLD_POINTEE;
01060 W2CF_SYMBOL_fld_ptr(&match_symbol) = fld.Idx ();
01061 W2CF_Get_Symbol(&symtab, &symhdr, &symbol, &match_symbol, symname);
01062
01063
01064 return W2CF_SYMBOL_name_string(symtab, symbol);
01065
01066 }
01067
01068
01069 const char *
01070 W2CF_Symtab_Nameof_Tempvar(INT32 tempvar_id)
01071 {
01072 char *symname;
01073 char *tmpvarname;
01074 INT32 symid;
01075 W2CF_SYMTAB *symtab;
01076 W2CF_SYMHDR *symhdr;
01077 W2CF_SYMBOL *symbol;
01078 W2CF_SYMBOL match_symbol;
01079
01080
01081
01082
01083
01084 tmpvarname = Get_Name_Buf_Slot(strlen(W2CF_Anonymous_Tempvar) + 32);
01085 sprintf(tmpvarname, "%s%d", W2CF_Anonymous_Tempvar, tempvar_id);
01086 symname = Get_Name_Buf_Slot(strlen(tmpvarname) + 32);
01087 W2CF_Get_Basename(tmpvarname, symname, &symid);
01088
01089
01090
01091 W2CF_SYMBOL_symid(&match_symbol) = symid;
01092 W2CF_SYMBOL_kind(&match_symbol) = SYMKIND_TEMPVAR;
01093 W2CF_SYMBOL_tempvar_id(&match_symbol) = tempvar_id;
01094 W2CF_Get_Symbol(&symtab, &symhdr, &symbol, &match_symbol, symname);
01095
01096
01097 return W2CF_SYMBOL_name_string(symtab, symbol);
01098
01099 }
01100
01101
01102 const char *
01103 W2CF_Symtab_Nameof_Preg(const TY_IDX preg_ty, PREG_NUM preg_num)
01104 {
01105 const char *valid_name;
01106 char *symname;
01107 INT32 symid;
01108 W2CF_SYMTAB *symtab;
01109 W2CF_SYMHDR *symhdr;
01110 W2CF_SYMBOL *symbol;
01111 W2CF_SYMBOL match_symbol;
01112
01113
01114
01115
01116
01117 valid_name = (preg_num > Last_Dedicated_Preg_Offset)
01118 ? Preg_Name(preg_num) : NULL;
01119 char buffer[64];
01120 if (valid_name == NULL && preg_ty == 0) {
01121 sprintf(buffer, "reg%d", preg_num);
01122 valid_name = buffer;
01123 }
01124 valid_name = W2FC_Valid_Name(valid_name,FALSE);
01125 if (valid_name == NULL || valid_name[0] == '\0')
01126 {
01127 symname = Get_Name_Buf_Slot(strlen(W2CF_Anonymous_Preg) + 32);
01128 sprintf(symname, "%s%d", W2CF_Anonymous_Preg, preg_num);
01129 valid_name = symname;
01130 }
01131
01132 symname = Get_Name_Buf_Slot(strlen(valid_name) + 32);
01133 W2CF_Get_Basename(valid_name, symname, &symid);
01134
01135
01136
01137 W2CF_SYMBOL_symid(&match_symbol) = symid;
01138 W2CF_SYMBOL_kind(&match_symbol) = SYMKIND_PREG;
01139 W2CF_SYMBOL_preg_ty(&match_symbol) = preg_ty;
01140 W2CF_SYMBOL_preg_num(&match_symbol) = preg_num;
01141 W2CF_Get_Symbol(&symtab, &symhdr, &symbol, &match_symbol, symname);
01142
01143 static char buf[256];
01144 BZERO(buf, sizeof(buf));
01145 strcpy(buf, "_w2c_");
01146 strncat(buf, W2CF_SYMBOL_name_string(symtab, symbol), 248);
01147
01148
01149
01150 return buf;
01151
01152 }
01153
01154
01155 const char *
01156 W2CF_Symtab_Unique_Name(const char *name)
01157 {
01158 const char *valid_name;
01159 char *unique_name;
01160 INT32 symid;
01161 W2CF_SYMTAB *symtab;
01162 W2CF_SYMHDR *symhdr;
01163 W2CF_SYMBOL *symbol;
01164 W2CF_SYMBOL match_symbol;
01165
01166
01167
01168
01169
01170 valid_name = W2FC_Valid_Name(name,WN2F_F90_pu);
01171 if (valid_name == NULL || valid_name[0] == '\0')
01172 valid_name = W2CF_Anonymous_St;
01173 unique_name = Get_Name_Buf_Slot(strlen(valid_name) + 32);
01174 W2CF_Get_Basename(valid_name, unique_name, &symid);
01175
01176
01177
01178 W2CF_SYMBOL_symid(&match_symbol) = symid;
01179 W2CF_SYMBOL_kind(&match_symbol) = SYMKIND_UNIQUE;
01180 W2CF_Get_Symbol(&symtab, &symhdr, &symbol, &match_symbol, unique_name);
01181
01182
01183 return W2CF_SYMBOL_name_string(symtab, symbol);
01184
01185 }
01186
01187
01188 UINT32
01189 W2CF_Symtab_Unique_Label(void)
01190 {
01191 return W2CF_SYMTAB_unique_label(W2CF_SYMTAB_STACK_top(Symtab_Stack))--;
01192 }
01193
01194
01195 void
01196 W2CF_Symtab_Free(void)
01197 {
01198
01199
01200
01201 W2CF_SYMTAB *symtab;
01202 W2CF_SYMHDR *symhdr;
01203 W2CF_SYMBOL *symbol;
01204
01205 while (Symtab_Free_List != NULL)
01206 {
01207 symtab = Symtab_Free_List;
01208 Symtab_Free_List = W2CF_SYMTAB_next(symtab);
01209 FREE(W2CF_SYMTAB_hash_tbl(symtab));
01210 if (W2CF_SYMTAB_strbuf_chars(symtab) != NULL)
01211 FREE(W2CF_SYMTAB_strbuf_chars(symtab));
01212 FREE(symtab);
01213 }
01214
01215 while (Symhdr_Free_List != NULL)
01216 {
01217 symhdr = Symhdr_Free_List;
01218 Symhdr_Free_List = W2CF_SYMHDR_next(symhdr);
01219 FREE(symhdr);
01220 }
01221
01222 while (Symbol_Free_List != NULL)
01223 {
01224 symbol = Symbol_Free_List;
01225 Symbol_Free_List = W2CF_SYMBOL_next(symbol);
01226 FREE(symbol);
01227 }
01228 }
01229
01230
01231 void
01232 W2CF_Symtab_Terminate(void)
01233 {
01234
01235
01236
01237
01238 while (W2CF_SYMTAB_STACK_top(Symtab_Stack) != NULL)
01239 W2CF_Symtab_Pop();
01240
01241 W2CF_Symtab_Free();
01242 }
01243
01244
01245
01246
01247
01248 static void
01249 W2CF_Dump_Symhdr(W2CF_SYMHDR *symhdr,W2CF_SYMTAB *symtab)
01250 {
01251
01252 if (symhdr != 0)
01253 {
01254 printf ("symhdr: 0x%p, hashval=0x%llx, next_symid=%d, next_symhdr=0x%p \n",
01255 symhdr,
01256 W2CF_SYMHDR_hashval(symhdr),
01257 W2CF_SYMHDR_next_symid(symhdr),
01258 W2CF_SYMHDR_next(symhdr));
01259
01260 if (symtab != NULL)
01261 printf (" basename: %s \n",W2CF_SYMHDR_basename_string(symtab, symhdr));
01262
01263 W2CF_SYMBOL *sym = W2CF_SYMHDR_symbol(symhdr);
01264 while (sym != NULL)
01265 {
01266 W2CF_Dump_Symbol(sym,NULL);
01267 sym = W2CF_SYMBOL_next(sym);
01268 }
01269 }
01270 }
01271
01272 static void
01273 W2CF_Dump_Symtab(W2CF_SYMTAB *symtab)
01274 {
01275 if (symtab != 0)
01276 {
01277 printf ("symtab: 0x%p, label=%d, num=%d, hash_tbl=0x%p, up=0x%p, down=0x%p next=0x%p\n",
01278 symtab,
01279 W2CF_SYMTAB_unique_label(symtab),
01280 W2CF_SYMTAB_size(symtab),
01281 W2CF_SYMTAB_hash_tbl(symtab),
01282 W2CF_SYMTAB_up(symtab),
01283 W2CF_SYMTAB_down(symtab),
01284 W2CF_SYMTAB_next(symtab));
01285
01286 W2CF_STRINGBUF str = W2CF_SYMTAB_strbuf(symtab);
01287
01288 printf (" strbuf: size=%d, next=0x%x chars=0x%p\n",
01289 W2CF_STRINGBUF_size(str),
01290 W2CF_STRINGBUF_next_char(str),
01291 W2CF_STRINGBUF_chars(str));
01292
01293 char * p = W2CF_STRINGBUF_chars(str);
01294 char * e = p + W2CF_STRINGBUF_next_char(str);
01295
01296 while (p < e)
01297 {
01298 printf(" %s\n",p);
01299 p += strlen(p) + 1;
01300 }
01301 }
01302 }
01303
01304 static void
01305 W2CF_Dump_Symbol(W2CF_SYMBOL *sym,W2CF_SYMTAB *symtab)
01306 {
01307 if (sym != NULL)
01308 {
01309 const char * hdr = " ";
01310
01311 W2CF_STR_IDX nm = W2CF_SYMBOL_name(sym);
01312
01313 printf (" symbol: 0x%p, id=%d, next=0x%p, str_idx 0x%d",
01314 sym,
01315 W2CF_SYMBOL_symid(sym),
01316 W2CF_SYMBOL_next(sym),
01317 nm);
01318
01319 if (symtab != NULL)
01320 {
01321 printf (", name %s",W2CF_SYMBOL_name_string(symtab,sym));
01322 }
01323 printf(" \n");
01324
01325 switch(W2CF_SYMBOL_kind(sym))
01326 {
01327 case SYMKIND_UNIQUE:
01328 printf("%s unique",hdr);
01329 break;
01330 case SYMKIND_FLD:
01331 {
01332 FLD_HANDLE fld(W2CF_SYMBOL_fld(sym));
01333 printf("%s FLD 0x%x %s",hdr,W2CF_SYMBOL_fld(sym),FLD_name(fld));
01334 break;
01335 }
01336 case SYMKIND_TY:
01337 {
01338 TY_IDX ty = W2CF_SYMBOL_ty(sym);
01339 printf("%s TY 0x%x %s",hdr,TY_IDX_index(ty),TY_name(ty));
01340 break;
01341 }
01342 case SYMKIND_ST:
01343 {
01344 const ST * st = W2CF_SYMBOL_st(sym);
01345 printf("%s ST 0x%p %s",hdr,st,ST_name(st));
01346 break;
01347 }
01348 case SYMKIND_PREG:
01349 {
01350 TY_IDX ty = W2CF_SYMBOL_preg_ty(sym);
01351 printf("%s PREG num 0x%x ty 0x%x %s",hdr,W2CF_SYMBOL_preg_num(sym),TY_IDX_index(ty),TY_name(ty));
01352 break;
01353 }
01354 default:
01355 printf("???");
01356 break;
01357 }
01358 printf("\n") ;
01359 }
01360 }
01361