Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

496 lines
19 KiB

/*
** Symbol types . . .
*/
#define SYMV_SYMBOL 0x0001
#define SYMV_RAWSYMBOL 0x0002
#define SYMV_FORMAL 0x0004
#define SYMV_SEGMENT 0x0008
#define SYMV_FUNCTION 0x0010
#define SYMV_INTRINSIC 0x0020
#define SYMV_LABEL 0x0040
#define SYMV_TAG 0x0080
#define SYMV_MOE 0x0100
#define SYMV_MEMBER 0x0200
#define SYMV_FIELD 0x0400
#define SYMV_OPC 0x0800
#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)