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