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