|
OpenADFortTk (basic)
|
00001 // -*-Mode: C++;-*- 00002 // $Header: /m_home/m_utkej/Argonne/cvs2svn/cvs/OpenADFortTk/src/sexp2whirl/sexp2symtab.cxx,v 1.10 2007-10-08 18:28:33 utke Exp $ 00003 00004 #include <sexp.h> 00005 00006 #include "Open64IRInterface/Open64BasicTypes.h" 00007 00008 #include "quad.h" 00009 #include "SexpTags.h" 00010 #include "sexputil.h" 00011 00012 #include "sexp2wn.h" 00013 #include "sexp2symtab.h" 00014 00015 using namespace sexp2whirl; 00016 00017 //*************************************************************************** 00018 // Helper templates 00019 //*************************************************************************** 00020 00021 template <typename T, UINT block_size> 00022 void 00023 xlate_SYMTAB(SEGMENTED_ARRAY<T, block_size>& table, 00024 sexp_t* tab_sx, const char* table_nm) 00025 { 00026 using namespace sexp; 00027 00028 // Sanity check 00029 FORTTK_ASSERT(tab_sx && is_list(tab_sx), fortTkSupport::Diagnostics::UnexpectedInput); 00030 00031 sexp_t* tag_sx = get_elem0(tab_sx); 00032 const char* tagstr = get_value(tag_sx); 00033 FORTTK_ASSERT(tag_sx && strcmp(tagstr, table_nm) == 0, 00034 fortTkSupport::Diagnostics::UnexpectedInput); 00035 00036 // Translate each entry 00037 for (sexp_t* entry = get_elem1(tab_sx); entry; entry = get_next(entry)) { 00038 // FIXME: translate in blocks 00039 T* x = xlate_SYMTAB_entry<T>(entry); 00040 table.Transfer(x, 1); 00041 } 00042 } 00043 00044 00045 template <typename T, UINT block_size> 00046 void 00047 xlate_SYMTAB(RELATED_SEGMENTED_ARRAY<T, block_size>& table, 00048 sexp_t* tab_sx, const char* table_nm) 00049 { 00050 using namespace sexp; 00051 00052 // Sanity check 00053 FORTTK_ASSERT(tab_sx && is_list(tab_sx), fortTkSupport::Diagnostics::UnexpectedInput); 00054 00055 sexp_t* tag_sx = get_elem0(tab_sx); 00056 const char* tagstr = get_value(tag_sx); 00057 FORTTK_ASSERT(tag_sx && strcmp(tagstr, table_nm) == 0, 00058 fortTkSupport::Diagnostics::UnexpectedInput); 00059 00060 // Translate each entry 00061 for (sexp_t* entry = get_elem1(tab_sx); entry; entry = get_next(entry)) { 00062 // FIXME: translate in blocks 00063 T* x = xlate_SYMTAB_entry<T>(entry); 00064 table.Transfer(x, 1); 00065 } 00066 } 00067 00068 00069 void 00070 xlate_SYMTAB(sexp_t* str_tab, const char* table_nm, 00071 UINT32 (*xlate_entry)(sexp_t*, std::string& buf), 00072 std::string& buf) 00073 { 00074 using namespace sexp; 00075 00076 // Sanity check 00077 FORTTK_ASSERT(str_tab && is_list(str_tab), fortTkSupport::Diagnostics::UnexpectedInput); 00078 00079 sexp_t* tag_sx = get_elem0(str_tab); 00080 const char* tagstr = get_value(tag_sx); 00081 FORTTK_ASSERT(tag_sx && strcmp(tagstr, table_nm) == 0, 00082 fortTkSupport::Diagnostics::UnexpectedInput); 00083 00084 // Translate each entry, building up buffer 00085 for (sexp_t* entry = get_elem1(str_tab); entry; entry = get_next(entry)) { 00086 xlate_entry(entry, buf); 00087 } 00088 } 00089 00090 00091 //*************************************************************************** 00092 // Translate symbol tables 00093 //*************************************************************************** 00094 00095 void 00096 sexp2whirl::TranslateGlobalSymbolTables(sexp_t* gbl_symtab, int flags) 00097 { 00098 using namespace sexp; 00099 00100 if (!gbl_symtab) { return; } 00101 00102 // Sanity check 00103 FORTTK_ASSERT(is_list(gbl_symtab), fortTkSupport::Diagnostics::UnexpectedInput); 00104 00105 sexp_t* tag_sx = get_elem0(gbl_symtab); 00106 const char* tagstr = get_value(tag_sx); 00107 FORTTK_ASSERT(tag_sx && strcmp(tagstr, SexpTags::GBL_SYMTAB) == 0, 00108 fortTkSupport::Diagnostics::UnexpectedInput); 00109 00110 // Initialize WHIRL symbol tables 00111 Read_Global_Data = "bogus-value-as-argument-to-Initialize_Symbol_Tables"; 00112 Initialize_Symbol_Tables(FALSE /*reserve_index_zero*/); 00113 { 00114 // FIXME: if the above is FALSE we must do the following: 00115 00116 // CANSKIP: Initialize_Strtab (0x1000); // start with 4Kbytes for strtab. 00117 00118 UINT32 dummy_idx; 00119 memset (&New_PU ((PU_IDX&) dummy_idx), '\0', sizeof(PU)); 00120 memset (&New_TY ((TY_IDX&) dummy_idx), '\0', sizeof(TY)); 00121 memset (New_FLD ().Entry(), '\0', sizeof(FLD)); 00122 memset (&New_TYLIST ((TYLIST_IDX&) dummy_idx), '\0', sizeof(TYLIST)); 00123 memset (New_ARB ().Entry(), '\0', sizeof(ARB)); 00124 memset (&New_BLK ((BLK_IDX&) dummy_idx), '\0', sizeof(BLK)); 00125 memset (&Initv_Table.New_entry ((INITV_IDX&) dummy_idx), '\0', 00126 sizeof(INITV)); 00127 // SKIP: Init_Constab (); 00128 TCON Zero; 00129 UINT32 idx; 00130 memset (&Zero, '\0', sizeof(TCON)); 00131 idx = Tcon_Table.Insert (Zero); // index 0: dummy 00132 // SKIP: init of consts 00133 // CANSKIP: Initialize_TCON_strtab (1024); // string table for TCONs 00134 00135 New_Scope(GLOBAL_SYMTAB, Malloc_Mem_Pool, TRUE /*reserve_index_zero*/); 00136 00137 // SKIP: Create_Special_Global_Symbols(); 00138 // SKIP: Create_All_Preg_Symbols(); 00139 } 00140 DST_Init(NULL, 0); // generate a trivial debugging symbol table (DST) 00141 00142 // Translate global tables 00143 sexp_t* file_info_sx = get_elem1(gbl_symtab); 00144 xlate_FILE_INFO(file_info_sx); 00145 00146 sexp_t* st_tab_sx = get_next(file_info_sx); 00147 xlate_ST_TAB(st_tab_sx, GLOBAL_SYMTAB); 00148 00149 sexp_t* st_attr_tab_sx = get_next(st_tab_sx); 00150 xlate_ST_ATTR_TAB(st_attr_tab_sx, GLOBAL_SYMTAB); 00151 00152 sexp_t* pu_tab_sx = get_next(st_attr_tab_sx); 00153 xlate_PU_TAB(pu_tab_sx); 00154 00155 sexp_t* ty_tab_sx = get_next(pu_tab_sx); 00156 xlate_TY_TAB(ty_tab_sx); 00157 00158 sexp_t* fld_tab_sx = get_next(ty_tab_sx); 00159 xlate_FLD_TAB(fld_tab_sx); 00160 00161 sexp_t* arb_tab_sx = get_next(fld_tab_sx); 00162 xlate_ARB_TAB(arb_tab_sx); 00163 00164 sexp_t* tlist_tab_sx = get_next(arb_tab_sx); 00165 xlate_TYLIST_TAB(tlist_tab_sx); 00166 00167 sexp_t* tcon_tab_sx = get_next(tlist_tab_sx); 00168 xlate_TCON_TAB(tcon_tab_sx); 00169 00170 sexp_t* tcon_str_tab_sx = get_next(tcon_tab_sx); 00171 xlate_TCON_STR_TAB(tcon_str_tab_sx); 00172 00173 sexp_t* inito_tab_sx = get_next(tcon_str_tab_sx); 00174 xlate_INITO_TAB(inito_tab_sx, GLOBAL_SYMTAB); 00175 00176 sexp_t* initv_tab_sx = get_next(inito_tab_sx); 00177 xlate_INITV_TAB(initv_tab_sx); 00178 00179 sexp_t* blk_tab_sx = get_next(initv_tab_sx); 00180 xlate_BLK_TAB(blk_tab_sx); 00181 00182 sexp_t* str_tab_sx = get_next(blk_tab_sx); 00183 xlate_STR_TAB(str_tab_sx); 00184 00185 // Special initialization of WHIRL symbol tables (disable) 00186 //Initialize_Special_Global_Symbols(); 00187 } 00188 00189 00190 void 00191 sexp2whirl::TranslateLocalSymbolTables(sexp_t* pu_symtab, SYMTAB_IDX stab_lvl, 00192 int flags) 00193 { 00194 using namespace sexp; 00195 00196 if (!pu_symtab) { return; } 00197 00198 // Sanity check 00199 FORTTK_ASSERT(is_list(pu_symtab), fortTkSupport::Diagnostics::UnexpectedInput); 00200 00201 sexp_t* tag_sx = get_elem0(pu_symtab); 00202 const char* tagstr = get_value(tag_sx); 00203 FORTTK_ASSERT(tag_sx && strcmp(tagstr, SexpTags::PU_SYMTAB) == 0, 00204 fortTkSupport::Diagnostics::UnexpectedInput); 00205 00206 // Initialize WHIRL symbol tables 00207 New_Scope(stab_lvl, Malloc_Mem_Pool, TRUE); 00208 00209 // Translate local tables 00210 sexp_t* st_tab_sx = get_elem1(pu_symtab); 00211 xlate_ST_TAB(st_tab_sx, stab_lvl); 00212 00213 sexp_t* st_attr_tab_sx = get_next(st_tab_sx); 00214 xlate_ST_ATTR_TAB(st_attr_tab_sx, stab_lvl); 00215 00216 sexp_t* label_tab_sx = get_next(st_attr_tab_sx); 00217 xlate_LABEL_TAB(label_tab_sx, stab_lvl); 00218 00219 sexp_t* preg_tab_sx = get_next(label_tab_sx); 00220 xlate_PREG_TAB(preg_tab_sx, stab_lvl); 00221 00222 sexp_t* inito_tab_sx = get_next(preg_tab_sx); 00223 xlate_INITO_TAB(inito_tab_sx, stab_lvl); 00224 } 00225 00226 00227 //*************************************************************************** 00228 // Translate individual tables 00229 //*************************************************************************** 00230 00231 void 00232 sexp2whirl::xlate_FILE_INFO(sexp_t* file_info) 00233 { 00234 using namespace sexp; 00235 00236 // Sanity check 00237 FORTTK_ASSERT(file_info && is_list(file_info), fortTkSupport::Diagnostics::UnexpectedInput); 00238 00239 sexp_t* tag_sx = get_elem0(file_info); 00240 const char* tagstr = get_value(tag_sx); 00241 FORTTK_ASSERT(tag_sx && strcmp(tagstr, SexpTags::FILE_INFO) == 0, 00242 fortTkSupport::Diagnostics::UnexpectedInput); 00243 00244 // gp_group 00245 sexp_t* gp_sx = get_elem1(file_info); 00246 mUINT8 gp = (mUINT8)get_value_ui32(gp_sx); 00247 Set_FILE_INFO_gp_group(File_info, gp); 00248 00249 // flags 00250 sexp_t* flags_sx = get_next(gp_sx); 00251 const char* flags_str = GetWhirlFlg(flags_sx); 00252 File_info.flags = (UINT32)Str_To_FILE_INFO_FLAGS(flags_str); 00253 } 00254 00255 00256 void 00257 sexp2whirl::xlate_ST_TAB(sexp_t* st_tab, SYMTAB_IDX stab_lvl) 00258 { 00259 // RELATED_SEGMENTED_ARRAY 00260 xlate_SYMTAB(*Scope_tab[stab_lvl].st_tab, st_tab, SexpTags::ST_TAB); 00261 } 00262 00263 00264 void 00265 sexp2whirl::xlate_ST_TAB(sexp_t* st_tab, const SCOPE& scope) 00266 { 00267 // RELATED_SEGMENTED_ARRAY 00268 FORTTK_DIE(fortTkSupport::Diagnostics::Unimplemented); 00269 } 00270 00271 00272 void 00273 sexp2whirl::xlate_ST_ATTR_TAB(sexp_t* st_attr_tab, SYMTAB_IDX stab_lvl) 00274 { 00275 // RELATED_SEGMENTED_ARRAY 00276 xlate_SYMTAB(*Scope_tab[stab_lvl].st_attr_tab, st_attr_tab, 00277 SexpTags::ST_ATTR_TAB); 00278 } 00279 00280 00281 void 00282 sexp2whirl::xlate_PU_TAB(sexp_t* pu_tab) 00283 { 00284 xlate_SYMTAB(Pu_Table, pu_tab, SexpTags::PU_TAB); 00285 } 00286 00287 00288 void 00289 sexp2whirl::xlate_TY_TAB(sexp_t* ty_tab) 00290 { 00291 xlate_SYMTAB(Ty_tab /*Ty_Table*/, ty_tab, SexpTags::TY_TAB); 00292 } 00293 00294 00295 void 00296 sexp2whirl::xlate_FLD_TAB(sexp_t* fld_tab) 00297 { 00298 xlate_SYMTAB(Fld_Table, fld_tab, SexpTags::FLD_TAB); 00299 } 00300 00301 00302 void 00303 sexp2whirl::xlate_ARB_TAB(sexp_t* arb_tab) 00304 { 00305 xlate_SYMTAB(Arb_Table, arb_tab, SexpTags::ARB_TAB); 00306 } 00307 00308 00309 void 00310 sexp2whirl::xlate_TYLIST_TAB(sexp_t* tylist_tab) 00311 { 00312 xlate_SYMTAB(Tylist_Table, tylist_tab, SexpTags::TYLIST_TAB); 00313 } 00314 00315 00316 void 00317 sexp2whirl::xlate_TCON_TAB(sexp_t* tcon_tab) 00318 { 00319 xlate_SYMTAB(Tcon_Table, tcon_tab, SexpTags::TCON_TAB); 00320 } 00321 00322 00323 void 00324 sexp2whirl::xlate_TCON_STR_TAB(sexp_t* str_tab) 00325 { 00326 // Details: Each char-array is preceeded by size info. If the 00327 // char-array is less than 0xff bytes, the first byte contains the 00328 // size. Otherwise the first byte is 0xff and the next 4 bytes hold 00329 // the size (UINT32). The index points to the first byte in the 00330 // string! 00331 // E.g.: -xxx0-yyy0 [where - is size info; xxx and yyy are strings] 00332 std::string buf(1, '\0'); // initialize (cf. STR_TAB<STR>::init_hash) 00333 xlate_SYMTAB(str_tab, SexpTags::TCON_STR_TAB, 00334 &xlate_TCON_STR_TAB_entry, buf); 00335 Initialize_TCON_strtab(buf.c_str(), buf.size()); 00336 } 00337 00338 00339 void 00340 sexp2whirl::xlate_INITO_TAB(sexp_t* inito_tab, SYMTAB_IDX stab_lvl) 00341 { 00342 // RELATED_SEGMENTED_ARRAY 00343 xlate_SYMTAB(*Scope_tab[stab_lvl].inito_tab, inito_tab, SexpTags::INITO_TAB); 00344 } 00345 00346 00347 void 00348 sexp2whirl::xlate_INITV_TAB(sexp_t* initv_tab) 00349 { 00350 xlate_SYMTAB(Initv_Table, initv_tab, SexpTags::INITV_TAB); 00351 } 00352 00353 00354 void 00355 sexp2whirl::xlate_BLK_TAB(sexp_t* blk_tab) 00356 { 00357 xlate_SYMTAB(Blk_Table, blk_tab, SexpTags::BLK_TAB); 00358 } 00359 00360 00361 void 00362 sexp2whirl::xlate_STR_TAB(sexp_t* str_tab) 00363 { 00364 // Details: The first entry in the buffer is NULL and thus every 00365 // string is preceeded by a NULL. The index points to the first 00366 // byte in the string! 00367 // E.g: 0xxx0yyy0zzz0 [where xxx, yyy, and zzz are strings] 00368 std::string buf(1, '\0'); // initialize (cf. STR_TAB<STR>::init_hash) 00369 xlate_SYMTAB(str_tab, SexpTags::STR_TAB, &xlate_STR_TAB_entry, buf); 00370 Initialize_Strtab(buf.c_str(), buf.size()); 00371 } 00372 00373 00374 void 00375 sexp2whirl::xlate_LABEL_TAB(sexp_t* label_tab, SYMTAB_IDX stab_lvl) 00376 { 00377 // RELATED_SEGMENTED_ARRAY 00378 xlate_SYMTAB(*Scope_tab[stab_lvl].label_tab, label_tab, SexpTags::LABEL_TAB); 00379 } 00380 00381 00382 void 00383 sexp2whirl::xlate_PREG_TAB(sexp_t* preg_tab, SYMTAB_IDX stab_lvl) 00384 { 00385 // RELATED_SEGMENTED_ARRAY 00386 xlate_SYMTAB(*Scope_tab[stab_lvl].preg_tab, preg_tab, SexpTags::PREG_TAB); 00387 } 00388 00389 00390 //*************************************************************************** 00391 // Functions to translate individual table entries 00392 //*************************************************************************** 00393 00394 ST* 00395 sexp2whirl::xlate_ST_TAB_entry(sexp_t* sx) 00396 { 00397 using namespace sexp; 00398 00399 ST* st = TYPE_MEM_POOL_ALLOC(ST, MEM_pu_pool_ptr); 00400 00401 // sym_class, storage_class, export_class 00402 sexp_t* stclass_sx = get_elem1(sx); 00403 const char* stclass_nm = get_value(stclass_sx); 00404 ST_CLASS stclass = Name_To_Class(stclass_nm); 00405 Set_ST_sym_class(*st, stclass); 00406 00407 sexp_t* stsclass_sx = get_next(stclass_sx); 00408 const char* stsclass_nm = get_value(stsclass_sx); 00409 ST_SCLASS stsclass = Name_To_Sclass(stsclass_nm); 00410 Set_ST_sclass(*st, stsclass); 00411 00412 sexp_t* stexport_sx = get_next(stsclass_sx); 00413 const char* stexport_nm = get_value(stexport_sx); 00414 ST_EXPORT stexport = Name_To_Export(stexport_nm); 00415 Set_ST_export(*st, stexport); 00416 00417 // name_idx/tcon 00418 sexp_t* name_idx_sx = get_next(stexport_sx); 00419 sexp_t* nmidx_sx = get_elem1(name_idx_sx); 00420 STR_IDX nmidx = get_value_ui32(nmidx_sx); // or TCON_IDX 00421 Set_ST_name_idx(*st, nmidx); // or TCON_IDX 00422 00423 // type/pu/blk 00424 sexp_t* typublk_sx = get_next(name_idx_sx); 00425 if (stclass == CLASS_FUNC) { 00426 PU_IDX stpu = get_value_ui32(typublk_sx); 00427 Set_ST_pu(*st, stpu); 00428 } 00429 else if (stclass == CLASS_BLOCK) { 00430 BLK_IDX stblk = get_value_ui32(typublk_sx); 00431 Set_ST_blk(*st, stblk); 00432 } 00433 else { 00434 TY_IDX sttype = GetWhirlTy(typublk_sx); 00435 Set_ST_type(*st, sttype); 00436 } 00437 00438 // base_idx, offset 00439 sexp_t* basest_sx = get_next(typublk_sx); 00440 ST_IDX stbase_idx = GetWhirlSym(basest_sx); 00441 Set_ST_base_idx(*st, stbase_idx); 00442 00443 sexp_t* oset_sx = get_next(basest_sx); 00444 UINT64 oset = get_value_ui64(oset_sx); 00445 Set_ST_ofst(*st, oset); 00446 00447 // flags/flags_ext 00448 sexp_t* flags_sx = get_next(oset_sx); 00449 const char* flags_str = GetWhirlFlg(flags_sx); 00450 st->flags = (UINT32)Str_To_ST_FLAGS(flags_str); 00451 00452 sexp_t* flagsext_sx = get_next(flags_sx); 00453 const char* flagsext_str = GetWhirlFlg(flagsext_sx); 00454 st->flags_ext = Str_To_ST_EXT_FLAGS(flagsext_str); 00455 00456 // st_idx 00457 sexp_t* st_idx_sx = get_next(flagsext_sx); 00458 ST_IDX st_idx = GetWhirlSym(st_idx_sx); 00459 Set_ST_st_idx(*st, st_idx); 00460 00461 return st; 00462 } 00463 00464 00465 ST_ATTR* 00466 sexp2whirl::xlate_ST_ATTR_TAB_entry(sexp_t* sx) 00467 { 00468 using namespace sexp; 00469 00470 ST_ATTR* st_attr = TYPE_MEM_POOL_ALLOC(ST_ATTR, MEM_pu_pool_ptr); 00471 00472 // st_idx 00473 sexp_t* st_idx_sx = get_elem1(sx); 00474 ST_IDX st_idx = GetWhirlSym(st_idx_sx); 00475 Set_ST_ATTR_st_idx(*st_attr, st_idx); 00476 00477 // kind 00478 sexp_t* knd_sx = get_next(st_idx_sx); 00479 const char* knd_nm = get_value(knd_sx); 00480 ST_ATTR_KIND knd = Name_To_ST_ATTR_Kind(knd_nm); 00481 st_attr->kind = knd; 00482 00483 // reg_id/section_name 00484 sexp_t* reg_id_sx = get_next(knd_sx); 00485 PREG_NUM reg_id = get_value_ui32(reg_id_sx); 00486 Set_ST_ATTR_reg_id(*st_attr, reg_id); 00487 00488 return st_attr; 00489 } 00490 00491 00492 PU* 00493 sexp2whirl::xlate_PU_TAB_entry(sexp_t* sx) 00494 { 00495 using namespace sexp; 00496 00497 PU* pu = TYPE_MEM_POOL_ALLOC(PU, MEM_pu_pool_ptr); 00498 00499 // prototype 00500 sexp_t* ty_idx_sx = get_elem1(sx); 00501 TY_IDX ty_idx = GetWhirlTy(ty_idx_sx); 00502 Set_PU_prototype(*pu, ty_idx); 00503 00504 // lexical_level 00505 sexp_t* lvl_sx = get_next(ty_idx_sx); 00506 SYMTAB_IDX lvl = (SYMTAB_IDX)get_value_ui32(lvl_sx); 00507 Set_PU_lexical_level(*pu, lvl); 00508 00509 // gp_group 00510 sexp_t* gp_sx = get_next(lvl_sx); 00511 UINT8 gp = (UINT8)get_value_ui32(gp_sx); 00512 Set_PU_gp_group(*pu, gp); 00513 00514 // src_lang 00515 sexp_t* srclang_sx = get_next(gp_sx); 00516 const char* srclang_str = GetWhirlFlg(srclang_sx); 00517 pu->src_lang = (mUINT8)Str_To_PU_SRC_LANG_FLAGS(srclang_str); 00518 00519 // target_idx 00520 sexp_t* targidx_sx = get_next(srclang_sx); 00521 TARGET_INFO_IDX targidx = get_value_ui32(targidx_sx); 00522 Set_PU_target_idx(*pu, targidx); 00523 00524 // flags 00525 sexp_t* flags_sx = get_next(targidx_sx); 00526 const char* flags_str = GetWhirlFlg(flags_sx); 00527 pu->flags = Str_To_PU_FLAGS(flags_str); 00528 00529 return pu; 00530 } 00531 00532 00533 TY* 00534 sexp2whirl::xlate_TY_TAB_entry(sexp_t* sx) 00535 { 00536 using namespace sexp; 00537 00538 TY* ty = TYPE_MEM_POOL_ALLOC(TY, MEM_pu_pool_ptr); 00539 00540 // kind 00541 sexp_t* knd_sx = get_elem1(sx); 00542 const char* knd_nm = get_value(knd_sx); 00543 TY_KIND knd = Name_To_Kind(knd_nm); 00544 Set_TY_kind(*ty, knd); 00545 00546 // name_idx 00547 sexp_t* name_idx_sx = get_next(knd_sx); 00548 sexp_t* nmidx_sx = get_elem1(name_idx_sx); 00549 STR_IDX nmidx = get_value_ui32(nmidx_sx); 00550 Set_TY_name_idx(*ty, nmidx); 00551 00552 // mtype, size 00553 sexp_t* mty_sx = get_next(name_idx_sx); 00554 const char* mty_nm = get_value(mty_sx); 00555 TYPE_ID mty = Name_To_Mtype(mty_nm); 00556 Set_TY_mtype(*ty, mty); 00557 00558 sexp_t* sz_sx = get_next(mty_sx); 00559 UINT64 sz = get_value_ui64(sz_sx); 00560 Set_TY_size(*ty, sz); 00561 00562 // flags 00563 sexp_t* flags_sx = get_next(sz_sx); 00564 const char* flags_str = GetWhirlFlg(flags_sx); 00565 UINT16 flg = (UINT16)Str_To_TY_FLAGS(flags_str); 00566 Set_TY_flags(*ty, flg); 00567 00568 // arb/fld/tylist: ARRAY, STRUCT, FUNCTION (respectively) 00569 // etype/pointed/pu_flags: ARRAY, POINTER, FUNCTION (respectively) 00570 sexp_t* olist_sx = get_next(flags_sx); 00571 if (knd == KIND_ARRAY) { 00572 sexp_t* arb_sx = get_elem0(olist_sx); 00573 ARB_IDX arb = get_value_ui32(arb_sx); 00574 ty->Set_arb(arb); 00575 00576 sexp_t* ety_sx = get_elem1(olist_sx); 00577 TY_IDX ety = GetWhirlTy(ety_sx); 00578 ty->Set_etype(ety); 00579 } 00580 else if (knd == KIND_STRUCT) { 00581 sexp_t* fld_sx = get_elem0(olist_sx); 00582 FLD_IDX fld = get_value_ui32(fld_sx); 00583 ty->Set_fld(fld); 00584 } 00585 else if (knd == KIND_POINTER) { 00586 sexp_t* basety_sx = get_elem0(olist_sx); 00587 TY_IDX basety = GetWhirlTy(basety_sx); 00588 Set_TY_pointed(*ty, basety); 00589 } 00590 else if (knd == KIND_FUNCTION) { 00591 sexp_t* tyl_sx = get_elem0(olist_sx); 00592 TYLIST_IDX tyl = get_value_ui32(tyl_sx); 00593 Set_TY_tylist(*ty, tyl); 00594 00595 sexp_t* pu_flg_sx = get_elem1(olist_sx); 00596 const char* pu_flg_str = GetWhirlFlg(pu_flg_sx); 00597 ty->u2.pu_flags = (PU_IDX)Str_To_TY_PU_FLAGS(pu_flg_str); 00598 } 00599 00600 return ty; 00601 } 00602 00603 00604 FLD* 00605 sexp2whirl::xlate_FLD_TAB_entry(sexp_t* sx) 00606 { 00607 using namespace sexp; 00608 00609 FLD* fld = TYPE_MEM_POOL_ALLOC(FLD, MEM_pu_pool_ptr); 00610 00611 // N.B. We cannot use the Set_FLD_xxx routines because they require 00612 // a FLD_HANDLE, something that is both annoying and impossible (the 00613 // FLD_HANDLE constructor assumes 'fld' is already *in* the table). 00614 00615 // name_idx 00616 sexp_t* name_idx_sx = get_elem1(sx); 00617 sexp_t* nmidx_sx = get_elem1(name_idx_sx); 00618 STR_IDX nmidx = get_value_ui32(nmidx_sx); 00619 fld->name_idx = nmidx; 00620 00621 // type 00622 sexp_t* ty_idx_sx = get_next(name_idx_sx); 00623 TY_IDX ty_idx = GetWhirlTy(ty_idx_sx); 00624 fld->type = ty_idx; 00625 00626 // ofst, bsize, bofst 00627 sexp_t* ofst_sx = get_next(ty_idx_sx); 00628 UINT64 ofst = get_value_ui64(ofst_sx); 00629 fld->ofst = ofst; 00630 00631 sexp_t* bsz_sx = get_next(ofst_sx); 00632 UINT8 bsz = (UINT8)get_value_ui32(bsz_sx); 00633 fld->bsize = bsz; 00634 00635 sexp_t* bofst_sx = get_next(bsz_sx); 00636 UINT8 bofst = (UINT8)get_value_ui32(bofst_sx); 00637 fld->bofst = bofst; 00638 00639 // flags 00640 sexp_t* flags_sx = get_next(bofst_sx); 00641 const char* flags_str = GetWhirlFlg(flags_sx); 00642 fld->flags = (UINT16)Str_To_FLD_FLAGS(flags_str); 00643 00644 // st 00645 sexp_t* st_sx = get_next(flags_sx); 00646 ST_IDX st = GetWhirlSym(st_sx); 00647 fld->st = st; 00648 00649 return fld; 00650 } 00651 00652 00653 ARB* 00654 sexp2whirl::xlate_ARB_TAB_entry(sexp_t* sx) 00655 { 00656 using namespace sexp; 00657 00658 ARB* arb = TYPE_MEM_POOL_ALLOC(ARB, MEM_pu_pool_ptr); 00659 00660 // N.B. We cannot use the Set_ARB_xxx routines because they require 00661 // a ARB_HANDLE, something that is both annoying and impossible (the 00662 // ARB_HANDLE constructor assumes 'arb' is already *in* the table). 00663 00664 // flags, dimension, co_dimension 00665 sexp_t* flags_sx = get_elem1(sx); 00666 const char* flags_str = GetWhirlFlg(flags_sx); 00667 arb->flags = (UINT16)Str_To_ARB_FLAGS(flags_str); 00668 00669 sexp_t* dim_sx = get_next(flags_sx); 00670 UINT16 dim = (UINT16)get_value_ui32(dim_sx); 00671 arb->dimension = dim; 00672 00673 sexp_t* codim_sx = get_next(dim_sx); 00674 UINT16 codim = (UINT16)get_value_ui32(codim_sx); 00675 arb->co_dimension = codim; 00676 00677 // lbnd_val/(lbnd_var, lbnd_unused) 00678 sexp_t* lbnd_sx = get_next(codim_sx); 00679 if (arb->flags & ARB_CONST_LBND) { 00680 sexp_t* val_sx = get_elem1(lbnd_sx); 00681 INT64 val = get_value_i64(val_sx); 00682 arb->Set_lbnd_val(val); 00683 } 00684 else { 00685 ST_IDX st_idx = GetWhirlSym(lbnd_sx); 00686 arb->Set_lbnd_var(st_idx); 00687 } 00688 00689 // ubnd_val/(ubnd_var, ubnd_unused) 00690 sexp_t* ubnd_sx = get_next(lbnd_sx); 00691 if (arb->flags & ARB_CONST_UBND) { 00692 sexp_t* val_sx = get_elem1(ubnd_sx); 00693 INT64 val = get_value_i64(val_sx); 00694 arb->Set_ubnd_val(val); 00695 } 00696 else { 00697 ST_IDX st_idx = GetWhirlSym(ubnd_sx); 00698 arb->Set_ubnd_var(st_idx); 00699 } 00700 00701 // stride_val/(stride_var, stride_unused) 00702 sexp_t* stride_sx = get_next(ubnd_sx); 00703 if (arb->flags & ARB_CONST_STRIDE) { 00704 sexp_t* val_sx = get_elem1(stride_sx); 00705 INT64 val = get_value_i64(val_sx); 00706 arb->Set_stride_val(val); 00707 } 00708 else { 00709 ST_IDX st_idx = GetWhirlSym(stride_sx); 00710 arb->Set_stride_var(st_idx); 00711 } 00712 00713 return arb; 00714 } 00715 00716 00717 TYLIST* 00718 sexp2whirl::xlate_TYLIST_TAB_entry(sexp_t* sx) 00719 { 00720 using namespace sexp; 00721 00722 TYLIST* tyl = TYPE_MEM_POOL_ALLOC(TYLIST, MEM_pu_pool_ptr); 00723 00724 sexp_t* ty_idx_sx = get_elem1(sx); 00725 TY_IDX ty_idx = GetWhirlTy(ty_idx_sx); 00726 Set_TYLIST_type(*tyl, ty_idx); 00727 00728 return tyl; 00729 } 00730 00731 00732 TCON* 00733 sexp2whirl::xlate_TCON_TAB_entry(sexp_t* sx) 00734 { 00735 // see osprey1.0/common/com/targ_const.h 00736 using namespace sexp; 00737 00738 TCON* tcon = TYPE_MEM_POOL_ALLOC(TCON, MEM_pu_pool_ptr); 00739 00740 FortTk::uint128_t qd; // 16 byte value, a tcon has two of these 00741 00742 // ty 00743 sexp_t* mty_sx = get_elem1(sx); 00744 const char* mty_nm = get_value(mty_sx); 00745 TYPE_ID mty = Name_To_Mtype(mty_nm); 00746 Set_TCON_ty(*tcon, mty); 00747 00748 // flags 00749 sexp_t* flags_sx = get_next(mty_sx); 00750 const char* flags_str = GetWhirlFlg(flags_sx); 00751 tcon->flags = (UINT32)Str_To_TCONFlags(flags_str); 00752 00753 // vals [quad] 00754 sexp_t* vals_sx = get_next(flags_sx); 00755 qd.hi = get_value_ui64(get_elem0(vals_sx)); 00756 qd.lo = get_value_ui64(get_elem1(vals_sx)); 00757 FortTk::assign(tcon->vals.qval, qd); 00758 00759 // cmplxval [quad] 00760 sexp_t* cmplxval_sx = get_next(vals_sx); 00761 qd.hi = get_value_ui64(get_elem0(cmplxval_sx)); 00762 qd.lo = get_value_ui64(get_elem1(cmplxval_sx)); 00763 FortTk::assign(tcon->cmplxval.qival, qd); 00764 00765 return tcon; 00766 } 00767 00768 00769 INITO* 00770 sexp2whirl::xlate_INITO_TAB_entry(sexp_t* sx) 00771 { 00772 // see osprey1.0/common/com/irbdata_defs.h 00773 using namespace sexp; 00774 00775 INITO* inito = TYPE_MEM_POOL_ALLOC(INITO, MEM_pu_pool_ptr); 00776 00777 // st_idx 00778 sexp_t* st_idx_sx = get_elem1(sx); 00779 ST_IDX st_idx = GetWhirlSym(st_idx_sx); 00780 inito->st_idx = st_idx; 00781 00782 // val 00783 sexp_t* val_sx = get_next(st_idx_sx); 00784 INITV_IDX val = get_value_ui32(val_sx); 00785 inito->val = val; 00786 00787 return inito; 00788 } 00789 00790 00791 INITV* 00792 sexp2whirl::xlate_INITV_TAB_entry(sexp_t* sx) 00793 { 00794 // see osprey1.0/common/com/irbdata_defs.h 00795 using namespace sexp; 00796 00797 INITV* initv = TYPE_MEM_POOL_ALLOC(INITV, MEM_pu_pool_ptr); 00798 00799 // next 00800 sexp_t* next_sx = get_elem1(sx); 00801 INITV_IDX next = get_value_ui32(next_sx); 00802 initv->next = next; 00803 00804 // kind 00805 sexp_t* kind_sx = get_next(next_sx); 00806 const char* kind_nm = get_value(kind_sx); 00807 INITVKIND kind = Name_To_InitvKind(kind_nm); 00808 initv->kind = kind; 00809 00810 // repeat1 00811 sexp_t* repeat1_sx = get_next(kind_sx); 00812 UINT16 repeat1 = (UINT16)get_value_ui32(repeat1_sx); 00813 initv->repeat1 = repeat1; 00814 00815 // st/lab/lab1/mtype/tc/blk/pad 00816 sexp_t* st_sx = get_next(repeat1_sx); 00817 UINT32 st = get_value_ui32(st_sx); 00818 initv->u.sto.st = st; 00819 00820 // ofst/st2/repeat2/unused 00821 sexp_t* ofst_sx = get_next(st_sx); 00822 INT32 ofst = get_value_i32(ofst_sx); 00823 initv->u.sto.ofst = ofst; 00824 00825 return initv; 00826 } 00827 00828 00829 BLK* 00830 sexp2whirl::xlate_BLK_TAB_entry(sexp_t* sx) 00831 { 00832 using namespace sexp; 00833 00834 BLK* blk = TYPE_MEM_POOL_ALLOC(BLK, MEM_pu_pool_ptr); 00835 00836 // size 00837 sexp_t* size_sx = get_elem1(sx); 00838 UINT64 size = get_value_ui64(size_sx); 00839 blk->Set_size(size); 00840 00841 // align 00842 sexp_t* align_sx = get_next(size_sx); 00843 UINT16 align = (UINT16)get_value_ui32(size_sx); 00844 blk->Set_align(align); 00845 00846 // flags 00847 sexp_t* flags_sx = get_next(align_sx); 00848 const char* flags_str = GetWhirlFlg(flags_sx); 00849 UINT16 flags = (UINT16)Str_To_BLK_FLAGS(flags_str); 00850 blk->Set_flags(flags); 00851 00852 // section_idx 00853 sexp_t* scn_idx_sx = get_next(flags_sx); 00854 UINT16 scn_idx = (UINT16)get_value_ui32(scn_idx_sx); 00855 blk->Set_section_idx(scn_idx); 00856 00857 // scninfo_idx 00858 sexp_t* scninfo_idx_sx = get_next(scn_idx_sx); 00859 UINT16 scninfo_idx = (UINT16)get_value_ui32(scninfo_idx_sx); 00860 blk->Set_scninfo_idx(scninfo_idx); 00861 00862 return blk; 00863 } 00864 00865 00866 LABEL* 00867 sexp2whirl::xlate_LABEL_TAB_entry(sexp_t* sx) 00868 { 00869 using namespace sexp; 00870 00871 LABEL* label = TYPE_MEM_POOL_ALLOC(LABEL, MEM_pu_pool_ptr); 00872 00873 // name_idx 00874 sexp_t* name_idx_sx = get_elem1(sx); 00875 sexp_t* nmidx_sx = get_elem1(name_idx_sx); 00876 STR_IDX nmidx = get_value_ui32(nmidx_sx); 00877 Set_LABEL_name_idx(*label, nmidx); 00878 00879 // kind 00880 sexp_t* knd_sx = get_next(name_idx_sx); 00881 const char* knd_nm = get_value(knd_sx); 00882 LABEL_KIND knd = Name_To_LABEL_Kind(knd_nm); 00883 Set_LABEL_KIND(*label, knd); 00884 00885 // flags 00886 sexp_t* flags_sx = get_next(knd_sx); 00887 const char* flags_str = GetWhirlFlg(flags_sx); 00888 label->flags = (UINT32)Str_To_LABEL_FLAGS(flags_str); 00889 00890 return label; 00891 } 00892 00893 00894 PREG* 00895 sexp2whirl::xlate_PREG_TAB_entry(sexp_t* sx) 00896 { 00897 using namespace sexp; 00898 00899 PREG* preg = TYPE_MEM_POOL_ALLOC(PREG, MEM_pu_pool_ptr); 00900 00901 // name_idx 00902 sexp_t* name_idx_sx = get_elem1(sx); 00903 sexp_t* nmidx_sx = get_elem1(name_idx_sx); 00904 STR_IDX nmidx = get_value_ui32(nmidx_sx); 00905 Set_PREG_name_idx(*preg, nmidx); 00906 00907 return preg; 00908 } 00909 00910 00911 UINT32 00912 sexp2whirl::xlate_TCON_STR_TAB_entry(sexp_t* sx, std::string& buf) 00913 { 00914 using namespace sexp; 00915 00916 // char_array 00917 sexp_t* str_sx = get_elem1(sx); 00918 const char* str = get_value(str_sx); 00919 00920 // Add to TCON_STR_TAB buffer (cf. xlate_TCON_STR_TAB) 00921 char prefix[6]; 00922 UINT32 len = strlen(str) + 1; // include terminator 00923 UINT32 plen = 0; 00924 if (len < 0xff) { 00925 prefix[0] = (char)len; 00926 prefix[1] = '\0'; 00927 plen = 1; 00928 } 00929 else { 00930 prefix[0] = (char)0xff; 00931 char* lenchar = (char*)&len; 00932 for (INT i = 0; i < 4; ++i) { // unaligned assignment of UINT32 00933 prefix[i+1] = lenchar[i]; 00934 } 00935 prefix[5] = '\0'; 00936 plen = 5; 00937 } 00938 00939 UINT32 idx = buf.size()-1 + plen; // idx of first byte of 'str' 00940 buf.append(prefix, plen); 00941 buf.append(str, len); // include terminator 00942 00943 // sanity check 00944 sexp_t* idxorig_sx = get_elem0(sx); 00945 UINT32 idxorig = get_value_ui32(idxorig_sx); 00946 FORTTK_ASSERT(idx == idxorig, "TCON_STR_TAB indices are inconsistent"); 00947 00948 return idx; 00949 } 00950 00951 00952 UINT32 00953 sexp2whirl::xlate_STR_TAB_entry(sexp_t* sx, std::string& buf) 00954 { 00955 using namespace sexp; 00956 00957 // string 00958 sexp_t* str_sx = get_elem1(sx); 00959 const char* str = get_value(str_sx); 00960 00961 // Add to STR_TAB buffer (cf. xlate_STR_TAB) 00962 UINT32 idx = buf.size(); // idx of first byte of 'str' 00963 buf.append(str, strlen(str) + 1); // include terminator 00964 00965 // sanity check 00966 sexp_t* idxorig_sx = get_elem0(sx); 00967 UINT32 idxorig = get_value_ui32(idxorig_sx); 00968 FORTTK_ASSERT(idx == idxorig, "STR_TAB indices are inconsistent"); 00969 00970 return idx; 00971 } 00972 00973 00974 //*************************************************************************** 00975