b286ac161d12cd32ff58a82d33bb2af2d8b4b365
[fw/sdcc] / debugger / mcs51 / sdcdb.h
1 /*-------------------------------------------------------------------------
2   sdcdb.h - Header file used by ALL source files for the debugger
3         Written By -  Sandeep Dutta . sandeep.dutta@usa.net (1999)
4
5    This program is free software; you can redistribute it and/or modify it
6    under the terms of the GNU General Public License as published by the
7    Free Software Foundation; either version 2, or (at your option) any
8    later version.
9
10    This program is distributed in the hope that it will be useful,
11    but WITHOUT ANY WARRANTY; without even the implied warranty of
12    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
13    GNU General Public License for more details.
14
15    You should have received a copy of the GNU General Public License
16    along with this program; if not, write to the Free Software
17    Foundation, 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
18
19    In other words, you are welcome to use, share and improve this program.
20    You are forbidden to forbid anyone else to use, share and improve
21    what you give them.   Help stamp out software-hoarding!
22 -------------------------------------------------------------------------*/
23
24 #ifndef  SDCDB_H
25 #define  SDCDB_H
26
27 #define SDCDB_DEBUG
28
29 #ifdef SDCDB_DEBUG
30 // set D_x to 0 to turn off, 1 to turn on.
31 #define D_break  0x01
32 #define D_simi   0x02
33 #define D_sdcdb  0x04
34 #define D_symtab 0x08
35
36 extern int sdcdbDebug;
37
38 #define Dprintf(f, fs) {if (f & sdcdbDebug) printf fs ; }
39 #else
40 #define Dprintf(f, fs) { }
41 #endif
42
43 #include <stdio.h>
44 #include <stdlib.h>
45 #include <string.h>
46 #include <ctype.h>
47 #include <limits.h>
48 #include "config.h"
49 #include "src/SDCCset.h"
50 #include "src/SDCChasht.h"
51
52 #define TRUE 1
53 #define FALSE !TRUE
54
55 typedef short bool;
56
57 #ifndef max
58 #define max(a,b) (a > b ? a : b)
59 #endif
60
61 #ifndef min
62 #define min(a,b) (a < b ? a : b)
63 #endif
64
65 /*
66  * #ifndef ALLOC
67  * #define  ALLOC(x,sz) if (!(x = calloc(1, sz)))                       \
68  *          {                                                           \
69  *             fprintf(stderr,"sdcdb: out of memory\n");                \
70  *             exit (1);                                                \
71  *          }
72  * #endif
73  * #ifndef ALLOC_ATOMIC
74  * #define ALLOC_ATOMIC(x,sz)   if (!(x = calloc(1, sz)))   \
75  *          {                                               \
76  *             fprintf(stderr,"sdcdb: out of memory\n");    \
77  *             exit (1);                                    \
78  *          }
79  * #endif
80  */
81
82 /* generalpurpose stack related macros */
83 #define  STACK_DCL(stack,type,size)                   \
84          typedef  type  t_##stack   ;                 \
85          t_##stack   stack[size]    ;                 \
86          t_##stack   (*p_##stack) = stack + (size);   \
87          t_##stack   (*w_##stack)   ;
88
89 /* define extern stack */
90 #define EXTERN_STACK_DCL(stack,type,size)             \
91         typedef type t_##stack     ;                  \
92         extern t_##stack stack[size] ;                \
93         extern t_##stack *p_##stack;                  \
94         extern t_##stack *w_##stack;
95
96 #define  STACK_FULL(stack)    ((p_##stack) <= stack )
97 #define  STACK_EMPTY(stack)   ((p_##stack) >= (stack +      \
98                               sizeof(stack)/sizeof(*stack)) )
99
100 #define  STACK_PUSH_(stack,x) (*--p_##stack = (x))
101 #define  STACK_POP_(stack)    (*p_##stack++)
102
103 #define  STACK_PUSH(stack,x)  (STACK_FULL(stack)                  \
104                               ?((t_##stack)(long)(STACK_ERR(1)))  \
105                               : STACK_PUSH_(stack,x)              )
106
107 #define  STACK_POP(stack)     (STACK_EMPTY(stack)                 \
108                               ?((t_##stack) NULL)  \
109                               : STACK_POP_(stack)                 )
110
111 #define  STACK_PEEK(stack)    (STACK_EMPTY(stack)                 \
112                               ?((t_##stack) NULL)                 \
113                               : *p_##stack                        )
114
115 #define  STACK_PPEEK(stack)    (((p_##stack + 1) >= (stack +      \
116                               sizeof(stack)/sizeof(*stack)))      \
117                               ?((t_##stack) NULL)                 \
118                               : *(p_##stack + 1)                  )
119
120 #define  STACK_ERR(o)         ( o                                 \
121                               ? fprintf(stderr,"stack Overflow\n")\
122                               : fprintf(stderr,"stack underflow\n"))
123
124 #define  STACK_STARTWALK(stack)   (w_##stack = p_##stack)
125
126 #define  STACK_WALK(stack)    (w_##stack >= (stack + sizeof(stack)/sizeof(*stack)) \
127                                ? NULL : *w_##stack++ )
128
129 #include "src/SDCCbitv.h"
130
131 enum {
132     SYM_REC = 1,
133     LNK_REC ,
134     FUNC_REC ,
135     STRUCT_REC,
136     MOD_REC
137 };
138
139 enum {
140     FMT_NON =  0,
141     FMT_BIN =  1,
142     FMT_OCT =  2,
143     FMT_DEZ =  3,
144     FMT_HEX =  4
145 };
146
147 enum { SRC_CMODE = 1, SRC_AMODE };
148
149 /*-----------------------------------------------------------------*/
150 /*                         source line structure                   */
151 /*-----------------------------------------------------------------*/
152 typedef struct srcLine
153 {
154     unsigned addr     ;
155     short block, level; /* scope information */
156     char     *src ;
157
158 } srcLine ;
159
160 /*-----------------------------------------------------------------*/
161 /*                     structure for cdb record                    */
162 /*-----------------------------------------------------------------*/
163 typedef struct  cdbrecs {
164     char type ;               /* type of line */
165     char *line;               /* contents of line */
166     struct cdbrecs *next;     /* next in chain */
167 } cdbrecs ;
168
169 /*-----------------------------------------------------------------*/
170 /*                     module definition                           */
171 /*-----------------------------------------------------------------*/
172 typedef struct module {
173     char *cfullname ;        /* full name Includeing path for the module */
174     char *afullname;         /* fullname of assembly file */
175     char *name ;             /* name of module */
176     char *c_name;            /* c filename     */
177     char *asm_name;          /* asm file name  */
178     int   ncLines;           /* number of lines in this module */
179     int   nasmLines;         /* # of lines in the assembler file */
180     srcLine  **cLines;       /* actual source lines */
181     srcLine  **asmLines;     /* actual assembler source lines*/
182     set       *cfpoints;     /* set of double line execution points */
183 } module;
184
185 /*-----------------------------------------------------------------*/
186 /*            execution point definition                           */
187 /*-----------------------------------------------------------------*/
188 typedef struct exePoint
189 {
190     unsigned addr  ;
191     int      line  ;
192     short    block , level ;
193 } exePoint ;
194
195 /*-----------------------------------------------------------------*/
196 /*                   definition for a function                     */
197 /*-----------------------------------------------------------------*/
198 typedef struct function {
199     struct symbol  *sym     ;/* pointer to symbol for function */
200     char           *modName ;/* module name */
201     module         *mod     ;/* module for this function */
202     int        entryline    ;/* first line in the function */
203     int        aentryline   ;
204     int        exitline     ;/* last line in the function  */
205     int        aexitline    ;
206     set       *cfpoints     ;/* set of all C execution points in func   */
207     set       *afpoints     ;/* set of all ASM execution points in func */
208     unsigned   int laddr    ;/* last executed address                   */
209     int        lline        ;/* last executed linenumber                */
210     unsigned   int stkaddr  ;/* stackpointer at beginning of function
211                               * (not reentrant ! ) only actual */
212 } function ;
213
214 /*-----------------------------------------------------------------*/
215 /*                  link record defintion                          */
216 /*-----------------------------------------------------------------*/
217 typedef struct linkrec {
218     char type;        /* type of linker rec */
219     unsigned addr ;   /* address specified by the linker rec */
220     char *name    ;   /* name specified by linker rec */
221 } linkrec;
222
223 /*-----------------------------------------------------------------*/
224 /*                       program context                           */
225 /*-----------------------------------------------------------------*/
226 typedef struct context {
227     function *func;           /* current function we are in */
228     char     *modName;        /* name of the module         */
229     unsigned int addr ;       /* current pc                 */
230     int      cline ;          /* current c line number      */
231     int      asmline;         /* current asm line number    */
232     int      block ;          /* current block number       */
233     int      level ;          /* current level number       */
234 } context ;
235
236 /*-----------------------------------------------------------------*/
237 /*                     symbol display information                  */
238 /*-----------------------------------------------------------------*/
239 typedef struct _dsymbol
240 {
241     char *name;
242     int  dnum;
243     int  fmt;
244     char *rs;
245 } dsymbol;
246
247
248 extern cdbrecs *recsRoot ;
249 extern context *currCtxt ;
250 extern set *modules  ; /* set of modules   */
251 extern set *functions; /* set of functions */
252 extern set *symbols  ; /* set of symbols */
253 extern set *sfrsymbols;/* set of symbols of sfr or sbit */
254 extern set *dispsymbols; /* set of displayable symbols */
255
256
257 extern char *currModName ;
258 extern char userinterrupt ;
259 extern char nointerrupt ;
260 extern short showfull ;
261 extern int nStructs ;
262 extern struct structdef **structs ; /* all structures */
263 extern char *ssdirl; /* source directory search path */
264 void **resize (void **, int );
265 char  *alloccpy(char *,int );
266 char *gc_strdup(const char *s);
267 srcLine **loadFile (char *name, int *nlines);
268
269 extern short fullname;
270 extern int srcMode;
271 extern char contsim;
272 char *searchDirsFname (char *);
273 char *getNextCmdLine(void );
274 void setCmdLine( char * );
275 void stopCommandList( void );
276
277 /* trimming functions */
278 extern char *trim_left(char *s);
279 extern char *trim_right(char *s);
280 extern char *trim(char *s);
281
282 #endif