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