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