496 lines
14 KiB
C
496 lines
14 KiB
C
/*
|
|
** Symbol types . . .
|
|
*/
|
|
#define SYMV_SYMBOL 0x001
|
|
#define SYMV_RAWSYMBOL 0x002
|
|
#define SYMV_FORMAL 0x004
|
|
#define SYMV_SEGMENT 0x008
|
|
|
|
#define SYMV_FUNCTION 0x010
|
|
#define SYMV_INTRINSIC 0x020
|
|
#define SYMV_LABEL 0x040
|
|
|
|
#define SYMV_TAG 0x080
|
|
#define SYMV_MOE 0x100
|
|
#define SYMV_MEMBER 0x200
|
|
#define SYMV_FIELD 0x400
|
|
#define SYMV_OPC 0x800
|
|
|
|
#define SYMV_ABSTRSYM 0x1000
|
|
|
|
#define SYM_ISSYMBOL(p) (SYM_ANYVTAG(p) & SYMV_SYMBOL)
|
|
#define SYM_ISFUNCTION(p) (SYM_ANYVTAG(p) & SYMV_FUNCTION)
|
|
#define SYM_ISFORMAL(p) (SYM_ANYVTAG(p) & SYMV_FORMAL)
|
|
#define SYM_ISABSTRSYM(p) (SYM_ANYVTAG(p) & SYMV_ABSTRSYM)
|
|
#define SYM_ISLABEL(p) (SYM_ANYVTAG(p) & SYMV_LABEL)
|
|
#define SYM_ISTAG(p) (SYM_ANYVTAG(p) & SYMV_TAG)
|
|
#define SYM_ISMOE(p) (SYM_ANYVTAG(p) & SYMV_MOE)
|
|
#define SYM_ISMEMBER(p) (SYM_ANYVTAG(p) & SYMV_MEMBER)
|
|
#define SYM_ISFIELD(p) (SYM_ANYVTAG(p) & SYMV_FIELD)
|
|
#define SYM_ISINTRINSIC(p) (SYM_ANYVTAG(p) & SYMV_INTRINSIC)
|
|
#define SYM_ISRAWSYMBOL(p) (SYM_ANYVTAG(p) & SYMV_RAWSYMBOL)
|
|
#define SYM_ISSEGMENT(p) (SYM_ANYVTAG(p) & SYMV_SEGMENT)
|
|
/*
|
|
** parameter list types
|
|
*/
|
|
#define NO_LIST 0
|
|
#define EMPTY_LIST 1
|
|
#define NAME_LIST 2
|
|
#define PASCAL_LIST 3
|
|
#define TYPE_LIST 4
|
|
/*
|
|
** symbol storage classes
|
|
** symbol adjectives, these have nothing to do with types.
|
|
*/
|
|
#define SCundef 0
|
|
#define SCauto 0x01
|
|
#define SCextern 0x02
|
|
#define SCregister 0x04
|
|
#define SCstatic 0x08
|
|
#define SCtypedef 0x10
|
|
#define SCglobal 0x20
|
|
#define SCabsolute 0x40
|
|
#define SCreally 0x80 /* used w/ SCregister by p2 if it allocs a reg */
|
|
|
|
#define SCp2stuff SCreally
|
|
|
|
/*
|
|
** symbol table sizes
|
|
*/
|
|
#define LEVEL_0 0xff
|
|
#define LEVEL_N 0x0f
|
|
|
|
struct s_adj {
|
|
uchar_t bit_0:1;
|
|
uchar_t bit_1:1;
|
|
uchar_t bit_2:1;
|
|
uchar_t bit_3:1;
|
|
|
|
uchar_t bit_4:1;
|
|
uchar_t bit_5:1;
|
|
uchar_t bit_6:1;
|
|
uchar_t bit_7:1;
|
|
|
|
uchar_t bit_8:1;
|
|
uchar_t bit_9:1;
|
|
uchar_t bit_10:1;
|
|
uchar_t bit_11:1;
|
|
|
|
uchar_t bit_12:1;
|
|
uchar_t bit_13:1;
|
|
uchar_t bit_14:1;
|
|
uchar_t bit_15:1;
|
|
};
|
|
|
|
#if VERS_DEBUG
|
|
/*
|
|
* d=DEFINED o=OUTPUT S=INASEGMENT n=NEAR
|
|
* v=VISIBLE p=PASCAL i=INIT s=STRING
|
|
* N=HASANAMELIST E=DEFNBEFOREUSE C=CODESEGNAME D=DATASEGNAME
|
|
* B=ISBACKREF F=FORWARDREF
|
|
*/
|
|
#define SYM_ADJFMT "??FBDCENsipvnSod" /* prword() fmt */
|
|
#endif
|
|
|
|
#define IS_INVISIBLE 0
|
|
#define IS_VISIBLE 1
|
|
|
|
#define SYM_ISDEFINED(s) ((SYM_ANYADJ(s)).bit_0) /* all */
|
|
#define SYM_ISOUTPUT(s) ((SYM_ANYADJ(s)).bit_1) /* all */
|
|
#define SYM_ISINASEGMENT(s) ((SYM_ANYADJ(s)).bit_2) /* all */
|
|
#define SYM_ISNEAR(s) ((SYM_ANYADJ(s)).bit_3) /* all */
|
|
#define SYM_ISVISIBLE(s) ((SYM_ANYADJ(s)).bit_4) /* all */
|
|
#define SYM_ISPASCAL(s) ((SYM_ANYADJ(s)).bit_5) /* all */
|
|
|
|
#define SYM_ISINITIALIZED(s) ((SYM_ANYADJ(s)).bit_6) /* symbol */
|
|
#define SYM_ISSTRING(s) ((SYM_ANYADJ(s)).bit_7) /* symbol */
|
|
|
|
#define SYM_HASANAMELIST(s) ((SYM_ANYADJ(s)).bit_8) /* funcs */
|
|
#define SYM_DEFNBEFOREUSE(s) ((SYM_ANYADJ(s)).bit_9) /* overload for QC */
|
|
|
|
#define SYM_ISCODESEGNAME(s) ((SYM_ANYADJ(s)).bit_10)/* segment */
|
|
#define SYM_ISDATASEGNAME(s) ((SYM_ANYADJ(s)).bit_11)/* segment */
|
|
|
|
#define SYM_ISBACKREF(s) ((SYM_ANYADJ(s)).bit_12)/* label */
|
|
#define SYM_ISFORWARDREF(s) ((SYM_ANYADJ(s)).bit_13)/* label */
|
|
#define SYM_ISMASM(s) ((SYM_ANYADJ(s)).bit_14)/* label */
|
|
#define SYM_TOLEVEL0(s) ((SYM_ANYADJ(s)).bit_15)/* funcs moved to 0 */
|
|
|
|
typedef struct sym_200 { /* for fields */
|
|
uchar_t field_bitstart; /* in which bit does the field start */
|
|
uchar_t field_nbits; /* number of bits in this field */
|
|
} sym_200_t;
|
|
|
|
typedef struct sym_190 { /* struct/union members/fields */
|
|
fpsym_t member_prev; /* previous member */
|
|
ushort_t member_offset; /* offset of this member in the struct */
|
|
sym_200_t m200;
|
|
} sym_190_t;
|
|
|
|
#define SOB_sym_190 (sizeof(sym_190_t) - sizeof(sym_200_t))
|
|
|
|
typedef struct sym_180 { /* struct/union/enum tags */
|
|
len_t tag_size; /* sizeof the struct/union */
|
|
ushort_t tag_align; /* alignment of this struct */
|
|
} sym_180_t;
|
|
|
|
typedef struct sym_170 { /* intrinsics */
|
|
ushort_t intrin_ino; /* intrinsic number */
|
|
ushort_t intrin_nparms; /* number of actuals it takes */
|
|
} sym_170_t;
|
|
|
|
typedef struct sym_160 { /* labels */
|
|
NA_TYPE label_template; /* label template */
|
|
} sym_160_t;
|
|
|
|
typedef struct sym_150 { /* formals */
|
|
fpsym_t formal_prev; /* ptr to previous formal */
|
|
} sym_150_t;
|
|
|
|
typedef struct sym_140 { /* raw symbols */
|
|
hash_t raw_hash; /* the hash of this symbol */
|
|
} sym_140_t;
|
|
|
|
typedef union sym_135 {
|
|
sym_140_t m140; /* raw symbols */
|
|
sym_150_t m150; /* formals */
|
|
sym_160_t m160; /* labels */
|
|
} sym_135_t;
|
|
|
|
typedef struct sym_130 {
|
|
/*
|
|
SYMV_SYMBOL
|
|
SYMV_RAWSYMBOL
|
|
SYMV_FORMAL
|
|
SYMV_SEGMENT
|
|
SYMV_FUNCTION
|
|
SYMV_LABEL
|
|
*/
|
|
fpsym_t sym_anysegment; /* ptr to segment this is alloc'd in */
|
|
sym_135_t m135;
|
|
} sym_130_t;
|
|
|
|
#define SOB_sym_130 (sizeof(sym_130_t) - sizeof(sym_135_t))
|
|
|
|
typedef union sym_125 {
|
|
sym_130_t m130;
|
|
sym_170_t m170;
|
|
} sym_125_t;
|
|
|
|
typedef struct sym_120 {
|
|
/*
|
|
case SYMV_SYMBOL:
|
|
case SYMV_RAWSYMBOL:
|
|
case SYMV_FORMAL:
|
|
case SYMV_SEGMENT:
|
|
case SYMV_FUNCTION:
|
|
case SYMV_INTRINSIC:
|
|
case SYMV_LABEL:
|
|
*/
|
|
refcnt_t sym_anyrefcnt; /* reference count */
|
|
class_t sym_anyclass; /* symbol's class */
|
|
symadj_t sym_anyadj; /* adjectives */
|
|
sym_125_t m125;
|
|
} sym_120_t;
|
|
|
|
#define SOB_sym_120 (sizeof(sym_120_t) - sizeof(sym_125_t))
|
|
|
|
typedef union sym_115 {
|
|
sym_120_t m120;
|
|
sym_180_t m180;
|
|
} sym_115_t;
|
|
|
|
typedef struct sym_110 {
|
|
/*
|
|
case SYMV_SYMBOL:
|
|
case SYMV_RAWSYMBOL:
|
|
case SYMV_FORMAL:
|
|
case SYMV_SEGMENT:
|
|
case SYMV_FUNCTION:
|
|
case SYMV_INTRINSIC:
|
|
case SYMV_LABEL:
|
|
case SYMV_TAG:
|
|
*/
|
|
p1key_t sym_anykey;
|
|
sym_115_t m115;
|
|
} sym_110_t;
|
|
|
|
#define SOB_sym_110 (sizeof(sym_110_t) - sizeof(sym_115_t))
|
|
|
|
typedef union sym_105 {
|
|
sym_110_t m110;
|
|
sym_190_t m190;
|
|
} sym_105_t;
|
|
|
|
typedef struct sym_100 {
|
|
ptype_t sym_anytype;
|
|
sym_105_t m105;
|
|
} sym_100_t;
|
|
|
|
#define SOB_sym_100 (sizeof(sym_100_t) - sizeof(sym_105_t))
|
|
|
|
typedef union sym_95 {
|
|
long moe_value;
|
|
sym_100_t m100;
|
|
} sym_95_t;
|
|
|
|
struct s_sym {
|
|
fpsym_t sym_anynext; /* pointer to next ident */
|
|
fpuchar_t sym_anyname; /* pointer to name */
|
|
ushort_t sym_anyvtag; /* which variant do we have? */
|
|
sym_95_t m95;
|
|
};
|
|
|
|
#define M95(p) ((p)->m95)
|
|
#define M100(p) ((p)->m95.m100)
|
|
#define M105(p) ((p)->m95.m100.m105)
|
|
#define M110(p) ((p)->m95.m100.m105.m110)
|
|
#define M115(p) ((p)->m95.m100.m105.m110.m115)
|
|
#define M120(p) ((p)->m95.m100.m105.m110.m115.m120)
|
|
#define M125(p) ((p)->m95.m100.m105.m110.m115.m120.m125)
|
|
#define M130(p) ((p)->m95.m100.m105.m110.m115.m120.m125.m130)
|
|
#define M135(p) (M130(p).m135)
|
|
#define M140(p) (M135(p).m140)
|
|
#define M150(p) (M135(p).m150)
|
|
#define M160(p) (M135(p).m160)
|
|
#define M170(p) ((p)->m95.m100.m105.m110.m115.m120.m125.m170)
|
|
#define M180(p) ((p)->m95.m100.m105.m110.m115.m180)
|
|
#define M190(p) ((p)->m95.m100.m105.m190)
|
|
#define M200(p) (M190(p).m200)
|
|
|
|
#define SO_BASICSYM (sizeof(sym_t) - sizeof(sym_95_t))
|
|
|
|
#define SO_SYMBOL ( SO_BASICSYM\
|
|
+ SOB_sym_100\
|
|
+ SOB_sym_110\
|
|
+ SOB_sym_120\
|
|
+ SOB_sym_130\
|
|
)
|
|
#define SO_SEGMENT (SO_SYMBOL)
|
|
#define SO_FUNCTION (SO_SYMBOL)
|
|
#define SO_RAWSYMBOL ( SO_SYMBOL\
|
|
+ sizeof(sym_140_t)\
|
|
)
|
|
#define SO_FORMAL ( SO_SYMBOL\
|
|
+ sizeof(sym_150_t)\
|
|
)
|
|
#define SO_LABEL ( SO_SYMBOL\
|
|
+ sizeof(sym_160_t)\
|
|
)
|
|
#define SO_INTRINSIC ( SO_BASICSYM\
|
|
+ SOB_sym_100\
|
|
+ SOB_sym_110\
|
|
+ SOB_sym_120\
|
|
+ sizeof(sym_170_t)\
|
|
)
|
|
#define SO_TAG ( SO_BASICSYM\
|
|
+ SOB_sym_100\
|
|
+ SOB_sym_110\
|
|
+ sizeof(sym_180_t)\
|
|
)
|
|
|
|
#define SO_MEMBER ( SO_BASICSYM\
|
|
+ SOB_sym_100\
|
|
+ SOB_sym_190\
|
|
)
|
|
#define SO_FIELD ( SO_MEMBER\
|
|
+ sizeof(sym_200_t)\
|
|
)
|
|
#define SO_MOE (SO_BASICSYM + sizeof(long)) /* sizeof(moe_value) */
|
|
|
|
#if 0 /* this is just a big comment */
|
|
|
|
*all* use s_sym and the following parts.
|
|
|
|
SYMV_SYMBOL(and SYMV_SEGMENT, SYMV_FUNCTION)
|
|
uses : sym_100, sym_110, sym_120, sym_130
|
|
|
|
SYMV_RAWSYMBOL uses : SYMV_SYMBOL *and* sym_140
|
|
SYMV_FORMAL uses : SYMV_SYMBOL *and* sym_150
|
|
SYMV_LABEL uses : SYMV_SYMBOL *and* sym_160
|
|
|
|
SYMV_INTRINSIC uses : sym_100, sym_110, sym_120, sym_170
|
|
|
|
SYMV_TAG uses : sym_100, sym_110, sym_180
|
|
|
|
SYMV_MEMBER uses : sym_100, sym_190
|
|
|
|
SYMV_FIELD uses : SYMV_MEMBER *and* sym_200
|
|
|
|
SYMV_MOE uses : moe_value
|
|
|
|
SYMV_OPC
|
|
|
|
#endif
|
|
|
|
#define SYM_ANYNEXT(p) ((p)->sym_anynext)
|
|
#define SYM_ANYNAME(p) ((p)->sym_anyname)
|
|
#define SYM_ANYVTAG(p) ((p)->sym_anyvtag)
|
|
|
|
#define SYM_ANYTYPE(p) ((p)->m95.m100.sym_anytype)
|
|
#define SYM_ANYKEY(p) ((p)->m95.m100.m105.m110.sym_anykey)
|
|
#define SYM_ANYREFCNT(p) ((p)->m95.m100.m105.m110.m115.m120.sym_anyrefcnt)
|
|
#define SYM_ANYCLASS(p) ((p)->m95.m100.m105.m110.m115.m120.sym_anyclass)
|
|
#define SYM_ANYADJ(p) ((p)->m95.m100.m105.m110.m115.m120.sym_anyadj)
|
|
#define SYM_ANYSEGMENT(p) (M130(p).sym_anysegment)
|
|
#define SYM_ANYAOFF(p) (M130(p).sym_anyaoff) /* P-2 allocation offset */
|
|
#define SYM_ANYAREGS(p) (M130(p).sym_anyaregs) /* P-2 allocation regs */
|
|
#define SYM_ANYASEG(p) (M130(p).sym_anyaseg) /* P-2 allocation segment */
|
|
|
|
#define SYM_SYNEXT(p) (SYM_ANYNEXT(p))
|
|
#define SYM_SYNAME(p) (SYM_ANYNAME(p))
|
|
#define SYM_SYTYPE(p) (SYM_ANYTYPE(p))
|
|
#define SYM_SYKEY(p) (SYM_ANYKEY(p))
|
|
#define SYM_SYREFCNT(p) (SYM_ANYREFCNT(p))
|
|
#define SYM_SYCLASS(p) (SYM_ANYCLASS(p))
|
|
#define SYM_SYADJ(p) (SYM_ANYADJ(p))
|
|
#define SYM_SYSEGMENT(p) (SYM_ANYSEGMENT(p))
|
|
#define SYM_SYAOFF(p) (SYM_ANYAOFF(p))
|
|
#define SYM_SYASEG(p) (SYM_ANYASEG(p))
|
|
|
|
#define SYM_SENEXT(p) (SYM_ANYNEXT(p))
|
|
#define SYM_SENAME(p) (SYM_ANYNAME(p))
|
|
#define SYM_SETYPE(p) (SYM_ANYTYPE(p))
|
|
#define SYM_SEKEY(p) (SYM_ANYKEY(p))
|
|
#define SYM_SEREFCNT(p) (SYM_ANYREFCNT(p))
|
|
#define SYM_SECLASS(p) (SYM_ANYCLASS(p))
|
|
#define SYM_SEADJ(p) (SYM_ANYADJ(p))
|
|
#define SYM_SEAOFF(p) (SYM_ANYAOFF(p))
|
|
|
|
#define SYM_RANAME(p) (SYM_ANYNAME(p))
|
|
#define SYM_RATYPE(p) (SYM_ANYTYPE(p))
|
|
#define SYM_RASEGMENT(p) (SYM_ANYSEGMENT(p))
|
|
#define SYM_RAHASH(p) (M140(p).raw_hash)
|
|
|
|
#define SYM_FUNEXT(p) (SYM_ANYNEXT(p))
|
|
#define SYM_FUNAME(p) (SYM_ANYNAME(p))
|
|
#define SYM_FUTYPE(p) (SYM_ANYTYPE(p))
|
|
#define SYM_FUKEY(p) (SYM_ANYKEY(p))
|
|
#define SYM_FUREFCNT(p) (SYM_ANYREFCNT(p))
|
|
#define SYM_FUCLASS(p) (SYM_ANYCLASS(p))
|
|
#define SYM_FUADJ(p) (SYM_ANYADJ(p))
|
|
#define SYM_FUSEGMENT(p) (SYM_ANYSEGMENT(p))
|
|
#define SYM_FUAOFF(p) (SYM_ANYAOFF(p))
|
|
#define SYM_FUASEG(p) (SYM_ANYASEG(p))
|
|
|
|
#define SYM_FONEXT(p) (SYM_ANYNEXT(p))
|
|
#define SYM_FONAME(p) (SYM_ANYNAME(p))
|
|
#define SYM_FOTYPE(p) (SYM_ANYTYPE(p))
|
|
#define SYM_FOKEY(p) (SYM_ANYKEY(p))
|
|
#define SYM_FOREFCNT(p) (SYM_ANYREFCNT(p))
|
|
#define SYM_FOCLASS(p) (SYM_ANYCLASS(p))
|
|
#define SYM_FOADJ(p) (SYM_ANYADJ(p))
|
|
#define SYM_FOAOFF(p) (SYM_ANYAOFF(p))
|
|
#define SYM_FOPREV(p) (M150(p).formal_prev)
|
|
|
|
#define SYM_LANEXT(p) (SYM_ANYNEXT(p))
|
|
#define SYM_LANAME(p) (SYM_ANYNAME(p))
|
|
#define SYM_LATYPE(p) (SYM_ANYTYPE(p))
|
|
#define SYM_LAKEY(p) (SYM_ANYKEY(p))
|
|
#define SYM_LAREFCNT(p) (SYM_ANYREFCNT(p))
|
|
#define SYM_LACLASS(p) (SYM_ANYCLASS(p))
|
|
#define SYM_LAADJ(p) (SYM_ANYADJ(p))
|
|
#define SYM_LAAOFF(p) (SYM_ANYAOFF(p))
|
|
#define SYM_LAASEG(p) (SYM_ANYASEG(p))
|
|
#define SYM_LATEMPLATE(p) (M160(p).label_template)
|
|
|
|
#define SYM_INNEXT(p) (SYM_ANYNEXT(p))
|
|
#define SYM_INNAME(p) (SYM_ANYNAME(p))
|
|
#define SYM_INTYPE(p) (SYM_ANYTYPE(p))
|
|
#define SYM_INKEY(p) (SYM_ANYKEY(p))
|
|
#define SYM_INREFCNT(p) (SYM_ANYREFCNT(p))
|
|
#define SYM_INCLASS(p) (SYM_ANYCLASS(p))
|
|
#define SYM_INADJ(p) (SYM_ANYADJ(p))
|
|
#define SYM_INNUMBER(p) (M170(p).intrin_ino)
|
|
#define SYM_INNPARMS(p) (M170(p).intrin_nparms)
|
|
|
|
#define SYM_TANEXT(p) (SYM_ANYNEXT(p))
|
|
#define SYM_TANAME(p) (SYM_ANYNAME(p))
|
|
#define SYM_TATYPE(p) (SYM_ANYTYPE(p))
|
|
#define SYM_TAKEY(p) (SYM_ANYKEY(p))
|
|
#define SYM_TASIZE(p) (M180(p).tag_size)
|
|
#define SYM_TAALIGN(p) (M180(p).tag_align)
|
|
|
|
#define SYM_MENEXT(p) (SYM_ANYNEXT(p))
|
|
#define SYM_MENAME(p) (SYM_ANYNAME(p))
|
|
#define SYM_METYPE(p) (SYM_ANYTYPE(p))
|
|
#define SYM_MEPREV(p) (M190(p).member_prev)
|
|
#define SYM_MEOFFSET(p) (M190(p).member_offset)
|
|
#define SYM_MEVACCESS(p) (M190(p).member_vaccess)
|
|
|
|
#define SYM_FINEXT(p) (SYM_ANYNEXT(p))
|
|
#define SYM_FINAME(p) (SYM_ANYNAME(p))
|
|
#define SYM_FITYPE(p) (SYM_ANYTYPE(p))
|
|
#define SYM_FIPREV(p) (M190(p).member_prev)
|
|
#define SYM_FIOFFSET(p) (M190(p).member_offset)
|
|
#define SYM_FIVACCESS(p) (M190(p).member_vaccess)
|
|
#define SYM_FIBITSTART(p) (M200(p).field_bitstart)
|
|
#define SYM_FINBITS(p) (M200(p).field_nbits)
|
|
|
|
#define SYM_MONEXT(p) (SYM_ANYNEXT(p))
|
|
#define SYM_MONAME(p) (SYM_ANYNAME(p))
|
|
#define SYM_MOVALUE(p) ((p)->m95.moe_value)
|
|
|
|
/*
|
|
** macros for acessing informmation on symbols type
|
|
*/
|
|
#define SYM_ANYBTYPE(P) (TY_BTYPE(SYM_ANYTYPE(P)))
|
|
#define SYM_ANYESU(P) (TY_ESU(SYM_ANYTYPE(P)))
|
|
#define SYM_ANYTINDEX(P) (TY_TINDEX(SYM_ANYTYPE(P)))
|
|
#define SYM_ANYINDIR(P) (TY_INDIR(SYM_SYTYPE(P)))
|
|
|
|
#define SYM_ANYISUB(P) (INDIR_ISUB(SYM_ANYINDIR(P)))
|
|
#define SYM_ANYINEXT(P) (INDIR_INEXT(SYM_ANYINDIR(P)))
|
|
#define SYM_ANYITYPE(P) (INDIR_ITYPE(SYM_ANYINDIR(P)))
|
|
#define SYM_ANYIFORMALS(P) (INDIR_IFORMALS(SYM_ANYINDIR(P)))
|
|
|
|
#define SYM_NEAR(P) (IS_NEAR(SYM_ANYBTYPE(P)))
|
|
#define SYM_FAR(P) (IS_FAR(SYM_ANYBTYPE(P)))
|
|
#define SYM_HUGE(P) (IS_HUGE(SYM_ANYBTYPE(P)))
|
|
#define SYM_CONST(P) (IS_CONST(SYM_ANYBTYPE(P)))
|
|
/*
|
|
** the symbol table
|
|
*/
|
|
struct s_table {
|
|
table_t *st_next; /* link to next */
|
|
table_t *st_incl; /* block is included in block pointer */
|
|
fpsym_t *st_table; /* ptr to hash table */
|
|
blknum_t st_level; /* block level */
|
|
uchar_t st_size; /* number of entries in hash table */
|
|
};
|
|
/*
|
|
** macros for accessing the symbol tables.
|
|
** `level' is the level of interest.
|
|
** `ptab' is a ptr to a symbol table
|
|
*/
|
|
#define ST_NEXT(ptab) ((ptab)->st_next)
|
|
#define ST_INCL(ptab) ((ptab)->st_incl)
|
|
#define ST_SYM(ptab) ((ptab)->st_table)
|
|
#define ST_LEVEL(ptab) ((ptab)->st_level)
|
|
#define ST_MOD(ptab) ((ptab)->st_size)
|
|
|
|
#define ST_TABLE(level) ((level) ? Table_n : Table_0)
|
|
#define ST_BUCKET(ptab,hash) (((ptab)->st_table[hash & ST_MOD(ptab)]))
|
|
|
|
/*
|
|
** A Hash/Length/Name string is one where the first character is the hash
|
|
** of the name. The second character is the length of the identifier
|
|
** including the hash and length characters. The name begins at the third
|
|
** character.
|
|
*/
|
|
#define HLN_IDENT_HASH(P) (HLN_HASH(*(P)))
|
|
#define HLN_IDENT_LENGTH(P) (HLN_LENGTH(*(P)))
|
|
#define HLN_IDENTP_NAME(P) (HLN_NAME(*(P)))
|
|
/*
|
|
** delcaration specifiers, used by to hold both the class and the type.
|
|
*/
|
|
struct s_declspec {
|
|
class_t ds_class;
|
|
ptype_t ds_type;
|
|
};
|
|
|
|
#define DSP_CLASS(p) ((p)->ds_class)
|
|
#define DSP_TYPE(p) ((p)->ds_type)
|
|
#define DS_CLASS(p) ((p).ds_class)
|
|
#define DS_TYPE(p) ((p).ds_type)
|