4 /*************************************************************
9 *************************************************************/
11 int cdbOpenFile (const char *file
);
12 int cdbCloseFile (void);
13 int cdbWriteFunction (symbol
*pSym
, iCode
*ic
);
14 int cdbWriteEndFunction (symbol
*pSym
, iCode
*ic
, int offset
);
15 int cdbWriteLabel (symbol
*pSym
, const iCode
*ic
);
16 int cdbWriteScope (iCode
*ic
);
17 int cdbWriteSymbol (symbol
*pSym
);
18 int cdbWriteType (structdef
*sdef
, int block
, int inStruct
, const char *tag
);
19 int cdbWriteModule (const char *name
);
20 int cdbWriteCLine (iCode
*ic
);
21 int cdbWriteALine (const char *module
, int Line
);
22 int cdbWriteFrameAddress (const char *variable
, struct reg_info
*reg
, int offset
);
23 int cdbWriteBasicSymbol (symbol
*sym
, int isStructSym
, int isFunc
);
24 void cdbTypeInfo (sym_link
* type
);
27 DEBUGFILE cdbDebugFile
=
43 FILE *cdbFilePtr
= NULL
;
44 const char *cdbModuleName
= NULL
;
46 /******************************************************************
47 * spacesToUnderscores - replace all non alpha-numerics with
51 *****************************************************************/
54 spacesToUnderscores (char *dest
, const char *src
, size_t len
)
59 assert (dest
!= NULL
);
64 for (p
= dest
, i
= 0; *src
!= '\0' && i
< len
; ++src
, ++i
) {
65 *p
++ = (isspace ((unsigned char)*src
) || (*src
== '-')) ? '_' : *src
;
73 /******************************************************************
78 *****************************************************************/
81 cdbOpenFile (const char *file
)
83 if (getenv ("SDCC_DEBUG_FUNCTION_POINTERS"))
84 fprintf (stderr
, "cdbFile.c:cdbOpenFile (%s)\n", file
);
86 return (cdbFilePtr
= fopen(file
, "w")) ? 1 : 0;
89 /******************************************************************
94 *****************************************************************/
98 if (getenv("SDCC_DEBUG_FUNCTION_POINTERS"))
99 fprintf (stderr
, "cdbFile.c:cdbCloseFile()\n");
101 if(!cdbFilePtr
) return 0;
105 cdbModuleName
= NULL
;
110 /******************************************************************
115 *****************************************************************/
118 cdbWriteFunction (symbol
*pSym
, iCode
*ic
)
120 char debugSym
[INITIAL_INLINEASM
];
122 if (getenv ("SDCC_DEBUG_FUNCTION_POINTERS"))
123 fprintf (stderr
, "cdbFile.c:cdbWriteFunction()\n");
125 if (!cdbFilePtr
) return 0;
127 if (IS_STATIC (pSym
->etype
))
128 sprintf (debugSym
, "F%s$%s$0$0", moduleName
, pSym
->name
);
130 sprintf (debugSym
, "G$%s$0$0", pSym
->name
);
131 emitDebuggerSymbol (debugSym
);
133 return cdbWriteBasicSymbol (pSym
, FALSE
, TRUE
);
136 /******************************************************************
141 *****************************************************************/
144 cdbWriteEndFunction (symbol
*pSym
, iCode
*ic
, int offset
)
146 char debugSym
[INITIAL_INLINEASM
];
148 if (getenv ("SDCC_DEBUG_FUNCTION_POINTERS"))
149 fprintf (stderr
, "cdbFile.c:cdbWriteEndFunction()\n");
151 if (!cdbFilePtr
) return 0;
155 sprintf (debugSym
, "C$%s$%d$%ld_%ld$%d",
156 FileBaseName (ic
->filename
), pSym
->lastLine
,
157 ic
->level
/ LEVEL_UNIT
, ic
->level
% LEVEL_UNIT
, ic
->block
);
158 spacesToUnderscores (debugSym
, debugSym
, sizeof (debugSym
));
159 emitDebuggerSymbol (debugSym
);
162 if (IS_STATIC (pSym
->etype
))
163 sprintf (debugSym
, "XF%s$%s$0$0", moduleName
, pSym
->name
);
165 sprintf (debugSym
, "XG$%s$0$0", pSym
->name
);
166 emitDebuggerSymbol (debugSym
);
171 /******************************************************************
176 *****************************************************************/
179 cdbWriteLabel (symbol
*pSym
, const iCode
*ic
)
181 if (getenv ("SDCC_DEBUG_FUNCTION_POINTERS"))
182 fprintf (stderr
, "cdbFile.c:cdbWriteLabel()\n");
184 if (!cdbFilePtr
) return 0;
189 /******************************************************************
194 *****************************************************************/
197 cdbWriteScope (iCode
*ic
)
199 if (getenv ("SDCC_DEBUG_FUNCTION_POINTERS"))
200 fprintf (stderr
, "cdbFile.c:cdbWriteScope()\n");
202 if (!cdbFilePtr
) return 0;
207 /******************************************************************
212 *****************************************************************/
215 cdbWriteSymbol(symbol
*pSym
)
217 if (getenv ("SDCC_DEBUG_FUNCTION_POINTERS"))
218 fprintf (stderr
, "cdbFile.c:cdbWriteSymbol()\n");
220 if (!cdbFilePtr
) return 0;
222 return cdbWriteBasicSymbol(pSym
, FALSE
, FALSE
);
225 /******************************************************************
230 *****************************************************************/
233 cdbWriteType (structdef
*sdef
, int block
, int inStruct
, const char *tag
)
237 if (getenv ("SDCC_DEBUG_FUNCTION_POINTERS"))
238 fprintf (stderr
, "cdbFile.c:cdbWriteType()\n");
240 if (!cdbFilePtr
) return 0;
242 fprintf (cdbFilePtr
, "T:");
244 /* if block # then must have function scope */
245 fprintf (cdbFilePtr
, "F%s$", moduleName
);
247 fprintf (cdbFilePtr
, "%s[", (tag
? tag
: sdef
->tag
));
249 for (sym
= sdef
->fields
; sym
; sym
= sym
->next
)
251 fprintf (cdbFilePtr
, "({%d}", sym
->offset
);
252 cdbWriteBasicSymbol (sym
, TRUE
, FALSE
);
253 fprintf (cdbFilePtr
, ")");
256 fprintf (cdbFilePtr
, "]");
259 fprintf (cdbFilePtr
, "\n");
264 /******************************************************************
269 *****************************************************************/
272 cdbWriteModule(const char *name
)
274 if (getenv ("SDCC_DEBUG_FUNCTION_POINTERS"))
275 fprintf (stderr
, "cdbFile.c:cdbWriteModule()\n");
277 if (!cdbFilePtr
) return 0;
278 cdbModuleName
= name
;
280 fprintf(cdbFilePtr
, "M:%s\n", cdbModuleName
);
285 /******************************************************************
290 *****************************************************************/
292 cdbWriteCLine (iCode
*ic
)
294 char debugSym
[INITIAL_INLINEASM
];
296 if (!cdbFilePtr
) return 0;
301 sprintf (debugSym
, "C$%s$%d$%ld_%ld$%d",
302 FileBaseName (ic
->filename
), ic
->lineno
,
303 ic
->level
/ LEVEL_UNIT
, ic
->level
% LEVEL_UNIT
, ic
->block
);
304 spacesToUnderscores (debugSym
, debugSym
, sizeof (debugSym
));
305 emitDebuggerSymbol (debugSym
);
310 /******************************************************************
315 *****************************************************************/
318 cdbWriteALine (const char *module
, int Line
)
320 if (!cdbFilePtr
) return 0;
325 /******************************************************************
330 *****************************************************************/
333 cdbWriteFrameAddress (const char *variable
, struct reg_info
*reg
, int offset
)
335 if (getenv ("SDCC_DEBUG_FUNCTION_POINTERS"))
336 fprintf (stderr
, "cdbFile.c:cdbWriteFrameAddress()\n");
338 if (!cdbFilePtr
) return 0;
343 /******************************************************************
348 *****************************************************************/
351 cdbWriteBasicSymbol (symbol
*sym
, int isStructSym
, int isFunc
)
356 if (getenv ("SDCC_DEBUG_FUNCTION_POINTERS"))
357 fprintf (stderr
, "cdbFile.c:cdbWriteBasicSymbol()\n");
359 if (!cdbFilePtr
) return 0;
363 /* WRITE HEADER, Function or Symbol */
365 fprintf (cdbFilePtr
, "F:");
367 fprintf (cdbFilePtr
, "S:");
369 /* STRUCTS do not have scope info.. */
373 if (sym
->level
&& sym
->localof
) /* symbol is local */
375 fprintf (cdbFilePtr
, "L%s.%s$", moduleName
, sym
->localof
->name
);
377 else if (IS_STATIC (sym
->etype
)) /* scope is file */
379 fprintf (cdbFilePtr
, "F%s$", moduleName
);
381 else /* scope is global */
383 fprintf (cdbFilePtr
, "G$");
388 fprintf (cdbFilePtr
, "S$"); /* scope is structure */
391 /* print the name, & mangled name */
392 fprintf (cdbFilePtr
, "%s$%ld_%ld$%d(", sym
->name
, sym
->level
/ LEVEL_UNIT
, sym
->level
% LEVEL_UNIT
, sym
->block
);
394 cdbTypeInfo (sym
->type
);
396 fprintf (cdbFilePtr
, "),");
398 /* CHECK FOR REGISTER SYMBOL... */
399 if (!sym
->allocreq
&& sym
->reqv
)
402 symbol
*TempSym
= OP_SYMBOL (sym
->reqv
);
404 if (!TempSym
->isspilt
|| TempSym
->remat
)
406 fprintf (cdbFilePtr
, "R,0,0,[");
408 for (a
= 0; a
< 4; a
++)
410 if (TempSym
->regs
[a
])
412 fprintf (cdbFilePtr
, "%s%s", port
->getRegName(TempSym
->regs
[a
]),
413 ((a
< 3) && (TempSym
->regs
[a
+1])) ? "," : "");
417 fprintf (cdbFilePtr
, "]");
422 sym2
= TempSym
->usl
.spillLoc
;
432 /* print the address space */
433 map
= SPEC_OCLS (sym2
->etype
);
435 fprintf (cdbFilePtr
, "%c,%d,%d",
436 (map
? map
->dbName
: 'Z'), sym2
->onStack
, SPEC_STAK (sym2
->etype
));
439 /* if assigned to registers then output register names */
440 /* if this is a function then print
441 if is it an interrupt routine & interrupt number
442 and the register bank it is using */
444 fprintf (cdbFilePtr
, ",%d,%d,%d", FUNC_ISISR (sym
->type
),
445 FUNC_INTNO (sym
->type
), FUNC_REGBANK (sym
->type
));
447 /* alternate location to find this symbol @ : eg registers
451 fprintf (cdbFilePtr
, "\n");
456 /******************************************************************
461 *****************************************************************/
463 /*-----------------------------------------------------------------*/
464 /* cdbTypeInfo - print the type information for debugger */
465 /*-----------------------------------------------------------------*/
467 cdbTypeInfo (sym_link
* type
)
469 fprintf (cdbFilePtr
, "{%d}", getSize (type
));
475 switch (DCL_TYPE (type
))
477 case FUNCTION
: fprintf (cdbFilePtr
, "DF,"); break;
478 case GPOINTER
: fprintf (cdbFilePtr
, "DG,"); break;
479 case CPOINTER
: fprintf (cdbFilePtr
, "DC,"); break;
480 case FPOINTER
: fprintf (cdbFilePtr
, "DX,"); break;
481 case POINTER
: fprintf (cdbFilePtr
, "DD,"); break;
482 case IPOINTER
: fprintf (cdbFilePtr
, "DI,"); break;
483 case PPOINTER
: fprintf (cdbFilePtr
, "DP,"); break;
484 case EEPPOINTER
: fprintf (cdbFilePtr
, "DA,"); break;
485 case ARRAY
: fprintf (cdbFilePtr
, "DA%ud,", (unsigned int) DCL_ELEM (type
)); break;
491 switch (SPEC_NOUN (type
))
495 fprintf (cdbFilePtr
, "SL");
497 fprintf (cdbFilePtr
, "SI");
500 case V_CHAR
: fprintf (cdbFilePtr
, "SC"); break;
501 case V_VOID
: fprintf (cdbFilePtr
, "SV"); break;
502 case V_FLOAT
: fprintf (cdbFilePtr
, "SF"); break;
503 case V_FIXED16X16
: fprintf(cdbFilePtr
, "SQ"); break;
505 fprintf (cdbFilePtr
, "ST%s", SPEC_STRUCT (type
)->tag
);
508 case V_SBIT
: fprintf (cdbFilePtr
, "SX"); break;
511 fprintf (cdbFilePtr
, "SB%d$%d", SPEC_BSTR (type
),
518 fputs (":", cdbFilePtr
);
519 if (SPEC_USIGN (type
))
520 fputs ("U", cdbFilePtr
);
522 fputs ("S", cdbFilePtr
);