OpenADFortTk (including Open64 and OpenAnalysis references)
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Macros
sexp2symtab.cxx
Go to the documentation of this file.
1 // -*-Mode: C++;-*-
2 // $Header: /Volumes/cvsrep/developer/OpenADFortTk/src/sexp2whirl/sexp2symtab.cxx,v 1.9 2005/02/01 22:03:18 eraxxon Exp $
3 
4 #include <sexp.h>
5 
7 
8 #include "quad.h"
9 #include "SexpTags.h"
10 #include "sexputil.h"
11 
12 #include "sexp2wn.h"
13 #include "sexp2symtab.h"
14 
15 using namespace sexp2whirl;
16 
17 //***************************************************************************
18 // Helper templates
19 //***************************************************************************
20 
21 template <typename T, UINT block_size>
22 void
24  sexp_t* tab_sx, const char* table_nm)
25 {
26  using namespace sexp;
27 
28  // Sanity check
30 
31  sexp_t* tag_sx = get_elem0(tab_sx);
32  const char* tagstr = get_value(tag_sx);
33  FORTTK_ASSERT(tag_sx && strcmp(tagstr, table_nm) == 0,
35 
36  // Translate each entry
37  for (sexp_t* entry = get_elem1(tab_sx); entry; entry = get_next(entry)) {
38  // FIXME: translate in blocks
39  T* x = xlate_SYMTAB_entry<T>(entry);
40  table.Transfer(x, 1);
41  }
42 }
43 
44 
45 template <typename T, UINT block_size>
46 void
48  sexp_t* tab_sx, const char* table_nm)
49 {
50  using namespace sexp;
51 
52  // Sanity check
54 
55  sexp_t* tag_sx = get_elem0(tab_sx);
56  const char* tagstr = get_value(tag_sx);
57  FORTTK_ASSERT(tag_sx && strcmp(tagstr, table_nm) == 0,
59 
60  // Translate each entry
61  for (sexp_t* entry = get_elem1(tab_sx); entry; entry = get_next(entry)) {
62  // FIXME: translate in blocks
63  T* x = xlate_SYMTAB_entry<T>(entry);
64  table.Transfer(x, 1);
65  }
66 }
67 
68 
69 void
70 xlate_SYMTAB(sexp_t* str_tab, const char* table_nm,
71  UINT32 (*xlate_entry)(sexp_t*, std::string& buf),
72  std::string& buf)
73 {
74  using namespace sexp;
75 
76  // Sanity check
78 
79  sexp_t* tag_sx = get_elem0(str_tab);
80  const char* tagstr = get_value(tag_sx);
81  FORTTK_ASSERT(tag_sx && strcmp(tagstr, table_nm) == 0,
83 
84  // Translate each entry, building up buffer
85  for (sexp_t* entry = get_elem1(str_tab); entry; entry = get_next(entry)) {
86  xlate_entry(entry, buf);
87  }
88 }
89 
90 
91 //***************************************************************************
92 // Translate symbol tables
93 //***************************************************************************
94 
95 void
96 sexp2whirl::TranslateGlobalSymbolTables(sexp_t* gbl_symtab, int flags)
97 {
98  using namespace sexp;
99 
100  if (!gbl_symtab) { return; }
101 
102  // Sanity check
104 
105  sexp_t* tag_sx = get_elem0(gbl_symtab);
106  const char* tagstr = get_value(tag_sx);
107  FORTTK_ASSERT(tag_sx && strcmp(tagstr, SexpTags::GBL_SYMTAB) == 0,
109 
110  // Initialize WHIRL symbol tables
111  Read_Global_Data = "bogus-value-as-argument-to-Initialize_Symbol_Tables";
112  Initialize_Symbol_Tables(FALSE /*reserve_index_zero*/);
113  {
114  // FIXME: if the above is FALSE we must do the following:
115 
116  // CANSKIP: Initialize_Strtab (0x1000); // start with 4Kbytes for strtab.
117 
118  UINT32 dummy_idx;
119  memset (&New_PU ((PU_IDX&) dummy_idx), '\0', sizeof(PU));
120  memset (&New_TY ((TY_IDX&) dummy_idx), '\0', sizeof(TY));
121  memset (New_FLD ().Entry(), '\0', sizeof(FLD));
122  memset (&New_TYLIST ((TYLIST_IDX&) dummy_idx), '\0', sizeof(TYLIST));
123  memset (New_ARB ().Entry(), '\0', sizeof(ARB));
124  memset (&New_BLK ((BLK_IDX&) dummy_idx), '\0', sizeof(BLK));
125  memset (&Initv_Table.New_entry ((INITV_IDX&) dummy_idx), '\0',
126  sizeof(INITV));
127  // SKIP: Init_Constab ();
128  TCON Zero;
129  UINT32 idx;
130  memset (&Zero, '\0', sizeof(TCON));
131  idx = Tcon_Table.Insert (Zero); // index 0: dummy
132  // SKIP: init of consts
133  // CANSKIP: Initialize_TCON_strtab (1024); // string table for TCONs
134 
135  New_Scope(GLOBAL_SYMTAB, Malloc_Mem_Pool, TRUE /*reserve_index_zero*/);
136 
137  // SKIP: Create_Special_Global_Symbols();
138  // SKIP: Create_All_Preg_Symbols();
139  }
140  DST_Init(NULL, 0); // generate a trivial debugging symbol table (DST)
141 
142  // Translate global tables
143  sexp_t* file_info_sx = get_elem1(gbl_symtab);
144  xlate_FILE_INFO(file_info_sx);
145 
146  sexp_t* st_tab_sx = get_next(file_info_sx);
147  xlate_ST_TAB(st_tab_sx, GLOBAL_SYMTAB);
148 
149  sexp_t* st_attr_tab_sx = get_next(st_tab_sx);
150  xlate_ST_ATTR_TAB(st_attr_tab_sx, GLOBAL_SYMTAB);
151 
152  sexp_t* pu_tab_sx = get_next(st_attr_tab_sx);
153  xlate_PU_TAB(pu_tab_sx);
154 
155  sexp_t* ty_tab_sx = get_next(pu_tab_sx);
156  xlate_TY_TAB(ty_tab_sx);
157 
158  sexp_t* fld_tab_sx = get_next(ty_tab_sx);
159  xlate_FLD_TAB(fld_tab_sx);
160 
161  sexp_t* arb_tab_sx = get_next(fld_tab_sx);
162  xlate_ARB_TAB(arb_tab_sx);
163 
164  sexp_t* tlist_tab_sx = get_next(arb_tab_sx);
165  xlate_TYLIST_TAB(tlist_tab_sx);
166 
167  sexp_t* tcon_tab_sx = get_next(tlist_tab_sx);
168  xlate_TCON_TAB(tcon_tab_sx);
169 
170  sexp_t* tcon_str_tab_sx = get_next(tcon_tab_sx);
171  xlate_TCON_STR_TAB(tcon_str_tab_sx);
172 
173  sexp_t* inito_tab_sx = get_next(tcon_str_tab_sx);
174  xlate_INITO_TAB(inito_tab_sx, GLOBAL_SYMTAB);
175 
176  sexp_t* initv_tab_sx = get_next(inito_tab_sx);
177  xlate_INITV_TAB(initv_tab_sx);
178 
179  sexp_t* blk_tab_sx = get_next(initv_tab_sx);
180  xlate_BLK_TAB(blk_tab_sx);
181 
182  sexp_t* str_tab_sx = get_next(blk_tab_sx);
183  xlate_STR_TAB(str_tab_sx);
184 
185  // Special initialization of WHIRL symbol tables (disable)
186  //Initialize_Special_Global_Symbols();
187 }
188 
189 
190 void
192  int flags)
193 {
194  using namespace sexp;
195 
196  if (!pu_symtab) { return; }
197 
198  // Sanity check
200 
201  sexp_t* tag_sx = get_elem0(pu_symtab);
202  const char* tagstr = get_value(tag_sx);
203  FORTTK_ASSERT(tag_sx && strcmp(tagstr, SexpTags::PU_SYMTAB) == 0,
205 
206  // Initialize WHIRL symbol tables
207  New_Scope(stab_lvl, Malloc_Mem_Pool, TRUE);
208 
209  // Translate local tables
210  sexp_t* st_tab_sx = get_elem1(pu_symtab);
211  xlate_ST_TAB(st_tab_sx, stab_lvl);
212 
213  sexp_t* st_attr_tab_sx = get_next(st_tab_sx);
214  xlate_ST_ATTR_TAB(st_attr_tab_sx, stab_lvl);
215 
216  sexp_t* label_tab_sx = get_next(st_attr_tab_sx);
217  xlate_LABEL_TAB(label_tab_sx, stab_lvl);
218 
219  sexp_t* preg_tab_sx = get_next(label_tab_sx);
220  xlate_PREG_TAB(preg_tab_sx, stab_lvl);
221 
222  sexp_t* inito_tab_sx = get_next(preg_tab_sx);
223  xlate_INITO_TAB(inito_tab_sx, stab_lvl);
224 }
225 
226 
227 //***************************************************************************
228 // Translate individual tables
229 //***************************************************************************
230 
231 void
233 {
234  using namespace sexp;
235 
236  // Sanity check
238 
239  sexp_t* tag_sx = get_elem0(file_info);
240  const char* tagstr = get_value(tag_sx);
241  FORTTK_ASSERT(tag_sx && strcmp(tagstr, SexpTags::FILE_INFO) == 0,
243 
244  // gp_group
245  sexp_t* gp_sx = get_elem1(file_info);
246  mUINT8 gp = (mUINT8)get_value_ui32(gp_sx);
248 
249  // flags
250  sexp_t* flags_sx = get_next(gp_sx);
251  const char* flags_str = GetWhirlFlg(flags_sx);
253 }
254 
255 
256 void
257 sexp2whirl::xlate_ST_TAB(sexp_t* st_tab, SYMTAB_IDX stab_lvl)
258 {
259  // RELATED_SEGMENTED_ARRAY
260  xlate_SYMTAB(*Scope_tab[stab_lvl].st_tab, st_tab, SexpTags::ST_TAB);
261 }
262 
263 
264 void
265 sexp2whirl::xlate_ST_TAB(sexp_t* st_tab, const SCOPE& scope)
266 {
267  // RELATED_SEGMENTED_ARRAY
269 }
270 
271 
272 void
273 sexp2whirl::xlate_ST_ATTR_TAB(sexp_t* st_attr_tab, SYMTAB_IDX stab_lvl)
274 {
275  // RELATED_SEGMENTED_ARRAY
276  xlate_SYMTAB(*Scope_tab[stab_lvl].st_attr_tab, st_attr_tab,
278 }
279 
280 
281 void
283 {
285 }
286 
287 
288 void
290 {
291  xlate_SYMTAB(Ty_tab /*Ty_Table*/, ty_tab, SexpTags::TY_TAB);
292 }
293 
294 
295 void
297 {
299 }
300 
301 
302 void
304 {
306 }
307 
308 
309 void
310 sexp2whirl::xlate_TYLIST_TAB(sexp_t* tylist_tab)
311 {
313 }
314 
315 
316 void
317 sexp2whirl::xlate_TCON_TAB(sexp_t* tcon_tab)
318 {
320 }
321 
322 
323 void
325 {
326  // Details: Each char-array is preceeded by size info. If the
327  // char-array is less than 0xff bytes, the first byte contains the
328  // size. Otherwise the first byte is 0xff and the next 4 bytes hold
329  // the size (UINT32). The index points to the first byte in the
330  // string!
331  // E.g.: -xxx0-yyy0 [where - is size info; xxx and yyy are strings]
332  std::string buf(1, '\0'); // initialize (cf. STR_TAB<STR>::init_hash)
335  Initialize_TCON_strtab(buf.c_str(), buf.size());
336 }
337 
338 
339 void
340 sexp2whirl::xlate_INITO_TAB(sexp_t* inito_tab, SYMTAB_IDX stab_lvl)
341 {
342  // RELATED_SEGMENTED_ARRAY
343  xlate_SYMTAB(*Scope_tab[stab_lvl].inito_tab, inito_tab, SexpTags::INITO_TAB);
344 }
345 
346 
347 void
348 sexp2whirl::xlate_INITV_TAB(sexp_t* initv_tab)
349 {
351 }
352 
353 
354 void
356 {
358 }
359 
360 
361 void
363 {
364  // Details: The first entry in the buffer is NULL and thus every
365  // string is preceeded by a NULL. The index points to the first
366  // byte in the string!
367  // E.g: 0xxx0yyy0zzz0 [where xxx, yyy, and zzz are strings]
368  std::string buf(1, '\0'); // initialize (cf. STR_TAB<STR>::init_hash)
370  Initialize_Strtab(buf.c_str(), buf.size());
371 }
372 
373 
374 void
375 sexp2whirl::xlate_LABEL_TAB(sexp_t* label_tab, SYMTAB_IDX stab_lvl)
376 {
377  // RELATED_SEGMENTED_ARRAY
378  xlate_SYMTAB(*Scope_tab[stab_lvl].label_tab, label_tab, SexpTags::LABEL_TAB);
379 }
380 
381 
382 void
383 sexp2whirl::xlate_PREG_TAB(sexp_t* preg_tab, SYMTAB_IDX stab_lvl)
384 {
385  // RELATED_SEGMENTED_ARRAY
386  xlate_SYMTAB(*Scope_tab[stab_lvl].preg_tab, preg_tab, SexpTags::PREG_TAB);
387 }
388 
389 
390 //***************************************************************************
391 // Functions to translate individual table entries
392 //***************************************************************************
393 
394 ST*
396 {
397  using namespace sexp;
398 
400 
401  // sym_class, storage_class, export_class
402  sexp_t* stclass_sx = get_elem1(sx);
403  const char* stclass_nm = get_value(stclass_sx);
404  ST_CLASS stclass = Name_To_Class(stclass_nm);
405  Set_ST_sym_class(*st, stclass);
406 
407  sexp_t* stsclass_sx = get_next(stclass_sx);
408  const char* stsclass_nm = get_value(stsclass_sx);
409  ST_SCLASS stsclass = Name_To_Sclass(stsclass_nm);
410  Set_ST_sclass(*st, stsclass);
411 
412  sexp_t* stexport_sx = get_next(stsclass_sx);
413  const char* stexport_nm = get_value(stexport_sx);
414  ST_EXPORT stexport = Name_To_Export(stexport_nm);
415  Set_ST_export(*st, stexport);
416 
417  // name_idx/tcon
418  sexp_t* name_idx_sx = get_next(stexport_sx);
419  sexp_t* nmidx_sx = get_elem1(name_idx_sx);
420  STR_IDX nmidx = get_value_ui32(nmidx_sx); // or TCON_IDX
421  Set_ST_name_idx(*st, nmidx); // or TCON_IDX
422 
423  // type/pu/blk
424  sexp_t* typublk_sx = get_next(name_idx_sx);
425  if (stclass == CLASS_FUNC) {
426  PU_IDX stpu = get_value_ui32(typublk_sx);
427  Set_ST_pu(*st, stpu);
428  }
429  else if (stclass == CLASS_BLOCK) {
430  BLK_IDX stblk = get_value_ui32(typublk_sx);
431  Set_ST_blk(*st, stblk);
432  }
433  else {
434  TY_IDX sttype = GetWhirlTy(typublk_sx);
435  Set_ST_type(*st, sttype);
436  }
437 
438  // base_idx, offset
439  sexp_t* basest_sx = get_next(typublk_sx);
440  ST_IDX stbase_idx = GetWhirlSym(basest_sx);
441  Set_ST_base_idx(*st, stbase_idx);
442 
443  sexp_t* oset_sx = get_next(basest_sx);
444  UINT64 oset = get_value_ui64(oset_sx);
445  Set_ST_ofst(*st, oset);
446 
447  // flags/flags_ext
448  sexp_t* flags_sx = get_next(oset_sx);
449  const char* flags_str = GetWhirlFlg(flags_sx);
450  st->flags = (UINT32)Str_To_ST_FLAGS(flags_str);
451 
452  sexp_t* flagsext_sx = get_next(flags_sx);
453  const char* flagsext_str = GetWhirlFlg(flagsext_sx);
454  st->flags_ext = Str_To_ST_EXT_FLAGS(flagsext_str);
455 
456  // st_idx
457  sexp_t* st_idx_sx = get_next(flagsext_sx);
458  ST_IDX st_idx = GetWhirlSym(st_idx_sx);
459  Set_ST_st_idx(*st, st_idx);
460 
461  return st;
462 }
463 
464 
465 ST_ATTR*
467 {
468  using namespace sexp;
469 
471 
472  // st_idx
473  sexp_t* st_idx_sx = get_elem1(sx);
474  ST_IDX st_idx = GetWhirlSym(st_idx_sx);
475  Set_ST_ATTR_st_idx(*st_attr, st_idx);
476 
477  // kind
478  sexp_t* knd_sx = get_next(st_idx_sx);
479  const char* knd_nm = get_value(knd_sx);
480  ST_ATTR_KIND knd = Name_To_ST_ATTR_Kind(knd_nm);
481  st_attr->kind = knd;
482 
483  // reg_id/section_name
484  sexp_t* reg_id_sx = get_next(knd_sx);
485  PREG_NUM reg_id = get_value_ui32(reg_id_sx);
486  Set_ST_ATTR_reg_id(*st_attr, reg_id);
487 
488  return st_attr;
489 }
490 
491 
492 PU*
494 {
495  using namespace sexp;
496 
498 
499  // prototype
500  sexp_t* ty_idx_sx = get_elem1(sx);
501  TY_IDX ty_idx = GetWhirlTy(ty_idx_sx);
502  Set_PU_prototype(*pu, ty_idx);
503 
504  // lexical_level
505  sexp_t* lvl_sx = get_next(ty_idx_sx);
506  SYMTAB_IDX lvl = (SYMTAB_IDX)get_value_ui32(lvl_sx);
507  Set_PU_lexical_level(*pu, lvl);
508 
509  // gp_group
510  sexp_t* gp_sx = get_next(lvl_sx);
511  UINT8 gp = (UINT8)get_value_ui32(gp_sx);
512  Set_PU_gp_group(*pu, gp);
513 
514  // src_lang
515  sexp_t* srclang_sx = get_next(gp_sx);
516  const char* srclang_str = GetWhirlFlg(srclang_sx);
517  pu->src_lang = (mUINT8)Str_To_PU_SRC_LANG_FLAGS(srclang_str);
518 
519  // target_idx
520  sexp_t* targidx_sx = get_next(srclang_sx);
521  TARGET_INFO_IDX targidx = get_value_ui32(targidx_sx);
522  Set_PU_target_idx(*pu, targidx);
523 
524  // flags
525  sexp_t* flags_sx = get_next(targidx_sx);
526  const char* flags_str = GetWhirlFlg(flags_sx);
527  pu->flags = Str_To_PU_FLAGS(flags_str);
528 
529  return pu;
530 }
531 
532 
533 TY*
535 {
536  using namespace sexp;
537 
539 
540  // kind
541  sexp_t* knd_sx = get_elem1(sx);
542  const char* knd_nm = get_value(knd_sx);
543  TY_KIND knd = Name_To_Kind(knd_nm);
544  Set_TY_kind(*ty, knd);
545 
546  // name_idx
547  sexp_t* name_idx_sx = get_next(knd_sx);
548  sexp_t* nmidx_sx = get_elem1(name_idx_sx);
549  STR_IDX nmidx = get_value_ui32(nmidx_sx);
550  Set_TY_name_idx(*ty, nmidx);
551 
552  // mtype, size
553  sexp_t* mty_sx = get_next(name_idx_sx);
554  const char* mty_nm = get_value(mty_sx);
555  TYPE_ID mty = Name_To_Mtype(mty_nm);
556  Set_TY_mtype(*ty, mty);
557 
558  sexp_t* sz_sx = get_next(mty_sx);
559  UINT64 sz = get_value_ui64(sz_sx);
560  Set_TY_size(*ty, sz);
561 
562  // flags
563  sexp_t* flags_sx = get_next(sz_sx);
564  const char* flags_str = GetWhirlFlg(flags_sx);
565  UINT16 flg = (UINT16)Str_To_TY_FLAGS(flags_str);
566  Set_TY_flags(*ty, flg);
567 
568  // arb/fld/tylist: ARRAY, STRUCT, FUNCTION (respectively)
569  // etype/pointed/pu_flags: ARRAY, POINTER, FUNCTION (respectively)
570  sexp_t* olist_sx = get_next(flags_sx);
571  if (knd == KIND_ARRAY) {
572  sexp_t* arb_sx = get_elem0(olist_sx);
573  ARB_IDX arb = get_value_ui32(arb_sx);
574  ty->Set_arb(arb);
575 
576  sexp_t* ety_sx = get_elem1(olist_sx);
577  TY_IDX ety = GetWhirlTy(ety_sx);
578  ty->Set_etype(ety);
579  }
580  else if (knd == KIND_STRUCT) {
581  sexp_t* fld_sx = get_elem0(olist_sx);
582  FLD_IDX fld = get_value_ui32(fld_sx);
583  ty->Set_fld(fld);
584  }
585  else if (knd == KIND_POINTER) {
586  sexp_t* basety_sx = get_elem0(olist_sx);
587  TY_IDX basety = GetWhirlTy(basety_sx);
588  Set_TY_pointed(*ty, basety);
589  }
590  else if (knd == KIND_FUNCTION) {
591  sexp_t* tyl_sx = get_elem0(olist_sx);
592  TYLIST_IDX tyl = get_value_ui32(tyl_sx);
593  Set_TY_tylist(*ty, tyl);
594 
595  sexp_t* pu_flg_sx = get_elem1(olist_sx);
596  const char* pu_flg_str = GetWhirlFlg(pu_flg_sx);
597  ty->u2.pu_flags = (PU_IDX)Str_To_TY_PU_FLAGS(pu_flg_str);
598  }
599 
600  return ty;
601 }
602 
603 
604 FLD*
606 {
607  using namespace sexp;
608 
610 
611  // N.B. We cannot use the Set_FLD_xxx routines because they require
612  // a FLD_HANDLE, something that is both annoying and impossible (the
613  // FLD_HANDLE constructor assumes 'fld' is already *in* the table).
614 
615  // name_idx
616  sexp_t* name_idx_sx = get_elem1(sx);
617  sexp_t* nmidx_sx = get_elem1(name_idx_sx);
618  STR_IDX nmidx = get_value_ui32(nmidx_sx);
619  fld->name_idx = nmidx;
620 
621  // type
622  sexp_t* ty_idx_sx = get_next(name_idx_sx);
623  TY_IDX ty_idx = GetWhirlTy(ty_idx_sx);
624  fld->type = ty_idx;
625 
626  // ofst, bsize, bofst
627  sexp_t* ofst_sx = get_next(ty_idx_sx);
628  UINT64 ofst = get_value_ui64(ofst_sx);
629  fld->ofst = ofst;
630 
631  sexp_t* bsz_sx = get_next(ofst_sx);
632  UINT8 bsz = (UINT8)get_value_ui32(bsz_sx);
633  fld->bsize = bsz;
634 
635  sexp_t* bofst_sx = get_next(bsz_sx);
636  UINT8 bofst = (UINT8)get_value_ui32(bofst_sx);
637  fld->bofst = bofst;
638 
639  // flags
640  sexp_t* flags_sx = get_next(bofst_sx);
641  const char* flags_str = GetWhirlFlg(flags_sx);
642  fld->flags = (UINT16)Str_To_FLD_FLAGS(flags_str);
643 
644  // st
645  sexp_t* st_sx = get_next(flags_sx);
646  ST_IDX st = GetWhirlSym(st_sx);
647  fld->st = st;
648 
649  return fld;
650 }
651 
652 
653 ARB*
655 {
656  using namespace sexp;
657 
659 
660  // N.B. We cannot use the Set_ARB_xxx routines because they require
661  // a ARB_HANDLE, something that is both annoying and impossible (the
662  // ARB_HANDLE constructor assumes 'arb' is already *in* the table).
663 
664  // flags, dimension, co_dimension
665  sexp_t* flags_sx = get_elem1(sx);
666  const char* flags_str = GetWhirlFlg(flags_sx);
667  arb->flags = (UINT16)Str_To_ARB_FLAGS(flags_str);
668 
669  sexp_t* dim_sx = get_next(flags_sx);
670  UINT16 dim = (UINT16)get_value_ui32(dim_sx);
671  arb->dimension = dim;
672 
673  sexp_t* codim_sx = get_next(dim_sx);
674  UINT16 codim = (UINT16)get_value_ui32(codim_sx);
675  arb->co_dimension = codim;
676 
677  // lbnd_val/(lbnd_var, lbnd_unused)
678  sexp_t* lbnd_sx = get_next(codim_sx);
679  if (arb->flags & ARB_CONST_LBND) {
680  sexp_t* val_sx = get_elem1(lbnd_sx);
681  INT64 val = get_value_i64(val_sx);
682  arb->Set_lbnd_val(val);
683  }
684  else {
685  ST_IDX st_idx = GetWhirlSym(lbnd_sx);
686  arb->Set_lbnd_var(st_idx);
687  }
688 
689  // ubnd_val/(ubnd_var, ubnd_unused)
690  sexp_t* ubnd_sx = get_next(lbnd_sx);
691  if (arb->flags & ARB_CONST_UBND) {
692  sexp_t* val_sx = get_elem1(ubnd_sx);
693  INT64 val = get_value_i64(val_sx);
694  arb->Set_ubnd_val(val);
695  }
696  else {
697  ST_IDX st_idx = GetWhirlSym(ubnd_sx);
698  arb->Set_ubnd_var(st_idx);
699  }
700 
701  // stride_val/(stride_var, stride_unused)
702  sexp_t* stride_sx = get_next(ubnd_sx);
703  if (arb->flags & ARB_CONST_STRIDE) {
704  sexp_t* val_sx = get_elem1(stride_sx);
705  INT64 val = get_value_i64(val_sx);
706  arb->Set_stride_val(val);
707  }
708  else {
709  ST_IDX st_idx = GetWhirlSym(stride_sx);
710  arb->Set_stride_var(st_idx);
711  }
712 
713  return arb;
714 }
715 
716 
717 TYLIST*
719 {
720  using namespace sexp;
721 
723 
724  sexp_t* ty_idx_sx = get_elem1(sx);
725  TY_IDX ty_idx = GetWhirlTy(ty_idx_sx);
726  Set_TYLIST_type(*tyl, ty_idx);
727 
728  return tyl;
729 }
730 
731 
732 TCON*
734 {
735  // see osprey1.0/common/com/targ_const.h
736  using namespace sexp;
737 
739 
740  FortTk::uint128_t qd; // 16 byte value, a tcon has two of these
741 
742  // ty
743  sexp_t* mty_sx = get_elem1(sx);
744  const char* mty_nm = get_value(mty_sx);
745  TYPE_ID mty = Name_To_Mtype(mty_nm);
746  Set_TCON_ty(*tcon, mty);
747 
748  // flags
749  sexp_t* flags_sx = get_next(mty_sx);
750  const char* flags_str = GetWhirlFlg(flags_sx);
751  tcon->flags = (UINT32)Str_To_TCONFlags(flags_str);
752 
753  // vals [quad]
754  sexp_t* vals_sx = get_next(flags_sx);
755  qd.hi = get_value_ui64(get_elem0(vals_sx));
756  qd.lo = get_value_ui64(get_elem1(vals_sx));
757  FortTk::assign(tcon->vals.qval, qd);
758 
759  // cmplxval [quad]
760  sexp_t* cmplxval_sx = get_next(vals_sx);
761  qd.hi = get_value_ui64(get_elem0(cmplxval_sx));
762  qd.lo = get_value_ui64(get_elem1(cmplxval_sx));
763  FortTk::assign(tcon->cmplxval.qival, qd);
764 
765  return tcon;
766 }
767 
768 
769 INITO*
771 {
772  // see osprey1.0/common/com/irbdata_defs.h
773  using namespace sexp;
774 
776 
777  // st_idx
778  sexp_t* st_idx_sx = get_elem1(sx);
779  ST_IDX st_idx = GetWhirlSym(st_idx_sx);
780  inito->st_idx = st_idx;
781 
782  // val
783  sexp_t* val_sx = get_next(st_idx_sx);
784  INITV_IDX val = get_value_ui32(val_sx);
785  inito->val = val;
786 
787  return inito;
788 }
789 
790 
791 INITV*
793 {
794  // see osprey1.0/common/com/irbdata_defs.h
795  using namespace sexp;
796 
798 
799  // next
800  sexp_t* next_sx = get_elem1(sx);
801  INITV_IDX next = get_value_ui32(next_sx);
802  initv->next = next;
803 
804  // kind
805  sexp_t* kind_sx = get_next(next_sx);
806  const char* kind_nm = get_value(kind_sx);
807  INITVKIND kind = Name_To_InitvKind(kind_nm);
808  initv->kind = kind;
809 
810  // repeat1
811  sexp_t* repeat1_sx = get_next(kind_sx);
812  UINT16 repeat1 = (UINT16)get_value_ui32(repeat1_sx);
813  initv->repeat1 = repeat1;
814 
815  // st/lab/lab1/mtype/tc/blk/pad
816  sexp_t* st_sx = get_next(repeat1_sx);
817  UINT32 st = get_value_ui32(st_sx);
818  initv->u.sto.st = st;
819 
820  // ofst/st2/repeat2/unused
821  sexp_t* ofst_sx = get_next(st_sx);
822  INT32 ofst = get_value_i32(ofst_sx);
823  initv->u.sto.ofst = ofst;
824 
825  return initv;
826 }
827 
828 
829 BLK*
831 {
832  using namespace sexp;
833 
835 
836  // size
837  sexp_t* size_sx = get_elem1(sx);
838  UINT64 size = get_value_ui64(size_sx);
839  blk->Set_size(size);
840 
841  // align
842  sexp_t* align_sx = get_next(size_sx);
843  UINT16 align = (UINT16)get_value_ui32(size_sx);
844  blk->Set_align(align);
845 
846  // flags
847  sexp_t* flags_sx = get_next(align_sx);
848  const char* flags_str = GetWhirlFlg(flags_sx);
849  UINT16 flags = (UINT16)Str_To_BLK_FLAGS(flags_str);
850  blk->Set_flags(flags);
851 
852  // section_idx
853  sexp_t* scn_idx_sx = get_next(flags_sx);
854  UINT16 scn_idx = (UINT16)get_value_ui32(scn_idx_sx);
855  blk->Set_section_idx(scn_idx);
856 
857  // scninfo_idx
858  sexp_t* scninfo_idx_sx = get_next(scn_idx_sx);
859  UINT16 scninfo_idx = (UINT16)get_value_ui32(scninfo_idx_sx);
860  blk->Set_scninfo_idx(scninfo_idx);
861 
862  return blk;
863 }
864 
865 
866 LABEL*
868 {
869  using namespace sexp;
870 
872 
873  // name_idx
874  sexp_t* name_idx_sx = get_elem1(sx);
875  sexp_t* nmidx_sx = get_elem1(name_idx_sx);
876  STR_IDX nmidx = get_value_ui32(nmidx_sx);
877  Set_LABEL_name_idx(*label, nmidx);
878 
879  // kind
880  sexp_t* knd_sx = get_next(name_idx_sx);
881  const char* knd_nm = get_value(knd_sx);
882  LABEL_KIND knd = Name_To_LABEL_Kind(knd_nm);
883  Set_LABEL_KIND(*label, knd);
884 
885  // flags
886  sexp_t* flags_sx = get_next(knd_sx);
887  const char* flags_str = GetWhirlFlg(flags_sx);
888  label->flags = (UINT32)Str_To_LABEL_FLAGS(flags_str);
889 
890  return label;
891 }
892 
893 
894 PREG*
896 {
897  using namespace sexp;
898 
900 
901  // name_idx
902  sexp_t* name_idx_sx = get_elem1(sx);
903  sexp_t* nmidx_sx = get_elem1(name_idx_sx);
904  STR_IDX nmidx = get_value_ui32(nmidx_sx);
905  Set_PREG_name_idx(*preg, nmidx);
906 
907  return preg;
908 }
909 
910 
911 UINT32
913 {
914  using namespace sexp;
915 
916  // char_array
917  sexp_t* str_sx = get_elem1(sx);
918  const char* str = get_value(str_sx);
919 
920  // Add to TCON_STR_TAB buffer (cf. xlate_TCON_STR_TAB)
921  char prefix[6];
922  UINT32 len = strlen(str) + 1; // include terminator
923  UINT32 plen = 0;
924  if (len < 0xff) {
925  prefix[0] = (char)len;
926  prefix[1] = '\0';
927  plen = 1;
928  }
929  else {
930  prefix[0] = (char)0xff;
931  char* lenchar = (char*)&len;
932  for (INT i = 0; i < 4; ++i) { // unaligned assignment of UINT32
933  prefix[i+1] = lenchar[i];
934  }
935  prefix[5] = '\0';
936  plen = 5;
937  }
938 
939  UINT32 idx = buf.size()-1 + plen; // idx of first byte of 'str'
940  buf.append(prefix, plen);
941  buf.append(str, len); // include terminator
942 
943  // sanity check
944  sexp_t* idxorig_sx = get_elem0(sx);
945  UINT32 idxorig = get_value_ui32(idxorig_sx);
946  FORTTK_ASSERT(idx == idxorig, "TCON_STR_TAB indices are inconsistent");
947 
948  return idx;
949 }
950 
951 
952 UINT32
954 {
955  using namespace sexp;
956 
957  // string
958  sexp_t* str_sx = get_elem1(sx);
959  const char* str = get_value(str_sx);
960 
961  // Add to STR_TAB buffer (cf. xlate_STR_TAB)
962  UINT32 idx = buf.size(); // idx of first byte of 'str'
963  buf.append(str, strlen(str) + 1); // include terminator
964 
965  // sanity check
966  sexp_t* idxorig_sx = get_elem0(sx);
967  UINT32 idxorig = get_value_ui32(idxorig_sx);
968  FORTTK_ASSERT(idx == idxorig, "STR_TAB indices are inconsistent");
969 
970  return idx;
971 }
972 
973 
974 //***************************************************************************
975