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