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