2 // DWARFManager.cpp: DWARF format manager
6 // JPM = Jean-Paul Mari <djipi.mari@gmail.com>
9 // --- ---------- ------------------------------------------------------------
10 // JPM 12/03/2016 Created this file
11 // JPM 12/03/2016 DWARF format support
23 //#define DEBUG_NumCU 0x6 // CU number to debug or undefine it
24 //#define DEBUG_VariableName "argc" // Variable name to look for or undefine it
27 // Source line internal structure
28 struct DMIStruct_LineSrc
36 // Base type internal structure
39 size_t Tag
; // Type's Tag
40 size_t Offset
; // Type's offset
41 size_t TypeOffset
; // Type's offset on another type
42 size_t ByteSize
; // Type's Byte Size
43 size_t Encoding
; // Type's encoding
44 char *PtrName
; // Type's name
47 // Definitions for the variables's typetag
48 #define TypeTag_structure 0x01 // structure
49 #define TypeTag_pointer 0x02 // pointer
50 #define TypeTag_0x04 0x04
51 #define TypeTag_arraytype 0x08 // array type
52 #define TypeTag_consttype 0x10 // const type
53 #define TypeTag_typedef 0x20 // typedef
55 // Variables internal structure
56 struct VariablesStruct
58 size_t Op
; // Variable's DW_OP
61 size_t Addr
; // Variable memory address
62 int Offset
; // Variable stack offset (signed)
64 char *PtrName
; // Variable's name
65 size_t TypeOffset
; // Offset pointing on the Variable's Type
66 size_t TypeByteSize
; // Variable's Type byte size
67 size_t TypeTag
; // Variable's Type Tag
68 size_t TypeEncoding
; // Variable's Type encoding
69 char *PtrTypeName
; // Variable's Type name
72 // Sub program internal structure
81 char *PtrSubprogramName
; // Sub program name
82 size_t NbLinesSrc
; // Number of lines source used by the sub program
83 DMIStruct_LineSrc
*PtrLinesSrc
; // Pointer of the lines source for the sub program
84 size_t NbVariables
; // Variables number
85 VariablesStruct
*PtrVariables
; // Pointer to the local variables list information structure
88 // Compilation Unit internal structure
93 char *PtrProducer
; // Pointer to the "Producer" information (compiler and compilation options used)
94 char *PtrFullFilename
; // Pointer to full namefile (directory & filename)
95 size_t SizeLoadSrc
; // Source code size
96 char *PtrLoadSrc
; // Pointer to loaded source code
97 size_t NbLinesLoadSrc
; // Lines source number
98 char **PtrLinesLoadSrc
; // Pointer lists to each source line put in QT html/text conformity
99 size_t NbSubProgs
; // Number of sub programs / routines
100 SubProgStruct
*PtrSubProgs
; // Pointer to the sub programs / routines information structure
102 BaseTypeStruct
*PtrTypes
;
103 size_t NbVariables
; // Variables number
104 VariablesStruct
*PtrVariables
; // Pointer to the global variables list information structure
118 Dwarf_Handler
DWARFManager_ErrorHandler(Dwarf_Ptr perrarg
);
119 void DWARFManager_InitDMI(void);
120 void DWARFManager_CloseDMI(void);
121 bool DWARFManager_ElfClose(void);
122 char *DWARFManager_GetLineSrcFromNumLine(char *PtrSrcFile
, size_t NumLine
);
123 void DWARFManager_InitInfosVariable(VariablesStruct
*PtrVariables
);
127 Dwarf_Handler
DWARFManager_ErrorHandler(Dwarf_Ptr perrarg
)
133 // Dwarf manager init
134 void DWARFManager_Init(void)
136 LibDwarf
= DW_DLV_NO_ENTRY
;
140 // Dwarf manager Reset
141 bool DWARFManager_Reset(void)
143 return DWARFManager_ElfClose();
147 // Dwarf manager Close
148 bool DWARFManager_Close(void)
150 return(DWARFManager_Reset());
154 // Dwarf manager Elf init
155 int DWARFManager_ElfInit(Elf
*ElfPtr
)
157 if ((LibDwarf
= dwarf_elf_init(ElfPtr
, DW_DLC_READ
, (Dwarf_Handler
)DWARFManager_ErrorHandler
, errarg
, &dbg
, &error
)) == DW_DLV_OK
)
159 DWARFManager_InitDMI();
166 // Dwarf manager Elf close
167 bool DWARFManager_ElfClose(void)
169 if (LibDwarf
== DW_DLV_OK
)
171 DWARFManager_CloseDMI();
173 if (dwarf_finish(dbg
, &error
) == DW_DLV_OK
)
175 LibDwarf
= DW_DLV_NO_ENTRY
;
190 // Dwarf manager Compilation Units close
191 void DWARFManager_CloseDMI(void)
195 free(PtrCU
[NbCU
].PtrFullFilename
);
196 free(PtrCU
[NbCU
].PtrLoadSrc
);
197 free(PtrCU
[NbCU
].PtrProducer
);
199 while (PtrCU
[NbCU
].NbLinesLoadSrc
--)
201 free(PtrCU
[NbCU
].PtrLinesLoadSrc
[PtrCU
[NbCU
].NbLinesLoadSrc
]);
203 free(PtrCU
[NbCU
].PtrLinesLoadSrc
);
205 while (PtrCU
[NbCU
].NbSubProgs
--)
207 while (PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbVariables
--)
209 free(PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrVariables
[PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbVariables
].PtrName
);
210 free(PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrVariables
[PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbVariables
].PtrTypeName
);
212 free(PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrVariables
);
214 free(PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrLinesSrc
);
215 free(PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrSubprogramName
);
217 free(PtrCU
[NbCU
].PtrSubProgs
);
219 while (PtrCU
[NbCU
].NbTypes
--)
221 free(PtrCU
[NbCU
].PtrTypes
[PtrCU
[NbCU
].NbTypes
].PtrName
);
223 free(PtrCU
[NbCU
].PtrTypes
);
225 while (PtrCU
[NbCU
].NbVariables
--)
227 free(PtrCU
[NbCU
].PtrVariables
[PtrCU
[NbCU
].NbVariables
].PtrName
);
228 free(PtrCU
[NbCU
].PtrVariables
[PtrCU
[NbCU
].NbVariables
].PtrTypeName
);
230 free(PtrCU
[NbCU
].PtrVariables
);
237 // Dwarf manager Compilation Units initialisations
238 void DWARFManager_InitDMI(void)
240 Dwarf_Unsigned next_cu_header
, return_uvalue
;
242 Dwarf_Attribute
*atlist
;
243 Dwarf_Attribute return_attr1
;
244 Dwarf_Half return_tagval
, return_attr
;
245 Dwarf_Addr return_lowpc
, return_highpc
, return_lineaddr
;
246 Dwarf_Block
*return_block
;
247 Dwarf_Signed atcnt
, cnt
;
248 Dwarf_Die return_sib
, return_die
, return_sub
, return_subdie
;
249 Dwarf_Off return_offset
;
255 char *SourceFilename
= NULL
;
256 char *SourceFileDirectory
= NULL
;
257 char *SourceFullFilename
= NULL
;
259 // Initialisation for the Compilation Units table
263 // loop on the available Compilation Unit
264 while (dwarf_next_cu_header(dbg
, NULL
, NULL
, NULL
, NULL
, &next_cu_header
, &error
) == DW_DLV_OK
)
266 // Allocation of an additional Compilation Unit structure in the table
267 if (Ptr
= (char *)realloc(PtrCU
, ((NbCU
+ 1) * sizeof(CUStruct
))))
269 // Compilation Unit RAZ
270 PtrCU
= (CUStruct
*)Ptr
;
271 memset(PtrCU
+ NbCU
, 0, sizeof(CUStruct
));
275 if (NbCU
== DEBUG_NumCU
)
278 // Get 1st Die from the Compilation Unit
279 if (dwarf_siblingof(dbg
, NULL
, &return_sib
, &error
) == DW_DLV_OK
)
282 if ((dwarf_tag(return_sib
, &return_tagval
, &error
) == DW_DLV_OK
))
284 PtrCU
[NbCU
].Tag
= return_tagval
;
286 // Die type detection
287 switch (return_tagval
)
289 case DW_TAG_compile_unit
:
290 if (dwarf_attrlist(return_sib
, &atlist
, &atcnt
, &error
) == DW_DLV_OK
)
292 for (Dwarf_Signed i
= 0; i
< atcnt
; ++i
)
294 if (dwarf_whatattr(atlist
[i
], &return_attr
, &error
) == DW_DLV_OK
)
299 if (dwarf_lowpc(return_sib
, &return_lowpc
, &error
) == DW_DLV_OK
)
301 PtrCU
[NbCU
].LowPC
= return_lowpc
;
306 if (dwarf_highpc(return_sib
, &return_highpc
, &error
) == DW_DLV_OK
)
308 PtrCU
[NbCU
].HighPC
= return_highpc
;
313 if (dwarf_formstring(atlist
[i
], &return_string
, &error
) == DW_DLV_OK
)
315 PtrCU
[NbCU
].PtrProducer
= (char *)calloc(strlen(return_string
) + 1, 1);
316 strcpy(PtrCU
[NbCU
].PtrProducer
, return_string
);
317 dwarf_dealloc(dbg
, return_string
, DW_DLA_STRING
);
322 if (dwarf_formstring(atlist
[i
], &return_string
, &error
) == DW_DLV_OK
)
324 SourceFilename
= (char *)realloc(SourceFilename
, strlen(return_string
) + 1);
325 strcpy(SourceFilename
, return_string
);
326 dwarf_dealloc(dbg
, return_string
, DW_DLA_STRING
);
331 if (dwarf_formstring(atlist
[i
], &return_string
, &error
) == DW_DLV_OK
)
333 SourceFileDirectory
= (char *)realloc(SourceFileDirectory
, strlen(return_string
) + 1);
334 strcpy(SourceFileDirectory
, return_string
);
335 dwarf_dealloc(dbg
, return_string
, DW_DLA_STRING
);
343 dwarf_dealloc(dbg
, atlist
[i
], DW_DLA_ATTR
);
345 dwarf_dealloc(dbg
, atlist
, DW_DLA_LIST
);
348 Ptr
= SourceFullFilename
= (char *)realloc(SourceFullFilename
, strlen(SourceFilename
) + strlen(SourceFileDirectory
) + 2);
349 sprintf(SourceFullFilename
, "%s\\%s", SourceFileDirectory
, SourceFilename
);
358 PtrCU
[NbCU
].PtrFullFilename
= (char *)calloc(strlen(SourceFullFilename
) + 1, 1);
359 strcpy((char *)PtrCU
[NbCU
].PtrFullFilename
, SourceFullFilename
);
362 if (!fopen_s(&SrcFile
, SourceFullFilename
, "rt"))
364 if (!(SrcFile
= fopen(SourceFullFilename
, "rt")))
367 if (!fseek(SrcFile
, 0, SEEK_END
))
369 if ((PtrCU
[NbCU
].SizeLoadSrc
= ftell(SrcFile
)) > 0)
371 if (PtrCU
[NbCU
].PtrLoadSrc
= Ptr
= (char *)calloc((PtrCU
[NbCU
].SizeLoadSrc
+ 1), 1))
374 if (PtrCU
[NbCU
].SizeLoadSrc
< fread(Ptr
, 1, PtrCU
[NbCU
].SizeLoadSrc
, SrcFile
))
376 free(PtrCU
[NbCU
].PtrLoadSrc
);
377 PtrCU
[NbCU
].PtrLoadSrc
= NULL
;
378 PtrCU
[NbCU
].SizeLoadSrc
= 0;
386 PtrCU
[NbCU
].NbLinesLoadSrc
++;
403 // Get the source lines table located in the Compilation Unit
404 if (dwarf_srclines(return_sib
, &linebuf
, &cnt
, &error
) == DW_DLV_OK
)
408 // Check if the CU has child
409 if (dwarf_child(return_sib
, &return_die
, &error
) == DW_DLV_OK
)
413 return_sib
= return_die
;
414 if ((dwarf_tag(return_die
, &return_tagval
, &error
) == DW_DLV_OK
))
416 switch (return_tagval
)
418 case DW_TAG_lexical_block
:
421 case DW_TAG_variable
:
422 if (dwarf_attrlist(return_die
, &atlist
, &atcnt
, &error
) == DW_DLV_OK
)
424 PtrCU
[NbCU
].PtrVariables
= (VariablesStruct
*)realloc(PtrCU
[NbCU
].PtrVariables
, ((PtrCU
[NbCU
].NbVariables
+ 1) * sizeof(VariablesStruct
)));
425 memset(PtrCU
[NbCU
].PtrVariables
+ PtrCU
[NbCU
].NbVariables
, 0, sizeof(VariablesStruct
));
427 for (Dwarf_Signed i
= 0; i
< atcnt
; ++i
)
429 if (dwarf_whatattr(atlist
[i
], &return_attr
, &error
) == DW_DLV_OK
)
431 if (dwarf_attr(return_die
, return_attr
, &return_attr1
, &error
) == DW_DLV_OK
)
436 if (dwarf_formblock(return_attr1
, &return_block
, &error
) == DW_DLV_OK
)
438 PtrCU
[NbCU
].PtrVariables
[PtrCU
[NbCU
].NbVariables
].Op
= (*((unsigned char *)(return_block
->bl_data
)));
440 switch (return_block
->bl_len
)
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));
449 dwarf_dealloc(dbg
, return_block
, DW_DLA_BLOCK
);
454 if (dwarf_global_formref(return_attr1
, &return_offset
, &error
) == DW_DLV_OK
)
456 PtrCU
[NbCU
].PtrVariables
[PtrCU
[NbCU
].NbVariables
].TypeOffset
= return_offset
;
461 if (dwarf_formstring(return_attr1
, &return_string
, &error
) == DW_DLV_OK
)
463 #ifdef DEBUG_VariableName
464 if (!strcmp(return_string
, DEBUG_VariableName
))
467 PtrCU
[NbCU
].PtrVariables
[PtrCU
[NbCU
].NbVariables
].PtrName
= (char *)calloc(strlen(return_string
) + 1, 1);
468 strcpy(PtrCU
[NbCU
].PtrVariables
[PtrCU
[NbCU
].NbVariables
].PtrName
, return_string
);
469 dwarf_dealloc(dbg
, return_string
, DW_DLA_STRING
);
480 dwarf_dealloc(dbg
, atlist
[i
], DW_DLA_ATTR
);
483 PtrCU
[NbCU
].NbVariables
++;
485 dwarf_dealloc(dbg
, atlist
, DW_DLA_LIST
);
489 case DW_TAG_base_type
:
491 case DW_TAG_structure_type
:
492 case DW_TAG_pointer_type
:
493 case DW_TAG_const_type
:
494 case DW_TAG_array_type
:
495 case DW_TAG_subrange_type
:
496 case DW_TAG_subroutine_type
:
497 if (dwarf_attrlist(return_die
, &atlist
, &atcnt
, &error
) == DW_DLV_OK
)
499 PtrCU
[NbCU
].PtrTypes
= (BaseTypeStruct
*)realloc(PtrCU
[NbCU
].PtrTypes
, ((PtrCU
[NbCU
].NbTypes
+ 1) * sizeof(BaseTypeStruct
)));
500 memset(PtrCU
[NbCU
].PtrTypes
+ PtrCU
[NbCU
].NbTypes
, 0, sizeof(BaseTypeStruct
));
501 PtrCU
[NbCU
].PtrTypes
[PtrCU
[NbCU
].NbTypes
].Tag
= return_tagval
;
503 if (dwarf_dieoffset(return_die
, &return_offset
, &error
) == DW_DLV_OK
)
505 PtrCU
[NbCU
].PtrTypes
[PtrCU
[NbCU
].NbTypes
].Offset
= return_offset
;
508 for (Dwarf_Signed i
= 0; i
< atcnt
; ++i
)
510 if (dwarf_whatattr(atlist
[i
], &return_attr
, &error
) == DW_DLV_OK
)
512 if (dwarf_attr(return_die
, return_attr
, &return_attr1
, &error
) == DW_DLV_OK
)
517 if (dwarf_global_formref(return_attr1
, &return_offset
, &error
) == DW_DLV_OK
)
519 PtrCU
[NbCU
].PtrTypes
[PtrCU
[NbCU
].NbTypes
].TypeOffset
= return_offset
;
523 case DW_AT_byte_size
:
524 if (dwarf_formudata(return_attr1
, &return_uvalue
, &error
) == DW_DLV_OK
)
526 PtrCU
[NbCU
].PtrTypes
[PtrCU
[NbCU
].NbTypes
].ByteSize
= return_uvalue
;
531 if (dwarf_formudata(return_attr1
, &return_uvalue
, &error
) == DW_DLV_OK
)
533 PtrCU
[NbCU
].PtrTypes
[PtrCU
[NbCU
].NbTypes
].Encoding
= return_uvalue
;
538 if (dwarf_formstring(return_attr1
, &return_string
, &error
) == DW_DLV_OK
)
540 PtrCU
[NbCU
].PtrTypes
[PtrCU
[NbCU
].NbTypes
].PtrName
= (char *)calloc(strlen(return_string
) + 1, 1);
541 strcpy(PtrCU
[NbCU
].PtrTypes
[PtrCU
[NbCU
].NbTypes
].PtrName
, return_string
);
542 dwarf_dealloc(dbg
, return_string
, DW_DLA_STRING
);
552 dwarf_dealloc(dbg
, atlist
[i
], DW_DLA_ATTR
);
555 PtrCU
[NbCU
].NbTypes
++;
557 dwarf_dealloc(dbg
, atlist
, DW_DLA_LIST
);
561 case DW_TAG_subprogram
:
562 if (dwarf_attrlist(return_die
, &atlist
, &atcnt
, &error
) == DW_DLV_OK
)
564 PtrCU
[NbCU
].PtrSubProgs
= (SubProgStruct
*)realloc(PtrCU
[NbCU
].PtrSubProgs
, ((PtrCU
[NbCU
].NbSubProgs
+ 1) * sizeof(SubProgStruct
)));
565 memset((void *)(PtrCU
[NbCU
].PtrSubProgs
+ PtrCU
[NbCU
].NbSubProgs
), 0, sizeof(SubProgStruct
));
566 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].Tag
= return_tagval
;
568 for (Dwarf_Signed i
= 0; i
< atcnt
; ++i
)
570 if (dwarf_whatattr(atlist
[i
], &return_attr
, &error
) == DW_DLV_OK
)
572 if (dwarf_attr(return_die
, return_attr
, &return_attr1
, &error
) == DW_DLV_OK
)
577 if (dwarf_lowpc(return_die
, &return_lowpc
, &error
) == DW_DLV_OK
)
579 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].StartPC
= return_lowpc
;
580 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].LowPC
= return_lowpc
;
585 if (dwarf_highpc(return_die
, &return_highpc
, &error
) == DW_DLV_OK
)
587 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].HighPC
= return_highpc
;
591 case DW_AT_decl_line
:
592 if (dwarf_formudata(return_attr1
, &return_uvalue
, &error
) == DW_DLV_OK
)
594 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NumLineSrc
= return_uvalue
;
598 case DW_AT_frame_base
:
599 if (dwarf_formudata(return_attr1
, &return_uvalue
, &error
) == DW_DLV_OK
)
601 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].FrameBase
= return_uvalue
;
606 if (dwarf_formstring(return_attr1
, &return_string
, &error
) == DW_DLV_OK
)
608 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrSubprogramName
= (char *)calloc(strlen(return_string
) + 1, 1);
609 strcpy(PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrSubprogramName
, return_string
);
610 dwarf_dealloc(dbg
, return_string
, DW_DLA_STRING
);
619 dwarf_dealloc(dbg
, atlist
[i
], DW_DLA_ATTR
);
621 dwarf_dealloc(dbg
, atlist
, DW_DLA_LIST
);
623 for (i
= 0; i
< (size_t)cnt
; ++i
)
625 if (dwarf_lineaddr(linebuf
[i
], &return_lineaddr
, &error
) == DW_DLV_OK
)
627 if (dwarf_lineno(linebuf
[i
], &return_uvalue
, &error
) == DW_DLV_OK
)
629 if ((return_lineaddr
>= return_lowpc
) && (return_lineaddr
<= return_highpc
))
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
));
632 memset((void *)(PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrLinesSrc
+ PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbLinesSrc
), 0, sizeof(DMIStruct_LineSrc
));
633 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrLinesSrc
[PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbLinesSrc
].StartPC
= return_lineaddr
;
634 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrLinesSrc
[PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbLinesSrc
].NumLineSrc
= return_uvalue
;
635 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbLinesSrc
++;
641 if (dwarf_child(return_die
, &return_subdie
, &error
) == DW_DLV_OK
)
645 return_sub
= return_subdie
;
646 if ((dwarf_tag(return_subdie
, &return_tagval
, &error
) == DW_DLV_OK
))
648 switch (return_tagval
)
650 case DW_TAG_formal_parameter
:
651 case DW_TAG_variable
:
652 if (dwarf_attrlist(return_subdie
, &atlist
, &atcnt
, &error
) == DW_DLV_OK
)
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
)));
655 memset(PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrVariables
+ PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbVariables
, 0, sizeof(VariablesStruct
));
657 for (Dwarf_Signed i
= 0; i
< atcnt
; ++i
)
659 if (dwarf_whatattr(atlist
[i
], &return_attr
, &error
) == DW_DLV_OK
)
661 if (dwarf_attr(return_subdie
, return_attr
, &return_attr1
, &error
) == DW_DLV_OK
)
666 if (dwarf_formblock(return_attr1
, &return_block
, &error
) == DW_DLV_OK
)
668 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrVariables
[PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbVariables
].Op
= *((unsigned char *)(return_block
->bl_data
));
670 switch (return_block
->bl_len
)
676 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrVariables
[PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbVariables
].Offset
= *((char *)(return_block
->bl_data
) + 1);
678 if (return_tagval
== DW_TAG_variable
)
680 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrVariables
[PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbVariables
].Offset
-= 0x80;
687 dwarf_dealloc(dbg
, return_block
, DW_DLA_BLOCK
);
692 if (dwarf_global_formref(return_attr1
, &return_offset
, &error
) == DW_DLV_OK
)
694 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrVariables
[PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbVariables
].TypeOffset
= return_offset
;
699 if (dwarf_formstring(return_attr1
, &return_string
, &error
) == DW_DLV_OK
)
701 #ifdef DEBUG_VariableName
702 if (!strcmp(return_string
, DEBUG_VariableName
))
705 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrVariables
[PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbVariables
].PtrName
= (char *)calloc(strlen(return_string
) + 1, 1);
706 strcpy(PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrVariables
[PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbVariables
].PtrName
, return_string
);
707 dwarf_dealloc(dbg
, return_string
, DW_DLA_STRING
);
718 dwarf_dealloc(dbg
, atlist
[i
], DW_DLA_ATTR
);
721 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbVariables
++;
723 dwarf_dealloc(dbg
, atlist
, DW_DLA_LIST
);
735 while (dwarf_siblingof(dbg
, return_sub
, &return_subdie
, &error
) == DW_DLV_OK
);
738 PtrCU
[NbCU
].NbSubProgs
++;
747 while (dwarf_siblingof(dbg
, return_sib
, &return_die
, &error
) == DW_DLV_OK
);
750 // Release the memory used by the source lines
751 for (i
= 0; i
< (size_t)cnt
; ++i
)
752 dwarf_dealloc(dbg
, linebuf
[i
], DW_DLA_LINE
);
753 dwarf_dealloc(dbg
, linebuf
, DW_DLA_LIST
);
756 // Set the source code lines for QT html/text conformity
757 if (PtrCU
[NbCU
].NbLinesLoadSrc
)
759 if (PtrCU
[NbCU
].PtrLinesLoadSrc
= (char **)calloc(PtrCU
[NbCU
].NbLinesLoadSrc
, sizeof(char *)))
761 for (j
= 0; j
< PtrCU
[NbCU
].NbLinesLoadSrc
; j
++)
763 if (PtrCU
[NbCU
].PtrLinesLoadSrc
[j
] = (char *)calloc(10000, sizeof(char)))
765 if (Ptr
= DWARFManager_GetLineSrcFromNumLine(PtrCU
[NbCU
].PtrLoadSrc
, (j
+ 1)))
774 strcat(PtrCU
[NbCU
].PtrLinesLoadSrc
[j
], " ");
775 i
+= strlen(" ");
779 strcat(PtrCU
[NbCU
].PtrLinesLoadSrc
[j
], "<");
784 strcat(PtrCU
[NbCU
].PtrLinesLoadSrc
[j
], ">");
789 strcpy(PtrCU
[NbCU
].PtrLinesLoadSrc
[j
], "&");
790 i
+= strlen("&");
795 strcpy(PtrCU
[NbCU
].PtrLinesLoadSrc
[j
], """);
796 i
+= strlen(""");
800 PtrCU
[NbCU
].PtrLinesLoadSrc
[j
][i
++] = *Ptr
;
806 PtrCU
[NbCU
].PtrLinesLoadSrc
[j
] = (char *)realloc(PtrCU
[NbCU
].PtrLinesLoadSrc
[j
], i
+ 1);
810 // Init lines source information based on each source code line numbers
811 for (j
= 0; j
< PtrCU
[NbCU
].NbSubProgs
; j
++)
813 // Check if the subprog / function's line exists in the source code
814 if (PtrCU
[NbCU
].PtrSubProgs
[j
].NumLineSrc
<= PtrCU
[NbCU
].NbLinesLoadSrc
)
816 PtrCU
[NbCU
].PtrSubProgs
[j
].PtrLineSrc
= PtrCU
[NbCU
].PtrLinesLoadSrc
[PtrCU
[NbCU
].PtrSubProgs
[j
].NumLineSrc
- 1];
819 for (k
= 0; k
< PtrCU
[NbCU
].PtrSubProgs
[j
].NbLinesSrc
; k
++)
821 if (PtrCU
[NbCU
].PtrSubProgs
[j
].PtrLinesSrc
[k
].NumLineSrc
<= PtrCU
[NbCU
].NbLinesLoadSrc
)
823 PtrCU
[NbCU
].PtrSubProgs
[j
].PtrLinesSrc
[k
].PtrLineSrc
= PtrCU
[NbCU
].PtrLinesLoadSrc
[PtrCU
[NbCU
].PtrSubProgs
[j
].PtrLinesSrc
[k
].NumLineSrc
- 1];
831 // Set each source lines pointer to NULL
832 if (PtrCU
[NbCU
].NbSubProgs
)
834 // Check the presence of source lines dedicated to the sub progs
835 if (PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
- 1].NbLinesSrc
)
837 i
= PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
- 1].PtrLinesSrc
[PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
- 1].NbLinesSrc
- 1].NumLineSrc
;
838 if (PtrCU
[NbCU
].PtrLinesLoadSrc
= (char **)calloc(i
, sizeof(char *)))
840 for (j
= 0; j
< i
; j
++)
842 PtrCU
[NbCU
].PtrLinesLoadSrc
[j
] = NULL
;
849 // Init global variables information based on types information
850 for (i
= 0; i
< PtrCU
[NbCU
].NbVariables
; i
++)
852 DWARFManager_InitInfosVariable(PtrCU
[NbCU
].PtrVariables
+ i
);
855 // Init local variables information based on types information
856 for (i
= 0; i
< PtrCU
[NbCU
].NbSubProgs
; i
++)
858 for (j
= 0; j
< PtrCU
[NbCU
].PtrSubProgs
[i
].NbVariables
; j
++)
860 DWARFManager_InitInfosVariable(PtrCU
[NbCU
].PtrSubProgs
[i
].PtrVariables
+ j
);
869 free(SourceFilename
);
870 free(SourceFileDirectory
);
871 free(SourceFullFilename
);
876 void DWARFManager_InitInfosVariable(VariablesStruct
*PtrVariables
)
878 size_t j
, TypeOffset
;
880 PtrVariables
->PtrTypeName
= (char *)calloc(1000, 1);
881 TypeOffset
= PtrVariables
->TypeOffset
;
883 for (j
= 0; j
< PtrCU
[NbCU
].NbTypes
; j
++)
885 if (TypeOffset
== PtrCU
[NbCU
].PtrTypes
[j
].Offset
)
887 switch (PtrCU
[NbCU
].PtrTypes
[j
].Tag
)
889 case DW_TAG_structure_type
:
890 PtrVariables
->TypeTag
|= 0x1;
891 if ((TypeOffset
= PtrCU
[NbCU
].PtrTypes
[j
].TypeOffset
))
897 if ((PtrVariables
->TypeTag
& 0x2))
899 strcat(PtrVariables
->PtrTypeName
, " *");
904 case DW_TAG_pointer_type
:
905 PtrVariables
->TypeTag
|= 0x2;
906 PtrVariables
->TypeByteSize
= PtrCU
[NbCU
].PtrTypes
[j
].ByteSize
;
907 PtrVariables
->TypeEncoding
= 0x10;
908 if (!(TypeOffset
= PtrCU
[NbCU
].PtrTypes
[j
].TypeOffset
))
910 strcat(PtrVariables
->PtrTypeName
, "void *");
919 if (!(PtrVariables
->TypeTag
& 0x20))
921 PtrVariables
->TypeTag
|= 0x20;
922 strcat(PtrVariables
->PtrTypeName
, PtrCU
[NbCU
].PtrTypes
[j
].PtrName
);
924 if ((TypeOffset
= PtrCU
[NbCU
].PtrTypes
[j
].TypeOffset
))
930 case DW_TAG_subrange_type
:
931 PtrVariables
->TypeTag
|= 0x4;
934 case DW_TAG_array_type
:
935 PtrVariables
->TypeTag
|= 0x8;
936 if ((TypeOffset
= PtrCU
[NbCU
].PtrTypes
[j
].TypeOffset
))
942 case DW_TAG_const_type
:
943 PtrVariables
->TypeTag
|= 0x10;
944 strcat(PtrVariables
->PtrTypeName
, "const ");
945 if ((TypeOffset
= PtrCU
[NbCU
].PtrTypes
[j
].TypeOffset
))
951 case DW_TAG_base_type
:
952 if (!(PtrVariables
->TypeTag
& 0x20))
954 strcat(PtrVariables
->PtrTypeName
, PtrCU
[NbCU
].PtrTypes
[j
].PtrName
);
956 if ((PtrVariables
->TypeTag
& 0x2))
958 strcat(PtrVariables
->PtrTypeName
, " *");
962 PtrVariables
->TypeByteSize
= PtrCU
[NbCU
].PtrTypes
[j
].ByteSize
;
963 PtrVariables
->TypeEncoding
= PtrCU
[NbCU
].PtrTypes
[j
].Encoding
;
965 if ((PtrVariables
->TypeTag
& 0x8))
967 strcat(PtrVariables
->PtrTypeName
, "[]");
979 // Get symbol name based from address
980 // Return NULL if no symbol name exists
981 char *DWARFManager_GetSymbolnameFromAdr(size_t Adr
)
985 for (i
= 0; i
< NbCU
; i
++)
987 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
989 for (j
= 0; (j
< PtrCU
[i
].NbSubProgs
); j
++)
991 if ((PtrCU
[i
].PtrSubProgs
[j
].StartPC
== Adr
))
993 return PtrCU
[i
].PtrSubProgs
[j
].PtrSubprogramName
;
1003 // Get complete source filename based from address
1004 // Return NULL if no source filename exists
1005 // Return the existence status (true or false) in Error
1006 char *DWARFManager_GetFullSourceFilenameFromAdr(size_t Adr
, bool *Error
)
1010 for (i
= 0; i
< NbCU
; i
++)
1012 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1014 *Error
= PtrCU
[i
].PtrLoadSrc
? true : false;
1015 return PtrCU
[i
].PtrFullFilename
;
1023 // Get text line source based on line number (starting by 1)
1024 // Return NULL if no text line exists or if line number is 0
1025 char *DWARFManager_GetLineSrcFromNumLine(char *PtrSrcFile
, size_t NumLine
)
1028 char *PtrLineSrc
= NULL
;
1032 while (i
!= NumLine
)
1034 PtrLineSrc
= PtrSrcFile
;
1035 while (*PtrSrcFile
++);
1044 // Get number of variables referenced by the function range address
1045 size_t DWARFManager_GetNbLocalVariables(size_t Adr
)
1049 for (i
= 0; i
< NbCU
; i
++)
1051 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1053 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1055 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1057 return PtrCU
[i
].PtrSubProgs
[j
].NbVariables
;
1067 // Get local variable name based on his index (starting by 1)
1068 // Return name's pointer text found
1069 // Return NULL if not found
1070 char *DWARFManager_GetLocalVariableName(size_t Adr
, size_t Index
)
1074 for (i
= 0; i
< NbCU
; i
++)
1076 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1078 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1080 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1082 return PtrCU
[i
].PtrSubProgs
[j
].PtrVariables
[Index
- 1].PtrName
;
1092 // Get local variable's type tag based on his index (starting by 1)
1093 // Return 0 if not found
1094 size_t DWARFManager_GetLocalVariableTypeTag(size_t Adr
, size_t Index
)
1098 for (i
= 0; i
< NbCU
; i
++)
1100 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1102 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1104 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1106 return PtrCU
[i
].PtrSubProgs
[j
].PtrVariables
[Index
- 1].TypeTag
;
1117 int DWARFManager_GetLocalVariableOffset(size_t Adr
, size_t Index
)
1121 for (i
= 0; i
< NbCU
; i
++)
1123 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1125 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1127 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1129 return PtrCU
[i
].PtrSubProgs
[j
].PtrVariables
[Index
- 1].Offset
;
1139 // Get local variable Type Byte Size based on his address and index (starting by 1)
1140 // Return 0 if not found
1141 // May return 0 if there is no Type Byte Size linked to the variable's address and index
1142 size_t DWARFManager_GetLocalVariableTypeByteSize(size_t Adr
, size_t Index
)
1146 for (i
= 0; i
< NbCU
; i
++)
1148 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1150 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1152 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1154 return PtrCU
[i
].PtrSubProgs
[j
].PtrVariables
[Index
- 1].TypeByteSize
;
1164 // Get local variable Type Encoding based on his address and index (starting by 1)
1165 // Return 0 if not found
1166 // May return 0 if there is no Type Encoding linked to the variable's address and index
1167 size_t DWARFManager_GetLocalVariableTypeEncoding(size_t Adr
, size_t Index
)
1171 for (i
= 0; i
< NbCU
; i
++)
1173 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1175 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1177 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1179 return PtrCU
[i
].PtrSubProgs
[j
].PtrVariables
[Index
- 1].TypeEncoding
;
1189 // Get local variable Op based on his address and index (starting by 1)
1190 // Return 0 if not found
1191 // May return 0 if there isn't Op linked to the variable's index
1192 size_t DWARFManager_GetLocalVariableOp(size_t Adr
, size_t Index
)
1196 for (i
= 0; i
< NbCU
; i
++)
1198 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1200 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1202 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1204 return PtrCU
[i
].PtrSubProgs
[j
].PtrVariables
[Index
- 1].Op
;
1214 // Get local variable type name based on his index (starting by 1)
1215 // Return NULL if not found
1216 // May return NULL if there is not type linked to the variable's index
1217 char *DWARFManager_GetLocalVariableTypeName(size_t Adr
, size_t Index
)
1221 for (i
= 0; i
< NbCU
; i
++)
1223 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1225 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1227 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1229 return PtrCU
[i
].PtrSubProgs
[j
].PtrVariables
[Index
- 1].PtrTypeName
;
1239 // Get Compilation Unit / global variables numbers
1240 // Return variables number
1241 size_t DWARFManager_GetNbGlobalVariables(void)
1243 size_t NbVariables
= 0, i
;
1245 for (i
= 0; i
< NbCU
; i
++)
1247 NbVariables
+= PtrCU
[i
].NbVariables
;
1254 // Get global variable type name based on his index (starting by 1)
1255 // Return NULL if not found
1256 // May return NULL if there is not type linked to the variable's index
1257 char *DWARFManager_GetGlobalVariableTypeName(size_t Index
)
1261 for (i
= 0; i
< NbCU
; i
++)
1263 if (PtrCU
[i
].NbVariables
)
1265 if (Index
<= PtrCU
[i
].NbVariables
)
1267 return PtrCU
[i
].PtrVariables
[Index
- 1].PtrTypeName
;
1271 Index
-= PtrCU
[i
].NbVariables
;
1280 // Get global variable's type tag based on his index (starting by 1)
1281 // Return 0 if not found
1282 size_t DWARFManager_GetGlobalVariableTypeTag(size_t Index
)
1286 for (i
= 0; i
< NbCU
; i
++)
1288 if (PtrCU
[i
].NbVariables
)
1290 if (Index
<= PtrCU
[i
].NbVariables
)
1292 return PtrCU
[i
].PtrVariables
[Index
- 1].TypeTag
;
1296 Index
-= PtrCU
[i
].NbVariables
;
1305 // Get global variable byte size based on his index (starting by 1)
1306 // Return 0 if not found
1307 size_t DWARFManager_GetGlobalVariableTypeByteSize(size_t Index
)
1311 for (i
= 0; i
< NbCU
; i
++)
1313 if (PtrCU
[i
].NbVariables
)
1315 if (Index
<= PtrCU
[i
].NbVariables
)
1317 return PtrCU
[i
].PtrVariables
[Index
- 1].TypeByteSize
;
1321 Index
-= PtrCU
[i
].NbVariables
;
1330 // Get global variable encoding based on his index (starting by 1)
1331 // Return 0 if not found
1332 size_t DWARFManager_GetGlobalVariableTypeEncoding(size_t Index
)
1336 for (i
= 0; i
< NbCU
; i
++)
1338 if (PtrCU
[i
].NbVariables
)
1340 if (Index
<= PtrCU
[i
].NbVariables
)
1342 return PtrCU
[i
].PtrVariables
[Index
- 1].TypeEncoding
;
1346 Index
-= PtrCU
[i
].NbVariables
;
1355 // Get global variable address based on his index (starting by 1)
1356 // Return 0 if not found
1357 size_t DWARFManager_GetGlobalVariableAdr(size_t Index
)
1361 for (i
= 0; i
< NbCU
; i
++)
1363 if (PtrCU
[i
].NbVariables
)
1365 if (Index
<= PtrCU
[i
].NbVariables
)
1367 return PtrCU
[i
].PtrVariables
[Index
- 1].Addr
;
1371 Index
-= PtrCU
[i
].NbVariables
;
1380 // Get global variable memory address based on his name
1381 // Return 0 if not found
1382 // Note: Return the first occurence found
1383 size_t DWARFManager_GetGlobalVariableAdrFromName(char *VariableName
)
1387 for (i
= 0; i
< NbCU
; i
++)
1389 if (PtrCU
[i
].NbVariables
)
1391 for (j
= 0; j
< PtrCU
[i
].NbVariables
; j
++)
1393 if (!strcmp(PtrCU
[i
].PtrVariables
[j
].PtrName
,VariableName
))
1395 return PtrCU
[i
].PtrVariables
[j
].Addr
;
1405 // Get global variable name based on his index (starting by 1)
1406 // Return name's pointer text found
1407 // Return NULL if not found
1408 char *DWARFManager_GetGlobalVariableName(size_t Index
)
1412 for (i
= 0; i
< NbCU
; i
++)
1414 if (PtrCU
[i
].NbVariables
)
1416 if (Index
<= PtrCU
[i
].NbVariables
)
1418 return PtrCU
[i
].PtrVariables
[Index
- 1].PtrName
;
1422 Index
-= PtrCU
[i
].NbVariables
;
1431 // Get text line from source based on address and his tag
1432 // Return NULL if no text line has been found
1433 char *DWARFManager_GetLineSrcFromAdr(size_t Adr
, size_t Tag
)
1437 for (i
= 0; i
< NbCU
; i
++)
1439 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1441 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1443 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1445 if ((PtrCU
[i
].PtrSubProgs
[j
].StartPC
== Adr
) && (!Tag
|| (Tag
== DW_TAG_subprogram
)))
1447 return PtrCU
[i
].PtrSubProgs
[j
].PtrLineSrc
;
1451 for (k
= 0; k
< PtrCU
[i
].PtrSubProgs
[j
].NbLinesSrc
; k
++)
1453 if ((PtrCU
[i
].PtrSubProgs
[j
].PtrLinesSrc
[k
].StartPC
== Adr
) && (!Tag
|| (PtrCU
[i
].PtrSubProgs
[j
].PtrLinesSrc
[k
].Tag
== Tag
)))
1455 return PtrCU
[i
].PtrSubProgs
[j
].PtrLinesSrc
[k
].PtrLineSrc
;
1468 // Get line number based on the address and the tag
1469 // Return 0 if no line number has been found
1470 size_t DWARFManager_GetNumLineFromAdr(size_t Adr
, size_t Tag
)
1474 for (i
= 0; i
< NbCU
; i
++)
1476 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1478 for (j
= 0; (j
< PtrCU
[i
].NbSubProgs
); j
++)
1480 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1482 if ((PtrCU
[i
].PtrSubProgs
[j
].StartPC
== Adr
) && (!Tag
|| (Tag
== DW_TAG_subprogram
)))
1484 return PtrCU
[i
].PtrSubProgs
[j
].NumLineSrc
;
1488 for (k
= 0; (k
< PtrCU
[i
].PtrSubProgs
[j
].NbLinesSrc
); k
++)
1490 if ((PtrCU
[i
].PtrSubProgs
[j
].PtrLinesSrc
[k
].StartPC
== Adr
) && (!Tag
|| (PtrCU
[i
].PtrSubProgs
[j
].PtrLinesSrc
[k
].Tag
== Tag
)))
1492 return PtrCU
[i
].PtrSubProgs
[j
].PtrLinesSrc
[k
].NumLineSrc
;
1497 if (!Tag
|| (Tag
== DW_TAG_subprogram
))
1499 return PtrCU
[i
].PtrSubProgs
[j
].NumLineSrc
;
1511 // Get function name based on address and his range
1512 // Return NULL if no function name has been found
1513 char *DWARFManager_GetFunctionName(size_t Adr
)
1517 for (i
= 0; i
< NbCU
; i
++)
1519 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1521 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1523 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1525 return PtrCU
[i
].PtrSubProgs
[j
].PtrSubprogramName
;
1535 // Get text line from source based on address and num line (starting by 1)
1536 // Return NULL if no text line has been found
1537 char *DWARFManager_GetLineSrcFromAdrNumLine(size_t Adr
, size_t NumLine
)
1541 for (i
= 0; i
< NbCU
; i
++)
1543 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1545 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1547 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1549 if (PtrCU
[i
].PtrSubProgs
[j
].NumLineSrc
== NumLine
)
1551 return PtrCU
[i
].PtrSubProgs
[j
].PtrLineSrc
;
1555 for (k
= 0; k
< PtrCU
[i
].PtrSubProgs
[j
].NbLinesSrc
; k
++)
1557 if (PtrCU
[i
].PtrSubProgs
[j
].PtrLinesSrc
[k
].NumLineSrc
== NumLine
)
1559 return PtrCU
[i
].PtrSubProgs
[j
].PtrLinesSrc
[k
].PtrLineSrc
;
1572 // Get text line from source based on address and num line (starting by 1)
1573 // Return NULL if no text line has been found
1574 char *DWARFManager_GetLineSrcFromNumLineBaseAdr(size_t Adr
, size_t NumLine
)
1578 for (i
= 0; i
< NbCU
; i
++)
1580 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1582 if (NumLine
<= PtrCU
[i
].NbLinesLoadSrc
)
1584 return PtrCU
[i
].PtrLinesLoadSrc
[NumLine
- 1];