Beautified (indented) compiler source tree
[fw/sdcc] / src / SDCCglobl.h
1 /* SDCCglobl.h - global macros etc required by all files */
2 #ifndef SDCCGLOBL_H
3 #define SDCCGLOBL_H
4 #include <memory.h>
5 #include <assert.h>
6 #include <stdlib.h>
7 #include <setjmp.h>
8 #include <stdio.h>
9
10 /*
11  * Define host port dependant constants etc.
12  */
13
14 #define DOS_DIR_SEPARATOR_CHAR      '\\'
15 #define DOS_DIR_SEPARATOR_STRING   "\\"
16 #define UNIX_DIR_SEPARATOR_CHAR    '/'
17 #define UNIX_DIR_SEPARATOR_STRING  "/"
18
19 #if defined(__BORLANDC__)       /* Borland Turbo C/Win32 Host */
20
21 #define NATIVE_WIN32            1
22 #define DIR_SEPARATOR_CHAR          DOS_DIR_SEPARATOR_CHAR
23 #define DIR_SEPARATOR_STRING        DOS_DIR_SEPARATOR_STRING
24
25 #elif defined(_MSC_VER)         /* Miscosoft VC6/Win32 Host */
26
27 #define NATIVE_WIN32            1
28 #include "sdcc_vc.h"
29 #define DIR_SEPARATOR_CHAR          DOS_DIR_SEPARATOR_CHAR
30 #define DIR_SEPARATOR_STRING        DOS_DIR_SEPARATOR_STRING
31
32 #elif defined(__MINGW32__)      /* MINGW32 DOS Host */
33
34 #define NATIVE_WIN32            1
35 #define DIR_SEPARATOR_CHAR          DOS_DIR_SEPARATOR_CHAR
36 #define DIR_SEPARATOR_STRING        DOS_DIR_SEPARATOR_STRING
37
38 #else /* Assume Un*x style system */
39
40 #include "sdccconf.h"
41 #define DIR_SEPARATOR_CHAR          UNIX_DIR_SEPARATOR_CHAR
42 #define DIR_SEPARATOR_STRING        UNIX_DIR_SEPARATOR_STRING
43
44 #endif // _MSC_VER
45
46 #include "SDCCerr.h"
47
48 #define SPACE ' '
49 #define ZERO  0
50
51 #define  MAX_FNAME_LEN  128
52 #define  MAX_REG_PARMS  1
53 typedef int bool;
54
55 #ifndef max
56 #define max(a,b) (a > b ? a : b)
57 #endif
58
59 #ifndef min
60 #define min(a,b) (a < b ? a : b)
61 #endif
62
63 #ifndef THROWS
64 #define THROWS
65 #define THROW_NONE  0
66 #define THROW_SRC   1
67 #define THROW_DEST  2
68 #define THROW_BOTH  3
69 #endif
70
71 /* size's in bytes  */
72 #define CHARSIZE    port->s.char_size
73 #define SHORTSIZE   port->s.short_size
74 #define INTSIZE     port->s.int_size
75 #define LONGSIZE    port->s.long_size
76 #define PTRSIZE     port->s.ptr_size
77 #define FPTRSIZE    port->s.fptr_size
78 #define GPTRSIZE    port->s.gptr_size
79 #define BITSIZE     port->s.bit_size
80 #define FLOATSIZE   port->s.float_size
81 #define MAXBASESIZE port->s.max_base_size
82
83
84 #define PRAGMA_SAVE        "SAVE"
85 #define PRAGMA_RESTORE     "RESTORE"
86 #define PRAGMA_NOINDUCTION "NOINDUCTION"
87 #define PRAGMA_NOINVARIANT "NOINVARIANT"
88 #define PRAGMA_NOLOOPREV   "NOLOOPREVERSE"
89 #define PRAGMA_INDUCTION   "INDUCTION"
90 #define PRAGMA_STACKAUTO   "STACKAUTO"
91 #define PRAGMA_NOJTBOUND   "NOJTBOUND"
92 #define PRAGMA_NOGCSE      "NOGCSE"
93 #define PRAGMA_NOOVERLAY   "NOOVERLAY"
94 #define PRAGMA_CALLEESAVES "CALLEE-SAVES"
95 #define PRAGMA_EXCLUDE     "EXCLUDE"
96 #define PRAGMA_NOREGPARMS  "NOREGPARMS"
97 #define  SMALL_MODEL 0
98 #define  LARGE_MODEL 1
99 #define  TRUE 1
100 #define  FALSE 0
101
102 #define MAX_TVAR 6
103 #define MAX_INLINEASM 4*1024
104 #define DEFPOOLSTACK(type,size)     \
105     type       *type##Pool        ; \
106     type *type##FreeStack [size]  ; \
107     int   type##StackPtr = 0      ;
108
109 #define PUSH(x,y)   x##FreeStack[x##StackPtr++] = y
110 #define PEEK(x)     x##FreeStack[x##StackPtr-1]
111 #define POP(type)   type##FreeStack[--type##StackPtr]
112 /* #define POP(x)    (x##StackPtr ? x##FreeStack[--x##StackPtr] :       \
113    (assert(x##StackPtr),0)) */
114 #ifdef UNIX
115 #define EMPTY(x)        (x##StackPtr <= 1 ? 1 : 0)
116 #else
117 #define EMPTY(x)        (x##StackPtr == 0 ? 1 : 0)
118 #endif
119
120
121 #define COPYTYPE(start,end,from) (end = getSpec (start = from))
122
123
124 /* generalpurpose stack related macros */
125 #define  STACK_DCL(stack,type,size)                   \
126          typedef  type  t_##stack   ;                 \
127          t_##stack   stack[size]    ;                 \
128          t_##stack   (*p_##stack) = stack + (size);   \
129
130 /* define extern stack */
131 #define EXTERN_STACK_DCL(stack,type,size)             \
132         typedef type t_##stack     ;                  \
133         extern t_##stack stack[size] ;                \
134         extern t_##stack *p_##stack;
135
136 #define  STACK_FULL(stack)    ((p_##stack) <= stack )
137 #define  STACK_EMPTY(stack)   ((p_##stack) >= (stack +      \
138                               sizeof(stack)/sizeof(*stack)) )
139
140 #define  STACK_PUSH_(stack,x) (*--p_##stack = (x))
141 #define  STACK_POP_(stack)    (*p_##stack++)
142
143 #define  STACK_PUSH(stack,x)  (STACK_FULL(stack)                  \
144                               ?((t_##stack)(long)(STACK_ERR(1)))  \
145                               : STACK_PUSH_(stack,x)              )
146
147 #define  STACK_POP(stack)     (STACK_EMPTY(stack)                 \
148                               ?((t_##stack)(long)(STACK_ERR(0)))  \
149                               : STACK_POP_(stack)                 )
150
151 #define  STACK_PEEK(stack)    (STACK_EMPTY(stack)                 \
152                               ?((t_##stack) NULL)                 \
153                               : *p_##stack                        )
154
155 #define  STACK_ERR(o)         ( o                                 \
156                               ? fprintf(stderr,"stack Overflow\n")\
157                               : fprintf(stderr,"stack underflow\n"))
158
159 /* optimization options */
160 struct optimize
161   {
162     unsigned global_cse:1;
163     unsigned ptrArithmetic:1;
164     unsigned label1:1;
165     unsigned label2:1;
166     unsigned label3:1;
167     unsigned label4:1;
168     unsigned loopInvariant:1;
169     unsigned loopInduction:1;
170     unsigned noJTabBoundary:1;
171     unsigned noLoopReverse:1;
172   };
173
174 /** Build model.
175     Used in options.model.A bit each as port.supported_models is an OR
176     of these. 
177 */
178 enum
179   {
180     MODEL_SMALL = 1,
181     MODEL_COMPACT = 2,
182     MODEL_MEDIUM = 4,
183     MODEL_LARGE = 8,
184     MODEL_FLAT24 = 16
185   };
186
187 /* other command line options */
188 struct options
189   {
190     int model;                  /* see MODEL_* defines above */
191     int stackAuto:3;            /* Stack Automatic  */
192     int useXstack:3;            /* use Xternal Stack */
193     int stack10bit:3;           /* use 10 bit stack (flat24 model only) */
194     int genericPtr:1;           /* use generic pointers */
195     int regExtend:1;            /* don't use extended registers */
196     int dump_raw:1;             /* dump after intermediate code generation */
197     int dump_gcse:1;            /* dump after gcse */
198     int dump_loop:1;            /* dump after loop optimizations */
199     int dump_kill:1;            /* dump after dead code elimination */
200     int dump_range:1;           /* dump after live range analysis */
201     int dump_pack:1;            /* dump after register packing */
202     int dump_rassgn:1;          /* dump after register assignment */
203     int cc_only:1;              /* compile only flag              */
204     int intlong_rent:1;         /* integer & long support routines reentrant */
205     int float_rent:1;           /* floating point routines are reentrant */
206     int out_fmt:1;              /* 1 = motorola S19 format 0 = intel Hex format */
207     int cyclomatic:1;           /* print cyclomatic information */
208     int noOverlay:1;            /* don't overlay local variables & parameters */
209     int mainreturn:1;           /* issue a return after main */
210     int nopeep:1;               /* no peep hole optimization */
211     int asmpeep:1;              /* pass inline assembler thru peep hole */
212     int debug:1;                /* generate extra debug info */
213     int nodebug:1;              /* Generate no debug info. */
214     int stackOnData:1;          /* stack after data segment  */
215     int noregparms:1;           /* do not pass parameters in registers */
216     int c1mode:1;               /* Act like c1 - no pre-proc, asm or link */
217     char *peep_file;            /* additional rules for peep hole */
218     char *out_name;             /* Asm output name for c1 mode */
219     int nostdlib:1;             /* Don't use standard lib files */
220     int nostdinc:1;             /* Don't use standard include files */
221     int verbose:1;              /* Show what the compiler is doing */
222     int ANSIint:1;              /* Use ANSI integer promotion rules in expressions. */
223
224     char *calleeSaves[128];     /* list of functions using callee save */
225     char *excludeRegs[32];      /* registers excluded from saving */
226
227     /* starting address of the segments */
228     int xstack_loc;             /* initial location of external stack */
229     int stack_loc;              /* initial value of internal stack pointer */
230     int xdata_loc;              /* xternal ram starts at address */
231     int data_loc;               /* interram start location       */
232     int idata_loc;              /* indirect address space        */
233     int code_loc;               /* code location start           */
234     int iram_size;              /* internal ram size (used only for error checking) */
235   };
236
237 /* forward definition for variables accessed globally */
238 extern char *currFname;
239 extern char *srcFileName;       /* source file name without the extenstion */
240 extern char *moduleName;        /* source file name without path & extension */
241 extern int currLineno;          /* current line number    */
242 extern int yylineno;            /* line number of the current file SDCC.lex */
243 extern FILE *yyin;              /* */
244 extern FILE *asmFile;           /* assembly output file */
245 extern FILE *cdbFile;           /* debugger symbol file */
246 extern int NestLevel;           /* NestLevel                 SDCC.y   */
247 extern int stackPtr;            /* stack pointer             SDCC.y   */
248 extern int xstackPtr;           /* external stack pointer    SDCC.y   */
249 extern int reentrant;           /* /X flag has been sent     SDCC.y */
250 extern char buffer[];           /* general buffer      SDCCgen.c   */
251 extern int currRegBank;         /* register bank being used   SDCCgens.c   */
252 extern struct symbol *currFunc; /* current function    SDCCgens.c */
253 extern int cNestLevel;          /* block nest level  SDCCval.c      */
254 extern int currBlockno;         /* sequentail block number */
255 extern struct optimize optimize;
256 extern struct options options;
257 extern int maxInterrupts;
258
259 /* Visible from SDCCmain.c */
260 extern int nrelFiles;
261 extern char *relFiles[128];
262 extern char *libFiles[128];
263 extern int nlibFiles;
264
265 /*
266    void buildCmdLine(char *into, char **args, const char **cmds, 
267    const char *p1, const char *p2, 
268    const char *p3, const char **list);
269    int my_system (const char *cmd, char **cmd_argv);
270  */
271
272 void parseWithComma (char **, char *);
273
274 /** Creates a temporary file a'la tmpfile which avoids the bugs
275     in cygwin wrt c:\tmp.
276     Scans, in order: TMP, TEMP, TMPDIR, else uses tmpfile().
277 */
278 FILE *tempfile (void);
279
280 /** Creates a duplicate of the string 'sz' a'la strdup but using
281     libgc.
282 */
283 char *gc_strdup (const char *sz);
284
285 /** An assert() macro that will go out through sdcc's error
286     system.
287 */
288 #define wassertl(a,s)   ((a) ? 0 : \
289         (werror (E_INTERNAL_ERROR,__FILE__,__LINE__, s), 0))
290
291 #define wassert(a)    wassertl(a,"code generator internal error")
292
293
294 #endif