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