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 keep 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 attr *_ap;
} 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_ap n_6._ap
#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.