[ucsim] Intro -U, -u options and configurable NL in UART display
[sdcc.git] / sdcc / src / cdbFile.c
blobbda35eb00adb11a8c7e8eb8663e0aa05809cef5e
1 #include "common.h"
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 =
29 &cdbOpenFile,
30 &cdbCloseFile,
31 &cdbWriteModule,
32 &cdbWriteFunction,
33 &cdbWriteEndFunction,
34 &cdbWriteLabel,
35 &cdbWriteScope,
36 &cdbWriteSymbol,
37 &cdbWriteType,
38 &cdbWriteCLine,
39 &cdbWriteALine,
40 &cdbWriteFrameAddress
43 FILE *cdbFilePtr = NULL;
44 const char *cdbModuleName = NULL;
46 /******************************************************************
47 * spacesToUnderscores - replace all non alpha-numerics with
48 * underscores
51 *****************************************************************/
53 static char *
54 spacesToUnderscores (char *dest, const char *src, size_t len)
56 unsigned int i;
57 char *p;
59 assert (dest != NULL);
60 assert (src != NULL);
61 assert (len > 0);
63 --len;
64 for (p = dest, i = 0; *src != '\0' && i < len; ++src, ++i) {
65 *p++ = (isspace ((unsigned char)*src) || (*src == '-')) ? '_' : *src;
67 *p = '\0';
69 return dest;
73 /******************************************************************
78 *****************************************************************/
80 int
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 *****************************************************************/
95 int
96 cdbCloseFile (void)
98 if (getenv("SDCC_DEBUG_FUNCTION_POINTERS"))
99 fprintf (stderr, "cdbFile.c:cdbCloseFile()\n");
101 if(!cdbFilePtr) return 0;
103 fclose(cdbFilePtr);
104 cdbFilePtr = NULL;
105 cdbModuleName = NULL;
107 return 1;
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);
129 else
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;
153 if (ic)
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);
164 else
165 sprintf (debugSym, "XG$%s$0$0", pSym->name);
166 emitDebuggerSymbol (debugSym);
168 return 1;
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;
186 return 1;
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;
204 return 1;
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)
235 symbol *sym;
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, "]");
258 if (!inStruct)
259 fprintf (cdbFilePtr, "\n");
261 return 1;
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);
282 return 1;
285 /******************************************************************
290 *****************************************************************/
292 cdbWriteCLine (iCode *ic)
294 char debugSym[INITIAL_INLINEASM];
296 if (!cdbFilePtr) return 0;
298 if (ic->inlined)
299 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);
307 return 1;
310 /******************************************************************
315 *****************************************************************/
318 cdbWriteALine (const char *module, int Line)
320 if (!cdbFilePtr) return 0;
322 return 1;
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;
340 return 1;
343 /******************************************************************
348 *****************************************************************/
351 cdbWriteBasicSymbol (symbol *sym, int isStructSym, int isFunc)
353 memmap *map;
354 symbol *sym2;
356 if (getenv ("SDCC_DEBUG_FUNCTION_POINTERS"))
357 fprintf (stderr, "cdbFile.c:cdbWriteBasicSymbol()\n");
359 if (!cdbFilePtr) return 0;
361 if (!sym) return 0;
363 /* WRITE HEADER, Function or Symbol */
364 if (isFunc)
365 fprintf (cdbFilePtr, "F:");
366 else
367 fprintf (cdbFilePtr, "S:");
369 /* STRUCTS do not have scope info.. */
371 if (!isStructSym)
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$");
386 else
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)
401 int a;
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, "]");
418 sym2 = NULL;
420 else
422 sym2 = TempSym->usl.spillLoc;
425 else
427 sym2 = sym;
430 if (sym2)
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 */
443 if (isFunc)
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
448 or spillocation */
450 if (!isStructSym)
451 fprintf (cdbFilePtr, "\n");
453 return 1;
456 /******************************************************************
461 *****************************************************************/
463 /*-----------------------------------------------------------------*/
464 /* cdbTypeInfo - print the type information for debugger */
465 /*-----------------------------------------------------------------*/
466 void
467 cdbTypeInfo (sym_link * type)
469 fprintf (cdbFilePtr, "{%d}", getSize (type));
471 while (type)
473 if (IS_DECL (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;
486 default: break;
489 else
491 switch (SPEC_NOUN (type))
493 case V_INT:
494 if (IS_LONG (type))
495 fprintf (cdbFilePtr, "SL");
496 else
497 fprintf (cdbFilePtr, "SI");
498 break;
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;
504 case V_STRUCT:
505 fprintf (cdbFilePtr, "ST%s", SPEC_STRUCT (type)->tag);
506 break;
508 case V_SBIT: fprintf (cdbFilePtr, "SX"); break;
509 case V_BIT:
510 case V_BITFIELD:
511 fprintf (cdbFilePtr, "SB%d$%d", SPEC_BSTR (type),
512 SPEC_BLEN (type));
513 break;
515 default:
516 break;
518 fputs (":", cdbFilePtr);
519 if (SPEC_USIGN (type))
520 fputs ("U", cdbFilePtr);
521 else
522 fputs ("S", cdbFilePtr);
524 type = type->next;