Added the support for the used lines source's DWARF structure.
[clinton/Virtual-Jaguar-Rx.git] / src / debugger / DBGManager.cpp
... / ...
CommitLineData
1//\r
2// DBGManager.cpp: Debugger information manager\r
3//\r
4// by Jean-Paul Mari\r
5//\r
6// JPM = Jean-Paul Mari <djipi.mari@gmail.com>\r
7//\r
8// WHO WHEN WHAT\r
9// --- ---------- ------------------------------------------------------------\r
10// JPM 12/21/2016 Created this file\r
11// JPM Various efforts to set the ELF format support\r
12// JPM Various efforts to set the DWARF format support\r
13// JPM 09/15/2018 Support the unsigned char\r
14// JPM 10/06/2018 Cosmetic changes\r
15//\r
16\r
17// To Do\r
18//\r
19\r
20\r
21#include <stdlib.h>\r
22#include <string.h>\r
23#include <stdint.h>\r
24#include "libelf/libelf.h"\r
25#include "libelf/gelf.h"\r
26#include "log.h"\r
27#include "ELFManager.h"\r
28#include "DwarfManager.h"\r
29#include "DBGManager.h"\r
30#include "HWLABELManager.h"\r
31#include "settings.h"\r
32#include "memory.h"\r
33\r
34\r
35//\r
36struct Value\r
37{\r
38 union\r
39 {\r
40 char Ct[10];\r
41 char C;\r
42 bool B;\r
43 double D;\r
44 float F;\r
45 int32_t SI;\r
46 int64_t SL;\r
47 uint32_t UI;\r
48 uint64_t UL;\r
49 };\r
50}S_Value;\r
51\r
52\r
53// Common debugger variables\r
54size_t DBGType;\r
55char value[1000];\r
56\r
57\r
58// Common debugger initialisation\r
59void DBGManager_Init(void)\r
60{\r
61 DBGType = DBG_NO_TYPE;\r
62 ELFManager_Init();\r
63 DWARFManager_Init();\r
64}\r
65\r
66\r
67// Common debugger reset\r
68void DBGManager_Reset(void)\r
69{\r
70 if ((DBGType & DBG_DWARF))\r
71 {\r
72 DWARFManager_Reset();\r
73 }\r
74\r
75 if ((DBGType & DBG_ELF))\r
76 {\r
77 ELFManager_Reset();\r
78 }\r
79\r
80 //DBGType = vjs.displayHWlabels ? DBG_HWLABEL : DBG_NO_TYPE;\r
81 DBGType = DBG_NO_TYPE;\r
82}\r
83\r
84\r
85// Get debugger type\r
86size_t DBGManager_GetType(void)\r
87{\r
88 return DBGType;\r
89}\r
90\r
91\r
92// Common debugger set\r
93void DBGManager_SetType(size_t DBGTypeSet)\r
94{\r
95 DBGType |= DBGTypeSet;\r
96}\r
97\r
98\r
99// Common debugger close\r
100void DBGManager_Close(void)\r
101{\r
102 if ((DBGType & DBG_DWARF))\r
103 {\r
104 DWARFManager_Close();\r
105 }\r
106\r
107 if ((DBGType & DBG_ELF))\r
108 {\r
109 ELFManager_Close();\r
110 }\r
111}\r
112\r
113\r
114// Get source filename based on the memeory address\r
115// return NULL if no source filename\r
116char *DBGManager_GetFullSourceFilenameFromAdr(size_t Adr, bool *Error)\r
117{\r
118 if ((DBGType & DBG_ELFDWARF))\r
119 {\r
120 return DWARFManager_GetFullSourceFilenameFromAdr(Adr, Error);\r
121 }\r
122 else\r
123 {\r
124 return NULL;\r
125 }\r
126}\r
127\r
128\r
129// Get number of local variables\r
130// Return 0 if none has been found\r
131size_t DBGManager_GetNbLocalVariables(size_t Adr)\r
132{\r
133 if ((DBGType & DBG_ELFDWARF))\r
134 {\r
135 return DWARFManager_GetNbLocalVariables(Adr);\r
136 }\r
137 else\r
138 {\r
139 return 0;\r
140 }\r
141}\r
142\r
143\r
144// Get number of global variables\r
145// Return 0 if none has been found\r
146size_t DBGManager_GetNbGlobalVariables(void)\r
147{\r
148 if ((DBGType & DBG_ELFDWARF))\r
149 {\r
150 return DWARFManager_GetNbGlobalVariables();\r
151 }\r
152 else\r
153 {\r
154 return 0;\r
155 }\r
156}\r
157\r
158\r
159// Get address from symbol name\r
160// Return found address\r
161// Return NULL if no symbol has been found\r
162size_t DBGManager_GetAdrFromSymbolName(char *SymbolName)\r
163{\r
164 if (SymbolName)\r
165 {\r
166 if ((DBGType & DBG_ELF))\r
167 {\r
168 return ELFManager_GetAdrFromSymbolName(SymbolName);\r
169 }\r
170 }\r
171\r
172 return 0;\r
173}\r
174\r
175\r
176// Get global variable's Address based on his Name\r
177// Return found Address\r
178// Return NULL if no Address has been found\r
179size_t DBGManager_GetGlobalVariableAdrFromName(char *VariableName)\r
180{\r
181 if ((DBGType & DBG_ELFDWARF))\r
182 {\r
183 return DWARFManager_GetGlobalVariableAdrFromName(VariableName);\r
184 }\r
185 else\r
186 {\r
187 return 0;\r
188 }\r
189}\r
190\r
191\r
192// Get local variable's type encoding based on his address and Index\r
193// Return the type encoding found\r
194// Return 0 if no type encoding has been found\r
195size_t DBGManager_GetLocalVariableTypeEncoding(size_t Adr, size_t Index)\r
196{\r
197 if ((DBGType & DBG_ELFDWARF))\r
198 {\r
199 return DWARFManager_GetLocalVariableTypeEncoding(Adr, Index);\r
200 }\r
201 else\r
202 {\r
203 return 0;\r
204 }\r
205}\r
206\r
207\r
208//\r
209int DBGManager_GetLocalVariableOffset(size_t Adr, size_t Index)\r
210{\r
211 if ((DBGType & DBG_ELFDWARF))\r
212 {\r
213 return DWARFManager_GetLocalVariableOffset(Adr, Index);\r
214 }\r
215 else\r
216 {\r
217 return 0;\r
218 }\r
219}\r
220\r
221\r
222// Get local variable's type byte size based on his address and Index\r
223// Return the type's byte size found\r
224// Return 0 if no type's byte size has been found\r
225size_t DBGManager_GetLocalVariableTypeByteSize(size_t Adr, size_t Index)\r
226{\r
227 if ((DBGType & DBG_ELFDWARF))\r
228 {\r
229 return DWARFManager_GetLocalVariableTypeByteSize(Adr, Index);\r
230 }\r
231 else\r
232 {\r
233 return 0;\r
234 }\r
235}\r
236\r
237\r
238//\r
239size_t DBGManager_GetLocalVariableTypeTag(size_t Adr, size_t Index)\r
240{\r
241 if ((DBGType & DBG_ELFDWARF))\r
242 {\r
243 return DWARFManager_GetLocalVariableTypeTag(Adr, Index);\r
244 }\r
245 else\r
246 {\r
247 return 0;\r
248 }\r
249}\r
250\r
251\r
252//\r
253size_t DBGManager_GetGlobalVariableTypeTag(size_t Index)\r
254{\r
255 if ((DBGType & DBG_ELFDWARF))\r
256 {\r
257 return DWARFManager_GetGlobalVariableTypeTag(Index);\r
258 }\r
259 else\r
260 {\r
261 return 0;\r
262 }\r
263}\r
264\r
265\r
266// Get global variable's type name based on his Index\r
267// Return type name's text pointer found\r
268// Return NULL if no type name has been found\r
269char *DBGManager_GetGlobalVariableTypeName(size_t Index)\r
270{\r
271 if ((DBGType & DBG_ELFDWARF))\r
272 {\r
273 return DWARFManager_GetGlobalVariableTypeName(Index);\r
274 }\r
275 else\r
276 {\r
277 return NULL;\r
278 }\r
279}\r
280\r
281\r
282// Get global variable's Address based on his Index\r
283// Return the Address found\r
284// Return 0 if no Address has been found\r
285size_t DBGManager_GetGlobalVariableAdr(size_t Index)\r
286{\r
287 if ((DBGType & DBG_ELFDWARF))\r
288 {\r
289 return DWARFManager_GetGlobalVariableAdr(Index);\r
290 }\r
291 else\r
292 {\r
293 return 0;\r
294 }\r
295}\r
296\r
297\r
298// Get global variable's type byte size based on his Index\r
299// Return the type's byte size found\r
300// Return 0 if no type's byte size has been found\r
301size_t DBGManager_GetGlobalVariableTypeByteSize(size_t Index)\r
302{\r
303 if ((DBGType & DBG_ELFDWARF))\r
304 {\r
305 return DWARFManager_GetGlobalVariableTypeByteSize(Index);\r
306 }\r
307 else\r
308 {\r
309 return 0;\r
310 }\r
311}\r
312\r
313\r
314// Get global variable's type encoding based on his Index\r
315// Return the type encoding found\r
316// Return 0 if no type encoding has been found\r
317size_t DBGManager_GetGlobalVariableTypeEncoding(size_t Index)\r
318{\r
319 if ((DBGType & DBG_ELFDWARF))\r
320 {\r
321 return DWARFManager_GetGlobalVariableTypeEncoding(Index);\r
322 }\r
323 else\r
324 {\r
325 return 0;\r
326 }\r
327}\r
328\r
329\r
330// Get global variable value based on his Index\r
331// Return value as a text pointer\r
332// Note: Pointer may point on a 0 lenght text\r
333char *DBGManager_GetGlobalVariableValue(size_t Index)\r
334{\r
335 size_t Adr = 0;\r
336 size_t TypeEncoding = DBG_NO_TYPEENCODING;\r
337 size_t TypeByteSize = 0;\r
338\r
339 if ((DBGType & DBG_ELFDWARF))\r
340 {\r
341 Adr = DWARFManager_GetGlobalVariableAdr(Index);\r
342 TypeEncoding = DWARFManager_GetGlobalVariableTypeEncoding(Index);\r
343 TypeByteSize = DWARFManager_GetGlobalVariableTypeByteSize(Index);\r
344 }\r
345\r
346 return DBGManager_GetVariableValueFromAdr(Adr, TypeEncoding, TypeByteSize);\r
347}\r
348\r
349\r
350// Get variable value based on his Adresse, Encoding Type and Size\r
351// Return value as a text pointer\r
352// Note: Pointer may point on a 0 length text\r
353char *DBGManager_GetVariableValueFromAdr(size_t Adr, size_t TypeEncoding, size_t TypeByteSize)\r
354{\r
355 Value V;\r
356 char *Ptrvalue = value;\r
357\r
358 value[0] = 0;\r
359\r
360#if 0\r
361 if (Adr)\r
362#endif\r
363 {\r
364 memset(&V, 0, sizeof(Value));\r
365#if 0\r
366 for (uint32_t i = 0; i < TypeByteSize; i++)\r
367 jaguarMainRAM[Adr + i] = 0;\r
368 //jaguarMainRAM[Adr + i] = rand();\r
369 jaguarMainRAM[Adr + TypeByteSize - 1] = 0x10;\r
370#else\r
371 for (size_t i = 0, j = TypeByteSize; i < TypeByteSize; i++, j--)\r
372 {\r
373 V.Ct[i] = jaguarMainRAM[Adr + j - 1];\r
374 }\r
375#endif\r
376 switch (TypeEncoding)\r
377 {\r
378 case DBG_ATE_address:\r
379 break;\r
380\r
381 case DBG_ATE_boolean:\r
382 sprintf(value, "%s", V.B ? "true" : "false");\r
383 break;\r
384\r
385 case DBG_ATE_complex_float:\r
386 break;\r
387\r
388 case DBG_ATE_float:\r
389 switch (TypeByteSize)\r
390 {\r
391 case 4:\r
392 sprintf(value, "%F", V.F);\r
393 break;\r
394\r
395 case 8:\r
396 //V.D = (double)jaguarMainRAM[Adr];\r
397 //sprintf(value, "%10.10F", V.D);\r
398 sprintf(value, "%F", V.D);\r
399 break;\r
400\r
401 default:\r
402 break;\r
403 }\r
404 break;\r
405\r
406 case DBG_ATE_signed:\r
407 switch (TypeByteSize)\r
408 {\r
409 case 4:\r
410 sprintf(value, "%i", V.SI);\r
411 break;\r
412\r
413 case 8:\r
414 sprintf(value, "%i", V.SL);\r
415 break;\r
416\r
417 default:\r
418 break;\r
419 }\r
420 break;\r
421\r
422 case DBG_ATE_signed_char:\r
423 break;\r
424\r
425 case DBG_ATE_unsigned:\r
426 switch (TypeByteSize)\r
427 {\r
428 case 4:\r
429 sprintf(value, "%u", V.UI);\r
430 break;\r
431\r
432 case 8:\r
433 sprintf(value, "%u", V.UL);\r
434 break;\r
435\r
436 default:\r
437 break;\r
438 }\r
439 break;\r
440\r
441 case DBG_ATE_unsigned_char:\r
442 sprintf(value, "%u", (unsigned int(V.C)));\r
443 break;\r
444\r
445 case DBG_ATE_ptr:\r
446 switch (TypeByteSize)\r
447 {\r
448 case 4:\r
449 sprintf(value, "0x%06x", V.UI);\r
450 break;\r
451\r
452 default:\r
453 break;\r
454 }\r
455\r
456 default:\r
457 break;\r
458 }\r
459 }\r
460\r
461 return Ptrvalue;\r
462}\r
463\r
464\r
465// Get local variable's type name based on his Index\r
466// Return type name's text pointer found\r
467// Return NULL if no type name has been found\r
468char *DBGManager_GetLocalVariableTypeName(size_t Adr, size_t Index)\r
469{\r
470 if ((DBGType & DBG_ELFDWARF))\r
471 {\r
472 return DWARFManager_GetLocalVariableTypeName(Adr, Index);\r
473 }\r
474 else\r
475 {\r
476 return NULL;\r
477 }\r
478}\r
479\r
480\r
481// Get local variable Op based on his Index\r
482// Return variable Op's found\r
483// Return 0 if no variable Op has been found\r
484size_t DBGManager_GetLocalVariableOp(size_t Adr, size_t Index)\r
485{\r
486 if ((DBGType & DBG_ELFDWARF))\r
487 {\r
488 return DWARFManager_GetLocalVariableOp(Adr, Index);\r
489 }\r
490 else\r
491 {\r
492 return 0;\r
493 }\r
494}\r
495\r
496\r
497// Get local variable name based on his Index\r
498// Return variable name's text pointer found\r
499// Return NULL if no variable name has been found\r
500char *DBGManager_GetLocalVariableName(size_t Adr, size_t Index)\r
501{\r
502 if ((DBGType & DBG_ELFDWARF))\r
503 {\r
504 return DWARFManager_GetLocalVariableName(Adr, Index);\r
505 }\r
506 else\r
507 {\r
508 return NULL;\r
509 }\r
510}\r
511\r
512\r
513// Get global variable name based on his Index\r
514// Return variable name's text pointer found\r
515// Return NULL if no variable name has been found\r
516char *DBGManager_GetGlobalVariableName(size_t Index)\r
517{\r
518 if ((DBGType & DBG_ELFDWARF))\r
519 {\r
520 return DWARFManager_GetGlobalVariableName(Index);\r
521 }\r
522 else\r
523 {\r
524 return NULL;\r
525 }\r
526}\r
527\r
528\r
529// Get function name from address\r
530// Return function name found\r
531// Return NULL if no function name has been found\r
532char *DBGManager_GetFunctionName(size_t Adr)\r
533{\r
534 if ((DBGType & DBG_ELFDWARF))\r
535 {\r
536 return DWARFManager_GetFunctionName(Adr);\r
537 }\r
538 else\r
539 {\r
540 return NULL;\r
541 }\r
542}\r
543\r
544\r
545// Get line number from address and his tag\r
546// Return line number on the symbol name found\r
547// Return 0 if no symbol name has been found\r
548size_t DBGManager_GetNumLineFromAdr(size_t Adr, size_t Tag)\r
549{\r
550 if ((DBGType & DBG_ELFDWARF))\r
551 {\r
552 return DWARFManager_GetNumLineFromAdr(Adr, Tag);\r
553 }\r
554 else\r
555 {\r
556 return 0;\r
557 }\r
558}\r
559\r
560\r
561// Get symbol name from address\r
562// Return text pointer on the symbol name found\r
563// Return NULL if no symbol name has been found\r
564char *DBGManager_GetSymbolNameFromAdr(size_t Adr)\r
565{\r
566 char *Symbolname;\r
567\r
568 //if ((DBGType & DBG_HWLABEL) || vjs.displayHWlabels)\r
569 if (vjs.displayHWlabels)\r
570 {\r
571 Symbolname = HWLABELManager_GetSymbolnameFromAdr(Adr);\r
572 }\r
573 else\r
574 {\r
575 Symbolname = NULL;\r
576 }\r
577#ifdef _MSC_VER\r
578#pragma message("Warning: !!! Need to set the DBG_HWLABEL in DBGType instead to use the setting value !!!")\r
579#else\r
580 #warning "!!! Need to set the DBG_HWLABEL in DBGType instead to use the setting value !!!"\r
581#endif // _MSC_VER\r
582\r
583 if (Symbolname == NULL)\r
584 {\r
585 if ((DBGType & DBG_ELFDWARF))\r
586 {\r
587 Symbolname = DWARFManager_GetSymbolnameFromAdr(Adr);\r
588 }\r
589\r
590 if ((DBGType & DBG_ELF) && (Symbolname == NULL))\r
591 {\r
592 Symbolname = ELFManager_GetSymbolnameFromAdr(Adr);\r
593 }\r
594 }\r
595\r
596 return Symbolname;\r
597}\r
598\r
599\r
600// Get source line based on the Address and his Tag\r
601// Return text pointer on the source line found\r
602// Return NULL if no source line has been found\r
603char *DBGManager_GetLineSrcFromAdr(size_t Adr, size_t Tag)\r
604{\r
605 char *TextLine = NULL;\r
606\r
607 if ((DBGType & DBG_ELFDWARF))\r
608 {\r
609 TextLine = DWARFManager_GetLineSrcFromAdr(Adr, Tag);\r
610 }\r
611\r
612 return TextLine;\r
613}\r
614\r
615\r
616// Get text line from source based on address and num line (starting from 1)\r
617// Return NULL if no text line has been found\r
618char *DBGManager_GetLineSrcFromAdrNumLine(size_t Adr, size_t NumLine)\r
619{\r
620 char *TextLine = NULL;\r
621\r
622 if ((DBGType & DBG_ELFDWARF))\r
623 {\r
624 TextLine = DWARFManager_GetLineSrcFromAdrNumLine(Adr, NumLine);\r
625 }\r
626\r
627 return TextLine;\r
628}\r
629\r
630\r
631// Get text line from source based on address and num line (starting from 1)\r
632// Return NULL if no text line has been found\r
633char *DBGManager_GetLineSrcFromNumLineBaseAdr(size_t Adr, size_t NumLine)\r
634{\r
635 char *TextLine = NULL;\r
636\r
637 if ((DBGType & DBG_ELFDWARF))\r
638 {\r
639 TextLine = DWARFManager_GetLineSrcFromNumLineBaseAdr(Adr, NumLine);\r
640 }\r
641\r
642 return TextLine;\r
643}\r
644\r
645\r
646// Get number of source code filenames\r
647size_t DBGManager_GetNbFullSourceFilename(void)\r
648{\r
649 size_t Nbr = 0;\r
650\r
651 if ((DBGType & DBG_ELFDWARF))\r
652 {\r
653 Nbr = DWARFManager_GetNbFullSourceFilename();\r
654 }\r
655\r
656 return Nbr;\r
657}\r
658\r
659\r
660// Get source code filename based on index\r
661char *DBGManager_GetNumFullSourceFilename(size_t Index)\r
662{\r
663 char *FullSourceFilename = NULL;\r
664\r
665 if ((DBGType & DBG_ELFDWARF))\r
666 {\r
667 FullSourceFilename = DWARFManager_GetNumFullSourceFilename(Index);\r
668 }\r
669\r
670 return FullSourceFilename;\r
671}\r