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