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