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