1 |
48 |
robfinch |
#ifndef _CGBLDEC_H
|
2 |
|
|
#define _CGBLDEC_H
|
3 |
|
|
|
4 |
|
|
// ============================================================================
|
5 |
|
|
// __
|
6 |
|
|
// \\__/ o\ (C) 2012-2018 Robert Finch, Waterloo
|
7 |
|
|
// \ __ / All rights reserved.
|
8 |
|
|
// \/_// robfinch<remove>@finitron.ca
|
9 |
|
|
// ||
|
10 |
|
|
//
|
11 |
|
|
// CC64 - 'C' derived language compiler
|
12 |
|
|
// - 64 bit CPU
|
13 |
|
|
//
|
14 |
|
|
// This source file is free software: you can redistribute it and/or modify
|
15 |
|
|
// it under the terms of the GNU Lesser General Public License as published
|
16 |
|
|
// by the Free Software Foundation, either version 3 of the License, or
|
17 |
|
|
// (at your option) any later version.
|
18 |
|
|
//
|
19 |
|
|
// This source file is distributed in the hope that it will be useful,
|
20 |
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of
|
21 |
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
22 |
|
|
// GNU General Public License for more details.
|
23 |
|
|
//
|
24 |
|
|
// You should have received a copy of the GNU General Public License
|
25 |
|
|
// along with this program. If not, see <http://www.gnu.org/licenses/>.
|
26 |
|
|
//
|
27 |
|
|
// ============================================================================
|
28 |
|
|
//
|
29 |
|
|
/* global ParseSpecifierarations */
|
30 |
|
|
#define THOR 0
|
31 |
|
|
#define TABLE888 888
|
32 |
|
|
#define RAPTOR64 64
|
33 |
|
|
#define W65C816 816
|
34 |
|
|
#define FISA64 164
|
35 |
|
|
#define DSD7 7
|
36 |
|
|
#define isThor (gCpu==THOR)
|
37 |
|
|
#define isTable888 (gCpu==TABLE888)
|
38 |
|
|
#define isRaptor64 (gCpu==RAPTOR64)
|
39 |
|
|
#define is816 (gCpu==W65C816)
|
40 |
|
|
#define isFISA64 (gCpu==FISA64)
|
41 |
|
|
#define isDSD7 (gCpu==DSD7)
|
42 |
|
|
//#define DOTRACE 1
|
43 |
|
|
#ifdef DOTRACE
|
44 |
|
|
#define TRACE(x) x
|
45 |
|
|
#else
|
46 |
|
|
#define TRACE(x)
|
47 |
|
|
#endif
|
48 |
|
|
|
49 |
|
|
extern CPU cpu;
|
50 |
|
|
extern int pass;
|
51 |
|
|
extern int maxPn;
|
52 |
|
|
extern int hook_predreg;
|
53 |
|
|
extern int gCpu;
|
54 |
|
|
extern int regGP;
|
55 |
|
|
extern int regTP;
|
56 |
|
|
extern int regSP;
|
57 |
|
|
extern int regFP;
|
58 |
|
|
extern int regLR;
|
59 |
|
|
extern int regXLR;
|
60 |
|
|
extern int regPC;
|
61 |
|
|
extern int regCLP;
|
62 |
|
|
extern int regPP;
|
63 |
|
|
extern int regZero;
|
64 |
|
|
extern int regFirstTemp;
|
65 |
|
|
extern int regLastTemp;
|
66 |
|
|
extern int regFirstRegvar;
|
67 |
|
|
extern int regLastRegvar;
|
68 |
|
|
extern int regFirstArg;
|
69 |
|
|
extern int regLastArg;
|
70 |
|
|
extern int pregGP;
|
71 |
|
|
extern int pregTP;
|
72 |
|
|
extern int pregSP;
|
73 |
|
|
extern int pregFP;
|
74 |
|
|
extern int pregLR;
|
75 |
|
|
extern int pregXLR;
|
76 |
|
|
extern int pregPC;
|
77 |
|
|
extern int pregCLP;
|
78 |
|
|
extern int pregPP;
|
79 |
|
|
extern int pregZero;
|
80 |
|
|
extern int pregFirstTemp;
|
81 |
|
|
extern int pregLastTemp;
|
82 |
|
|
extern int pregFirstRegvar;
|
83 |
|
|
extern int pregLastRegvar;
|
84 |
|
|
extern int pregFirstArg;
|
85 |
|
|
extern int pregLastArg;
|
86 |
|
|
extern int opt_vreg;
|
87 |
|
|
extern int farcode;
|
88 |
|
|
extern int wcharSupport;
|
89 |
|
|
extern int verbose;
|
90 |
|
|
extern int use_gp;
|
91 |
|
|
extern int address_bits;
|
92 |
|
|
extern std::ifstream *ifs;
|
93 |
|
|
extern txtoStream ofs;
|
94 |
|
|
extern txtoStream lfs;
|
95 |
|
|
extern txtoStream dfs;
|
96 |
|
|
extern int mangledNames;
|
97 |
|
|
extern int sizeOfWord;
|
98 |
|
|
extern int sizeOfPtr;
|
99 |
|
|
extern int sizeOfFP;
|
100 |
|
|
extern int sizeOfFPS;
|
101 |
|
|
extern int sizeOfFPT;
|
102 |
|
|
extern int sizeOfFPD;
|
103 |
|
|
extern int sizeOfFPQ;
|
104 |
|
|
extern int maxVL;
|
105 |
|
|
|
106 |
|
|
/*
|
107 |
|
|
extern FILE *input,
|
108 |
|
|
*list,
|
109 |
|
|
*output;
|
110 |
|
|
*/
|
111 |
|
|
extern FILE *outputG;
|
112 |
|
|
extern int incldepth;
|
113 |
|
|
extern int lineno;
|
114 |
|
|
extern int nextlabel;
|
115 |
|
|
extern int lastch;
|
116 |
|
|
extern int lastst;
|
117 |
|
|
extern char lastid[128];
|
118 |
|
|
extern char lastkw[128];
|
119 |
|
|
extern char laststr[MAX_STLP1];
|
120 |
|
|
extern int64_t ival;
|
121 |
|
|
extern double rval;
|
122 |
|
|
extern Float128 rval128;
|
123 |
|
|
extern char float_precision;
|
124 |
|
|
extern int parseEsc;
|
125 |
|
|
//extern FloatTriple FAC1,FAC2;
|
126 |
|
|
|
127 |
|
|
extern TABLE gsyms[257],
|
128 |
|
|
lsyms;
|
129 |
|
|
extern TABLE tagtable;
|
130 |
|
|
extern SYM *lasthead;
|
131 |
|
|
extern struct slit *strtab;
|
132 |
|
|
extern struct clit *casetab;
|
133 |
|
|
extern Float128 *quadtab;
|
134 |
|
|
extern int lc_static;
|
135 |
|
|
extern int lc_auto;
|
136 |
|
|
extern int lc_thread;
|
137 |
|
|
extern Statement *bodyptr; /* parse tree for function */
|
138 |
|
|
extern int global_flag;
|
139 |
|
|
extern TABLE defsyms;
|
140 |
|
|
extern int64_t save_mask; /* register save mask */
|
141 |
|
|
extern int64_t fpsave_mask;
|
142 |
|
|
extern int bsave_mask;
|
143 |
|
|
extern int uctran_off;
|
144 |
|
|
extern int isKernel;
|
145 |
|
|
extern int isPascal;
|
146 |
|
|
extern int isOscall;
|
147 |
|
|
extern int isInterrupt;
|
148 |
|
|
extern int isTask;
|
149 |
|
|
extern int isNocall;
|
150 |
|
|
extern bool isRegister;
|
151 |
|
|
extern int asmblock;
|
152 |
|
|
extern int optimize;
|
153 |
|
|
extern int opt_noregs;
|
154 |
|
|
extern int opt_nopeep;
|
155 |
|
|
extern int opt_noexpr;
|
156 |
|
|
extern int opt_nocgo;
|
157 |
|
|
extern int opt_size;
|
158 |
|
|
extern int exceptions;
|
159 |
|
|
extern int mixedSource;
|
160 |
|
|
extern Function *currentFn;
|
161 |
|
|
extern int iflevel;
|
162 |
|
|
extern int foreverlevel;
|
163 |
|
|
extern int looplevel;
|
164 |
|
|
extern int loopexit;
|
165 |
|
|
extern short int loop_active;
|
166 |
|
|
extern int stmtdepth;
|
167 |
|
|
extern int regmask;
|
168 |
|
|
extern int bregmask;
|
169 |
|
|
extern Statement *currentStmt;
|
170 |
|
|
extern bool dogen;
|
171 |
|
|
extern OCODE *peep_head;
|
172 |
|
|
extern OCODE *peep_tail;
|
173 |
|
|
|
174 |
|
|
extern TYP stdvoid;
|
175 |
|
|
extern TYP stdint;
|
176 |
|
|
extern TYP stduint;
|
177 |
|
|
extern TYP stdlong;
|
178 |
|
|
extern TYP stdulong;
|
179 |
|
|
extern TYP stdshort;
|
180 |
|
|
extern TYP stdushort;
|
181 |
|
|
extern TYP stdchar;
|
182 |
|
|
extern TYP stduchar;
|
183 |
|
|
extern TYP stdbyte;
|
184 |
|
|
extern TYP stdubyte;
|
185 |
|
|
extern TYP stdstring;
|
186 |
|
|
extern TYP stddbl;
|
187 |
|
|
extern TYP stdtriple;
|
188 |
|
|
extern TYP stdflt;
|
189 |
|
|
extern TYP stddouble;
|
190 |
|
|
extern TYP stdfunc;
|
191 |
|
|
extern TYP stdexception;
|
192 |
|
|
extern TYP stdconst;
|
193 |
|
|
extern TYP stdquad;
|
194 |
|
|
extern TYP stdvector;
|
195 |
|
|
extern TYP *stdvectormask;
|
196 |
|
|
|
197 |
|
|
extern std::string *declid;
|
198 |
|
|
extern Compiler compiler;
|
199 |
|
|
extern int64_t genst_cumulative;
|
200 |
|
|
|
201 |
|
|
extern int throwlab;
|
202 |
|
|
extern int breaklab;
|
203 |
|
|
extern int contlab;
|
204 |
|
|
extern int retlab;
|
205 |
|
|
extern int lastsph;
|
206 |
|
|
extern char *semaphores[20];
|
207 |
|
|
extern unsigned int ArgRegCount;
|
208 |
|
|
extern bool isFuncBody;
|
209 |
|
|
extern int isTypedef;
|
210 |
|
|
extern bool isUnion;
|
211 |
|
|
extern int isUnsigned;
|
212 |
|
|
extern int isSigned;
|
213 |
|
|
extern int isVolatile;
|
214 |
|
|
extern int isVirtual;
|
215 |
|
|
extern bool isInline;
|
216 |
|
|
extern int isIO;
|
217 |
|
|
extern int isConst;
|
218 |
|
|
extern bool isRegister;
|
219 |
|
|
extern bool isAuto;
|
220 |
|
|
extern bool isFuncBody;
|
221 |
|
|
extern bool isFuncPtr;
|
222 |
|
|
extern char *stkname;
|
223 |
|
|
extern int nparms;
|
224 |
|
|
extern int funcdecl;
|
225 |
|
|
extern Stringx names[20];
|
226 |
|
|
extern int isStructDecl;
|
227 |
|
|
extern int worstAlignment;
|
228 |
|
|
extern Map map;
|
229 |
|
|
extern int optimized;
|
230 |
|
|
|
231 |
|
|
// Analyze.c
|
232 |
|
|
extern short int csendx;
|
233 |
|
|
extern int equalnode(ENODE *node1, ENODE *node2);
|
234 |
|
|
extern int bsort(CSE **list);
|
235 |
|
|
// CMain.c
|
236 |
|
|
extern void closefiles();
|
237 |
|
|
|
238 |
|
|
extern void error(int n);
|
239 |
|
|
extern void needpunc(enum e_sym p,int);
|
240 |
|
|
// Memmgt.c
|
241 |
|
|
extern void *allocx(int);
|
242 |
|
|
extern char *xalloc(int);
|
243 |
|
|
extern SYM *allocSYM();
|
244 |
|
|
extern TYP *allocTYP();
|
245 |
|
|
extern Operand *allocOperand();
|
246 |
|
|
extern ENODE *allocEnode();
|
247 |
|
|
extern CSE *allocCSE();
|
248 |
|
|
extern void ReleaseGlobalMemory();
|
249 |
|
|
extern void ReleaseLocalMemory();
|
250 |
|
|
|
251 |
|
|
// NextToken.c
|
252 |
|
|
extern void initsym();
|
253 |
|
|
extern void NextToken();
|
254 |
|
|
extern int getch();
|
255 |
|
|
extern int my_isspace(char c);
|
256 |
|
|
extern void getbase(int64_t);
|
257 |
|
|
extern void SkipSpaces();
|
258 |
|
|
|
259 |
|
|
// Stmt.c
|
260 |
|
|
extern Statement *ParseCompoundStatement();
|
261 |
|
|
|
262 |
|
|
extern void GenerateDiadic(int op, int len, Operand *ap1,Operand *ap2);
|
263 |
|
|
// Symbol.c
|
264 |
|
|
extern SYM *gsearch(std::string na);
|
265 |
|
|
extern SYM *search(std::string na,TABLE *thead);
|
266 |
|
|
extern void insert(SYM* sp, TABLE *table);
|
267 |
|
|
|
268 |
|
|
// ParseFunction.c
|
269 |
|
|
extern SYM *BuildParameterList(SYM *sp, int *);
|
270 |
|
|
|
271 |
|
|
extern char *my_strdup(char *);
|
272 |
|
|
// Decl.c
|
273 |
|
|
extern int imax(int i, int j);
|
274 |
|
|
extern TYP *maketype(int bt, int siz);
|
275 |
|
|
extern void dodecl(int defclass);
|
276 |
|
|
extern int ParseParameterDeclarations(int);
|
277 |
|
|
extern void ParseAutoDeclarations(SYM *sym, TABLE *table);
|
278 |
|
|
extern int ParseSpecifier(TABLE *table);
|
279 |
|
|
extern SYM* ParseDeclarationPrefix(char isUnion);
|
280 |
|
|
extern int ParseStructDeclaration(int);
|
281 |
|
|
extern void ParseEnumerationList(TABLE *table);
|
282 |
|
|
extern int ParseFunction(SYM *sp);
|
283 |
|
|
extern int declare(SYM *sym,TABLE *table,int al,int ilc,int ztype);
|
284 |
|
|
extern void initstack();
|
285 |
|
|
extern int getline(int listflag);
|
286 |
|
|
extern void compile();
|
287 |
|
|
|
288 |
|
|
// Init.c
|
289 |
|
|
extern void doinit(SYM *sp);
|
290 |
|
|
// Func.c
|
291 |
|
|
extern SYM *makeint(char *);
|
292 |
|
|
extern void funcbody(SYM *sp);
|
293 |
|
|
// Intexpr.c
|
294 |
|
|
extern int64_t GetIntegerExpression(ENODE **p);
|
295 |
|
|
extern Float128 *GetFloatExpression(ENODE **pnode);
|
296 |
|
|
// Expr.c
|
297 |
|
|
extern SYM *makeStructPtr(std::string name);
|
298 |
|
|
extern ENODE *makenode(int nt, ENODE *v1, ENODE *v2);
|
299 |
|
|
extern ENODE *makeinode(int nt, int64_t v1);
|
300 |
|
|
extern ENODE *makesnode(int nt, std::string *v1, std::string *v2, int64_t i);
|
301 |
|
|
extern TYP *nameref(ENODE **node,int);
|
302 |
|
|
extern TYP *forcefit(ENODE **node1,TYP *tp1,ENODE **node2,TYP *tp2,bool);
|
303 |
|
|
extern TYP *expression(ENODE **node);
|
304 |
|
|
extern int IsLValue(ENODE *node);
|
305 |
|
|
extern Operand *GenerateExpression(ENODE *node, int flags, int size);
|
306 |
|
|
extern int GetNaturalSize(ENODE *node);
|
307 |
|
|
extern TYP *asnop(ENODE **node);
|
308 |
|
|
extern TYP *NonCommaExpression(ENODE **);
|
309 |
|
|
// Optimize.c
|
310 |
|
|
extern void opt_const(ENODE **node);
|
311 |
|
|
// GenerateStatement.c
|
312 |
|
|
//extern void GenerateFunction(Statement *stmt);
|
313 |
|
|
extern void GenerateIntoff(Statement *stmt);
|
314 |
|
|
extern void GenerateInton(Statement *stmt);
|
315 |
|
|
extern void GenerateStop(Statement *stmt);
|
316 |
|
|
extern void gen_regrestore();
|
317 |
|
|
extern Operand *make_direct(int i);
|
318 |
|
|
extern Operand *makereg(int r);
|
319 |
|
|
extern Operand *makevreg(int r);
|
320 |
|
|
extern Operand *makefpreg(int t);
|
321 |
|
|
extern Operand *makebreg(int r);
|
322 |
|
|
extern Operand *makepred(int r);
|
323 |
|
|
extern int popcnt(int64_t m);
|
324 |
|
|
// Outcode.c
|
325 |
|
|
extern void gen_strlab(char *s);
|
326 |
|
|
extern void dumplits();
|
327 |
|
|
extern int stringlit(char *s);
|
328 |
|
|
extern int quadlit(Float128 *f128);
|
329 |
|
|
extern void nl();
|
330 |
|
|
extern void seg(int sg, int algn);
|
331 |
|
|
extern void cseg();
|
332 |
|
|
extern void dseg();
|
333 |
|
|
extern void tseg();
|
334 |
|
|
//extern void put_code(int op, int len,Operand *aps, Operand *apd, Operand *);
|
335 |
|
|
extern void put_code(OCODE *);
|
336 |
|
|
extern char *put_label(int lab, char*, char*, char);
|
337 |
|
|
extern char *gen_label(int lab, char*, char*, char);
|
338 |
|
|
extern char *put_labels(char *);
|
339 |
|
|
extern char *opstr(int op);
|
340 |
|
|
// Peepgen.c
|
341 |
|
|
extern void MarkRemove(OCODE *ip);
|
342 |
|
|
extern int PeepCount(OCODE *);
|
343 |
|
|
extern void flush_peep();
|
344 |
|
|
extern void GenerateLabel(int labno);
|
345 |
|
|
extern void GenerateZeradic(int op);
|
346 |
|
|
extern void GenerateMonadic(int op, int len, Operand *ap1);
|
347 |
|
|
extern void GenerateMonadicNT(int op, int len, Operand *ap1);
|
348 |
|
|
extern void GenerateDiadic(int op, int len, Operand *ap1, Operand *ap2);
|
349 |
|
|
extern void GenerateDiadicNT(int op, int len, Operand *ap1, Operand *ap2);
|
350 |
|
|
extern void GenerateTriadic(int op, int len, Operand *ap1, Operand *ap2, Operand *ap3);
|
351 |
|
|
extern void Generate4adic(int op, int len, Operand *ap1, Operand *ap2, Operand *ap3, Operand *ap4);
|
352 |
|
|
// Gencode.c
|
353 |
|
|
extern Operand *make_label(int lab);
|
354 |
|
|
extern Operand *make_clabel(int lab);
|
355 |
|
|
extern Operand *make_immed(int64_t i);
|
356 |
|
|
extern Operand *make_indirect(int i);
|
357 |
|
|
extern Operand *make_offset(ENODE *node);
|
358 |
|
|
extern void swap_nodes(ENODE *node);
|
359 |
|
|
|
360 |
|
|
// IdentifyKeyword.c
|
361 |
|
|
extern int IdentifyKeyword();
|
362 |
|
|
// Preproc.c
|
363 |
|
|
extern int preprocess();
|
364 |
|
|
// CodeGenerator.c
|
365 |
|
|
extern Operand *make_indirect(int i);
|
366 |
|
|
extern Operand *make_indexed(int64_t o, int i);
|
367 |
|
|
extern Operand *make_indx(ENODE *node, int reg);
|
368 |
|
|
extern Operand *make_string(char *s);
|
369 |
|
|
extern void GenerateFalseJump(ENODE *node,int label, unsigned int);
|
370 |
|
|
extern void GenerateTrueJump(ENODE *node,int label, unsigned int);
|
371 |
|
|
extern char *GetNamespace();
|
372 |
|
|
extern char nmspace[20][100];
|
373 |
|
|
extern Operand *GenerateDereference(ENODE *, int, int, int);
|
374 |
|
|
extern void MakeLegalOperand(Operand *ap,int flags, int size);
|
375 |
|
|
extern void GenLoad(Operand *, Operand *, int size, int);
|
376 |
|
|
extern void GenStore(Operand *, Operand *, int size);
|
377 |
|
|
// List.c
|
378 |
|
|
extern void ListTable(TABLE *t, int i);
|
379 |
|
|
// Register.c
|
380 |
|
|
extern Operand *GetTempReg(int);
|
381 |
|
|
extern Operand *GetTempRegister();
|
382 |
|
|
extern Operand *GetTempTgtRegister();
|
383 |
|
|
extern Operand *GetTempBrRegister();
|
384 |
|
|
extern Operand *GetTempFPRegister();
|
385 |
|
|
extern Operand *GetTempVectorRegister();
|
386 |
|
|
extern Operand *GetTempVectorMaskRegister();
|
387 |
|
|
extern void ReleaseTempRegister(Operand *ap);
|
388 |
|
|
extern void ReleaseTempReg(Operand *ap);
|
389 |
|
|
extern int TempInvalidate(int *);
|
390 |
|
|
extern void TempRevalidate(int sp, int fsp);
|
391 |
|
|
extern int GetTempMemSpace();
|
392 |
|
|
extern bool IsArgumentReg(int);
|
393 |
|
|
extern Operand *GenerateFunctionCall(ENODE *node, int flags);
|
394 |
|
|
|
395 |
|
|
extern void GenerateFunction(SYM *sym);
|
396 |
|
|
extern void GenerateReturn(Statement *stmt);
|
397 |
|
|
|
398 |
|
|
extern Operand *GenerateBitfieldDereference(ENODE *node, int flags, int size);
|
399 |
|
|
extern Operand *GenerateBitfieldAssign(ENODE *node, int flags, int size);
|
400 |
|
|
extern void GenerateBitfieldInsert(Operand *ap1, Operand *ap2, int offset, int width);
|
401 |
|
|
|
402 |
|
|
// err.c
|
403 |
|
|
extern void fatal(char *str);
|
404 |
|
|
|
405 |
|
|
extern int tmpVarSpace();
|
406 |
|
|
extern void tmpFreeAll();
|
407 |
|
|
extern void tmpReset();
|
408 |
|
|
extern int tmpAlloc(int);
|
409 |
|
|
extern void tmpFree(int);
|
410 |
|
|
extern BasicBlock *basicBlocks[10000];
|
411 |
|
|
extern BasicBlock *sortedBlocks[10000];
|
412 |
|
|
extern Forest forest;
|
413 |
|
|
extern IGraph iGraph;
|
414 |
|
|
extern Instruction opl[];
|
415 |
|
|
extern BasicBlock *RootBlock;
|
416 |
|
|
extern BasicBlock *LastBlock;
|
417 |
|
|
extern Instruction *GetInsn(int);
|
418 |
|
|
|
419 |
|
|
#endif
|