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