The main data structure used through the whole compiler is the NODE. The parse trees are built out of NODEs and it is the underlying data structure when generating code.
The NODE structure contains lots of fields in unions to kefep the size down of the struct. Different NODE types uses different elements in the structure. The NODE struct is declared like this:
typedef struct node {
int n_op;
int n_rall;
TWORD n_type;
TWORD n_qual;
int n_su;
union {
char * _name;
int _stsize;
union dimfun *_df;
} n_5;
union {
int _label;
int _stalign;
struct suedef *_sue;
} n_6;
union {
struct {
union {
struct node *_left;
CONSZ _lval;
#ifdef SPECIAL_INTEGERS
SPECLVAL _slval;
#endif
} n_l;
union {
struct node *_right;
int _rval;
struct symtab *_sp;
} n_r;
} n_u;
long double _dcon;
} n_f;
} NODE;
#define n_name n_5._name
#define n_stsize n_5._stsize
#define n_df n_5._df
#define n_label n_6._label
#define n_stalign n_6._stalign
#define n_sue n_6._sue
#define n_left n_f.n_u.n_l._left
#define n_lval n_f.n_u.n_l._lval
#define n_slval n_f.n_u.n_l._slval
#define n_right n_f.n_u.n_r._right
#define n_rval n_f.n_u.n_r._rval
#define n_sp n_f.n_u.n_r._sp
#define n_dcon n_f._dcon
## NODE fields
### All Nodes
The fields that are valid in all nodes are:
- n\_op
Tells which op the node is.
- n\_type/n\_qual
Keeps the encoded type of the node.
- n\_rall/n\_su
Used in [[pass2]] to generate code.
### Leaf Nodes
- NAME
n\_lval has offset to the NAME (in bits). In [[pass1]], n\_sp is a pointer to this node symtab entry, in [[pass2]] the name string is stored in n\_name.
- ICON
Holds an integer constant in n\_lval. If it is a memory referenced constant, n\_sp is a pointer to this node symtab entry in [[pass1]] and n\_name points to its name in [[pass2]].
- FCON
Holds a floating point constant in n\_dcon.
- REG
Reference to a register. The register number is held in n\_rval.
- OREG
An indirect reference to memory via an offset to a register. The register number is held in n\_rval, the offset in n\_lval.
### Unary Nodes
The node leg is always the left leg.
- COMPL
Complements the left node.
- UMUL
Type indirection operator; does PTR int -> int.
- UMINUS
Negates the left node.
- FLD
The left leg is a bitfield reference. n\_rval holds the bit offsets in packed format.
- SCONV
Type converts any type to an integer or float type.
- PCONV
The same as SCONV but the result is a pointer.
- PMCONV/PVCONV
Used to do struct offset calculations. Mostly they can be replaced in [[pass1]].
- UCALL/UFORTCALL/USTCALL
Call to a function without arguments. UFORTCALL is to call a fortran function, USTCALL for functions returning structures or unions.
- FORCE
Forces the return value from a function to end up in the return register.
- GOTO
Just goto the left-node label.
- RETURN
Return from a function.
- FUNARG
Make the tree result an argument for a function to call.
- ADDROF
The inverse of UMUL, get the address of an object.Powered by rcshistory.cgi 0.3