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