|
|
1.1 root 1: /*
2: * Header file for the 'direct-to-bits' code generator and optimizer.
3: * This contains all of the machine independent data structures and macros.
4: * Definitions dealing with the object code are in another file.
5: */
6:
7: #include <stdio.h>
8: #include <setjmp.h>
9: #ifdef vax
10: #include "INC$LIB:mch.h"
11: #include "INC$LIB:host.h"
12: #include "INC$LIB:ops.h"
13: #include "INC$LIB:var.h"
14: #include "INC$LIB:varmch.h"
15: #include "INC$LIB:opcode.h"
16: #include "INC$LIB:cc2mch.h"
17: #include "INC$LIB:stream.h"
18: #else
19: #include "mch.h"
20: #include "host.h"
21: #include "ops.h"
22: #include "var.h"
23: #include "varmch.h"
24: #include "opcode.h"
25: #include "cc2mch.h"
26: #include "stream.h"
27: #endif
28:
29: /*
30: * Table sizes.
31: */
32: #define NADDR 5 /* # of address fields */
33: #define NSHASH 64 /* Symbol hash buckets */
34: #define SHMASK 077 /* Mask for hashing into above */
35:
36: /*
37: * An array of these structures, indexed by compiler segment identifier,
38: * keeps track of the current location in each segment.
39: * The values of "dot" and "size" are not correct for the current segment.
40: */
41: typedef struct seg {
42: ADDRESS s_dot; /* Current location */
43: ADDRESS s_mseek; /* Base in memory */
44: long s_dseek; /* Base in file */
45: } SEG;
46:
47: /*
48: * Every symbol in the assembler symbol table looks like this.
49: * Local and global symbols live in the same table.
50: * A flag bit "S_LABNO" tells which variant is in use.
51: */
52: typedef struct sym {
53: struct sym *s_fp; /* Link */
54: ADDRESS s_value; /* Offset into segment */
55: char s_seg; /* Segment # */
56: char s_flag; /* Flags */
57: int s_data; /* Data, depends on variant */
58: int s_type;
59: char s_id[]; /* Name + null */
60: } SYM;
61:
62: #define s_labno s_data /* Local label # */
63: #define s_ref s_data /* Globl reference # */
64:
65: #define S_GBL 01 /* Global */
66: #define S_LABNO 02 /* Has labno, not id */
67: #define S_DEF 04 /* Defined */
68: #define S_NFL 010 /* Not local to function */
69: #define S_PUT 020 /* Debug item present */
70:
71: /*
72: * This structure is used to hold the address field of a machine instruction.
73: * It assumes the rather weak linker model.
74: */
75: typedef struct afield {
76: short a_mode; /* Address mode */
77: SYM *a_sp; /* Symbol table pointer */
78: ADDRESS a_value; /* Offset */
79: } AFIELD;
80:
81: /*
82: * When a function is read into memory,
83: * it is represented as a doubly linked list of these structures.
84: * The 'i_type' field tells which variant is used.
85: */
86: typedef struct INS {
87: struct INS *i_fp; /* Link forward */
88: struct INS *i_bp; /* Link back */
89: int i_type; /* Node type */
90: union {
91: int i_data[2]; /* Variant areas #1 and #2 */
92: sizeof_t i_data3;
93: } i_var;
94: SYM *i_sp; /* Symbol */
95: ADDRESS i_pc; /* Location */
96: char i_data4; /* Variant area #3 */
97: struct INS *i_ip; /* Label link */
98: short i_rel; /* JUMP relation code */
99: AFIELD i_af[]; /* Addresses */
100: } INS;
101:
102: /* Variant data resolution */
103: #define i_data1 i_var.i_data[0]
104: #define i_data2 i_var.i_data[1]
105:
106: /* Variant #1 */
107: #define i_seg i_data1 /* Segment identifier */
108: #define i_len i_var.i_data3 /* BLOCK length */
109: #define i_line i_data1 /* LINE number */
110: #define i_align i_data1 /* ALIGN information */
111: #define i_labno i_data1 /* LLABEL or JUMP label number */
112: #define i_op i_data1 /* CODE opcode */
113:
114: /* Variant #2 */
115: #define i_refc i_data2 /* Ref. count for labels */
116: #define i_pcseg i_data2 /* Segment for code */
117:
118: /* Variant #3 */
119: #define i_naddr i_data4 /* # of i_af entries */
120: #define i_long i_data4 /* Long jump flag */
121:
122: /*
123: * A table of these structures is indexed by opcode number
124: * (obtained from the 'opcode.h' header file).
125: * Each element holds information needed to assemble the instruction
126: * into either ascii assembler or binary code.
127: */
128: typedef struct opinfo {
129: char op_naddr; /* # of addresses */
130: char op_flag; /* Flags */
131: short op_opcode; /* Op code */
132: short op_style; /* Style, used by formatter */
133: } OPINFO;
134:
135: #define OP_JUMP 01 /* Some kind of jump */
136: #define OP_DD 02 /* Some kind of data pseudo-op */
137:
138: /*
139: * Functions and externals.
140: */
141: extern SYM *hash2[];
142: extern INS *getcode();
143: extern SYM *glookup();
144: extern char id[];
145: extern SYM *llookup();
146: extern ADDRESS dot;
147: extern int dotseg;
148: extern SEG seg[];
149: extern FILE *ofp;
150: extern FILE *ifp;
151: extern OPINFO opinfo[];
152: extern INS ins;
153: extern INS *newi();
154: extern INS *newn();
155: extern int line;
156: extern INS *getins();
157: extern int changes;
158: extern int nlabdel;
159: extern INS *deleteins();
160: extern int ndead;
161: extern int nbrbr;
162: extern int ncbrbr;
163: extern int nexbr;
164: extern int nbrnext;
165: extern int nxjump;
166: extern int ncomseq;
167: extern int nsimplify;
168: extern int nuseless;
169: #if !TINY
170: extern int vflag;
171: extern int xflag;
172: #endif
173: extern char file[];
174: extern char module[];
175: extern int nerr;
176: extern char *passname;
177: extern int labgen;
178:
179: #if OVERLAID
180: extern jmp_buf death;
181: #endif
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.