54 lines
1.7 KiB
C
54 lines
1.7 KiB
C
|
/* D E S I G N A T O R D E S C R I P T I O N S */
|
||
|
|
||
|
/* $Header$ */
|
||
|
|
||
|
/* Generating code for designators is not particularly easy, especially if
|
||
|
you don't know wether you want the address or the value.
|
||
|
The next structure is used to generate code for designators.
|
||
|
It contains information on how to find the designator, after generation
|
||
|
of the code that is common to both address and value computations.
|
||
|
*/
|
||
|
|
||
|
struct desig {
|
||
|
int dsg_kind;
|
||
|
#define DSG_INIT 0 /* don't know anything yet */
|
||
|
#define DSG_LOADED 1 /* designator loaded on top of the stack */
|
||
|
#define DSG_PLOADED 2 /* designator accessible through pointer on
|
||
|
stack, possibly with an offset
|
||
|
*/
|
||
|
#define DSG_FIXED 3 /* designator directly accessible */
|
||
|
#define DSG_PFIXED 4 /* designator accessible through directly
|
||
|
accessible pointer
|
||
|
*/
|
||
|
#define DSG_INDEXED 5 /* designator accessible through array
|
||
|
operation. Address of array descriptor on
|
||
|
top of the stack, index beneath that, and
|
||
|
base address beneath that
|
||
|
*/
|
||
|
arith dsg_offset; /* contains an offset for PLOADED,
|
||
|
or for FIXED or PFIXED it contains an
|
||
|
offset from dsg_name, if it exists,
|
||
|
or from the current Local Base
|
||
|
*/
|
||
|
char *dsg_name; /* name of global variable, used for
|
||
|
FIXED and PFIXED
|
||
|
*/
|
||
|
};
|
||
|
|
||
|
/* The next structure describes the designator in a with-statement.
|
||
|
We have a linked list of them, as with-statements may be nested.
|
||
|
*/
|
||
|
|
||
|
struct withdesig {
|
||
|
struct withdesig *w_next;
|
||
|
struct scope *w_scope; /* scope in which fields of this record
|
||
|
reside
|
||
|
*/
|
||
|
struct desig *w_desig; /* a desig structure for this particular
|
||
|
designator
|
||
|
*/
|
||
|
};
|
||
|
|
||
|
extern struct withdesig *WithDesigs;
|
||
|
extern struct desig Desig;
|