Worked started for the source tracing
[clinton/Virtual-Jaguar-Rx.git] / src / debugger / DWARFManager.cpp
CommitLineData
ebcb0f3d
JPM
1//\r
2// DWARFManager.cpp: DWARF format 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
5fa7aa73 10// JPM Dec./2016 Created this file, and added the DWARF format support\r
6564336c 11// JPM Sept./2018 Added LEB128 decoding features, and improve the DWARF parsing information\r
f0dd2f7b 12// JPM Oct./2018 Improve the DWARF parsing information, and the source file text reading; support the used source lines from DWARF structure, and the search paths for the files\r
695f52e3 13// JPM Aug./2019 Added new functions to handle DWARF information, full filename fix\r
f8dde18d
JPM
14//\r
15\r
16// To Do\r
17// To use pointers instead of arrays usage\r
0536c3ba 18// To keep sources text file intact wihtout QT/HTML transformation\r
f8dde18d 19// \r
ebcb0f3d
JPM
20\r
21\r
41d6f5f7
JPM
22#include <stdlib.h>\r
23#include <stdio.h>\r
24#include <stdint.h>\r
25#include <string.h>\r
26#include <libdwarf.h>\r
27#include <dwarf.h>\r
f8dde18d 28#include "LEB128.h"\r
41d6f5f7
JPM
29\r
30\r
5fa7aa73 31// Definitions for debugging\r
695f52e3 32//#define DEBUG_NumCU 0x44 // CU number to debug or undefine it\r
ce32526a 33//#define DEBUG_VariableName "sound_death" // Variable name to look for or undefine it\r
f8dde18d
JPM
34//#define DEBUG_TypeName "Cbuf_Execute" // Type name to look for or undefine it\r
35//#define DEBUG_TypeDef DW_TAG_typedef // Type def to look for or undefine it (not supported)\r
695f52e3
JPM
36//#define DEBUG_Filename "crt0" // Filename to look for or undefine it\r
37\r
38// Definitions for handling data\r
39//#define CONVERT_QT_HML // Text will be converted as HTML\r
ebcb0f3d 40\r
5fa7aa73
JPM
41// Definitions for the variables's typetag\r
42#define TypeTag_structure 0x01 // structure\r
43#define TypeTag_pointer 0x02 // pointer\r
44#define TypeTag_subrange 0x04 // (subrange_type?)\r
45#define TypeTag_arraytype 0x08 // array type\r
46#define TypeTag_consttype 0x10 // const type\r
47#define TypeTag_typedef 0x20 // typedef\r
48#define TypeTag_enumeration_type 0x40 // enumeration\r
49#define TypeTag_subroutine_type 0x80 // subroutine\r
50\r
51\r
52// Source line CU structure\r
53typedef struct CUStruct_LineSrc\r
54{\r
55 size_t StartPC;\r
56 size_t NumLineSrc;\r
57 char *PtrLineSrc;\r
58}S_CUStruct_LineSrc;\r
ebcb0f3d
JPM
59\r
60// Source line internal structure\r
f8dde18d 61typedef struct DMIStruct_LineSrc\r
ebcb0f3d
JPM
62{\r
63 size_t Tag;\r
64 size_t StartPC;\r
65 size_t NumLineSrc;\r
66 char *PtrLineSrc;\r
67}S_DMIStruct_LineSrc;\r
68\r
f8dde18d
JPM
69// Enumeration structure\r
70typedef struct EnumerationStruct\r
71{\r
72 char *PtrName; // Enumeration's name\r
73 size_t value; // Enumeration's value\r
74}S_EnumerationStruct;\r
75\r
76// Structure members structure\r
77//typedef struct StructureMembersStruct\r
78//{\r
79//}S_StructureMembersStruct;\r
80\r
ebcb0f3d 81// Base type internal structure\r
f8dde18d 82typedef struct BaseTypeStruct\r
ebcb0f3d 83{\r
f8dde18d
JPM
84 size_t Tag; // Type's Tag\r
85 size_t Offset; // Type's offset\r
86 size_t TypeOffset; // Type's offset on another type\r
87 size_t ByteSize; // Type's Byte Size\r
88 size_t Encoding; // Type's encoding\r
89 char *PtrName; // Type's name\r
90 size_t NbEnumeration; // Type's enumeration numbers\r
91 EnumerationStruct *PtrEnumeration; // Type's enumeration\r
92// StructureMembersStruct *PtrStructureMembers; // Type's structure members\r
ebcb0f3d
JPM
93}S_BaseTypeStruct;\r
94\r
95// Variables internal structure\r
f8dde18d 96typedef struct VariablesStruct\r
ebcb0f3d 97{\r
0203b5fd
JPM
98 size_t Op; // Variable's DW_OP\r
99 union\r
100 {\r
101 size_t Addr; // Variable memory address\r
102 int Offset; // Variable stack offset (signed)\r
103 };\r
ebcb0f3d
JPM
104 char *PtrName; // Variable's name\r
105 size_t TypeOffset; // Offset pointing on the Variable's Type\r
106 size_t TypeByteSize; // Variable's Type byte size\r
107 size_t TypeTag; // Variable's Type Tag\r
108 size_t TypeEncoding; // Variable's Type encoding\r
109 char *PtrTypeName; // Variable's Type name\r
110}S_VariablesStruct;\r
111\r
112// Sub program internal structure\r
f8dde18d 113typedef struct SubProgStruct\r
ebcb0f3d
JPM
114{\r
115 size_t Tag;\r
116 size_t NumLineSrc;\r
117 size_t StartPC;\r
118 size_t LowPC, HighPC;\r
0203b5fd 119 size_t FrameBase;\r
ebcb0f3d 120 char *PtrLineSrc;\r
0203b5fd
JPM
121 char *PtrSubprogramName; // Sub program name\r
122 size_t NbLinesSrc; // Number of lines source used by the sub program\r
123 DMIStruct_LineSrc *PtrLinesSrc; // Pointer of the lines source for the sub program\r
124 size_t NbVariables; // Variables number\r
125 VariablesStruct *PtrVariables; // Pointer to the local variables list information structure\r
ebcb0f3d
JPM
126}S_SubProgStruct;\r
127\r
128// Compilation Unit internal structure\r
f8dde18d 129typedef struct CUStruct\r
ebcb0f3d
JPM
130{\r
131 size_t Tag;\r
695f52e3 132 size_t Language; // Language (C, etc.) used by the source code\r
5fa7aa73 133 size_t LowPC, HighPC; // Memory range for the code\r
f8dde18d
JPM
134 char *PtrProducer; // Pointer to the "Producer" text information (mostly compiler and compilation options used)\r
135 char *PtrSourceFilename; // Source file name\r
136 char *PtrSourceFileDirectory; // Directory of the source file\r
ebcb0f3d 137 char *PtrFullFilename; // Pointer to full namefile (directory & filename)\r
5fa7aa73
JPM
138 size_t SizeLoadSrc; // Source code text size\r
139 char *PtrLoadSrc; // Pointer to the source code text\r
140 size_t NbLinesLoadSrc; // Total number of lines in the source code text\r
ebcb0f3d
JPM
141 char **PtrLinesLoadSrc; // Pointer lists to each source line put in QT html/text conformity\r
142 size_t NbSubProgs; // Number of sub programs / routines\r
5fa7aa73 143 SubProgStruct *PtrSubProgs; // Pointer to the sub programs / routines structure\r
f8dde18d
JPM
144 size_t NbTypes; // Number of types\r
145 BaseTypeStruct *PtrTypes; // Pointer to types\r
ebcb0f3d 146 size_t NbVariables; // Variables number\r
5fa7aa73 147 VariablesStruct *PtrVariables; // Pointer to the global variables list structure\r
65597951 148 size_t NbFrames; // Frames number\r
695f52e3
JPM
149 size_t NbUsedLinesSrc; // Number of used source lines\r
150 size_t LastNumUsedLinesSrc; // Last used source number line\r
151 CUStruct_LineSrc *PtrUsedLinesSrc; // Pointer to the used source lines list structure\r
152 char **PtrUsedLinesLoadSrc; // Pointer lists to each used source line referenced by the CUStruct_LineSrc structure\r
153 size_t *PtrUsedNumLines; // Pointer list to the number lines used\r
ebcb0f3d
JPM
154}S_CUStruct;\r
155\r
156\r
157// Dwarf management\r
158uint32_t LibDwarf;\r
159uint32_t NbCU;\r
160Dwarf_Ptr errarg;\r
161Dwarf_Error error;\r
162Dwarf_Debug dbg;\r
163CUStruct *PtrCU;\r
f0dd2f7b
JPM
164char **ListSearchPaths;\r
165size_t NbSearchPaths;\r
ebcb0f3d
JPM
166\r
167\r
168//\r
169Dwarf_Handler DWARFManager_ErrorHandler(Dwarf_Ptr perrarg);\r
170void DWARFManager_InitDMI(void);\r
171void DWARFManager_CloseDMI(void);\r
172bool DWARFManager_ElfClose(void);\r
173char *DWARFManager_GetLineSrcFromNumLine(char *PtrSrcFile, size_t NumLine);\r
0203b5fd 174void DWARFManager_InitInfosVariable(VariablesStruct *PtrVariables);\r
f0dd2f7b
JPM
175void DWARFManager_SourceFileSearchPathsInit(void);\r
176void DWARFManager_SourceFileSearchPathsReset(void);\r
177void DWARFManager_SourceFileSearchPathsClose(void);\r
695f52e3 178void DWARFManager_ConformSlachesBackslashes(char *Ptr);\r
ebcb0f3d
JPM
179\r
180\r
181//\r
182Dwarf_Handler DWARFManager_ErrorHandler(Dwarf_Ptr perrarg)\r
183{\r
184 return 0;\r
185}\r
186\r
187\r
f0dd2f7b
JPM
188// Dwarf manager list search paths init\r
189void DWARFManager_SourceFileSearchPathsInit(void)\r
190{\r
191 ListSearchPaths = NULL;\r
192 NbSearchPaths = 0;\r
193}\r
194\r
195\r
196// Dwarf manager list search paths reset\r
197void DWARFManager_SourceFileSearchPathsReset(void)\r
198{\r
199 ListSearchPaths = NULL;\r
200 NbSearchPaths = 0;\r
201}\r
202\r
203\r
204// Dwarf manager list search paths close\r
205void DWARFManager_SourceFileSearchPathsClose(void)\r
206{\r
207 DWARFManager_SourceFileSearchPathsReset();\r
208}\r
209\r
210\r
ebcb0f3d
JPM
211// Dwarf manager init\r
212void DWARFManager_Init(void)\r
213{\r
f0dd2f7b 214 DWARFManager_SourceFileSearchPathsInit();\r
ebcb0f3d
JPM
215 LibDwarf = DW_DLV_NO_ENTRY;\r
216}\r
217\r
218\r
f0dd2f7b
JPM
219// Dwarf manager settings\r
220void DWARFManager_Set(size_t NbPathsInList, char **PtrListPaths)\r
221{\r
222 // Search paths init\r
223 ListSearchPaths = PtrListPaths;\r
224 NbSearchPaths = NbPathsInList;\r
225}\r
226\r
227\r
ebcb0f3d
JPM
228// Dwarf manager Reset\r
229bool DWARFManager_Reset(void)\r
230{\r
f0dd2f7b 231 DWARFManager_SourceFileSearchPathsReset();\r
ebcb0f3d
JPM
232 return DWARFManager_ElfClose();\r
233}\r
234\r
235\r
236// Dwarf manager Close\r
237bool DWARFManager_Close(void)\r
238{\r
f0dd2f7b 239 DWARFManager_SourceFileSearchPathsClose();\r
ebcb0f3d
JPM
240 return(DWARFManager_Reset());\r
241}\r
242\r
243\r
244// Dwarf manager Elf init\r
245int DWARFManager_ElfInit(Elf *ElfPtr)\r
246{\r
247 if ((LibDwarf = dwarf_elf_init(ElfPtr, DW_DLC_READ, (Dwarf_Handler)DWARFManager_ErrorHandler, errarg, &dbg, &error)) == DW_DLV_OK)\r
248 {\r
249 DWARFManager_InitDMI();\r
250 }\r
251\r
252 return LibDwarf;\r
253}\r
254\r
255\r
256// Dwarf manager Elf close\r
257bool DWARFManager_ElfClose(void)\r
258{\r
259 if (LibDwarf == DW_DLV_OK)\r
260 {\r
261 DWARFManager_CloseDMI();\r
262\r
263 if (dwarf_finish(dbg, &error) == DW_DLV_OK)\r
264 {\r
265 LibDwarf = DW_DLV_NO_ENTRY;\r
266 return true;\r
267 }\r
268 else\r
269 {\r
270 return false;\r
271 }\r
272 }\r
273 else\r
274 {\r
275 return true;\r
276 }\r
277}\r
278\r
279\r
280// Dwarf manager Compilation Units close\r
281void DWARFManager_CloseDMI(void)\r
282{\r
283 while (NbCU--)\r
284 {\r
285 free(PtrCU[NbCU].PtrFullFilename);\r
286 free(PtrCU[NbCU].PtrLoadSrc);\r
287 free(PtrCU[NbCU].PtrProducer);\r
f8dde18d
JPM
288 free(PtrCU[NbCU].PtrSourceFilename);\r
289 free(PtrCU[NbCU].PtrSourceFileDirectory);\r
695f52e3
JPM
290 free(PtrCU[NbCU].PtrUsedLinesSrc);\r
291 free(PtrCU[NbCU].PtrUsedLinesLoadSrc);\r
292 free(PtrCU[NbCU].PtrUsedNumLines);\r
ebcb0f3d
JPM
293\r
294 while (PtrCU[NbCU].NbLinesLoadSrc--)\r
295 {\r
296 free(PtrCU[NbCU].PtrLinesLoadSrc[PtrCU[NbCU].NbLinesLoadSrc]);\r
297 }\r
298 free(PtrCU[NbCU].PtrLinesLoadSrc);\r
299\r
300 while (PtrCU[NbCU].NbSubProgs--)\r
301 {\r
0203b5fd
JPM
302 while (PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables--)\r
303 {\r
304 free(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].PtrName);\r
305 free(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].PtrTypeName);\r
306 }\r
307 free(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables);\r
308\r
ebcb0f3d
JPM
309 free(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc);\r
310 free(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrSubprogramName);\r
311 }\r
312 free(PtrCU[NbCU].PtrSubProgs);\r
313\r
314 while (PtrCU[NbCU].NbTypes--)\r
315 {\r
316 free(PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].PtrName);\r
317 }\r
318 free(PtrCU[NbCU].PtrTypes);\r
319\r
320 while (PtrCU[NbCU].NbVariables--)\r
321 {\r
322 free(PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrName);\r
323 free(PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrTypeName);\r
324 }\r
325 free(PtrCU[NbCU].PtrVariables);\r
326 }\r
327\r
328 free(PtrCU);\r
329}\r
330\r
331\r
332// Dwarf manager Compilation Units initialisations\r
333void DWARFManager_InitDMI(void)\r
334{\r
335 Dwarf_Unsigned next_cu_header, return_uvalue;\r
336 Dwarf_Error error;\r
337 Dwarf_Attribute *atlist;\r
338 Dwarf_Attribute return_attr1;\r
339 Dwarf_Half return_tagval, return_attr;\r
340 Dwarf_Addr return_lowpc, return_highpc, return_lineaddr;\r
341 Dwarf_Block *return_block;\r
342 Dwarf_Signed atcnt, cnt;\r
0203b5fd 343 Dwarf_Die return_sib, return_die, return_sub, return_subdie;\r
ebcb0f3d
JPM
344 Dwarf_Off return_offset;\r
345 Dwarf_Line *linebuf;\r
346 FILE *SrcFile;\r
ebcb0f3d 347 char *return_string;\r
1155c536 348 char *Ptr, *Ptr1;\r
ebcb0f3d
JPM
349\r
350 // Initialisation for the Compilation Units table\r
351 NbCU = 0;\r
352 PtrCU = NULL;\r
353\r
354 // loop on the available Compilation Unit\r
355 while (dwarf_next_cu_header(dbg, NULL, NULL, NULL, NULL, &next_cu_header, &error) == DW_DLV_OK)\r
356 {\r
357 // Allocation of an additional Compilation Unit structure in the table\r
358 if (Ptr = (char *)realloc(PtrCU, ((NbCU + 1) * sizeof(CUStruct))))\r
359 {\r
360 // Compilation Unit RAZ\r
361 PtrCU = (CUStruct *)Ptr;\r
362 memset(PtrCU + NbCU, 0, sizeof(CUStruct));\r
363\r
41d6f5f7
JPM
364 // Debug specific CU\r
365#ifdef DEBUG_NumCU\r
366 if (NbCU == DEBUG_NumCU)\r
367#endif\r
ebcb0f3d 368 {\r
41d6f5f7
JPM
369 // Get 1st Die from the Compilation Unit\r
370 if (dwarf_siblingof(dbg, NULL, &return_sib, &error) == DW_DLV_OK)\r
ebcb0f3d 371 {\r
41d6f5f7
JPM
372 // Get Die's Tag\r
373 if ((dwarf_tag(return_sib, &return_tagval, &error) == DW_DLV_OK))\r
ebcb0f3d 374 {\r
41d6f5f7
JPM
375 PtrCU[NbCU].Tag = return_tagval;\r
376\r
377 // Die type detection\r
378 switch (return_tagval)\r
ebcb0f3d 379 {\r
65597951 380 case DW_TAG_compile_unit:\r
41d6f5f7 381 if (dwarf_attrlist(return_sib, &atlist, &atcnt, &error) == DW_DLV_OK)\r
ebcb0f3d 382 {\r
41d6f5f7 383 for (Dwarf_Signed i = 0; i < atcnt; ++i)\r
ebcb0f3d 384 {\r
41d6f5f7 385 if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK)\r
ebcb0f3d 386 {\r
41d6f5f7 387 switch (return_attr)\r
ebcb0f3d 388 {\r
65597951
JPM
389 // Start address\r
390 case DW_AT_low_pc:\r
41d6f5f7
JPM
391 if (dwarf_lowpc(return_sib, &return_lowpc, &error) == DW_DLV_OK)\r
392 {\r
393 PtrCU[NbCU].LowPC = return_lowpc;\r
394 }\r
395 break;\r
ebcb0f3d 396\r
65597951
JPM
397 // End address\r
398 case DW_AT_high_pc:\r
41d6f5f7
JPM
399 if (dwarf_highpc(return_sib, &return_highpc, &error) == DW_DLV_OK)\r
400 {\r
401 PtrCU[NbCU].HighPC = return_highpc;\r
402 }\r
403 break;\r
ebcb0f3d 404\r
65597951
JPM
405 // compilation information\r
406 case DW_AT_producer:\r
41d6f5f7
JPM
407 if (dwarf_formstring(atlist[i], &return_string, &error) == DW_DLV_OK)\r
408 {\r
409 PtrCU[NbCU].PtrProducer = (char *)calloc(strlen(return_string) + 1, 1);\r
410 strcpy(PtrCU[NbCU].PtrProducer, return_string);\r
411 dwarf_dealloc(dbg, return_string, DW_DLA_STRING);\r
412 }\r
413 break;\r
ebcb0f3d 414\r
65597951
JPM
415 // Filename\r
416 case DW_AT_name:\r
41d6f5f7
JPM
417 if (dwarf_formstring(atlist[i], &return_string, &error) == DW_DLV_OK)\r
418 {\r
f8dde18d
JPM
419#ifdef DEBUG_Filename\r
420 if (strstr(return_string, DEBUG_Filename))\r
421#endif\r
422 {\r
423 PtrCU[NbCU].PtrSourceFilename = (char *)calloc((strlen(return_string) + 1), 1);\r
424 strcpy(PtrCU[NbCU].PtrSourceFilename, return_string);\r
425 }\r
41d6f5f7
JPM
426 dwarf_dealloc(dbg, return_string, DW_DLA_STRING);\r
427 }\r
428 break;\r
ebcb0f3d 429\r
65597951
JPM
430 // Directory name\r
431 case DW_AT_comp_dir:\r
41d6f5f7
JPM
432 if (dwarf_formstring(atlist[i], &return_string, &error) == DW_DLV_OK)\r
433 {\r
f8dde18d
JPM
434 PtrCU[NbCU].PtrSourceFileDirectory = (char *)calloc((strlen(return_string) + 1), 1);\r
435 strcpy(PtrCU[NbCU].PtrSourceFileDirectory, return_string);\r
41d6f5f7
JPM
436 dwarf_dealloc(dbg, return_string, DW_DLA_STRING);\r
437 }\r
438 break;\r
ebcb0f3d 439\r
695f52e3
JPM
440 // Language\r
441 case DW_AT_language:\r
442 if (dwarf_formudata(atlist[i], &return_uvalue, &error) == DW_DLV_OK)\r
443 {\r
444 PtrCU[NbCU].Language = return_uvalue;\r
445 }\r
446 break;\r
447\r
41d6f5f7
JPM
448 default:\r
449 break;\r
450 }\r
ebcb0f3d 451 }\r
41d6f5f7 452 dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR);\r
ebcb0f3d 453 }\r
41d6f5f7 454 dwarf_dealloc(dbg, atlist, DW_DLA_LIST);\r
ebcb0f3d 455 }\r
ebcb0f3d 456\r
f0dd2f7b 457 // Check filename presence\r
f8dde18d
JPM
458 if (!PtrCU[NbCU].PtrSourceFilename)\r
459 {\r
460 PtrCU[NbCU].PtrSourceFilename = (char *)calloc(1, 1);\r
461 }\r
462\r
f0dd2f7b 463 // Check directory presence\r
f8dde18d
JPM
464 if (!PtrCU[NbCU].PtrSourceFileDirectory)\r
465 {\r
f0dd2f7b
JPM
466 // Check if file exists in the search paths\r
467 for (size_t i = 0; i < NbSearchPaths; i++)\r
468 {\r
469 PtrCU[NbCU].PtrFullFilename = (char *)realloc(PtrCU[NbCU].PtrFullFilename, strlen(PtrCU[NbCU].PtrSourceFilename) + strlen((const char *)ListSearchPaths[i]) + 2);\r
470#if defined(_WIN32)\r
471 sprintf(PtrCU[NbCU].PtrFullFilename, "%s\\%s", ListSearchPaths[i], PtrCU[NbCU].PtrSourceFilename);\r
472#else\r
473 sprintf(PtrCU[NbCU].PtrFullFilename, "%s/%s", ListSearchPaths[i], PtrCU[NbCU].PtrSourceFilename);\r
474#endif\r
475 if (!fopen_s(&SrcFile, PtrCU[NbCU].PtrFullFilename, "rb"))\r
476 {\r
477 PtrCU[NbCU].PtrSourceFileDirectory = (char *)realloc(PtrCU[NbCU].PtrSourceFileDirectory, strlen(ListSearchPaths[i]) + 1);\r
478 strcpy(PtrCU[NbCU].PtrSourceFileDirectory, ListSearchPaths[i]);\r
479 }\r
480 }\r
481\r
482 // File directory doesn't exits\r
483 if (!PtrCU[NbCU].PtrSourceFileDirectory)\r
484 {\r
485 PtrCU[NbCU].PtrSourceFileDirectory = (char *)realloc(PtrCU[NbCU].PtrSourceFileDirectory, 2);\r
486 strcpy(PtrCU[NbCU].PtrSourceFileDirectory, ".");\r
487 }\r
f8dde18d
JPM
488 }\r
489\r
695f52e3
JPM
490 // Conform slashes / backslashes for the filename\r
491 DWARFManager_ConformSlachesBackslashes(PtrCU[NbCU].PtrSourceFilename);\r
492\r
493 // Check if filename contains already the complete directory\r
494 if (PtrCU[NbCU].PtrSourceFilename[1] == ':')\r
495 {\r
496 // Copy the filename as the full filename\r
497 PtrCU[NbCU].PtrFullFilename = (char *)realloc(PtrCU[NbCU].PtrFullFilename, strlen(PtrCU[NbCU].PtrSourceFilename) + 1);\r
498 strcpy(PtrCU[NbCU].PtrFullFilename, PtrCU[NbCU].PtrSourceFilename);\r
499 }\r
500 else\r
ebcb0f3d 501 {\r
695f52e3
JPM
502 // Create full filename and Conform slashes / backslashes\r
503 PtrCU[NbCU].PtrFullFilename = (char *)realloc(PtrCU[NbCU].PtrFullFilename, strlen(PtrCU[NbCU].PtrSourceFilename) + strlen(PtrCU[NbCU].PtrSourceFileDirectory) + 2);\r
65597951 504#if defined(_WIN32)\r
695f52e3 505 sprintf(PtrCU[NbCU].PtrFullFilename, "%s\\%s", PtrCU[NbCU].PtrSourceFileDirectory, PtrCU[NbCU].PtrSourceFilename);\r
65597951 506#else\r
695f52e3 507 sprintf(PtrCU[NbCU].PtrFullFilename, "%s/%s", PtrCU[NbCU].PtrSourceFileDirectory, PtrCU[NbCU].PtrSourceFilename);\r
65597951 508#endif\r
ebcb0f3d 509 }\r
ebcb0f3d 510\r
695f52e3
JPM
511 DWARFManager_ConformSlachesBackslashes(PtrCU[NbCU].PtrFullFilename);\r
512\r
1155c536
JPM
513 // Directory path clean-up\r
514#if defined(_WIN32)\r
515 while ((Ptr1 = Ptr = strstr(PtrCU[NbCU].PtrFullFilename, "\\..\\")))\r
516#else\r
517 while ((Ptr1 = Ptr = strstr(PtrCU[NbCU].PtrFullFilename, "/../")))\r
518#endif\r
519 {\r
520#if defined(_WIN32)\r
521 while (*--Ptr1 != '\\');\r
522#else\r
523 while (*--Ptr1 != '/');\r
524#endif\r
525 strcpy((Ptr1 + 1), (Ptr + 4));\r
526 }\r
527\r
f795e8ac
JPM
528 // Open the source file as a binary file\r
529 if (!fopen_s(&SrcFile, PtrCU[NbCU].PtrFullFilename, "rb"))\r
ebcb0f3d 530 {\r
41d6f5f7 531 if (!fseek(SrcFile, 0, SEEK_END))\r
ebcb0f3d 532 {\r
41d6f5f7 533 if ((PtrCU[NbCU].SizeLoadSrc = ftell(SrcFile)) > 0)\r
ebcb0f3d 534 {\r
f795e8ac 535 if (!fseek(SrcFile, 0, SEEK_SET))\r
ebcb0f3d 536 {\r
f795e8ac 537 if (PtrCU[NbCU].PtrLoadSrc = Ptr = Ptr1 = (char *)calloc(1, (PtrCU[NbCU].SizeLoadSrc + 2)))\r
ebcb0f3d 538 {\r
f795e8ac
JPM
539 // Read whole file\r
540 if (fread_s(PtrCU[NbCU].PtrLoadSrc, PtrCU[NbCU].SizeLoadSrc, PtrCU[NbCU].SizeLoadSrc, 1, SrcFile) != 1)\r
ebcb0f3d 541 {\r
f795e8ac
JPM
542 free(PtrCU[NbCU].PtrLoadSrc);\r
543 PtrCU[NbCU].PtrLoadSrc = NULL;\r
544 PtrCU[NbCU].SizeLoadSrc = 0;\r
545 }\r
546 else\r
547 {\r
548 // Eliminate all carriage return code '\r' (oxd)\r
549 do\r
550 {\r
551 if ((*Ptr = *Ptr1) != '\r')\r
552 {\r
553 Ptr++;\r
554 }\r
555 }\r
556 while (*Ptr1++);\r
557\r
558 // Get back the new text file size\r
559 PtrCU[NbCU].SizeLoadSrc = strlen(Ptr = PtrCU[NbCU].PtrLoadSrc);\r
560\r
561 // Make sure the text file finish with a new line code '\n' (0xa)\r
562 if (PtrCU[NbCU].PtrLoadSrc[PtrCU[NbCU].SizeLoadSrc - 1] != '\n')\r
41d6f5f7 563 {\r
f795e8ac
JPM
564 PtrCU[NbCU].PtrLoadSrc[PtrCU[NbCU].SizeLoadSrc++] = '\n';\r
565 PtrCU[NbCU].PtrLoadSrc[PtrCU[NbCU].SizeLoadSrc] = 0;\r
41d6f5f7 566 }\r
f795e8ac
JPM
567\r
568 // Reallocate text file\r
569 if (PtrCU[NbCU].PtrLoadSrc = Ptr = (char *)realloc(PtrCU[NbCU].PtrLoadSrc, (PtrCU[NbCU].SizeLoadSrc + 1)))\r
570 {\r
571 // Count line numbers, based on the new line code '\n' (0xa), and finish each line with 0\r
572 do\r
573 {\r
574 if (*Ptr == '\n')\r
575 {\r
576 PtrCU[NbCU].NbLinesLoadSrc++;\r
577 *Ptr = 0;\r
578 }\r
579 } while (*++Ptr);\r
580 }\r
581 }\r
41d6f5f7 582 }\r
ebcb0f3d
JPM
583 }\r
584 }\r
585 }\r
41d6f5f7 586 fclose(SrcFile);\r
ebcb0f3d 587 }\r
41d6f5f7 588 break;\r
ebcb0f3d 589\r
41d6f5f7
JPM
590 default:\r
591 break;\r
592 }\r
ebcb0f3d 593 }\r
ebcb0f3d 594\r
f795e8ac 595 // Get the source lines table located in the CU\r
41d6f5f7
JPM
596 if (dwarf_srclines(return_sib, &linebuf, &cnt, &error) == DW_DLV_OK)\r
597 {\r
5fa7aa73
JPM
598 if (cnt)\r
599 {\r
695f52e3
JPM
600 PtrCU[NbCU].NbUsedLinesSrc = cnt;\r
601 PtrCU[NbCU].PtrUsedLinesSrc = (CUStruct_LineSrc *)calloc(cnt, sizeof(CUStruct_LineSrc));\r
602 PtrCU[NbCU].PtrUsedLinesLoadSrc = (char **)calloc(cnt, sizeof(char *));\r
603 PtrCU[NbCU].PtrUsedNumLines = (size_t *)calloc(cnt, sizeof(size_t));\r
604\r
605 // Get the addresses and their source line numbers\r
5fa7aa73
JPM
606 for (Dwarf_Signed i = 0; i < cnt; i++)\r
607 {\r
608 if (dwarf_lineaddr(linebuf[i], &return_lineaddr, &error) == DW_DLV_OK)\r
609 {\r
610 if (dwarf_lineno(linebuf[i], &return_uvalue, &error) == DW_DLV_OK)\r
611 {\r
695f52e3
JPM
612 PtrCU[NbCU].PtrUsedLinesSrc[i].StartPC = return_lineaddr;\r
613 PtrCU[NbCU].PtrUsedLinesSrc[i].NumLineSrc = return_uvalue;\r
614\r
615 // Get the last used line number in the source file\r
616 if (PtrCU[NbCU].LastNumUsedLinesSrc < PtrCU[NbCU].PtrUsedLinesSrc[i].NumLineSrc)\r
617 {\r
618 PtrCU[NbCU].LastNumUsedLinesSrc = PtrCU[NbCU].PtrUsedLinesSrc[i].NumLineSrc;\r
619 }\r
5fa7aa73
JPM
620 }\r
621 }\r
622 }\r
623 }\r
41d6f5f7 624 }\r
ebcb0f3d 625\r
0203b5fd 626 // Check if the CU has child\r
41d6f5f7 627 if (dwarf_child(return_sib, &return_die, &error) == DW_DLV_OK)\r
ebcb0f3d 628 {\r
41d6f5f7 629 do\r
ebcb0f3d 630 {\r
41d6f5f7
JPM
631 return_sib = return_die;\r
632 if ((dwarf_tag(return_die, &return_tagval, &error) == DW_DLV_OK))\r
ebcb0f3d 633 {\r
41d6f5f7 634 switch (return_tagval)\r
ebcb0f3d 635 {\r
65597951 636 case DW_TAG_lexical_block:\r
41d6f5f7 637 break;\r
ebcb0f3d 638\r
65597951 639 case DW_TAG_variable:\r
41d6f5f7 640 if (dwarf_attrlist(return_die, &atlist, &atcnt, &error) == DW_DLV_OK)\r
ebcb0f3d 641 {\r
41d6f5f7
JPM
642 PtrCU[NbCU].PtrVariables = (VariablesStruct *)realloc(PtrCU[NbCU].PtrVariables, ((PtrCU[NbCU].NbVariables + 1) * sizeof(VariablesStruct)));\r
643 memset(PtrCU[NbCU].PtrVariables + PtrCU[NbCU].NbVariables, 0, sizeof(VariablesStruct));\r
644\r
645 for (Dwarf_Signed i = 0; i < atcnt; ++i)\r
ebcb0f3d 646 {\r
41d6f5f7 647 if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK)\r
ebcb0f3d 648 {\r
41d6f5f7 649 if (dwarf_attr(return_die, return_attr, &return_attr1, &error) == DW_DLV_OK)\r
ebcb0f3d 650 {\r
41d6f5f7 651 switch (return_attr)\r
ebcb0f3d 652 {\r
65597951 653 case DW_AT_location:\r
41d6f5f7 654 if (dwarf_formblock(return_attr1, &return_block, &error) == DW_DLV_OK)\r
ebcb0f3d 655 {\r
0203b5fd
JPM
656 PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].Op = (*((unsigned char *)(return_block->bl_data)));\r
657\r
658 switch (return_block->bl_len)\r
41d6f5f7 659 {\r
0203b5fd 660 case 5:\r
41d6f5f7 661 PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].Addr = (*((unsigned char *)(return_block->bl_data) + 1) << 24) + (*((unsigned char *)(return_block->bl_data) + 2) << 16) + (*((unsigned char *)(return_block->bl_data) + 3) << 8) + (*((unsigned char *)(return_block->bl_data) + 4));\r
0203b5fd
JPM
662 break;\r
663\r
664 default:\r
665 break;\r
41d6f5f7
JPM
666 }\r
667 dwarf_dealloc(dbg, return_block, DW_DLA_BLOCK);\r
ebcb0f3d 668 }\r
41d6f5f7 669 break;\r
ebcb0f3d 670\r
65597951 671 case DW_AT_type:\r
41d6f5f7
JPM
672 if (dwarf_global_formref(return_attr1, &return_offset, &error) == DW_DLV_OK)\r
673 {\r
674 PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].TypeOffset = return_offset;\r
675 }\r
676 break;\r
ebcb0f3d 677\r
65597951
JPM
678 // Variable name\r
679 case DW_AT_name:\r
41d6f5f7
JPM
680 if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK)\r
681 {\r
0203b5fd
JPM
682#ifdef DEBUG_VariableName\r
683 if (!strcmp(return_string, DEBUG_VariableName))\r
684#endif\r
685 {\r
686 PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrName = (char *)calloc(strlen(return_string) + 1, 1);\r
687 strcpy(PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrName, return_string);\r
0203b5fd 688 }\r
f8dde18d 689 dwarf_dealloc(dbg, return_string, DW_DLA_STRING);\r
41d6f5f7
JPM
690 }\r
691 break;\r
ebcb0f3d 692\r
65597951 693 default:\r
41d6f5f7
JPM
694 break;\r
695 }\r
ebcb0f3d
JPM
696 }\r
697 }\r
ebcb0f3d 698\r
41d6f5f7
JPM
699 dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR);\r
700 }\r
ebcb0f3d 701\r
ce32526a
JPM
702 // Check variable's name validity\r
703 if (PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrName)\r
704 {\r
705 // Check variable's memory address validity\r
706 if (PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].Addr)\r
707 {\r
708 // Valid variable\r
709 PtrCU[NbCU].NbVariables++;\r
710 }\r
711 else\r
712 {\r
713 // Invalid variable\r
714 free(PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrName);\r
715 PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrName = NULL;\r
716 }\r
717 }\r
ebcb0f3d 718\r
41d6f5f7 719 dwarf_dealloc(dbg, atlist, DW_DLA_LIST);\r
ebcb0f3d 720 }\r
41d6f5f7
JPM
721 break;\r
722\r
65597951
JPM
723 case DW_TAG_base_type:\r
724 case DW_TAG_typedef:\r
725 case DW_TAG_structure_type:\r
726 case DW_TAG_pointer_type:\r
727 case DW_TAG_const_type:\r
728 case DW_TAG_array_type:\r
729 case DW_TAG_subrange_type:\r
730 case DW_TAG_subroutine_type:\r
f8dde18d 731 case DW_TAG_enumeration_type:\r
41d6f5f7 732 if (dwarf_attrlist(return_die, &atlist, &atcnt, &error) == DW_DLV_OK)\r
ebcb0f3d 733 {\r
f8dde18d 734 // Allocate memory for this type\r
41d6f5f7
JPM
735 PtrCU[NbCU].PtrTypes = (BaseTypeStruct *)realloc(PtrCU[NbCU].PtrTypes, ((PtrCU[NbCU].NbTypes + 1) * sizeof(BaseTypeStruct)));\r
736 memset(PtrCU[NbCU].PtrTypes + PtrCU[NbCU].NbTypes, 0, sizeof(BaseTypeStruct));\r
737 PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].Tag = return_tagval;\r
738\r
739 if (dwarf_dieoffset(return_die, &return_offset, &error) == DW_DLV_OK)\r
740 {\r
741 PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].Offset = return_offset;\r
742 }\r
743\r
744 for (Dwarf_Signed i = 0; i < atcnt; ++i)\r
ebcb0f3d 745 {\r
41d6f5f7 746 if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK)\r
ebcb0f3d 747 {\r
41d6f5f7 748 if (dwarf_attr(return_die, return_attr, &return_attr1, &error) == DW_DLV_OK)\r
ebcb0f3d 749 {\r
41d6f5f7 750 switch (return_attr)\r
ebcb0f3d 751 {\r
f8dde18d
JPM
752 // \r
753 case DW_AT_sibling:\r
754 break;\r
755\r
756 // Type's type offset\r
65597951 757 case DW_AT_type:\r
41d6f5f7
JPM
758 if (dwarf_global_formref(return_attr1, &return_offset, &error) == DW_DLV_OK)\r
759 {\r
760 PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].TypeOffset = return_offset;\r
761 }\r
762 break;\r
ebcb0f3d 763\r
f8dde18d 764 // Type's byte size\r
65597951 765 case DW_AT_byte_size:\r
41d6f5f7
JPM
766 if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK)\r
767 {\r
768 PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].ByteSize = return_uvalue;\r
769 }\r
770 break;\r
ebcb0f3d 771\r
f8dde18d 772 // Type's encoding\r
65597951 773 case DW_AT_encoding:\r
41d6f5f7
JPM
774 if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK)\r
775 {\r
776 PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].Encoding = return_uvalue;\r
777 }\r
778 break;\r
ebcb0f3d 779\r
f8dde18d 780 // Type's name\r
65597951 781 case DW_AT_name:\r
41d6f5f7
JPM
782 if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK)\r
783 {\r
f8dde18d
JPM
784#ifdef DEBUG_TypeName\r
785 if (!strcmp(return_string, DEBUG_TypeName))\r
786#endif\r
787 {\r
788 PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].PtrName = (char *)calloc(strlen(return_string) + 1, 1);\r
789 strcpy(PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].PtrName, return_string);\r
790 }\r
41d6f5f7
JPM
791 dwarf_dealloc(dbg, return_string, DW_DLA_STRING);\r
792 }\r
793 break;\r
ebcb0f3d 794\r
f8dde18d
JPM
795 // Type's file number\r
796 case DW_AT_decl_file:\r
797 break;\r
798\r
799 // Type's line number\r
800 case DW_AT_decl_line:\r
801 break;\r
802\r
803 default:\r
41d6f5f7
JPM
804 break;\r
805 }\r
ebcb0f3d
JPM
806 }\r
807 }\r
ebcb0f3d 808\r
41d6f5f7
JPM
809 dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR);\r
810 }\r
ebcb0f3d 811\r
41d6f5f7 812 PtrCU[NbCU].NbTypes++;\r
ebcb0f3d 813\r
41d6f5f7
JPM
814 dwarf_dealloc(dbg, atlist, DW_DLA_LIST);\r
815 }\r
816 break;\r
ebcb0f3d 817\r
65597951 818 case DW_TAG_subprogram:\r
41d6f5f7 819 if (dwarf_attrlist(return_die, &atlist, &atcnt, &error) == DW_DLV_OK)\r
ebcb0f3d 820 {\r
41d6f5f7
JPM
821 PtrCU[NbCU].PtrSubProgs = (SubProgStruct *)realloc(PtrCU[NbCU].PtrSubProgs, ((PtrCU[NbCU].NbSubProgs + 1) * sizeof(SubProgStruct)));\r
822 memset((void *)(PtrCU[NbCU].PtrSubProgs + PtrCU[NbCU].NbSubProgs), 0, sizeof(SubProgStruct));\r
823 PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].Tag = return_tagval;\r
824\r
825 for (Dwarf_Signed i = 0; i < atcnt; ++i)\r
ebcb0f3d 826 {\r
41d6f5f7 827 if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK)\r
ebcb0f3d 828 {\r
41d6f5f7 829 if (dwarf_attr(return_die, return_attr, &return_attr1, &error) == DW_DLV_OK)\r
ebcb0f3d 830 {\r
41d6f5f7 831 switch (return_attr)\r
ebcb0f3d 832 {\r
65597951 833 // start address\r
0203b5fd 834 case DW_AT_low_pc:\r
41d6f5f7
JPM
835 if (dwarf_lowpc(return_die, &return_lowpc, &error) == DW_DLV_OK)\r
836 {\r
837 PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].StartPC = return_lowpc;\r
838 PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].LowPC = return_lowpc;\r
839 }\r
840 break;\r
ebcb0f3d 841\r
65597951 842 // end address\r
0203b5fd 843 case DW_AT_high_pc:\r
41d6f5f7
JPM
844 if (dwarf_highpc(return_die, &return_highpc, &error) == DW_DLV_OK)\r
845 {\r
846 PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].HighPC = return_highpc;\r
847 }\r
848 break;\r
ebcb0f3d 849\r
65597951 850 // Line number\r
0203b5fd 851 case DW_AT_decl_line:\r
41d6f5f7
JPM
852 if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK)\r
853 {\r
854 PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NumLineSrc = return_uvalue;\r
855 }\r
856 break;\r
ebcb0f3d 857\r
65597951 858 // Frame\r
0203b5fd
JPM
859 case DW_AT_frame_base:\r
860 if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK)\r
861 {\r
862 PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].FrameBase = return_uvalue;\r
65597951 863 PtrCU[NbCU].NbFrames++;\r
0203b5fd
JPM
864 }\r
865 break;\r
866\r
65597951 867 // function name\r
0203b5fd 868 case DW_AT_name:\r
41d6f5f7
JPM
869 if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK)\r
870 {\r
871 PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrSubprogramName = (char *)calloc(strlen(return_string) + 1, 1);\r
872 strcpy(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrSubprogramName, return_string);\r
873 dwarf_dealloc(dbg, return_string, DW_DLA_STRING);\r
874 }\r
875 break;\r
ebcb0f3d 876\r
65597951
JPM
877 case DW_AT_sibling:\r
878 break;\r
879\r
880 case DW_AT_GNU_all_tail_call_sites:\r
881 break;\r
882\r
883 case DW_AT_type:\r
884 break;\r
885\r
886 case DW_AT_prototyped:\r
887 break;\r
888\r
889 // File number\r
890 case DW_AT_decl_file:\r
891 break;\r
892\r
893 case DW_AT_external:\r
894 break;\r
895\r
41d6f5f7
JPM
896 default:\r
897 break;\r
898 }\r
ebcb0f3d
JPM
899 }\r
900 }\r
41d6f5f7 901 dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR);\r
ebcb0f3d 902 }\r
41d6f5f7 903 dwarf_dealloc(dbg, atlist, DW_DLA_LIST);\r
ebcb0f3d 904\r
f8dde18d 905 // Get source line number and associated block of address\r
ce32526a 906 for (Dwarf_Signed i = 0; i < cnt; ++i)\r
ebcb0f3d 907 {\r
41d6f5f7 908 if (dwarf_lineaddr(linebuf[i], &return_lineaddr, &error) == DW_DLV_OK)\r
ebcb0f3d 909 {\r
41d6f5f7 910 if (dwarf_lineno(linebuf[i], &return_uvalue, &error) == DW_DLV_OK)\r
ebcb0f3d 911 {\r
41d6f5f7
JPM
912 if ((return_lineaddr >= return_lowpc) && (return_lineaddr <= return_highpc))\r
913 {\r
914 PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc = (DMIStruct_LineSrc *)realloc(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc, (PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc + 1) * sizeof(DMIStruct_LineSrc));\r
915 memset((void *)(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc), 0, sizeof(DMIStruct_LineSrc));\r
916 PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc].StartPC = return_lineaddr;\r
917 PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc].NumLineSrc = return_uvalue;\r
918 PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc++;\r
919 }\r
ebcb0f3d
JPM
920 }\r
921 }\r
41d6f5f7
JPM
922 }\r
923\r
0203b5fd
JPM
924 if (dwarf_child(return_die, &return_subdie, &error) == DW_DLV_OK)\r
925 {\r
926 do\r
927 {\r
928 return_sub = return_subdie;\r
929 if ((dwarf_tag(return_subdie, &return_tagval, &error) == DW_DLV_OK))\r
930 {\r
931 switch (return_tagval)\r
932 {\r
933 case DW_TAG_formal_parameter:\r
934 case DW_TAG_variable:\r
935 if (dwarf_attrlist(return_subdie, &atlist, &atcnt, &error) == DW_DLV_OK)\r
936 {\r
937 PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables = (VariablesStruct *)realloc(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables, ((PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables + 1) * sizeof(VariablesStruct)));\r
938 memset(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables, 0, sizeof(VariablesStruct));\r
939\r
940 for (Dwarf_Signed i = 0; i < atcnt; ++i)\r
941 {\r
942 if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK)\r
943 {\r
944 if (dwarf_attr(return_subdie, return_attr, &return_attr1, &error) == DW_DLV_OK)\r
945 {\r
946 switch (return_attr)\r
947 {\r
65597951 948 case DW_AT_location:\r
0203b5fd
JPM
949 if (dwarf_formblock(return_attr1, &return_block, &error) == DW_DLV_OK)\r
950 {\r
951 PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].Op = *((unsigned char *)(return_block->bl_data));\r
952\r
953 switch (return_block->bl_len)\r
954 {\r
955 case 1:\r
956 break;\r
957\r
958 case 2:\r
f8dde18d 959 case 3:\r
47b6ecae 960 switch (return_tagval)\r
0203b5fd 961 {\r
65597951 962 case DW_TAG_variable:\r
f8dde18d 963 PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].Offset = ReadLEB128((char *)return_block->bl_data + 1);\r
47b6ecae
JPM
964 break;\r
965\r
65597951 966 case DW_TAG_formal_parameter:\r
f8dde18d 967 PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].Offset = ReadULEB128((char *)return_block->bl_data + 1);\r
47b6ecae
JPM
968 break;\r
969\r
970 default:\r
971 break;\r
0203b5fd 972 }\r
f8dde18d 973 break;\r
0203b5fd
JPM
974\r
975 default:\r
976 break;\r
977 }\r
978 dwarf_dealloc(dbg, return_block, DW_DLA_BLOCK);\r
979 }\r
980 break;\r
981\r
65597951 982 case DW_AT_type:\r
0203b5fd
JPM
983 if (dwarf_global_formref(return_attr1, &return_offset, &error) == DW_DLV_OK)\r
984 {\r
985 PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].TypeOffset = return_offset;\r
986 }\r
987 break;\r
988\r
65597951 989 case DW_AT_name:\r
0203b5fd
JPM
990 if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK)\r
991 {\r
992#ifdef DEBUG_VariableName\r
993 if (!strcmp(return_string, DEBUG_VariableName))\r
994#endif\r
995 {\r
996 PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].PtrName = (char *)calloc(strlen(return_string) + 1, 1);\r
997 strcpy(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].PtrName, return_string);\r
0203b5fd 998 }\r
f8dde18d 999 dwarf_dealloc(dbg, return_string, DW_DLA_STRING);\r
0203b5fd
JPM
1000 }\r
1001 break;\r
1002\r
65597951 1003 case DW_AT_decl_file:\r
47b6ecae
JPM
1004 break;\r
1005\r
65597951 1006 case DW_AT_decl_line:\r
47b6ecae
JPM
1007 break;\r
1008\r
0203b5fd
JPM
1009 default:\r
1010 break;\r
1011 }\r
1012 }\r
1013 }\r
1014\r
1015 dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR);\r
1016 }\r
1017\r
1018 PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables++;\r
1019\r
1020 dwarf_dealloc(dbg, atlist, DW_DLA_LIST);\r
1021 }\r
1022 break;\r
1023\r
1024 case DW_TAG_label:\r
1025 break;\r
1026\r
1027 default:\r
1028 break;\r
1029 }\r
1030 }\r
1031 }\r
1032 while (dwarf_siblingof(dbg, return_sub, &return_subdie, &error) == DW_DLV_OK);\r
1033 }\r
1034\r
41d6f5f7 1035 PtrCU[NbCU].NbSubProgs++;\r
ebcb0f3d 1036 }\r
41d6f5f7 1037 break;\r
ebcb0f3d 1038\r
41d6f5f7
JPM
1039 default:\r
1040 break;\r
1041 }\r
ebcb0f3d 1042 }\r
0203b5fd
JPM
1043 }\r
1044 while (dwarf_siblingof(dbg, return_sib, &return_die, &error) == DW_DLV_OK);\r
ebcb0f3d 1045 }\r
ebcb0f3d 1046\r
41d6f5f7 1047 // Release the memory used by the source lines\r
ce32526a 1048 for (Dwarf_Signed i = 0; i < cnt; ++i)\r
47b6ecae 1049 {\r
41d6f5f7 1050 dwarf_dealloc(dbg, linebuf[i], DW_DLA_LINE);\r
47b6ecae 1051 }\r
41d6f5f7
JPM
1052 dwarf_dealloc(dbg, linebuf, DW_DLA_LIST);\r
1053 }\r
ebcb0f3d 1054\r
41d6f5f7
JPM
1055 // Set the source code lines for QT html/text conformity\r
1056 if (PtrCU[NbCU].NbLinesLoadSrc)\r
ebcb0f3d 1057 {\r
41d6f5f7 1058 if (PtrCU[NbCU].PtrLinesLoadSrc = (char **)calloc(PtrCU[NbCU].NbLinesLoadSrc, sizeof(char *)))\r
ebcb0f3d 1059 {\r
ce32526a 1060 for (size_t j = 0; j < PtrCU[NbCU].NbLinesLoadSrc; j++)\r
ebcb0f3d 1061 {\r
41d6f5f7 1062 if (PtrCU[NbCU].PtrLinesLoadSrc[j] = (char *)calloc(10000, sizeof(char)))\r
ebcb0f3d 1063 {\r
41d6f5f7 1064 if (Ptr = DWARFManager_GetLineSrcFromNumLine(PtrCU[NbCU].PtrLoadSrc, (j + 1)))\r
ebcb0f3d 1065 {\r
ce32526a 1066 size_t i = 0;\r
41d6f5f7
JPM
1067\r
1068 while (*Ptr)\r
ebcb0f3d 1069 {\r
41d6f5f7
JPM
1070 switch (*Ptr)\r
1071 {\r
695f52e3 1072#ifdef CONVERT_QT_HML\r
41d6f5f7
JPM
1073 case 9:\r
1074 strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], "&nbsp;");\r
ce32526a 1075 i += 6;\r
41d6f5f7
JPM
1076 break;\r
1077\r
1078 case '<':\r
1079 strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], "&lt;");\r
ce32526a 1080 i += 4;\r
41d6f5f7
JPM
1081 break;\r
1082\r
1083 case '>':\r
1084 strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], "&gt;");\r
ce32526a 1085 i += 4;\r
41d6f5f7 1086 break;\r
ebcb0f3d 1087#if 0\r
41d6f5f7
JPM
1088 case '&':\r
1089 strcpy(PtrCU[NbCU].PtrLinesLoadSrc[j], "&amp;");\r
1090 i += strlen("&amp;");\r
1091 break;\r
ebcb0f3d
JPM
1092#endif\r
1093#if 0\r
41d6f5f7
JPM
1094 case '"':\r
1095 strcpy(PtrCU[NbCU].PtrLinesLoadSrc[j], "&quot;");\r
1096 i += strlen("&quot;");\r
1097 break;\r
695f52e3 1098#endif\r
ebcb0f3d 1099#endif\r
41d6f5f7
JPM
1100 default:\r
1101 PtrCU[NbCU].PtrLinesLoadSrc[j][i++] = *Ptr;\r
1102 break;\r
1103 }\r
1104 Ptr++;\r
ebcb0f3d 1105 }\r
ebcb0f3d 1106 }\r
ce32526a 1107 PtrCU[NbCU].PtrLinesLoadSrc[j] = (char *)realloc(PtrCU[NbCU].PtrLinesLoadSrc[j], strlen(PtrCU[NbCU].PtrLinesLoadSrc[j]) + 1);\r
ebcb0f3d 1108 }\r
ebcb0f3d 1109 }\r
95fe01d7 1110\r
5fa7aa73 1111 // Init lines source information for each source code line numbers and for each subprogs\r
ce32526a 1112 for (size_t j = 0; j < PtrCU[NbCU].NbSubProgs; j++)\r
95fe01d7
JPM
1113 {\r
1114 // Check if the subprog / function's line exists in the source code\r
1115 if (PtrCU[NbCU].PtrSubProgs[j].NumLineSrc <= PtrCU[NbCU].NbLinesLoadSrc)\r
1116 {\r
1117 PtrCU[NbCU].PtrSubProgs[j].PtrLineSrc = PtrCU[NbCU].PtrLinesLoadSrc[PtrCU[NbCU].PtrSubProgs[j].NumLineSrc - 1];\r
1118 }\r
1119\r
ce32526a 1120 for (size_t k = 0; k < PtrCU[NbCU].PtrSubProgs[j].NbLinesSrc; k++)\r
95fe01d7
JPM
1121 {\r
1122 if (PtrCU[NbCU].PtrSubProgs[j].PtrLinesSrc[k].NumLineSrc <= PtrCU[NbCU].NbLinesLoadSrc)\r
1123 {\r
1124 PtrCU[NbCU].PtrSubProgs[j].PtrLinesSrc[k].PtrLineSrc = PtrCU[NbCU].PtrLinesLoadSrc[PtrCU[NbCU].PtrSubProgs[j].PtrLinesSrc[k].NumLineSrc - 1];\r
1125 }\r
1126 }\r
1127 }\r
ebcb0f3d
JPM
1128 }\r
1129 }\r
41d6f5f7 1130 else\r
ebcb0f3d 1131 {\r
41d6f5f7
JPM
1132 // Set each source lines pointer to NULL\r
1133 if (PtrCU[NbCU].NbSubProgs)\r
ebcb0f3d 1134 {\r
95fe01d7
JPM
1135 // Check the presence of source lines dedicated to the sub progs\r
1136 if (PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs - 1].NbLinesSrc)\r
ebcb0f3d 1137 {\r
ce32526a 1138 size_t i = PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs - 1].PtrLinesSrc[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs - 1].NbLinesSrc - 1].NumLineSrc;\r
95fe01d7 1139 if (PtrCU[NbCU].PtrLinesLoadSrc = (char **)calloc(i, sizeof(char *)))\r
41d6f5f7 1140 {\r
ce32526a 1141 for (size_t j = 0; j < i; j++)\r
95fe01d7
JPM
1142 {\r
1143 PtrCU[NbCU].PtrLinesLoadSrc[j] = NULL;\r
1144 }\r
41d6f5f7 1145 }\r
ebcb0f3d
JPM
1146 }\r
1147 }\r
1148 }\r
ebcb0f3d 1149\r
695f52e3
JPM
1150 // Check validity between used number lines and number lines in the source file\r
1151 if (PtrCU[NbCU].LastNumUsedLinesSrc <= PtrCU[NbCU].NbLinesLoadSrc)\r
5fa7aa73 1152 {\r
695f52e3
JPM
1153 // Set information based on used line numbers\r
1154 if (PtrCU[NbCU].PtrUsedLinesSrc)\r
5fa7aa73 1155 {\r
695f52e3
JPM
1156 // Set the line source pointers for each used line numbers\r
1157 if (PtrCU[NbCU].PtrLinesLoadSrc)\r
5fa7aa73 1158 {\r
695f52e3
JPM
1159 for (size_t i = 0; i < PtrCU[NbCU].NbUsedLinesSrc; i++)\r
1160 {\r
1161 PtrCU[NbCU].PtrUsedNumLines[i] = PtrCU[NbCU].PtrUsedLinesSrc[i].NumLineSrc - 1;\r
1162 PtrCU[NbCU].PtrUsedLinesLoadSrc[i] = PtrCU[NbCU].PtrUsedLinesSrc[i].PtrLineSrc = PtrCU[NbCU].PtrLinesLoadSrc[PtrCU[NbCU].PtrUsedLinesSrc[i].NumLineSrc - 1];\r
1163 }\r
0536c3ba 1164\r
695f52e3
JPM
1165 // Setup memory range for the code if CU doesn't have already this information\r
1166 // It is taken from the used lines structure\r
1167 if (!PtrCU[NbCU].LowPC && (!PtrCU[NbCU].HighPC || (PtrCU[NbCU].HighPC == ~0)))\r
1168 {\r
1169 PtrCU[NbCU].LowPC = PtrCU[NbCU].PtrUsedLinesSrc[0].StartPC;\r
1170 PtrCU[NbCU].HighPC = PtrCU[NbCU].PtrUsedLinesSrc[PtrCU[NbCU].NbUsedLinesSrc - 1].StartPC;\r
1171 }\r
0536c3ba 1172 }\r
5fa7aa73 1173 }\r
5fa7aa73
JPM
1174 }\r
1175\r
0203b5fd 1176 // Init global variables information based on types information\r
ce32526a 1177 for (size_t i = 0; i < PtrCU[NbCU].NbVariables; i++)\r
ebcb0f3d 1178 {\r
0203b5fd
JPM
1179 DWARFManager_InitInfosVariable(PtrCU[NbCU].PtrVariables + i);\r
1180 }\r
41d6f5f7 1181\r
0203b5fd 1182 // Init local variables information based on types information\r
ce32526a 1183 for (size_t i = 0; i < PtrCU[NbCU].NbSubProgs; i++)\r
0203b5fd 1184 {\r
ce32526a 1185 for (size_t j = 0; j < PtrCU[NbCU].PtrSubProgs[i].NbVariables; j++)\r
ebcb0f3d 1186 {\r
0203b5fd 1187 DWARFManager_InitInfosVariable(PtrCU[NbCU].PtrSubProgs[i].PtrVariables + j);\r
ebcb0f3d
JPM
1188 }\r
1189 }\r
1190 }\r
1191\r
1192 ++NbCU;\r
1193 }\r
1194 } \r
ebcb0f3d
JPM
1195}\r
1196\r
1197\r
695f52e3
JPM
1198// Conform slashes and backslashes\r
1199void DWARFManager_ConformSlachesBackslashes(char *Ptr)\r
1200{\r
1201 while (*Ptr)\r
1202 {\r
1203#if defined(_WIN32)\r
1204 if (*Ptr == '/')\r
1205 {\r
1206 *Ptr = '\\';\r
1207 }\r
1208#else\r
1209 if (*Ptr == '\\')\r
1210 {\r
1211 *Ptr = '/';\r
1212 }\r
1213#endif\r
1214 Ptr++;\r
1215 }\r
1216}\r
1217\r
1218\r
65597951 1219// Variables information initialisation\r
0203b5fd
JPM
1220void DWARFManager_InitInfosVariable(VariablesStruct *PtrVariables)\r
1221{\r
1222 size_t j, TypeOffset;\r
1223\r
f8dde18d
JPM
1224#ifdef DEBUG_VariableName\r
1225 if (PtrVariables->PtrName && !strcmp(PtrVariables->PtrName, DEBUG_VariableName))\r
1226#endif\r
0203b5fd 1227 {\r
f8dde18d
JPM
1228 PtrVariables->PtrTypeName = (char *)calloc(1000, 1);\r
1229 TypeOffset = PtrVariables->TypeOffset;\r
1230\r
1231 for (j = 0; j < PtrCU[NbCU].NbTypes; j++)\r
0203b5fd 1232 {\r
f8dde18d 1233 if (TypeOffset == PtrCU[NbCU].PtrTypes[j].Offset)\r
0203b5fd 1234 {\r
f8dde18d 1235 switch (PtrCU[NbCU].PtrTypes[j].Tag)\r
0203b5fd 1236 {\r
f8dde18d
JPM
1237 case DW_TAG_subroutine_type:\r
1238 PtrVariables->TypeTag |= TypeTag_subroutine_type;\r
1239 strcat(PtrVariables->PtrTypeName, " (* ) ()");\r
1240 break;\r
1241\r
1242 // Structure type tag\r
1243 case DW_TAG_structure_type:\r
1244 PtrVariables->TypeTag |= TypeTag_structure;\r
1245 if (!(PtrVariables->TypeTag & TypeTag_typedef))\r
0203b5fd 1246 {\r
f951022b
JPM
1247 if (PtrCU[NbCU].PtrTypes[j].PtrName)\r
1248 {\r
1249 strcat(PtrVariables->PtrTypeName, PtrCU[NbCU].PtrTypes[j].PtrName);\r
1250 }\r
0203b5fd 1251 }\r
f8dde18d
JPM
1252 if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
1253 {\r
1254 j = -1;\r
1255 }\r
1256 else\r
1257 {\r
1258 if ((PtrVariables->TypeTag & TypeTag_pointer))\r
1259 {\r
1260 strcat(PtrVariables->PtrTypeName, " *");\r
1261 }\r
1262 }\r
1263 break;\r
0203b5fd 1264\r
f8dde18d
JPM
1265 // Pointer type tag\r
1266 case DW_TAG_pointer_type:\r
1267 PtrVariables->TypeTag |= TypeTag_pointer;\r
1268 PtrVariables->TypeByteSize = PtrCU[NbCU].PtrTypes[j].ByteSize;\r
1269 PtrVariables->TypeEncoding = 0x10;\r
1270 if (!(TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
1271 {\r
1272 strcat(PtrVariables->PtrTypeName, "void *");\r
1273 }\r
1274 else\r
1275 {\r
1276 j = -1;\r
1277 }\r
1278 break;\r
0203b5fd 1279\r
f8dde18d
JPM
1280 case DW_TAG_enumeration_type:\r
1281 PtrVariables->TypeTag |= TypeTag_enumeration_type;\r
1282 PtrVariables->TypeByteSize = PtrCU[NbCU].PtrTypes[j].ByteSize;\r
1283 if (!(PtrVariables->TypeEncoding = PtrCU[NbCU].PtrTypes[j].Encoding))\r
1284 {\r
1285 // Try to determine the possible size\r
1286 switch (PtrVariables->TypeByteSize)\r
1287 {\r
1288 case 4:\r
1289 PtrVariables->TypeEncoding = 0x7;\r
1290 break;\r
0203b5fd 1291\r
f8dde18d
JPM
1292 default:\r
1293 break;\r
1294 }\r
1295 }\r
1296 break;\r
0203b5fd 1297\r
f8dde18d
JPM
1298 // Typedef type tag\r
1299 case DW_TAG_typedef:\r
1300 if (!(PtrVariables->TypeTag & TypeTag_typedef))\r
1301 {\r
1302 PtrVariables->TypeTag |= TypeTag_typedef;\r
1303 strcat(PtrVariables->PtrTypeName, PtrCU[NbCU].PtrTypes[j].PtrName);\r
1304 }\r
1305 if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
1306 {\r
1307 j = -1;\r
1308 }\r
1309 break;\r
0203b5fd 1310\r
f8dde18d
JPM
1311 // ? type tag\r
1312 case DW_TAG_subrange_type:\r
1313 PtrVariables->TypeTag |= TypeTag_subrange;\r
1314 break;\r
0203b5fd 1315\r
f8dde18d
JPM
1316 // Array type tag\r
1317 case DW_TAG_array_type:\r
1318 PtrVariables->TypeTag |= TypeTag_arraytype;\r
1319 if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
1320 {\r
1321 j = -1;\r
1322 }\r
1323 break;\r
1324\r
1325 // Const type tag\r
1326 case DW_TAG_const_type:\r
1327 PtrVariables->TypeTag |= TypeTag_consttype;\r
1328 strcat(PtrVariables->PtrTypeName, "const ");\r
1329 if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
1330 {\r
1331 j = -1;\r
1332 }\r
1333 break;\r
1334\r
1335 // Base type tag\r
1336 case DW_TAG_base_type:\r
1337 if (!(PtrVariables->TypeTag & TypeTag_typedef))\r
1338 {\r
1339 strcat(PtrVariables->PtrTypeName, PtrCU[NbCU].PtrTypes[j].PtrName);\r
1340 }\r
1341 if ((PtrVariables->TypeTag & TypeTag_pointer))\r
1342 {\r
1343 strcat(PtrVariables->PtrTypeName, " *");\r
1344 }\r
1345 else\r
1346 {\r
1347 PtrVariables->TypeByteSize = PtrCU[NbCU].PtrTypes[j].ByteSize;\r
1348 PtrVariables->TypeEncoding = PtrCU[NbCU].PtrTypes[j].Encoding;\r
1349 }\r
1350 if ((PtrVariables->TypeTag & TypeTag_arraytype))\r
1351 {\r
1352 strcat(PtrVariables->PtrTypeName, "[]");\r
1353 }\r
1354 break;\r
1355\r
1356 default:\r
1357 break;\r
1358 }\r
0203b5fd
JPM
1359 }\r
1360 }\r
1361 }\r
1362}\r
1363\r
1364\r
ebcb0f3d
JPM
1365// Get symbol name based from address\r
1366// Return NULL if no symbol name exists\r
1367char *DWARFManager_GetSymbolnameFromAdr(size_t Adr)\r
1368{\r
f0dd2f7b 1369 for (size_t i = 0; i < NbCU; i++)\r
ebcb0f3d
JPM
1370 {\r
1371 if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
1372 {\r
f0dd2f7b 1373 for (size_t j = 0; j < PtrCU[i].NbSubProgs; j++)\r
ebcb0f3d
JPM
1374 {\r
1375 if ((PtrCU[i].PtrSubProgs[j].StartPC == Adr))\r
1376 {\r
1377 return PtrCU[i].PtrSubProgs[j].PtrSubprogramName;\r
1378 }\r
1379 }\r
1380 }\r
1381 }\r
1382\r
1383 return NULL;\r
1384}\r
1385\r
1386\r
1387// Get complete source filename based from address\r
1388// Return NULL if no source filename exists\r
1389// Return the existence status (true or false) in Error\r
1390char *DWARFManager_GetFullSourceFilenameFromAdr(size_t Adr, bool *Error)\r
1391{\r
f0dd2f7b 1392 for (size_t i = 0; i < NbCU; i++)\r
ebcb0f3d
JPM
1393 {\r
1394 if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
1395 {\r
1396 *Error = PtrCU[i].PtrLoadSrc ? true : false;\r
1397 return PtrCU[i].PtrFullFilename;\r
1398 }\r
1399 }\r
1400\r
1401 return NULL;\r
1402}\r
1403\r
1404\r
f0dd2f7b 1405// Get text line source based on line number (starting from 1)\r
ebcb0f3d
JPM
1406// Return NULL if no text line exists or if line number is 0\r
1407char *DWARFManager_GetLineSrcFromNumLine(char *PtrSrcFile, size_t NumLine)\r
1408{\r
1409 size_t i = 0;\r
1410 char *PtrLineSrc = NULL;\r
1411\r
1412 if (PtrSrcFile)\r
1413 {\r
1414 while (i != NumLine)\r
1415 {\r
1416 PtrLineSrc = PtrSrcFile;\r
1417 while (*PtrSrcFile++);\r
1418 i++;\r
1419 }\r
1420 }\r
1421\r
1422 return PtrLineSrc;\r
1423}\r
1424\r
1425\r
0203b5fd
JPM
1426// Get number of variables referenced by the function range address\r
1427size_t DWARFManager_GetNbLocalVariables(size_t Adr)\r
1428{\r
f0dd2f7b 1429 for (size_t i = 0; i < NbCU; i++)\r
0203b5fd
JPM
1430 {\r
1431 if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
1432 {\r
f0dd2f7b 1433 for (size_t j = 0; j < PtrCU[i].NbSubProgs; j++)\r
0203b5fd
JPM
1434 {\r
1435 if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
1436 {\r
1437 return PtrCU[i].PtrSubProgs[j].NbVariables;\r
1438 }\r
1439 }\r
1440 }\r
1441 }\r
1442\r
1443 return 0;\r
1444}\r
1445\r
1446\r
f0dd2f7b 1447// Get local variable name based on his index (starting from 1)\r
0203b5fd
JPM
1448// Return name's pointer text found\r
1449// Return NULL if not found\r
1450char *DWARFManager_GetLocalVariableName(size_t Adr, size_t Index)\r
1451{\r
f0dd2f7b 1452 for (size_t i = 0; i < NbCU; i++)\r
0203b5fd
JPM
1453 {\r
1454 if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
1455 {\r
f0dd2f7b 1456 for (size_t j = 0; j < PtrCU[i].NbSubProgs; j++)\r
0203b5fd
JPM
1457 {\r
1458 if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
1459 {\r
1460 return PtrCU[i].PtrSubProgs[j].PtrVariables[Index - 1].PtrName;\r
1461 }\r
1462 }\r
1463 }\r
1464 }\r
1465\r
1466 return NULL;\r
1467}\r
1468\r
1469\r
f0dd2f7b 1470// Get local variable's type tag based on his index (starting from 1)\r
0203b5fd
JPM
1471// Return 0 if not found\r
1472size_t DWARFManager_GetLocalVariableTypeTag(size_t Adr, size_t Index)\r
1473{\r
f0dd2f7b 1474 for (size_t i = 0; i < NbCU; i++)\r
0203b5fd
JPM
1475 {\r
1476 if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
1477 {\r
f0dd2f7b 1478 for (size_t j = 0; j < PtrCU[i].NbSubProgs; j++)\r
0203b5fd
JPM
1479 {\r
1480 if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
1481 {\r
1482 return PtrCU[i].PtrSubProgs[j].PtrVariables[Index - 1].TypeTag;\r
1483 }\r
1484 }\r
1485 }\r
1486 }\r
1487\r
1488 return 0;\r
1489}\r
1490\r
1491\r
f0dd2f7b
JPM
1492// Get the local variable's offset based on a index (starting from 1)\r
1493// Return 0 if no offset has been found\r
0203b5fd
JPM
1494int DWARFManager_GetLocalVariableOffset(size_t Adr, size_t Index)\r
1495{\r
f0dd2f7b 1496 for (size_t i = 0; i < NbCU; i++)\r
0203b5fd
JPM
1497 {\r
1498 if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
1499 {\r
f0dd2f7b 1500 for (size_t j = 0; j < PtrCU[i].NbSubProgs; j++)\r
0203b5fd
JPM
1501 {\r
1502 if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
1503 {\r
1504 return PtrCU[i].PtrSubProgs[j].PtrVariables[Index - 1].Offset;\r
1505 }\r
1506 }\r
1507 }\r
1508 }\r
1509\r
1510 return 0;\r
1511}\r
1512\r
1513\r
f0dd2f7b 1514// Get local variable Type Byte Size based on his address and index (starting from 1)\r
0203b5fd
JPM
1515// Return 0 if not found\r
1516// May return 0 if there is no Type Byte Size linked to the variable's address and index\r
1517size_t DWARFManager_GetLocalVariableTypeByteSize(size_t Adr, size_t Index)\r
1518{\r
f0dd2f7b 1519 for (size_t i = 0; i < NbCU; i++)\r
0203b5fd
JPM
1520 {\r
1521 if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
1522 {\r
f0dd2f7b 1523 for (size_t j = 0; j < PtrCU[i].NbSubProgs; j++)\r
0203b5fd
JPM
1524 {\r
1525 if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
1526 {\r
1527 return PtrCU[i].PtrSubProgs[j].PtrVariables[Index - 1].TypeByteSize;\r
1528 }\r
1529 }\r
1530 }\r
1531 }\r
1532\r
1533 return 0;\r
1534}\r
1535\r
1536\r
f0dd2f7b 1537// Get local variable Type Encoding based on his address and index (starting from 1)\r
0203b5fd
JPM
1538// Return 0 if not found\r
1539// May return 0 if there is no Type Encoding linked to the variable's address and index\r
1540size_t DWARFManager_GetLocalVariableTypeEncoding(size_t Adr, size_t Index)\r
1541{\r
f0dd2f7b 1542 for (size_t i = 0; i < NbCU; i++)\r
0203b5fd
JPM
1543 {\r
1544 if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
1545 {\r
f0dd2f7b 1546 for (size_t j = 0; j < PtrCU[i].NbSubProgs; j++)\r
0203b5fd
JPM
1547 {\r
1548 if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
1549 {\r
1550 return PtrCU[i].PtrSubProgs[j].PtrVariables[Index - 1].TypeEncoding;\r
1551 }\r
1552 }\r
1553 }\r
1554 }\r
1555\r
1556 return 0;\r
1557}\r
1558\r
1559\r
f0dd2f7b 1560// Get local variable Op based on his address and index (starting from 1)\r
5fa7aa73 1561// Return 0 if not found, may return 0 if there isn't Op linked to the variable's index\r
0203b5fd
JPM
1562size_t DWARFManager_GetLocalVariableOp(size_t Adr, size_t Index)\r
1563{\r
f0dd2f7b 1564 for (size_t i = 0; i < NbCU; i++)\r
0203b5fd
JPM
1565 {\r
1566 if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
1567 {\r
f0dd2f7b 1568 for (size_t j = 0; j < PtrCU[i].NbSubProgs; j++)\r
0203b5fd
JPM
1569 {\r
1570 if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
1571 {\r
1572 return PtrCU[i].PtrSubProgs[j].PtrVariables[Index - 1].Op;\r
1573 }\r
1574 }\r
1575 }\r
1576 }\r
1577\r
1578 return 0;\r
1579}\r
1580\r
1581\r
f0dd2f7b 1582// Get local variable type name based on his index (starting from 1) and an address\r
5fa7aa73 1583// Return NULL if not found, may also return NULL if there is no type linked to the variable's index\r
0203b5fd
JPM
1584char *DWARFManager_GetLocalVariableTypeName(size_t Adr, size_t Index)\r
1585{\r
f0dd2f7b 1586 for (size_t i = 0; i < NbCU; i++)\r
0203b5fd
JPM
1587 {\r
1588 if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
1589 {\r
f0dd2f7b 1590 for (size_t j = 0; j < PtrCU[i].NbSubProgs; j++)\r
0203b5fd
JPM
1591 {\r
1592 if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
1593 {\r
1594 return PtrCU[i].PtrSubProgs[j].PtrVariables[Index - 1].PtrTypeName;\r
1595 }\r
1596 }\r
1597 }\r
1598 }\r
1599\r
1600 return NULL;\r
1601}\r
1602\r
1603\r
1604// Get Compilation Unit / global variables numbers\r
5fa7aa73 1605// Return number of variables\r
0203b5fd 1606size_t DWARFManager_GetNbGlobalVariables(void)\r
ebcb0f3d 1607{\r
f0dd2f7b 1608 size_t NbVariables = 0;\r
ebcb0f3d 1609\r
f0dd2f7b 1610 for (size_t i = 0; i < NbCU; i++)\r
ebcb0f3d
JPM
1611 {\r
1612 NbVariables += PtrCU[i].NbVariables;\r
1613 }\r
1614\r
1615 return NbVariables;\r
1616}\r
1617\r
1618\r
f0dd2f7b 1619// Get global variable type name based on his index (starting from 1)\r
ebcb0f3d
JPM
1620// Return NULL if not found\r
1621// May return NULL if there is not type linked to the variable's index\r
0203b5fd 1622char *DWARFManager_GetGlobalVariableTypeName(size_t Index)\r
ebcb0f3d 1623{\r
f0dd2f7b 1624 for (size_t i = 0; i < NbCU; i++)\r
ebcb0f3d
JPM
1625 {\r
1626 if (PtrCU[i].NbVariables)\r
1627 {\r
1628 if (Index <= PtrCU[i].NbVariables)\r
1629 {\r
1630 return PtrCU[i].PtrVariables[Index - 1].PtrTypeName;\r
1631 }\r
1632 else\r
1633 {\r
1634 Index -= PtrCU[i].NbVariables;\r
1635 }\r
1636 }\r
1637 }\r
1638\r
1639 return NULL;\r
1640}\r
1641\r
1642\r
f0dd2f7b 1643// Get global variable's type tag based on his index (starting from 1)\r
ebcb0f3d 1644// Return 0 if not found\r
0203b5fd 1645size_t DWARFManager_GetGlobalVariableTypeTag(size_t Index)\r
ebcb0f3d 1646{\r
f0dd2f7b 1647 for (size_t i = 0; i < NbCU; i++)\r
ebcb0f3d
JPM
1648 {\r
1649 if (PtrCU[i].NbVariables)\r
1650 {\r
1651 if (Index <= PtrCU[i].NbVariables)\r
1652 {\r
1653 return PtrCU[i].PtrVariables[Index - 1].TypeTag;\r
1654 }\r
1655 else\r
1656 {\r
1657 Index -= PtrCU[i].NbVariables;\r
1658 }\r
1659 }\r
1660 }\r
1661\r
1662 return 0;\r
1663}\r
1664\r
1665\r
f0dd2f7b 1666// Get global variable byte size based on his index (starting from 1)\r
ebcb0f3d 1667// Return 0 if not found\r
0203b5fd 1668size_t DWARFManager_GetGlobalVariableTypeByteSize(size_t Index)\r
ebcb0f3d 1669{\r
f0dd2f7b 1670 for (size_t i = 0; i < NbCU; i++)\r
ebcb0f3d
JPM
1671 {\r
1672 if (PtrCU[i].NbVariables)\r
1673 {\r
1674 if (Index <= PtrCU[i].NbVariables)\r
1675 {\r
1676 return PtrCU[i].PtrVariables[Index - 1].TypeByteSize;\r
1677 }\r
1678 else\r
1679 {\r
1680 Index -= PtrCU[i].NbVariables;\r
1681 }\r
1682 }\r
1683 }\r
1684\r
1685 return 0;\r
1686}\r
1687\r
1688\r
f0dd2f7b 1689// Get global variable encoding based on his index (starting from 1)\r
ebcb0f3d 1690// Return 0 if not found\r
0203b5fd 1691size_t DWARFManager_GetGlobalVariableTypeEncoding(size_t Index)\r
ebcb0f3d 1692{\r
f0dd2f7b 1693 for (size_t i = 0; i < NbCU; i++)\r
ebcb0f3d
JPM
1694 {\r
1695 if (PtrCU[i].NbVariables)\r
1696 {\r
1697 if (Index <= PtrCU[i].NbVariables)\r
1698 {\r
1699 return PtrCU[i].PtrVariables[Index - 1].TypeEncoding;\r
1700 }\r
1701 else\r
1702 {\r
1703 Index -= PtrCU[i].NbVariables;\r
1704 }\r
1705 }\r
1706 }\r
1707\r
1708 return 0;\r
1709}\r
1710\r
1711\r
f0dd2f7b 1712// Get global variable memory address based on his index (starting from 1)\r
ebcb0f3d 1713// Return 0 if not found\r
0203b5fd 1714size_t DWARFManager_GetGlobalVariableAdr(size_t Index)\r
ebcb0f3d 1715{\r
f0dd2f7b 1716 for (size_t i = 0; i < NbCU; i++)\r
ebcb0f3d
JPM
1717 {\r
1718 if (PtrCU[i].NbVariables)\r
1719 {\r
1720 if (Index <= PtrCU[i].NbVariables)\r
1721 {\r
1722 return PtrCU[i].PtrVariables[Index - 1].Addr;\r
1723 }\r
1724 else\r
1725 {\r
1726 Index -= PtrCU[i].NbVariables;\r
1727 }\r
1728 }\r
1729 }\r
1730\r
1731 return 0;\r
1732}\r
1733\r
1734\r
0203b5fd 1735// Get global variable memory address based on his name\r
5fa7aa73 1736// Return 0 if not found, or will return the first occurence found\r
0203b5fd 1737size_t DWARFManager_GetGlobalVariableAdrFromName(char *VariableName)\r
ebcb0f3d 1738{\r
f0dd2f7b 1739 for (size_t i = 0; i < NbCU; i++)\r
ebcb0f3d
JPM
1740 {\r
1741 if (PtrCU[i].NbVariables)\r
1742 {\r
f0dd2f7b 1743 for (size_t j = 0; j < PtrCU[i].NbVariables; j++)\r
ebcb0f3d
JPM
1744 {\r
1745 if (!strcmp(PtrCU[i].PtrVariables[j].PtrName,VariableName))\r
1746 {\r
1747 return PtrCU[i].PtrVariables[j].Addr;\r
1748 }\r
1749 }\r
1750 }\r
1751 }\r
1752\r
1753 return 0;\r
1754}\r
1755\r
1756\r
f0dd2f7b 1757// Get global variable name based on his index (starting from 1)\r
5fa7aa73 1758// Return name's pointer text found, or will return NULL if no variable can be found\r
0203b5fd 1759char *DWARFManager_GetGlobalVariableName(size_t Index)\r
ebcb0f3d 1760{\r
f0dd2f7b 1761 for (size_t i = 0; i < NbCU; i++)\r
ebcb0f3d
JPM
1762 {\r
1763 if (PtrCU[i].NbVariables)\r
1764 {\r
1765 if (Index <= PtrCU[i].NbVariables)\r
1766 {\r
1767 return PtrCU[i].PtrVariables[Index - 1].PtrName;\r
1768 }\r
1769 else\r
1770 {\r
1771 Index -= PtrCU[i].NbVariables;\r
1772 }\r
1773 }\r
1774 }\r
1775\r
1776 return NULL;\r
1777}\r
1778\r
1779\r
1780// Get text line from source based on address and his tag\r
5fa7aa73
JPM
1781// A tag can be either 0 or a DW_TAG_subprogram\r
1782// DW_TAG_subprogram will look for the line pointing to the function\r
ebcb0f3d
JPM
1783// Return NULL if no text line has been found\r
1784char *DWARFManager_GetLineSrcFromAdr(size_t Adr, size_t Tag)\r
1785{\r
f0dd2f7b 1786 for (size_t i = 0; i < NbCU; i++)\r
ebcb0f3d
JPM
1787 {\r
1788 if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
1789 {\r
f0dd2f7b 1790 for (size_t j = 0; j < PtrCU[i].NbSubProgs; j++)\r
ebcb0f3d
JPM
1791 {\r
1792 if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
1793 {\r
1794 if ((PtrCU[i].PtrSubProgs[j].StartPC == Adr) && (!Tag || (Tag == DW_TAG_subprogram)))\r
1795 {\r
1796 return PtrCU[i].PtrSubProgs[j].PtrLineSrc;\r
1797 }\r
1798 else\r
1799 {\r
f0dd2f7b 1800 for (size_t k = 0; k < PtrCU[i].PtrSubProgs[j].NbLinesSrc; k++)\r
ebcb0f3d 1801 {\r
f8dde18d
JPM
1802 if (PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].StartPC <= Adr)\r
1803 {\r
1804 if ((PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].StartPC == Adr) && (!Tag || (PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].Tag == Tag)))\r
1805 {\r
1806 return PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].PtrLineSrc;\r
1807 }\r
1808 }\r
1809 else\r
ebcb0f3d 1810 {\r
f8dde18d 1811 return PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k - 1].PtrLineSrc;\r
ebcb0f3d
JPM
1812 }\r
1813 }\r
1814 }\r
1815 }\r
1816 }\r
1817 }\r
1818 }\r
1819\r
1820 return NULL;\r
1821}\r
1822\r
1823\r
5fa7aa73
JPM
1824// Get line number based on the address and a tag\r
1825// A tag can be either 0 or a DW_TAG_subprogram\r
1826// DW_TAG_subprogram will look for the line pointing to the function name as described in the source code\r
ebcb0f3d
JPM
1827// Return 0 if no line number has been found\r
1828size_t DWARFManager_GetNumLineFromAdr(size_t Adr, size_t Tag)\r
1829{\r
f0dd2f7b 1830 for (size_t i = 0; i < NbCU; i++)\r
ebcb0f3d
JPM
1831 {\r
1832 if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
1833 {\r
f0dd2f7b 1834 for (size_t j = 0; j < PtrCU[i].NbSubProgs; j++)\r
ebcb0f3d
JPM
1835 {\r
1836 if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
1837 {\r
1838 if ((PtrCU[i].PtrSubProgs[j].StartPC == Adr) && (!Tag || (Tag == DW_TAG_subprogram)))\r
1839 {\r
1840 return PtrCU[i].PtrSubProgs[j].NumLineSrc;\r
1841 }\r
1842 else\r
1843 {\r
f0dd2f7b 1844 for (size_t k = 0; k < PtrCU[i].PtrSubProgs[j].NbLinesSrc; k++)\r
ebcb0f3d
JPM
1845 {\r
1846 if ((PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].StartPC == Adr) && (!Tag || (PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].Tag == Tag)))\r
1847 {\r
1848 return PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].NumLineSrc;\r
1849 }\r
1850 }\r
1851 }\r
1852#if 0\r
1853 if (!Tag || (Tag == DW_TAG_subprogram))\r
1854 {\r
1855 return PtrCU[i].PtrSubProgs[j].NumLineSrc;\r
1856 }\r
1857#endif\r
1858 }\r
1859 }\r
0536c3ba
JPM
1860\r
1861 // Check if a used line is found with the address\r
695f52e3 1862 for (size_t j = 0; j < PtrCU[i].NbUsedLinesSrc; j++)\r
0536c3ba 1863 {\r
695f52e3 1864 if (PtrCU[i].PtrUsedLinesSrc[j].StartPC == Adr)\r
0536c3ba 1865 {\r
695f52e3 1866 return PtrCU[i].PtrUsedLinesSrc[j].NumLineSrc;\r
0536c3ba
JPM
1867 }\r
1868 }\r
ebcb0f3d
JPM
1869 }\r
1870 }\r
1871\r
1872 return 0;\r
1873}\r
1874\r
1875\r
5fa7aa73
JPM
1876// Get function name based on an address\r
1877// Return NULL if no function name has been found, otherwise will return the function name in the range of the provided address\r
0203b5fd
JPM
1878char *DWARFManager_GetFunctionName(size_t Adr)\r
1879{\r
f0dd2f7b 1880 for (size_t i = 0; i < NbCU; i++)\r
0203b5fd
JPM
1881 {\r
1882 if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
1883 {\r
f0dd2f7b 1884 for (size_t j = 0; j < PtrCU[i].NbSubProgs; j++)\r
0203b5fd
JPM
1885 {\r
1886 if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
1887 {\r
1888 return PtrCU[i].PtrSubProgs[j].PtrSubprogramName;\r
1889 }\r
1890 }\r
1891 }\r
1892 }\r
1893\r
1894 return NULL;\r
1895}\r
1896\r
1897\r
695f52e3
JPM
1898// Get number of lines of texts source list from source index\r
1899size_t DWARFManager_GetSrcNbListPtrFromIndex(size_t Index, bool Used)\r
1900{\r
1901 if (!Used)\r
1902 {\r
1903 return PtrCU[Index].NbLinesLoadSrc;\r
1904 }\r
1905 else\r
1906 {\r
1907 return PtrCU[Index].NbUsedLinesSrc;\r
1908 }\r
1909}\r
1910\r
1911\r
1912// Get text source line number list pointer from source index\r
1913// Return NULL for the text source used list \r
1914size_t *DWARFManager_GetSrcNumLinesPtrFromIndex(size_t Index, bool Used)\r
1915{\r
1916 if (Used)\r
1917 {\r
1918 return PtrCU[Index].PtrUsedNumLines;\r
1919 }\r
1920 else\r
1921 {\r
1922 return NULL;\r
1923 }\r
1924}\r
1925\r
1926\r
1927// Get text source list pointers from source index\r
1928// Return NULL for the text source used list \r
1929char **DWARFManager_GetSrcListPtrFromIndex(size_t Index, bool Used)\r
1930{\r
1931 if (!Used)\r
1932 {\r
1933 return PtrCU[Index].PtrLinesLoadSrc;\r
1934 }\r
1935 else\r
1936 {\r
1937 return PtrCU[Index].PtrUsedLinesLoadSrc;\r
1938 }\r
1939}\r
1940\r
1941\r
1942// Get source language\r
1943size_t DWARFManager_GetSrcLanguageFromIndex(size_t Index)\r
1944{\r
1945 return PtrCU[Index].Language;\r
1946}\r
1947\r
1948\r
f0dd2f7b 1949// Get text line from source based on address and num line (starting from 1)\r
ebcb0f3d
JPM
1950// Return NULL if no text line has been found\r
1951char *DWARFManager_GetLineSrcFromAdrNumLine(size_t Adr, size_t NumLine)\r
1952{\r
f0dd2f7b 1953 for (size_t i = 0; i < NbCU; i++)\r
ebcb0f3d
JPM
1954 {\r
1955 if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
1956 {\r
f0dd2f7b 1957 for (size_t j = 0; j < PtrCU[i].NbSubProgs; j++)\r
ebcb0f3d
JPM
1958 {\r
1959 if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
1960 {\r
1961 if (PtrCU[i].PtrSubProgs[j].NumLineSrc == NumLine)\r
1962 {\r
1963 return PtrCU[i].PtrSubProgs[j].PtrLineSrc;\r
1964 }\r
1965 else\r
1966 {\r
f0dd2f7b 1967 for (size_t k = 0; k < PtrCU[i].PtrSubProgs[j].NbLinesSrc; k++)\r
ebcb0f3d
JPM
1968 {\r
1969 if (PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].NumLineSrc == NumLine)\r
1970 {\r
1971 return PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].PtrLineSrc;\r
1972 }\r
1973 }\r
1974 }\r
1975 }\r
1976 }\r
1977 }\r
1978 }\r
1979\r
1980 return NULL;\r
1981}\r
1982\r
1983\r
f0dd2f7b 1984// Get text line pointer from source, based on address and line number (starting from 1)\r
f795e8ac 1985// Return NULL if no text line has been found, or if requested number line is above the source total number of lines\r
ebcb0f3d
JPM
1986char *DWARFManager_GetLineSrcFromNumLineBaseAdr(size_t Adr, size_t NumLine)\r
1987{\r
f0dd2f7b 1988 for (size_t i = 0; i < NbCU; i++)\r
ebcb0f3d
JPM
1989 {\r
1990 if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
1991 {\r
41d6f5f7
JPM
1992 if (NumLine <= PtrCU[i].NbLinesLoadSrc)\r
1993 {\r
1994 return PtrCU[i].PtrLinesLoadSrc[NumLine - 1];\r
1995 }\r
1996 else\r
1997 {\r
1998 return NULL;\r
1999 }\r
ebcb0f3d
JPM
2000 }\r
2001 }\r
2002\r
2003 return NULL;\r
2004}\r
2005\r
6564336c
JPM
2006\r
2007// Get number of source code filenames\r
695f52e3 2008size_t DWARFManager_GetNbSources(void)\r
6564336c
JPM
2009{\r
2010 return NbCU;\r
2011}\r
2012\r
2013\r
695f52e3 2014// Get source code filename, including his directory, based on index (starting from 0)\r
6564336c
JPM
2015char *DWARFManager_GetNumFullSourceFilename(size_t Index)\r
2016{\r
2017 return (PtrCU[Index].PtrFullFilename);\r
2018}\r
2019\r
695f52e3
JPM
2020\r
2021// Get source code filename based on index (starting from 0)\r
2022char *DWARFManager_GetNumSourceFilename(size_t Index)\r
2023{\r
2024 return (PtrCU[Index].PtrSourceFilename);\r
2025}\r
2026\r