OpenADFortTk (basic)
src/sexp2whirl/sexp2symtab.cxx
Go to the documentation of this file.
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 
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Defines