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