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 #ifndef symtab_defs_INCLUDED
00047 #define symtab_defs_INCLUDED
00048
00049
00050
00051
00052
00053
00054
00055
00056
00057
00058
00059
00060
00061
00062 enum ST_CLASS
00063 {
00064 CLASS_UNK = 0,
00065 CLASS_VAR = 1,
00066 CLASS_FUNC = 2,
00067 CLASS_CONST = 3,
00068 CLASS_PREG = 4,
00069 CLASS_BLOCK = 5,
00070 CLASS_NAME = 6,
00071 CLASS_COUNT = 7
00072 };
00073
00074
00075 enum ST_SCLASS
00076 {
00077
00078 SCLASS_UNKNOWN = 0,
00079 SCLASS_AUTO = 1,
00080 SCLASS_FORMAL = 2,
00081 SCLASS_FORMAL_REF = 3,
00082 SCLASS_PSTATIC = 4,
00083 SCLASS_FSTATIC = 5,
00084 SCLASS_COMMON = 6,
00085 SCLASS_EXTERN = 7,
00086 SCLASS_UGLOBAL = 8,
00087 SCLASS_DGLOBAL = 9,
00088 SCLASS_TEXT = 10,
00089 SCLASS_REG = 11,
00090 SCLASS_CPLINIT = 12,
00091 SCLASS_EH_REGION = 13,
00092 SCLASS_EH_REGION_SUPP = 14,
00093 SCLASS_DISTR_ARRAY = 15,
00094 SCLASS_COMMENT = 16,
00095 SCLASS_THREAD_PRIVATE_FUNCS = 17,
00096 SCLASS_COUNT = 18
00097
00098 };
00099
00100
00101 enum ST_EXPORT
00102 {
00103 EXPORT_LOCAL = 0,
00104 EXPORT_LOCAL_INTERNAL = 1,
00105
00106 EXPORT_INTERNAL = 2,
00107
00108
00109
00110 EXPORT_HIDDEN = 3,
00111
00112
00113
00114
00115 EXPORT_PROTECTED = 4,
00116
00117 EXPORT_PREEMPTIBLE = 5,
00118 EXPORT_OPTIONAL = 6,
00119 EXPORT_COUNT = 7
00120
00121 };
00122
00123 #ifdef TARG_NVISA
00124 enum ST_MEMORY
00125 {
00126 MEMORY_UNKNOWN = 0,
00127 MEMORY_GLOBAL = 1,
00128 MEMORY_LOCAL = 2,
00129 MEMORY_SHARED = 3,
00130 MEMORY_CONSTANT = 4,
00131 MEMORY_TEXTURE = 5,
00132 MEMORY_PARAM = 6,
00133 MEMORY_COUNT = 7
00134 };
00135 #endif
00136
00137 enum ST_FLAGS
00138 {
00139 ST_IS_WEAK_SYMBOL = 0x00000001,
00140 ST_IS_SPLIT_COMMON = 0x00000002,
00141 ST_IS_NOT_USED = 0x00000004,
00142 ST_IS_INITIALIZED = 0x00000008,
00143 ST_IS_RETURN_VAR = 0x00000010,
00144 ST_IS_VALUE_PARM = 0x00000020,
00145 ST_PROMOTE_PARM = 0x00000040,
00146 ST_KEEP_NAME_W2F = 0x00000080,
00147 ST_IS_DATAPOOL = 0x00000100,
00148 ST_IS_RESHAPED = 0x00000200,
00149 ST_EMIT_SYMBOL = 0x00000400,
00150 ST_HAS_NESTED_REF = 0x00000800,
00151 ST_INIT_VALUE_ZERO = 0x00001000,
00152 ST_GPREL = 0x00002000,
00153 ST_NOT_GPREL = 0x00004000,
00154 ST_IS_NAMELIST = 0x00008000,
00155 ST_IS_F90_TARGET = 0x00010000,
00156 ST_DECLARED_STATIC = 0x00020000,
00157 ST_IS_EQUIVALENCED = 0x00040000,
00158 ST_IS_FILL_ALIGN = 0x00080000,
00159 ST_IS_OPTIONAL_ARGUMENT = 0x00100000,
00160 ST_PT_TO_UNIQUE_MEM = 0x00200000,
00161 ST_IS_TEMP_VAR = 0x00400000,
00162 ST_IS_CONST_VAR = 0x00800000,
00163 ST_ADDR_SAVED = 0x01000000,
00164 ST_ADDR_PASSED = 0x02000000,
00165 ST_IS_THREAD_PRIVATE = 0x04000000,
00166
00167 ST_PT_TO_COMPILER_GENERATED_MEM = 0x08000000,
00168
00169 ST_IS_SHARED_AUTO = 0x10000000,
00170
00171 ST_ASSIGNED_TO_DEDICATED_PREG = 0x20000000,
00172
00173 ST_ASM_FUNCTION_ST = 0x40000000,
00174
00175 ST_HAS_NAMED_SECTION = 0x80000000
00176
00177 };
00178
00179 #ifdef KEY
00180 enum ST_FLAGS_EXT
00181 {
00182 ST_ONE_PER_PU = 0x01,
00183 ST_COPY_CONSTRUCTOR_ST = 0x02,
00184 ST_INITV_IN_OTHER_ST = 0x04,
00185 ST_IS_INITIALIZED_IN_F90 = 0x8,
00186 ST_IS_METHOD_FUNC = 0x10,
00187
00188 ST_IS_THIS_PTR = 0x20,
00189 ST_IS_PURE_VFUNC = 0x40,
00190 ST_IS_THREAD_LOCAL = 0x80,
00191 #if defined(TARG_SL)
00192 ST_IN_V1BUF = 0x100,
00193 ST_IN_V2BUF = 0x200,
00194 ST_IN_V4BUF = 0x400,
00195 ST_IN_SDRAM = 0x800,
00196 ST_IN_SBUF = 0x1000,
00197 ST_IS_VBUF_OFFSET = 0x2000,
00198 ST_IS_SBUF_OFFSET = 0x4000,
00199 #endif
00200 };
00201 #endif
00202
00203
00204 class ST
00205 {
00206 public:
00207 union {
00208 STR_IDX name_idx;
00209 TCON_IDX tcon;
00210 } u1;
00211
00212 mUINT32 flags;
00213
00214 #if defined(TARG_SL)
00215 mUINT16 flags_ext;
00216 #else
00217 mUINT8 flags_ext;
00218 #endif
00219
00220 ST_CLASS sym_class : 8;
00221 ST_SCLASS storage_class : 8;
00222 #ifdef TARG_NVISA
00223 ST_EXPORT export_class : 4;
00224 ST_MEMORY memory_space: 4;
00225 #else
00226 ST_EXPORT export_class : 8;
00227 #endif
00228 union {
00229 TY_IDX type;
00230 PU_IDX pu;
00231 BLK_IDX blk;
00232 } u2;
00233
00234 #ifdef KEY
00235
00236
00237 mUINT32 pad;
00238 #endif
00239 mUINT64 offset;
00240
00241 ST_IDX base_idx;
00242
00243 ST_IDX st_idx;
00244
00245
00246
00247 ST () {Fail_FmtAssertion("ST default constructor must not be called.");}
00248
00249 void Verify(UINT level) const;
00250
00251 void Print(FILE *f, BOOL verbose = TRUE) const;
00252
00253 BOOL operator==(ST &st) const;
00254
00255 };
00256
00257
00258
00259
00260
00261
00262
00263
00264 enum FLD_FLAGS
00265 {
00266 FLD_LAST_FIELD = 0x0001,
00267 FLD_EQUIVALENCE = 0x0002,
00268 FLD_BEGIN_UNION = 0x0004,
00269 FLD_END_UNION = 0x0008,
00270 FLD_BEGIN_MAP = 0x0010,
00271 FLD_END_MAP = 0x0020,
00272 FLD_IS_BIT_FIELD = 0x0040,
00273 FLD_IS_ANONYMOUS = 0x0080,
00274 FLD_IS_BASE_CLASS = 0x0100,
00275 };
00276
00277 struct FLD
00278 {
00279 STR_IDX name_idx;
00280
00281 mUINT64 ofst;
00282
00283 mUINT8 bsize;
00284 mUINT8 bofst;
00285
00286 mUINT16 flags;
00287
00288 ST_IDX st;
00289
00290 TY_IDX type;
00291
00292
00293
00294 FLD ();
00295
00296 void Verify (UINT64 record_size) const;
00297
00298 void Print (FILE *f) const;
00299
00300 };
00301
00302
00303 typedef TY_IDX TYLIST;
00304
00305
00306
00307
00308
00309
00310 enum ARB_FLAGS
00311 {
00312 ARB_CONST_LBND = 0x0001,
00313 ARB_CONST_UBND = 0x0002,
00314 ARB_CONST_STRIDE = 0x0004,
00315 ARB_FIRST_DIMEN = 0x0008,
00316 ARB_LAST_DIMEN = 0x0010
00317 };
00318
00319 struct ARB
00320 {
00321 mUINT16 flags;
00322 mUINT16 dimension;
00323
00324 mUINT32 unused;
00325
00326 union {
00327 mINT64 lbnd_val;
00328 struct {
00329 ST_IDX lbnd_var;
00330
00331 mINT32 unused;
00332 } var;
00333 } u1;
00334
00335 union {
00336 mINT64 ubnd_val;
00337 struct {
00338 ST_IDX ubnd_var;
00339
00340 mINT32 unused;
00341 } var;
00342 } u2;
00343
00344 union {
00345 mINT64 stride_val;
00346 struct {
00347 ST_IDX stride_var;
00348
00349 mINT32 unused;
00350 } var;
00351 } u3;
00352
00353
00354 INT64 Lbnd_val () const { return u1.lbnd_val; }
00355 void Set_lbnd_val (INT64 val) { u1.lbnd_val = val; }
00356
00357 ST_IDX Lbnd_var () const { return u1.var.lbnd_var; }
00358 void Set_lbnd_var (ST_IDX st) {
00359 u1.var.lbnd_var = st;
00360 u1.var.unused = 0;
00361 }
00362
00363 INT64 Ubnd_val () const { return u2.ubnd_val; }
00364 void Set_ubnd_val (INT64 val) { u2.ubnd_val = val; }
00365
00366 ST_IDX Ubnd_var () const { return u2.var.ubnd_var; }
00367 void Set_ubnd_var (ST_IDX st) {
00368 u2.var.ubnd_var = st;
00369 u2.var.unused = 0;
00370 }
00371
00372 INT64 Stride_val () const { return u3.stride_val; }
00373 void Set_stride_val (INT64 val) { u3.stride_val = val; }
00374
00375 ST_IDX Stride_var () const { return u3.var.stride_var; }
00376 void Set_stride_var (ST_IDX st) {
00377 u3.var.stride_var = st;
00378 u3.var.unused = 0;
00379 }
00380
00381
00382
00383
00384 #ifdef really_call_bzero // don't call bzero if it is poisoned
00385 ARB () { really_call_bzero (this, sizeof(ARB)); }
00386 #else
00387 ARB () { BZERO (this, sizeof(ARB)); }
00388 #endif
00389
00390 void Verify (mUINT16 dim) const;
00391
00392 void Print (FILE *f) const;
00393
00394 };
00395
00396
00397 enum LABEL_KIND
00398 {
00399 LKIND_DEFAULT = 0,
00400 LKIND_ASSIGNED = 1,
00401 LKIND_BEGIN_EH_RANGE = 2,
00402 LKIND_END_EH_RANGE = 3,
00403 LKIND_BEGIN_HANDLER = 4,
00404 LKIND_END_HANDLER = 5,
00405 LKIND_TAG = 6
00406 };
00407
00408 enum LABEL_FLAGS
00409 {
00410 LABEL_TARGET_OF_GOTO_OUTER_BLOCK = 1,
00411 LABEL_ADDR_SAVED = 2,
00412 LABEL_ADDR_PASSED = 4
00413 };
00414
00415 struct LABEL
00416 {
00417 STR_IDX name_idx;
00418 mUINT32 flags:24;
00419 LABEL_KIND kind:8;
00420
00421
00422
00423 LABEL () {Fail_FmtAssertion("LABEL default constructor must not be called.");}
00424
00425 LABEL (STR_IDX idx, LABEL_KIND k) : name_idx (idx), kind (k) {}
00426
00427 void Verify(UINT level) const;
00428
00429 void Print (FILE *f) const;
00430 };
00431
00432
00433 struct PREG
00434 {
00435 STR_IDX name_idx;
00436
00437
00438 PREG(void)
00439 {
00440 Fail_FmtAssertion("PREG default constructor must not be called.");
00441 }
00442
00443 PREG (STR_IDX idx) : name_idx (idx) { }
00444
00445 void Verify(UINT level) const;
00446
00447 void Print (FILE *f) const;
00448
00449 };
00450
00451
00452
00453 enum ST_ATTR_KIND
00454 {
00455 ST_ATTR_UNKNOWN = 0,
00456 ST_ATTR_DEDICATED_REGISTER = 1,
00457 ST_ATTR_SECTION_NAME = 2
00458 };
00459
00460 class ST_ATTR
00461 {
00462 public:
00463 ST_IDX st_idx;
00464 ST_ATTR_KIND kind;
00465 private:
00466 union {
00467 mUINT32 value;
00468 mPREG_NUM reg_id;
00469 STR_IDX section_name;
00470 } u;
00471
00472 public:
00473
00474 ST_ATTR () {
00475 Fail_FmtAssertion("ST_ATTR default constructor must not be called.");
00476 }
00477
00478 ST_ATTR (ST_IDX idx, ST_ATTR_KIND akind, UINT64 val) :
00479 st_idx (idx), kind (akind) {
00480 u.section_name = val;
00481 }
00482
00483
00484 void Set_u (UINT64 val) {
00485 u.section_name = val;
00486 }
00487
00488
00489 void Set_reg_id (mPREG_NUM r) {
00490 u.reg_id = r;
00491 }
00492
00493 mPREG_NUM Get_reg_id (void) const {
00494 return u.reg_id;
00495 }
00496
00497
00498 void Set_section_name (STR_IDX i) {
00499 u.section_name = i;
00500 }
00501
00502 STR_IDX Get_section_name (void) const {
00503 return u.section_name;
00504 }
00505
00506
00507 void Verify (UINT level) const;
00508
00509 void Print (FILE* f) const;
00510 };
00511
00512
00513
00514
00515 enum TY_KIND
00516 {
00517 KIND_INVALID = 0,
00518 KIND_SCALAR = 1,
00519 KIND_ARRAY = 2,
00520 KIND_STRUCT = 3,
00521 KIND_POINTER = 4,
00522 KIND_FUNCTION = 5,
00523 KIND_VOID = 6,
00524 KIND_LAST = 8
00525 };
00526
00527
00528 enum TY_FLAGS
00529 {
00530 TY_IS_CHARACTER = 0x0001,
00531 TY_IS_LOGICAL = 0x0002,
00532 TY_IS_UNION = 0x0004,
00533 TY_IS_PACKED = 0x0008,
00534 TY_PTR_AS_ARRAY = 0x0010,
00535 TY_ANONYMOUS = 0x0020,
00536 TY_SPLIT = 0x0040,
00537
00538 TY_IS_F90_POINTER = 0x0080,
00539 TY_NOT_IN_UNION = 0x0100,
00540 TY_NO_ANSI_ALIAS = 0x0200,
00541 TY_IS_NON_POD = 0x0400,
00542 #ifdef KEY
00543 TY_RETURN_IN_MEM = 0x0800,
00544
00545 TY_CONTENT_SEEN = 0x1000,
00546
00547
00548 TY_IS_INCOMPLETE = 0x2000,
00549
00550
00551 TY_NO_SPLIT = 0x4000,
00552
00553
00554 #endif
00555 #ifdef TARG_NVISA
00556 TY_CAN_BE_VECTOR = 0x8000,
00557 #endif
00558 };
00559
00560
00561
00562 enum TY_PU_FLAGS
00563 {
00564 TY_RETURN_TO_PARAM = 0x00000001,
00565 TY_IS_VARARGS = 0x00000002,
00566 TY_HAS_PROTOTYPE = 0x00000004,
00567 #ifdef TARG_X8664
00568 TY_HAS_SSEREG_PARM = 0x00000008,
00569 TY_HAS_1_REG_PARM = 0x00000010,
00570 TY_HAS_2_REG_PARM = 0x00000020,
00571 TY_HAS_3_REG_PARM = 0x00000030
00572 #endif
00573 };
00574
00575 class TY
00576 {
00577 public:
00578 mUINT64 size;
00579
00580 TY_KIND kind : 8;
00581 mTYPE_ID mtype : 8;
00582 mUINT16 flags;
00583
00584 union {
00585 FLD_IDX fld;
00586 TYLIST_IDX tylist;
00587 ARB_IDX arb;
00588 } u1;
00589
00590 STR_IDX name_idx;
00591
00592 union {
00593 TY_IDX etype;
00594 TY_IDX pointed;
00595 mUINT32 pu_flags;
00596 #ifdef KEY
00597 ST_IDX copy_constructor;
00598 #endif
00599 } u2;
00600
00601
00602
00603 FLD_IDX Fld () const { return u1.fld; }
00604 void Set_fld (FLD_IDX idx) { u1.fld = idx; }
00605
00606 TYLIST_IDX Tylist () const { return u1.tylist; }
00607 void Set_tylist (TYLIST_IDX idx) { u1.tylist = idx; }
00608
00609 ARB_IDX Arb () const { return u1.arb; }
00610 void Set_arb (ARB_IDX idx) { u1.arb = idx; }
00611
00612 TY_IDX Etype () const
00613 {
00614 Is_True(kind == KIND_ARRAY,
00615 ("non-KIND_ARRAY type has no element type"));
00616 return u2.etype;
00617 }
00618 void Set_etype (TY_IDX idx) { u2.etype = idx; }
00619
00620 TY_IDX Pointed () const
00621 {
00622 Is_True(kind == KIND_POINTER,
00623 ("non-KIND_POINTER type doesn't point"));
00624 return u2.pointed;
00625 }
00626 void Set_pointed (TY_IDX idx) { u2.pointed = idx; }
00627
00628 #ifdef KEY
00629 ST_IDX Copy_constructor () const
00630 {
00631 Is_True(kind == KIND_STRUCT,
00632 ("non-KIND_STRUCT type has no copy constructor"));
00633 return u2.copy_constructor;
00634 }
00635 void Set_copy_constructor (ST_IDX idx) { u2.copy_constructor = idx; }
00636 #endif // KEY
00637
00638 PU_IDX Pu_flags () const { return u2.pu_flags; }
00639 void Set_pu_flag (TY_PU_FLAGS f) { u2.pu_flags |= f; }
00640 void Clear_pu_flag (TY_PU_FLAGS f) { u2.pu_flags &= ~f; }
00641
00642
00643
00644 TY ();
00645
00646 void Verify(UINT level) const;
00647
00648 void Print (FILE *f) const;
00649
00650 };
00651
00652
00653
00654
00655 #define PU_IS_PURE 0x00000001 // pure function
00656 #define PU_NO_SIDE_EFFECTS 0x00000002 // no side effect
00657 #define PU_IS_INLINE_FUNCTION 0x00000004 // inline keyword specified
00658 #define PU_NO_INLINE 0x00000008 // noinline pragma specified
00659 #define PU_MUST_INLINE 0x00000010 // must inline
00660 #define PU_NO_DELETE 0x00000020 // nodelete pragma specified
00661 #define PU_HAS_EXC_SCOPES 0x00000040 // has eh regions, or would have
00662
00663 #define PU_IS_NESTED_FUNC 0x00000080 // is a nested function
00664 #define PU_HAS_NON_MANGLED_CALL 0x00000100 // PU has a call in which no
00665
00666 #define PU_ARGS_ALIASED 0x00000200 // f77 arguments are aliased
00667 #define PU_NEEDS_FILL_ALIGN_LOWERING 0x00000400 // needs fill/align lowering
00668 #define PU_NEEDS_T9 0x00000800 // needs T9
00669 #define PU_HAS_VERY_HIGH_WHIRL 0x00001000 // PU has very high whirl in it
00670 #define PU_HAS_ALTENTRY 0x00002000 // PU has alternate entries
00671 #define PU_RECURSIVE 0x00004000 // in recursive path
00672 #define PU_IS_MAINPU 0x00008000 // is entry point of program
00673 #define PU_UPLEVEL 0x00010000 // Other PU nested in this one
00674 #define PU_MP_NEEDS_LNO 0x00020000 // PU needs LNO processing
00675 #define PU_HAS_ALLOCA 0x00040000 // PU has alloca in it
00676 #define PU_IN_ELF_SECTION 0x00080000 // PU is in its own Elf section
00677 #define PU_HAS_MP 0x00100000 // Symtab has MP region/do within it
00678 #define PU_MP 0x00200000 // PU is an MP region/do
00679 #define PU_HAS_NAMELIST 0x00400000 // PU has namelist
00680 #define PU_HAS_RETURN_ADDRESS 0x00800000 // __return_address was used
00681 #define PU_HAS_REGION 0x01000000 // PU has regions in it
00682 #define PU_HAS_INLINES 0x02000000 // PU has inlined code in it
00683 #define PU_CALLS_SETJMP 0x04000000 // PU has calls to setjmp(2)
00684 #define PU_CALLS_LONGJMP 0x08000000 // PU has calls to longjmp(2)
00685 #define PU_IPA_ADDR_ANALYSIS 0x10000000 // IPA has done address analysis
00686 #define PU_SMART_ADDR_ANALYSIS 0x20000000 // Unnecessary addr flags are reset
00687
00688 #define PU_HAS_SYSCALL_LINKAGE 0x40000000 // preserve input regs
00689 #define PU_HAS_GLOBAL_PRAGMAS 0x80000000 // PU is a dummy pu with global
00690
00691 #define PU_HAS_USER_ALLOCA 0x0000000100000000LL
00692
00693 #define PU_HAS_UNKNOWN_CONTROL_FLOW \
00694 0x0000000200000000LL
00695
00696
00697
00698 #define PU_IS_THUNK 0x0000000400000000LL // pu is a C++ thunk
00699
00700 #ifdef KEY
00701 #define PU_NEEDS_MANUAL_UNWINDING \
00702 0x0000000800000000LL // PU has cleanups in outermost scope and hence needs to call _Unwind_Resume itself
00703 #endif
00704
00705 #ifdef TARG_X8664
00706 #define PU_FF2C_ABI 0x0000001000000000LL // PU use g77 linkage convention for returns of complex and float
00707 #endif
00708
00709 #ifdef KEY
00710 #define PU_IS_EXTERN_INLINE 0x0000002000000000LL // PU is marked extern _inline_ in C
00711 #define PU_MP_LOWER_GENERATED 0x0000004000000000LL // PU generated by mp-lowerer
00712 #define PU_IS_MARKED_INLINE 0x0000008000000000LL
00713
00714
00715
00716 #define PU_NO_INSTRUMENT 0x0000010000000000LL // -finstrument-functions will skip PU
00717 #endif
00718
00719 #define PU_IS_MALLOC 0x0000020000000000LL // __attribute__((malloc)) semantic
00720 #define PU_HAS_ATTR_MALLOC 0x0000020000000000LL // __attribute__((malloc)) semantic
00721 #define PU_HAS_ATTR_PURE 0x0000040000000000LL // __attribute__((pure)) semantic
00722 #define PU_HAS_ATTR_NORETURN 0x0000080000000000LL // __attribute__((noreturn)) semantic
00723 #define PU_IS_CONSTRUCTOR 0x0000100000000000LL // PU is a constructor of a class
00724 #define PU_IS_OPERATOR 0x0000200000000000LL // PU is overload of operator
00725
00726 #define PU_NEED_TRAMPOLINE 0x0000400000000000LL // a nested function whose address is taken
00727 #define PU_HAS_NONLOCAL_GOTO_LABEL \
00728 0x0000800000000000LL // has a label jumped to directly from a nested function
00729 #define PU_HAS_GOTO_OUTER_BLOCK 0x0001000000000000LL // has GOTO_OUTER_BLOCK stmt
00730 #define PU_IS_CDECL 0x0002000000000000LL // __attribute__((cdecl)) semantic
00731
00732 enum PU_SRC_LANG_FLAGS
00733 {
00734 PU_UNKNOWN_LANG = 0x00,
00735 PU_MIXED_LANG = 0x01,
00736 PU_C_LANG = 0x02,
00737 PU_CXX_LANG = 0x04,
00738 PU_F77_LANG = 0x08,
00739 PU_F90_LANG = 0x10,
00740 PU_JAVA_LANG = 0x20
00741 };
00742
00743 struct PU
00744 {
00745 TARGET_INFO_IDX target_idx;
00746
00747
00748 TY_IDX prototype;
00749 TY_IDX base_class;
00750 SYMTAB_IDX lexical_level;
00751 INITO_IDX misc;
00752 #ifdef TARG_NVISA
00753 mUINT16 thread_limit;
00754 mUINT16 block_limit;
00755 #endif
00756 mUINT8 gp_group;
00757 mUINT8 src_lang;
00758 mUINT8 unused : 8;
00759 mUINT64 flags;
00760
00761
00762
00763 PU ();
00764
00765 void Verify(UINT level) const;
00766
00767 void Print (FILE *f) const;
00768
00769 };
00770
00771
00772
00773
00774
00775
00776 class BLK
00777 {
00778 private:
00779
00780 mUINT64 size;
00781 mUINT16 align;
00782 mUINT16 flags;
00783 mUINT16 section_idx;
00784 mUINT16 scninfo_idx;
00785
00786 public:
00787
00788 BLK () : size (0), section_idx(0), scninfo_idx(0), flags (0) {}
00789
00790 #ifdef really_call_bzero // don't call bzero if it is poisoned
00791 void Init (void) { really_call_bzero (this, sizeof(BLK)); }
00792 #else
00793 void Init (void) { BZERO (this, sizeof(BLK)); }
00794 #endif
00795
00796 public:
00797
00798
00799
00800 UINT64 Size () const { return size; }
00801 void Set_size (UINT64 s) { size = s; }
00802
00803 UINT16 Align () const { return align; }
00804 void Set_align (UINT16 s) { align = s; }
00805
00806 UINT16 Section_idx () const { return section_idx; }
00807 void Set_section_idx (UINT16 s) { section_idx = s; }
00808 UINT16 Scninfo_idx () const { return scninfo_idx; }
00809 void Set_scninfo_idx (UINT16 s) { scninfo_idx = s; }
00810
00811 UINT16 Flags () const { return flags; }
00812 BOOL Is_set (UINT16 f) const { return flags & f; }
00813 void Set_flags (UINT16 f) { flags |= f; }
00814 void Clear_flags (UINT16 f) { flags &= ~f; }
00815 void Clear_all_flags () { flags = 0; }
00816
00817 void Print (FILE *f) const;
00818 };
00819
00820
00821 #define BLK_SECTION 0x0001 // block for elf section
00822 #define BLK_ROOT_BASE 0x0002 // block should not be merged
00823 #define BLK_IS_BASEREG 0x0004 // block that maps into reg
00824 #define BLK_DECREMENT 0x0008 // grow block by decrementing
00825 #define BLK_EXEC 0x0010 // (ELF) executable instructions
00826 #define BLK_NOBITS 0x0020 // (ELF) occupies no space in file
00827 #define BLK_MERGE 0x0040 // (ELF) merge duplicates in ld
00828 #define BLK_COMPILER_LAYOUT 0x0080 // children symbols are not connected
00829
00830
00831
00832
00833 enum FILE_INFO_FLAGS
00834 {
00835 FI_IPA = 0x1,
00836 FI_NEEDS_LNO = 0x2,
00837 FI_HAS_INLINES = 0x4,
00838 FI_HAS_MP = 0x8
00839 };
00840
00841 struct FILE_INFO
00842 {
00843 mUINT32 flags;
00844 mUINT8 gp_group;
00845 mUINT32 unused : 24;
00846
00847 void Verify() const;
00848 void Print (FILE *f) const;
00849 FILE_INFO () : flags (0), gp_group (0), unused (0) {}
00850
00851 };
00852
00853
00854
00855
00856 typedef SEGMENTED_ARRAY<PU> PU_TAB;
00857 typedef RELATED_SEGMENTED_ARRAY<ST> ST_TAB;
00858 typedef SEGMENTED_ARRAY<TY> TY_TAB;
00859 typedef SEGMENTED_ARRAY<FLD> FLD_TAB;
00860 typedef SEGMENTED_ARRAY<TYLIST> TYLIST_TAB;
00861 typedef SEGMENTED_ARRAY<ARB> ARB_TAB;
00862 typedef RELATED_SEGMENTED_ARRAY<LABEL> LABEL_TAB;
00863 typedef RELATED_SEGMENTED_ARRAY<PREG> PREG_TAB;
00864 typedef SEGMENTED_ARRAY<ST_ATTR> ST_ATTR_TAB;
00865 typedef SEGMENTED_ARRAY<BLK> BLK_TAB;
00866 typedef SEGMENTED_ARRAY<TCON,64> TCON_TAB;
00867 typedef SEGMENTED_ARRAY<INITO> INITO_TAB;
00868 typedef SEGMENTED_ARRAY<INITV> INITV_TAB;
00869
00870 typedef PU_TAB::iterator PU_ITER;
00871 typedef ST_TAB::iterator ST_ITER;
00872 typedef TY_TAB::iterator TY_ITER;
00873 typedef FLD_TAB::iterator FLD_ITER;
00874 typedef TYLIST_TAB::iterator TYLIST_ITER;
00875 typedef ARB_TAB::iterator ARB_ITER;
00876 typedef LABEL_TAB::iterator LABEL_ITER;
00877 typedef PREG_TAB::iterator PREG_ITER;
00878 typedef ST_ATTR_TAB::iterator ST_ATTR_ITER;
00879 typedef BLK_TAB::iterator BLK_ITER;
00880 typedef TCON_TAB::iterator TCON_ITER;
00881 typedef INITO_TAB::iterator INITO_ITER;
00882 typedef INITV_TAB::iterator INITV_ITER;
00883
00884
00885 struct SCOPE
00886 {
00887 MEM_POOL *pool;
00888 ST* st;
00889 ST_TAB *st_tab;
00890 LABEL_TAB *label_tab;
00891 PREG_TAB *preg_tab;
00892 INITO_TAB *inito_tab;
00893 ST_ATTR_TAB *st_attr_tab;
00894
00895 void Init (ST_TAB *s) {
00896
00897 pool = NULL;
00898 st_tab = s;
00899 st = NULL;
00900 label_tab = NULL;
00901 preg_tab = NULL;
00902 inito_tab = NULL;
00903 st_attr_tab = NULL;
00904 }
00905
00906 void Init (ST_TAB *s, LABEL_TAB *l, PREG_TAB *p, INITO_TAB *io,
00907 ST_ATTR_TAB* d, MEM_POOL *mp = Malloc_Mem_Pool) {
00908 pool = mp;
00909 st = NULL;
00910 st_tab = s;
00911 label_tab = l;
00912 preg_tab = p;
00913 inito_tab = io;
00914 st_attr_tab = d;
00915
00916 }
00917
00918
00919 };
00920
00921
00922 #define GLOBAL_SYMTAB (1) // file scope global symtab
00923 #define CURRENT_SYMTAB (Current_scope)
00924
00925 struct SCOPE_TAB_SYMTAB_ACCESS {
00926 SCOPE_TAB_SYMTAB_ACCESS(void) { }
00927
00928 ST_TAB *operator()(SCOPE **scope_tab, SYMTAB_IDX level)
00929 { return (*scope_tab)[level].st_tab; }
00930 };
00931
00932 struct SCOPE_TAB_INITO_ACCESS {
00933 SCOPE_TAB_INITO_ACCESS(void) { }
00934
00935 INITO_TAB *operator()(SCOPE **scope_tab, SYMTAB_IDX level)
00936 { return (*scope_tab)[level].inito_tab; }
00937 };
00938
00939 struct SCOPE_TAB_LABEL_ACCESS {
00940 SCOPE_TAB_LABEL_ACCESS(void) { }
00941
00942 LABEL_TAB *operator()(SCOPE **scope_tab, SYMTAB_IDX level)
00943 { return (*scope_tab)[level].label_tab; }
00944 };
00945
00946
00947 extern SCOPE *Scope_tab;
00948
00949
00950 typedef TABLE_INDEXED_BY_LEVEL8_AND_INDEX24<ST, ST_IDX, SYMTAB_IDX,
00951 SCOPE *, &Scope_tab,
00952 SCOPE_TAB_SYMTAB_ACCESS>
00953 SYMBOL_TABLE;
00954
00955 typedef TABLE_INDEXED_BY_LEVEL8_AND_INDEX24<INITO, INITO_IDX, SYMTAB_IDX,
00956 SCOPE *, &Scope_tab,
00957 SCOPE_TAB_INITO_ACCESS>
00958 INITO_TABLE;
00959
00960 typedef TABLE_INDEXED_BY_LEVEL8_AND_INDEX24<LABEL, LABEL_IDX, SYMTAB_IDX,
00961 SCOPE *, &Scope_tab,
00962 SCOPE_TAB_LABEL_ACCESS>
00963 LABEL_TABLE;
00964
00965 struct PREG_TABLE
00966 {
00967 inline PREG& operator[] (PREG_IDX idx);
00968 inline PREG& operator() (SYMTAB_IDX level, PREG_IDX idx);
00969 };
00970
00971 struct ST_ATTR_TABLE
00972 {
00973 inline ST_ATTR& operator[] (ST_ATTR_IDX idx);
00974 inline ST_ATTR& operator() (SYMTAB_IDX level, ST_ATTR_IDX idx);
00975 };
00976
00977 struct TYPE_TABLE
00978 {
00979 inline TY& operator[] (TY_IDX idx);
00980 inline TY_TAB* operator& ();
00981 };
00982
00983
00984 extern FILE_INFO File_info;
00985 extern PU_TAB Pu_Table;
00986 extern SYMBOL_TABLE St_Table;
00987 extern TY_TAB Ty_tab;
00988 extern TYPE_TABLE Ty_Table;
00989 extern FLD_TAB Fld_Table;
00990 extern TYLIST_TAB Tylist_Table;
00991 extern ARB_TAB Arb_Table;
00992 extern STRING_TABLE Str_Table;
00993 extern TCON_TAB Tcon_Table;
00994 extern INITV_TAB Initv_Table;
00995 extern INITO_TABLE Inito_Table;
00996 extern PREG_TABLE Preg_Table;
00997 extern ST_ATTR_TABLE St_Attr_Table;
00998 extern LABEL_TABLE Label_Table;
00999
01000 extern BLK_TAB Blk_Table;
01001
01002
01003
01004 extern SYMTAB_IDX Current_scope;
01005 extern PU* Current_pu;
01006
01007
01008
01009
01010
01011
01012
01013
01014 enum SHDR_TYPE
01015 {
01016 SHDR_UNK = 0,
01017 SHDR_FILE = 1,
01018 SHDR_ST = 2,
01019 SHDR_TY = 3,
01020 SHDR_PU = 4,
01021 SHDR_FLD = 5,
01022 SHDR_ARB = 6,
01023 SHDR_TYLIST = 7,
01024 SHDR_TCON = 8,
01025 SHDR_STR = 9,
01026 SHDR_LABEL = 10,
01027 SHDR_PREG = 11,
01028 SHDR_INITO = 12,
01029 SHDR_INITV = 13,
01030 SHDR_BLK = 14,
01031 SHDR_ST_ATTR= 15
01032 };
01033
01034
01035 struct SYMTAB_HEADER
01036 {
01037 mUINT64 offset;
01038 mUINT64 size;
01039 mUINT32 entsize;
01040
01041 mUINT16 align;
01042 mUINT16 type;
01043
01044 void Init (UINT64 _offset, UINT64 _size, UINT32 _entsize,
01045 UINT16 _align, SHDR_TYPE _type) {
01046 offset = _offset;
01047 size = _size;
01048 entsize = _entsize;
01049 align = _align;
01050 type = _type;
01051 }
01052
01053 };
01054
01055
01056 #define GLOBAL_SYMTAB_TABLES (13) // # of tables in global symtab:
01057
01058
01059
01060 #define LOCAL_SYMTAB_TABLES (5) // # of tables in local symtab:
01061
01062
01063 template <UINT table_size>
01064 struct SYMTAB_HEADER_TABLE
01065 {
01066 mUINT32 size;
01067 mUINT32 entries;
01068
01069 SYMTAB_HEADER header[table_size];
01070
01071 typedef SYMTAB_HEADER_TABLE<table_size> self;
01072
01073 SYMTAB_HEADER_TABLE () {
01074 size = sizeof(self);
01075 entries = table_size;
01076 #ifdef really_call_bzero // don't call bzero if it is poisoned
01077 really_call_bzero (header, sizeof(header));
01078 #else
01079 BZERO (header, sizeof(header));
01080 #endif
01081 }
01082
01083 };
01084
01085 typedef SYMTAB_HEADER_TABLE<GLOBAL_SYMTAB_TABLES> GLOBAL_SYMTAB_HEADER_TABLE;
01086 typedef SYMTAB_HEADER_TABLE<LOCAL_SYMTAB_TABLES> LOCAL_SYMTAB_HEADER_TABLE;
01087
01088 #endif
01089