Display the structure's members in the Local variables window
[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
c4fe5864 7// RG = Richard Goedeken\r
2d0121d4
JPM
8//\r
9// WHO WHEN WHAT\r
10// --- ---------- ------------------------------------------------------------\r
11// JPM 12/21/2016 Created this file\r
12// JPM Various efforts to set the ELF format support\r
13// JPM Various efforts to set the DWARF format support\r
fe3b257d 14// JPM 09/15/2018 Support the unsigned char\r
4f945aea 15// JPM Oct./2018 Cosmetic changes, added source file search paths, and ELF function name\r
aae93d86 16// JPM Aug./2019 Added new functions mainly for source text lines\r
ef0da6de 17// JPM Sept./2019 Support the unsigned/signed short type\r
c4fe5864 18// RG Jan./2021 Linux build fixes\r
fe3b257d 19//\r
f8dde18d
JPM
20\r
21// To Do\r
4f945aea 22// To think about unique format to handle variations from ELF, DWARF, etc.\r
f8dde18d
JPM
23//\r
24\r
2d0121d4
JPM
25\r
26#include <stdlib.h>\r
27#include <string.h>\r
28#include <stdint.h>\r
c89f8ff7
RG
29#include "libelf.h"\r
30#include "gelf.h"\r
2d0121d4
JPM
31#include "log.h"\r
32#include "ELFManager.h"\r
c89f8ff7 33#include "DWARFManager.h"\r
2d0121d4
JPM
34#include "DBGManager.h"\r
35#include "HWLABELManager.h"\r
36#include "settings.h"\r
37#include "memory.h"\r
38\r
39\r
2d0121d4
JPM
40//\r
41struct Value\r
42{\r
43 union\r
44 {\r
f8dde18d
JPM
45 char Ct[10];\r
46 char C;\r
47 bool B;\r
2d0121d4
JPM
48 double D;\r
49 float F;\r
ef0da6de 50 int16_t SS;\r
2d0121d4
JPM
51 int32_t SI;\r
52 int64_t SL;\r
ef0da6de 53 uint16_t US;\r
2d0121d4
JPM
54 uint32_t UI;\r
55 uint64_t UL;\r
56 };\r
57}S_Value;\r
58\r
59\r
f0dd2f7b
JPM
60//\r
61void DBGManager_SourceFileSearchPathsInit(void);\r
62void DBGManager_SourceFileSearchPathsReset(void);\r
63void DBGManager_SourceFileSearchPathsClose(void);\r
64\r
65\r
2d0121d4
JPM
66// Common debugger variables\r
67size_t DBGType;\r
68char value[1000];\r
f0dd2f7b
JPM
69size_t NbSFSearchPaths;\r
70char **SourceFileSearchPaths;\r
71\r
72\r
73// Init the source file search paths\r
74void DBGManager_SourceFileSearchPathsInit(void)\r
75{\r
76 NbSFSearchPaths = 0;\r
77 SourceFileSearchPaths = NULL;\r
78}\r
79\r
80\r
81// Set the source file search paths\r
82// Create individual path for each one provided in the list (separate with ';')\r
83void DBGManager_SourceFileSearchPathsSet(char *ListPaths)\r
84{\r
85 // Check presence of a previous list\r
86 if (NbSFSearchPaths)\r
87 {\r
88 // Reset previous list\r
89 DBGManager_SourceFileSearchPathsReset();\r
90 }\r
91\r
92 // Check if there is a paths list\r
93 if (strlen(ListPaths))\r
94 {\r
95 // Get number of paths\r
96 char *Ptr = ListPaths;\r
97 while(*Ptr)\r
98 {\r
99 while (*Ptr && (*Ptr++ != ';'));\r
100 {\r
101 NbSFSearchPaths++;\r
102 }\r
103 }\r
104\r
105 // Isolate each search path\r
106 SourceFileSearchPaths = (char **)calloc(NbSFSearchPaths, sizeof(char *));\r
107 size_t i = 0;\r
108 Ptr = ListPaths;\r
109\r
110 while (*Ptr)\r
111 {\r
112 // Search the path separator (';')\r
113 char *Ptr1 = Ptr;\r
114 while (*Ptr && (*Ptr++ != ';'));\r
115\r
116 // Copy the inidividual search path\r
117 SourceFileSearchPaths[i] = (char *)calloc(1, (Ptr - Ptr1) + 1);\r
118 strncpy(SourceFileSearchPaths[i], Ptr1, (Ptr - Ptr1));\r
119 if (SourceFileSearchPaths[i][strlen(SourceFileSearchPaths[i]) - 1] == ';')\r
120 {\r
121 SourceFileSearchPaths[i][strlen(SourceFileSearchPaths[i]) - 1] = 0;\r
122 }\r
123 i++;\r
124 }\r
125 }\r
126\r
127 DWARFManager_Set(NbSFSearchPaths, SourceFileSearchPaths);\r
128}\r
129\r
130\r
131// Reset the source file search paths\r
132void DBGManager_SourceFileSearchPathsReset(void)\r
133{\r
134 // Free each path\r
135 while (NbSFSearchPaths)\r
136 {\r
137 free(SourceFileSearchPaths[--NbSFSearchPaths]);\r
138 }\r
139\r
140 // Free the pointers list\r
141 free(SourceFileSearchPaths);\r
142 SourceFileSearchPaths = NULL;\r
143}\r
144\r
145\r
146// Close the source file search paths\r
147void DBGManager_SourceFileSearchPathsClose(void)\r
148{\r
149 DBGManager_SourceFileSearchPathsReset();\r
150}\r
2d0121d4
JPM
151\r
152\r
153// Common debugger initialisation\r
154void DBGManager_Init(void)\r
155{\r
f0dd2f7b 156 // DBG initialisations\r
2d0121d4 157 DBGType = DBG_NO_TYPE;\r
f0dd2f7b
JPM
158 DBGManager_SourceFileSearchPathsInit();\r
159\r
160 // ELF initialisation \r
2d0121d4 161 ELFManager_Init();\r
f0dd2f7b 162 // DWARF initialisation\r
2d0121d4
JPM
163 DWARFManager_Init();\r
164}\r
165\r
166\r
167// Common debugger reset\r
168void DBGManager_Reset(void)\r
169{\r
170 if ((DBGType & DBG_DWARF))\r
171 {\r
172 DWARFManager_Reset();\r
173 }\r
174\r
175 if ((DBGType & DBG_ELF))\r
176 {\r
177 ELFManager_Reset();\r
178 }\r
179\r
180 //DBGType = vjs.displayHWlabels ? DBG_HWLABEL : DBG_NO_TYPE;\r
181 DBGType = DBG_NO_TYPE;\r
182}\r
183\r
184\r
2d0121d4
JPM
185// Common debugger close\r
186void DBGManager_Close(void)\r
187{\r
188 if ((DBGType & DBG_DWARF))\r
189 {\r
190 DWARFManager_Close();\r
191 }\r
192\r
193 if ((DBGType & DBG_ELF))\r
194 {\r
195 ELFManager_Close();\r
196 }\r
f0dd2f7b
JPM
197\r
198 DBGManager_SourceFileSearchPathsClose();\r
199 DBGType = DBG_NO_TYPE;\r
200}\r
201\r
202\r
203// Common debugger set\r
204void DBGManager_SetType(size_t DBGTypeSet)\r
205{\r
206 DBGType |= DBGTypeSet;\r
207}\r
208\r
209\r
210// Get debugger type\r
211size_t DBGManager_GetType(void)\r
212{\r
213 return DBGType;\r
2d0121d4
JPM
214}\r
215\r
216\r
217// Get source filename based on the memeory address\r
218// return NULL if no source filename\r
009df4d7 219char *DBGManager_GetFullSourceFilenameFromAdr(size_t Adr, DBGstatus *Status)\r
2d0121d4
JPM
220{\r
221 if ((DBGType & DBG_ELFDWARF))\r
222 {\r
009df4d7 223 return DWARFManager_GetFullSourceFilenameFromAdr(Adr, (DWARFstatus *)Status);\r
2d0121d4
JPM
224 }\r
225 else\r
226 {\r
227 return NULL;\r
228 }\r
229}\r
230\r
231\r
0203b5fd
JPM
232// Get number of local variables\r
233// Return 0 if none has been found\r
234size_t DBGManager_GetNbLocalVariables(size_t Adr)\r
235{\r
236 if ((DBGType & DBG_ELFDWARF))\r
237 {\r
238 return DWARFManager_GetNbLocalVariables(Adr);\r
239 }\r
240 else\r
241 {\r
242 return 0;\r
243 }\r
244}\r
245\r
246\r
247// Get number of global variables\r
2d0121d4 248// Return 0 if none has been found\r
0203b5fd 249size_t DBGManager_GetNbGlobalVariables(void)\r
2d0121d4
JPM
250{\r
251 if ((DBGType & DBG_ELFDWARF))\r
252 {\r
0203b5fd 253 return DWARFManager_GetNbGlobalVariables();\r
2d0121d4
JPM
254 }\r
255 else\r
256 {\r
257 return 0;\r
258 }\r
259}\r
260\r
261\r
a4e46c05
JPM
262// Get address from symbol name\r
263// Return found address\r
264// Return NULL if no symbol has been found\r
2d0121d4
JPM
265size_t DBGManager_GetAdrFromSymbolName(char *SymbolName)\r
266{\r
a4e46c05 267 if (SymbolName)\r
2d0121d4 268 {\r
a4e46c05
JPM
269 if ((DBGType & DBG_ELF))\r
270 {\r
271 return ELFManager_GetAdrFromSymbolName(SymbolName);\r
272 }\r
2d0121d4 273 }\r
a4e46c05
JPM
274\r
275 return 0;\r
2d0121d4
JPM
276}\r
277\r
278\r
0203b5fd 279// Get global variable's Address based on his Name\r
2d0121d4
JPM
280// Return found Address\r
281// Return NULL if no Address has been found\r
0203b5fd 282size_t DBGManager_GetGlobalVariableAdrFromName(char *VariableName)\r
2d0121d4
JPM
283{\r
284 if ((DBGType & DBG_ELFDWARF))\r
285 {\r
0203b5fd 286 return DWARFManager_GetGlobalVariableAdrFromName(VariableName);\r
2d0121d4
JPM
287 }\r
288 else\r
289 {\r
290 return 0;\r
291 }\r
292}\r
293\r
294\r
0203b5fd
JPM
295// Get local variable's type encoding based on his address and Index\r
296// Return the type encoding found\r
297// Return 0 if no type encoding has been found\r
298size_t DBGManager_GetLocalVariableTypeEncoding(size_t Adr, size_t Index)\r
299{\r
300 if ((DBGType & DBG_ELFDWARF))\r
301 {\r
302 return DWARFManager_GetLocalVariableTypeEncoding(Adr, Index);\r
303 }\r
304 else\r
305 {\r
306 return 0;\r
307 }\r
308}\r
309\r
310\r
311//\r
312int DBGManager_GetLocalVariableOffset(size_t Adr, size_t Index)\r
313{\r
314 if ((DBGType & DBG_ELFDWARF))\r
315 {\r
316 return DWARFManager_GetLocalVariableOffset(Adr, Index);\r
317 }\r
318 else\r
319 {\r
320 return 0;\r
321 }\r
322}\r
323\r
324\r
325// Get local variable's type byte size based on his address and Index\r
326// Return the type's byte size found\r
327// Return 0 if no type's byte size has been found\r
328size_t DBGManager_GetLocalVariableTypeByteSize(size_t Adr, size_t Index)\r
329{\r
330 if ((DBGType & DBG_ELFDWARF))\r
331 {\r
332 return DWARFManager_GetLocalVariableTypeByteSize(Adr, Index);\r
333 }\r
334 else\r
335 {\r
336 return 0;\r
337 }\r
338}\r
339\r
340\r
341//\r
342size_t DBGManager_GetLocalVariableTypeTag(size_t Adr, size_t Index)\r
343{\r
344 if ((DBGType & DBG_ELFDWARF))\r
345 {\r
346 return DWARFManager_GetLocalVariableTypeTag(Adr, Index);\r
347 }\r
348 else\r
349 {\r
350 return 0;\r
351 }\r
352}\r
353\r
354\r
2d0121d4 355//\r
0203b5fd 356size_t DBGManager_GetGlobalVariableTypeTag(size_t Index)\r
2d0121d4
JPM
357{\r
358 if ((DBGType & DBG_ELFDWARF))\r
359 {\r
0203b5fd 360 return DWARFManager_GetGlobalVariableTypeTag(Index);\r
2d0121d4
JPM
361 }\r
362 else\r
363 {\r
364 return 0;\r
365 }\r
366}\r
367\r
368\r
0203b5fd 369// Get global variable's type name based on his Index\r
2d0121d4
JPM
370// Return type name's text pointer found\r
371// Return NULL if no type name has been found\r
0203b5fd 372char *DBGManager_GetGlobalVariableTypeName(size_t Index)\r
2d0121d4
JPM
373{\r
374 if ((DBGType & DBG_ELFDWARF))\r
375 {\r
0203b5fd 376 return DWARFManager_GetGlobalVariableTypeName(Index);\r
2d0121d4
JPM
377 }\r
378 else\r
379 {\r
380 return NULL;\r
381 }\r
382}\r
383\r
384\r
0203b5fd 385// Get global variable's Address based on his Index\r
2d0121d4
JPM
386// Return the Address found\r
387// Return 0 if no Address has been found\r
0203b5fd 388size_t DBGManager_GetGlobalVariableAdr(size_t Index)\r
2d0121d4
JPM
389{\r
390 if ((DBGType & DBG_ELFDWARF))\r
391 {\r
0203b5fd 392 return DWARFManager_GetGlobalVariableAdr(Index);\r
2d0121d4
JPM
393 }\r
394 else\r
395 {\r
396 return 0;\r
397 }\r
398}\r
399\r
400\r
0203b5fd 401// Get global variable's type byte size based on his Index\r
2d0121d4
JPM
402// Return the type's byte size found\r
403// Return 0 if no type's byte size has been found\r
0203b5fd 404size_t DBGManager_GetGlobalVariableTypeByteSize(size_t Index)\r
2d0121d4
JPM
405{\r
406 if ((DBGType & DBG_ELFDWARF))\r
407 {\r
0203b5fd 408 return DWARFManager_GetGlobalVariableTypeByteSize(Index);\r
2d0121d4
JPM
409 }\r
410 else\r
411 {\r
412 return 0;\r
413 }\r
414}\r
415\r
416\r
0203b5fd 417// Get global variable's type encoding based on his Index\r
2d0121d4
JPM
418// Return the type encoding found\r
419// Return 0 if no type encoding has been found\r
0203b5fd 420size_t DBGManager_GetGlobalVariableTypeEncoding(size_t Index)\r
2d0121d4
JPM
421{\r
422 if ((DBGType & DBG_ELFDWARF))\r
423 {\r
0203b5fd 424 return DWARFManager_GetGlobalVariableTypeEncoding(Index);\r
2d0121d4
JPM
425 }\r
426 else\r
427 {\r
428 return 0;\r
429 }\r
430}\r
431\r
432\r
0203b5fd 433// Get global variable value based on his Index\r
2d0121d4
JPM
434// Return value as a text pointer\r
435// Note: Pointer may point on a 0 lenght text\r
0203b5fd 436char *DBGManager_GetGlobalVariableValue(size_t Index)\r
2d0121d4 437{\r
0203b5fd
JPM
438 size_t Adr = 0;\r
439 size_t TypeEncoding = DBG_NO_TYPEENCODING;\r
440 size_t TypeByteSize = 0;\r
2d0121d4
JPM
441\r
442 if ((DBGType & DBG_ELFDWARF))\r
443 {\r
0203b5fd
JPM
444 Adr = DWARFManager_GetGlobalVariableAdr(Index);\r
445 TypeEncoding = DWARFManager_GetGlobalVariableTypeEncoding(Index);\r
446 TypeByteSize = DWARFManager_GetGlobalVariableTypeByteSize(Index);\r
2d0121d4
JPM
447 }\r
448\r
449 return DBGManager_GetVariableValueFromAdr(Adr, TypeEncoding, TypeByteSize);\r
450}\r
451\r
452\r
453// Get variable value based on his Adresse, Encoding Type and Size\r
454// Return value as a text pointer\r
f8dde18d 455// Note: Pointer may point on a 0 length text\r
0203b5fd 456char *DBGManager_GetVariableValueFromAdr(size_t Adr, size_t TypeEncoding, size_t TypeByteSize)\r
2d0121d4
JPM
457{\r
458 Value V;\r
459 char *Ptrvalue = value;\r
460\r
461 value[0] = 0;\r
462\r
f8dde18d 463#if 0\r
2d0121d4 464 if (Adr)\r
f8dde18d 465#endif\r
2d0121d4
JPM
466 {\r
467 memset(&V, 0, sizeof(Value));\r
468#if 0\r
469 for (uint32_t i = 0; i < TypeByteSize; i++)\r
470 jaguarMainRAM[Adr + i] = 0;\r
471 //jaguarMainRAM[Adr + i] = rand();\r
472 jaguarMainRAM[Adr + TypeByteSize - 1] = 0x10;\r
f8dde18d 473#else\r
0203b5fd 474 for (size_t i = 0, j = TypeByteSize; i < TypeByteSize; i++, j--)\r
2d0121d4 475 {\r
f8dde18d 476 V.Ct[i] = jaguarMainRAM[Adr + j - 1];\r
2d0121d4
JPM
477 }\r
478#endif\r
2d0121d4
JPM
479 switch (TypeEncoding)\r
480 {\r
481 case DBG_ATE_address:\r
482 break;\r
483\r
484 case DBG_ATE_boolean:\r
f8dde18d 485 sprintf(value, "%s", V.B ? "true" : "false");\r
2d0121d4
JPM
486 break;\r
487\r
488 case DBG_ATE_complex_float:\r
489 break;\r
490\r
491 case DBG_ATE_float:\r
492 switch (TypeByteSize)\r
493 {\r
494 case 4:\r
495 sprintf(value, "%F", V.F);\r
496 break;\r
497\r
498 case 8:\r
499 //V.D = (double)jaguarMainRAM[Adr];\r
500 //sprintf(value, "%10.10F", V.D);\r
501 sprintf(value, "%F", V.D);\r
502 break;\r
503\r
504 default:\r
505 break;\r
506 }\r
507 break;\r
508\r
509 case DBG_ATE_signed:\r
510 switch (TypeByteSize)\r
511 {\r
ef0da6de
JPM
512 case 2:\r
513 sprintf(value, "%i", V.SS);\r
514 break;\r
515\r
2d0121d4
JPM
516 case 4:\r
517 sprintf(value, "%i", V.SI);\r
518 break;\r
519\r
520 case 8:\r
521 sprintf(value, "%i", V.SL);\r
522 break;\r
523\r
524 default:\r
525 break;\r
526 }\r
527 break;\r
528\r
529 case DBG_ATE_signed_char:\r
530 break;\r
531\r
532 case DBG_ATE_unsigned:\r
533 switch (TypeByteSize)\r
534 {\r
ef0da6de
JPM
535 case 2:\r
536 sprintf(value, "%u", V.US);\r
537 break;\r
538\r
2d0121d4
JPM
539 case 4:\r
540 sprintf(value, "%u", V.UI);\r
541 break;\r
542\r
543 case 8:\r
544 sprintf(value, "%u", V.UL);\r
545 break;\r
546\r
547 default:\r
548 break;\r
549 }\r
550 break;\r
551\r
552 case DBG_ATE_unsigned_char:\r
c89f8ff7 553 sprintf(value, "%u", (unsigned int) V.C);\r
2d0121d4
JPM
554 break;\r
555\r
556 case DBG_ATE_ptr:\r
557 switch (TypeByteSize)\r
558 {\r
559 case 4:\r
560 sprintf(value, "0x%06x", V.UI);\r
561 break;\r
562\r
563 default:\r
564 break;\r
565 }\r
566\r
567 default:\r
568 break;\r
569 }\r
570 }\r
571\r
572 return Ptrvalue;\r
573}\r
574\r
575\r
0203b5fd
JPM
576// Get local variable's type name based on his Index\r
577// Return type name's text pointer found\r
578// Return NULL if no type name has been found\r
579char *DBGManager_GetLocalVariableTypeName(size_t Adr, size_t Index)\r
580{\r
581 if ((DBGType & DBG_ELFDWARF))\r
582 {\r
583 return DWARFManager_GetLocalVariableTypeName(Adr, Index);\r
584 }\r
585 else\r
586 {\r
587 return NULL;\r
588 }\r
589}\r
590\r
591\r
592// Get local variable Op based on his Index\r
593// Return variable Op's found\r
594// Return 0 if no variable Op has been found\r
595size_t DBGManager_GetLocalVariableOp(size_t Adr, size_t Index)\r
596{\r
597 if ((DBGType & DBG_ELFDWARF))\r
598 {\r
599 return DWARFManager_GetLocalVariableOp(Adr, Index);\r
600 }\r
601 else\r
602 {\r
603 return 0;\r
604 }\r
605}\r
606\r
607\r
608// Get local variable name based on his Index\r
609// Return variable name's text pointer found\r
610// Return NULL if no variable name has been found\r
611char *DBGManager_GetLocalVariableName(size_t Adr, size_t Index)\r
612{\r
613 if ((DBGType & DBG_ELFDWARF))\r
614 {\r
615 return DWARFManager_GetLocalVariableName(Adr, Index);\r
616 }\r
617 else\r
618 {\r
619 return NULL;\r
620 }\r
621}\r
622\r
623\r
624// Get global variable name based on his Index\r
2d0121d4
JPM
625// Return variable name's text pointer found\r
626// Return NULL if no variable name has been found\r
0203b5fd
JPM
627char *DBGManager_GetGlobalVariableName(size_t Index)\r
628{\r
629 if ((DBGType & DBG_ELFDWARF))\r
630 {\r
631 return DWARFManager_GetGlobalVariableName(Index);\r
632 }\r
633 else\r
634 {\r
635 return NULL;\r
636 }\r
637}\r
638\r
639\r
640// Get function name from address\r
641// Return function name found\r
642// Return NULL if no function name has been found\r
643char *DBGManager_GetFunctionName(size_t Adr)\r
2d0121d4 644{\r
4f945aea
JPM
645 char *Symbolname = NULL;\r
646\r
2d0121d4
JPM
647 if ((DBGType & DBG_ELFDWARF))\r
648 {\r
4f945aea 649 Symbolname = DWARFManager_GetFunctionName(Adr);\r
2d0121d4 650 }\r
4f945aea
JPM
651\r
652 if ((DBGType & DBG_ELF) && (Symbolname == NULL))\r
2d0121d4 653 {\r
4f945aea 654 Symbolname = ELFManager_GetFunctionName(Adr);\r
2d0121d4 655 }\r
4f945aea
JPM
656\r
657 return Symbolname;\r
2d0121d4
JPM
658}\r
659\r
660\r
661// Get line number from address and his tag\r
662// Return line number on the symbol name found\r
663// Return 0 if no symbol name has been found\r
664size_t DBGManager_GetNumLineFromAdr(size_t Adr, size_t Tag)\r
665{\r
666 if ((DBGType & DBG_ELFDWARF))\r
667 {\r
668 return DWARFManager_GetNumLineFromAdr(Adr, Tag);\r
669 }\r
670 else\r
671 {\r
672 return 0;\r
673 }\r
674}\r
675\r
676\r
677// Get symbol name from address\r
678// Return text pointer on the symbol name found\r
679// Return NULL if no symbol name has been found\r
0203b5fd 680char *DBGManager_GetSymbolNameFromAdr(size_t Adr)\r
2d0121d4
JPM
681{\r
682 char *Symbolname;\r
683\r
684 //if ((DBGType & DBG_HWLABEL) || vjs.displayHWlabels)\r
685 if (vjs.displayHWlabels)\r
686 {\r
687 Symbolname = HWLABELManager_GetSymbolnameFromAdr(Adr);\r
688 }\r
689 else\r
690 {\r
691 Symbolname = NULL;\r
692 }\r
41d6f5f7
JPM
693#ifdef _MSC_VER\r
694#pragma message("Warning: !!! Need to set the DBG_HWLABEL in DBGType instead to use the setting value !!!")\r
695#else\r
696 #warning "!!! Need to set the DBG_HWLABEL in DBGType instead to use the setting value !!!"\r
2d0121d4
JPM
697#endif // _MSC_VER\r
698\r
699 if (Symbolname == NULL)\r
700 {\r
701 if ((DBGType & DBG_ELFDWARF))\r
702 {\r
703 Symbolname = DWARFManager_GetSymbolnameFromAdr(Adr);\r
704 }\r
705\r
706 if ((DBGType & DBG_ELF) && (Symbolname == NULL))\r
707 {\r
708 Symbolname = ELFManager_GetSymbolnameFromAdr(Adr);\r
709 }\r
710 }\r
711\r
712 return Symbolname;\r
713}\r
714\r
715\r
716// Get source line based on the Address and his Tag\r
717// Return text pointer on the source line found\r
718// Return NULL if no source line has been found\r
719char *DBGManager_GetLineSrcFromAdr(size_t Adr, size_t Tag)\r
720{\r
fe3b257d 721 char *TextLine = NULL;\r
2d0121d4
JPM
722\r
723 if ((DBGType & DBG_ELFDWARF))\r
724 {\r
fe3b257d 725 TextLine = DWARFManager_GetLineSrcFromAdr(Adr, Tag);\r
2d0121d4
JPM
726 }\r
727\r
fe3b257d 728 return TextLine;\r
2d0121d4
JPM
729}\r
730\r
731\r
fe3b257d 732// Get text line from source based on address and num line (starting from 1)\r
2d0121d4
JPM
733// Return NULL if no text line has been found\r
734char *DBGManager_GetLineSrcFromAdrNumLine(size_t Adr, size_t NumLine)\r
735{\r
fe3b257d 736 char *TextLine = NULL;\r
2d0121d4
JPM
737\r
738 if ((DBGType & DBG_ELFDWARF))\r
739 {\r
fe3b257d 740 TextLine = DWARFManager_GetLineSrcFromAdrNumLine(Adr, NumLine);\r
2d0121d4
JPM
741 }\r
742\r
fe3b257d 743 return TextLine;\r
2d0121d4
JPM
744}\r
745\r
746\r
fe3b257d 747// Get text line from source based on address and num line (starting from 1)\r
2d0121d4
JPM
748// Return NULL if no text line has been found\r
749char *DBGManager_GetLineSrcFromNumLineBaseAdr(size_t Adr, size_t NumLine)\r
750{\r
fe3b257d 751 char *TextLine = NULL;\r
2d0121d4
JPM
752\r
753 if ((DBGType & DBG_ELFDWARF))\r
754 {\r
fe3b257d 755 TextLine = DWARFManager_GetLineSrcFromNumLineBaseAdr(Adr, NumLine);\r
2d0121d4
JPM
756 }\r
757\r
fe3b257d 758 return TextLine;\r
2d0121d4
JPM
759}\r
760\r
6564336c
JPM
761\r
762// Get number of source code filenames\r
aae93d86 763size_t DBGManager_GetNbSources(void)\r
6564336c
JPM
764{\r
765 size_t Nbr = 0;\r
766\r
767 if ((DBGType & DBG_ELFDWARF))\r
768 {\r
aae93d86 769 Nbr = DWARFManager_GetNbSources();\r
6564336c
JPM
770 }\r
771\r
772 return Nbr;\r
773}\r
774\r
775\r
aae93d86
JPM
776// Get source code filename based on index\r
777char *DBGManager_GetNumSourceFilename(size_t Index)\r
778{\r
779 char *SourceFilename = NULL;\r
780\r
781 if ((DBGType & DBG_ELFDWARF))\r
782 {\r
783 SourceFilename = DWARFManager_GetNumSourceFilename(Index);\r
784 }\r
785\r
786 return SourceFilename;\r
787}\r
788\r
789\r
6564336c
JPM
790// Get source code filename based on index\r
791char *DBGManager_GetNumFullSourceFilename(size_t Index)\r
792{\r
793 char *FullSourceFilename = NULL;\r
794\r
795 if ((DBGType & DBG_ELFDWARF))\r
796 {\r
797 FullSourceFilename = DWARFManager_GetNumFullSourceFilename(Index);\r
798 }\r
799\r
800 return FullSourceFilename;\r
801}\r
aae93d86
JPM
802\r
803\r
804// Get number of lines of texts source list from source index\r
805size_t DBGManager_GetSrcNbListPtrFromIndex(size_t Index, bool Used)\r
806{\r
807 size_t NbListPtr = 0;\r
808\r
809 if ((DBGType & DBG_ELFDWARF))\r
810 {\r
811 NbListPtr = DWARFManager_GetSrcNbListPtrFromIndex(Index, Used);\r
812 }\r
813\r
814 return NbListPtr;\r
815}\r
816\r
817\r
818// Get pointer to the lines number list from source index\r
819size_t *DBGManager_GetSrcNumLinesPtrFromIndex(size_t Index, bool Used)\r
820{\r
821 size_t *PtrNumLines = NULL;\r
822\r
823 if ((DBGType & DBG_ELFDWARF))\r
824 {\r
825 PtrNumLines = DWARFManager_GetSrcNumLinesPtrFromIndex(Index, Used);\r
826 }\r
827\r
828 return PtrNumLines;\r
829}\r
830\r
831\r
832// Get text source list pointers from source index\r
833char **DBGManager_GetSrcListPtrFromIndex(size_t Index, bool Used)\r
834{\r
835 char **PtrSource = NULL;\r
836\r
837 if ((DBGType & DBG_ELFDWARF))\r
838 {\r
839 PtrSource = DWARFManager_GetSrcListPtrFromIndex(Index, Used);\r
840 }\r
841\r
842 return PtrSource;\r
843}\r
844\r
845\r
846// Get source language\r
847size_t DBGManager_GetSrcLanguageFromIndex(size_t Index)\r
848{\r
849 size_t Language = 0;\r
850\r
851 if ((DBGType & DBG_ELFDWARF))\r
852 {\r
853 Language = DWARFManager_GetSrcLanguageFromIndex(Index);\r
854 }\r
855\r
856 return Language;\r
857}\r
858\r