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 switch (return_tagval
)
680 case DW_TAG_variable
:
681 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrVariables
[PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbVariables
].Offset
-= 0x80;
684 case DW_TAG_formal_parameter
:
694 dwarf_dealloc(dbg
, return_block
, DW_DLA_BLOCK
);
699 if (dwarf_global_formref(return_attr1
, &return_offset
, &error
) == DW_DLV_OK
)
701 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrVariables
[PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbVariables
].TypeOffset
= return_offset
;
706 if (dwarf_formstring(return_attr1
, &return_string
, &error
) == DW_DLV_OK
)
708 #ifdef DEBUG_VariableName
709 if (!strcmp(return_string
, DEBUG_VariableName
))
712 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrVariables
[PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbVariables
].PtrName
= (char *)calloc(strlen(return_string
) + 1, 1);
713 strcpy(PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrVariables
[PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbVariables
].PtrName
, return_string
);
714 dwarf_dealloc(dbg
, return_string
, DW_DLA_STRING
);
719 case DW_AT_decl_file
:
722 case DW_AT_decl_line
:
731 dwarf_dealloc(dbg
, atlist
[i
], DW_DLA_ATTR
);
734 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbVariables
++;
736 dwarf_dealloc(dbg
, atlist
, DW_DLA_LIST
);
748 while (dwarf_siblingof(dbg
, return_sub
, &return_subdie
, &error
) == DW_DLV_OK
);
751 PtrCU
[NbCU
].NbSubProgs
++;
760 while (dwarf_siblingof(dbg
, return_sib
, &return_die
, &error
) == DW_DLV_OK
);
763 // Release the memory used by the source lines
764 for (i
= 0; i
< (size_t)cnt
; ++i
)
766 dwarf_dealloc(dbg
, linebuf
[i
], DW_DLA_LINE
);
768 dwarf_dealloc(dbg
, linebuf
, DW_DLA_LIST
);
771 // Set the source code lines for QT html/text conformity
772 if (PtrCU
[NbCU
].NbLinesLoadSrc
)
774 if (PtrCU
[NbCU
].PtrLinesLoadSrc
= (char **)calloc(PtrCU
[NbCU
].NbLinesLoadSrc
, sizeof(char *)))
776 for (j
= 0; j
< PtrCU
[NbCU
].NbLinesLoadSrc
; j
++)
778 if (PtrCU
[NbCU
].PtrLinesLoadSrc
[j
] = (char *)calloc(10000, sizeof(char)))
780 if (Ptr
= DWARFManager_GetLineSrcFromNumLine(PtrCU
[NbCU
].PtrLoadSrc
, (j
+ 1)))
789 strcat(PtrCU
[NbCU
].PtrLinesLoadSrc
[j
], " ");
790 i
+= strlen(" ");
794 strcat(PtrCU
[NbCU
].PtrLinesLoadSrc
[j
], "<");
799 strcat(PtrCU
[NbCU
].PtrLinesLoadSrc
[j
], ">");
804 strcpy(PtrCU
[NbCU
].PtrLinesLoadSrc
[j
], "&");
805 i
+= strlen("&");
810 strcpy(PtrCU
[NbCU
].PtrLinesLoadSrc
[j
], """);
811 i
+= strlen(""");
815 PtrCU
[NbCU
].PtrLinesLoadSrc
[j
][i
++] = *Ptr
;
821 PtrCU
[NbCU
].PtrLinesLoadSrc
[j
] = (char *)realloc(PtrCU
[NbCU
].PtrLinesLoadSrc
[j
], i
+ 1);
825 // Init lines source information based on each source code line numbers
826 for (j
= 0; j
< PtrCU
[NbCU
].NbSubProgs
; j
++)
828 // Check if the subprog / function's line exists in the source code
829 if (PtrCU
[NbCU
].PtrSubProgs
[j
].NumLineSrc
<= PtrCU
[NbCU
].NbLinesLoadSrc
)
831 PtrCU
[NbCU
].PtrSubProgs
[j
].PtrLineSrc
= PtrCU
[NbCU
].PtrLinesLoadSrc
[PtrCU
[NbCU
].PtrSubProgs
[j
].NumLineSrc
- 1];
834 for (k
= 0; k
< PtrCU
[NbCU
].PtrSubProgs
[j
].NbLinesSrc
; k
++)
836 if (PtrCU
[NbCU
].PtrSubProgs
[j
].PtrLinesSrc
[k
].NumLineSrc
<= PtrCU
[NbCU
].NbLinesLoadSrc
)
838 PtrCU
[NbCU
].PtrSubProgs
[j
].PtrLinesSrc
[k
].PtrLineSrc
= PtrCU
[NbCU
].PtrLinesLoadSrc
[PtrCU
[NbCU
].PtrSubProgs
[j
].PtrLinesSrc
[k
].NumLineSrc
- 1];
846 // Set each source lines pointer to NULL
847 if (PtrCU
[NbCU
].NbSubProgs
)
849 // Check the presence of source lines dedicated to the sub progs
850 if (PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
- 1].NbLinesSrc
)
852 i
= PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
- 1].PtrLinesSrc
[PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
- 1].NbLinesSrc
- 1].NumLineSrc
;
853 if (PtrCU
[NbCU
].PtrLinesLoadSrc
= (char **)calloc(i
, sizeof(char *)))
855 for (j
= 0; j
< i
; j
++)
857 PtrCU
[NbCU
].PtrLinesLoadSrc
[j
] = NULL
;
864 // Init global variables information based on types information
865 for (i
= 0; i
< PtrCU
[NbCU
].NbVariables
; i
++)
867 DWARFManager_InitInfosVariable(PtrCU
[NbCU
].PtrVariables
+ i
);
870 // Init local variables information based on types information
871 for (i
= 0; i
< PtrCU
[NbCU
].NbSubProgs
; i
++)
873 for (j
= 0; j
< PtrCU
[NbCU
].PtrSubProgs
[i
].NbVariables
; j
++)
875 DWARFManager_InitInfosVariable(PtrCU
[NbCU
].PtrSubProgs
[i
].PtrVariables
+ j
);
884 free(SourceFilename
);
885 free(SourceFileDirectory
);
886 free(SourceFullFilename
);
891 void DWARFManager_InitInfosVariable(VariablesStruct
*PtrVariables
)
893 size_t j
, TypeOffset
;
895 PtrVariables
->PtrTypeName
= (char *)calloc(1000, 1);
896 TypeOffset
= PtrVariables
->TypeOffset
;
898 for (j
= 0; j
< PtrCU
[NbCU
].NbTypes
; j
++)
900 if (TypeOffset
== PtrCU
[NbCU
].PtrTypes
[j
].Offset
)
902 switch (PtrCU
[NbCU
].PtrTypes
[j
].Tag
)
904 case DW_TAG_structure_type
:
905 PtrVariables
->TypeTag
|= 0x1;
906 if ((TypeOffset
= PtrCU
[NbCU
].PtrTypes
[j
].TypeOffset
))
912 if ((PtrVariables
->TypeTag
& 0x2))
914 strcat(PtrVariables
->PtrTypeName
, " *");
919 case DW_TAG_pointer_type
:
920 PtrVariables
->TypeTag
|= 0x2;
921 PtrVariables
->TypeByteSize
= PtrCU
[NbCU
].PtrTypes
[j
].ByteSize
;
922 PtrVariables
->TypeEncoding
= 0x10;
923 if (!(TypeOffset
= PtrCU
[NbCU
].PtrTypes
[j
].TypeOffset
))
925 strcat(PtrVariables
->PtrTypeName
, "void *");
934 if (!(PtrVariables
->TypeTag
& 0x20))
936 PtrVariables
->TypeTag
|= 0x20;
937 strcat(PtrVariables
->PtrTypeName
, PtrCU
[NbCU
].PtrTypes
[j
].PtrName
);
939 if ((TypeOffset
= PtrCU
[NbCU
].PtrTypes
[j
].TypeOffset
))
945 case DW_TAG_subrange_type
:
946 PtrVariables
->TypeTag
|= 0x4;
949 case DW_TAG_array_type
:
950 PtrVariables
->TypeTag
|= 0x8;
951 if ((TypeOffset
= PtrCU
[NbCU
].PtrTypes
[j
].TypeOffset
))
957 case DW_TAG_const_type
:
958 PtrVariables
->TypeTag
|= 0x10;
959 strcat(PtrVariables
->PtrTypeName
, "const ");
960 if ((TypeOffset
= PtrCU
[NbCU
].PtrTypes
[j
].TypeOffset
))
966 case DW_TAG_base_type
:
967 if (!(PtrVariables
->TypeTag
& 0x20))
969 strcat(PtrVariables
->PtrTypeName
, PtrCU
[NbCU
].PtrTypes
[j
].PtrName
);
971 if ((PtrVariables
->TypeTag
& 0x2))
973 strcat(PtrVariables
->PtrTypeName
, " *");
977 PtrVariables
->TypeByteSize
= PtrCU
[NbCU
].PtrTypes
[j
].ByteSize
;
978 PtrVariables
->TypeEncoding
= PtrCU
[NbCU
].PtrTypes
[j
].Encoding
;
980 if ((PtrVariables
->TypeTag
& 0x8))
982 strcat(PtrVariables
->PtrTypeName
, "[]");
994 // Get symbol name based from address
995 // Return NULL if no symbol name exists
996 char *DWARFManager_GetSymbolnameFromAdr(size_t Adr
)
1000 for (i
= 0; i
< NbCU
; i
++)
1002 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1004 for (j
= 0; (j
< PtrCU
[i
].NbSubProgs
); j
++)
1006 if ((PtrCU
[i
].PtrSubProgs
[j
].StartPC
== Adr
))
1008 return PtrCU
[i
].PtrSubProgs
[j
].PtrSubprogramName
;
1018 // Get complete source filename based from address
1019 // Return NULL if no source filename exists
1020 // Return the existence status (true or false) in Error
1021 char *DWARFManager_GetFullSourceFilenameFromAdr(size_t Adr
, bool *Error
)
1025 for (i
= 0; i
< NbCU
; i
++)
1027 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1029 *Error
= PtrCU
[i
].PtrLoadSrc
? true : false;
1030 return PtrCU
[i
].PtrFullFilename
;
1038 // Get text line source based on line number (starting by 1)
1039 // Return NULL if no text line exists or if line number is 0
1040 char *DWARFManager_GetLineSrcFromNumLine(char *PtrSrcFile
, size_t NumLine
)
1043 char *PtrLineSrc
= NULL
;
1047 while (i
!= NumLine
)
1049 PtrLineSrc
= PtrSrcFile
;
1050 while (*PtrSrcFile
++);
1059 // Get number of variables referenced by the function range address
1060 size_t DWARFManager_GetNbLocalVariables(size_t Adr
)
1064 for (i
= 0; i
< NbCU
; i
++)
1066 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1068 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1070 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1072 return PtrCU
[i
].PtrSubProgs
[j
].NbVariables
;
1082 // Get local variable name based on his index (starting by 1)
1083 // Return name's pointer text found
1084 // Return NULL if not found
1085 char *DWARFManager_GetLocalVariableName(size_t Adr
, size_t Index
)
1089 for (i
= 0; i
< NbCU
; i
++)
1091 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1093 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1095 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1097 return PtrCU
[i
].PtrSubProgs
[j
].PtrVariables
[Index
- 1].PtrName
;
1107 // Get local variable's type tag based on his index (starting by 1)
1108 // Return 0 if not found
1109 size_t DWARFManager_GetLocalVariableTypeTag(size_t Adr
, size_t Index
)
1113 for (i
= 0; i
< NbCU
; i
++)
1115 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1117 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1119 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1121 return PtrCU
[i
].PtrSubProgs
[j
].PtrVariables
[Index
- 1].TypeTag
;
1132 int DWARFManager_GetLocalVariableOffset(size_t Adr
, size_t Index
)
1136 for (i
= 0; i
< NbCU
; i
++)
1138 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1140 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1142 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1144 return PtrCU
[i
].PtrSubProgs
[j
].PtrVariables
[Index
- 1].Offset
;
1154 // Get local variable Type Byte Size based on his address and index (starting by 1)
1155 // Return 0 if not found
1156 // May return 0 if there is no Type Byte Size linked to the variable's address and index
1157 size_t DWARFManager_GetLocalVariableTypeByteSize(size_t Adr
, size_t Index
)
1161 for (i
= 0; i
< NbCU
; i
++)
1163 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1165 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1167 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1169 return PtrCU
[i
].PtrSubProgs
[j
].PtrVariables
[Index
- 1].TypeByteSize
;
1179 // Get local variable Type Encoding based on his address and index (starting by 1)
1180 // Return 0 if not found
1181 // May return 0 if there is no Type Encoding linked to the variable's address and index
1182 size_t DWARFManager_GetLocalVariableTypeEncoding(size_t Adr
, size_t Index
)
1186 for (i
= 0; i
< NbCU
; i
++)
1188 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1190 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1192 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1194 return PtrCU
[i
].PtrSubProgs
[j
].PtrVariables
[Index
- 1].TypeEncoding
;
1204 // Get local variable Op based on his address and index (starting by 1)
1205 // Return 0 if not found
1206 // May return 0 if there isn't Op linked to the variable's index
1207 size_t DWARFManager_GetLocalVariableOp(size_t Adr
, size_t Index
)
1211 for (i
= 0; i
< NbCU
; i
++)
1213 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1215 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1217 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1219 return PtrCU
[i
].PtrSubProgs
[j
].PtrVariables
[Index
- 1].Op
;
1229 // Get local variable type name based on his index (starting by 1)
1230 // Return NULL if not found
1231 // May return NULL if there is not type linked to the variable's index
1232 char *DWARFManager_GetLocalVariableTypeName(size_t Adr
, size_t Index
)
1236 for (i
= 0; i
< NbCU
; i
++)
1238 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1240 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1242 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1244 return PtrCU
[i
].PtrSubProgs
[j
].PtrVariables
[Index
- 1].PtrTypeName
;
1254 // Get Compilation Unit / global variables numbers
1255 // Return variables number
1256 size_t DWARFManager_GetNbGlobalVariables(void)
1258 size_t NbVariables
= 0, i
;
1260 for (i
= 0; i
< NbCU
; i
++)
1262 NbVariables
+= PtrCU
[i
].NbVariables
;
1269 // Get global variable type name based on his index (starting by 1)
1270 // Return NULL if not found
1271 // May return NULL if there is not type linked to the variable's index
1272 char *DWARFManager_GetGlobalVariableTypeName(size_t Index
)
1276 for (i
= 0; i
< NbCU
; i
++)
1278 if (PtrCU
[i
].NbVariables
)
1280 if (Index
<= PtrCU
[i
].NbVariables
)
1282 return PtrCU
[i
].PtrVariables
[Index
- 1].PtrTypeName
;
1286 Index
-= PtrCU
[i
].NbVariables
;
1295 // Get global variable's type tag based on his index (starting by 1)
1296 // Return 0 if not found
1297 size_t DWARFManager_GetGlobalVariableTypeTag(size_t Index
)
1301 for (i
= 0; i
< NbCU
; i
++)
1303 if (PtrCU
[i
].NbVariables
)
1305 if (Index
<= PtrCU
[i
].NbVariables
)
1307 return PtrCU
[i
].PtrVariables
[Index
- 1].TypeTag
;
1311 Index
-= PtrCU
[i
].NbVariables
;
1320 // Get global variable byte size based on his index (starting by 1)
1321 // Return 0 if not found
1322 size_t DWARFManager_GetGlobalVariableTypeByteSize(size_t Index
)
1326 for (i
= 0; i
< NbCU
; i
++)
1328 if (PtrCU
[i
].NbVariables
)
1330 if (Index
<= PtrCU
[i
].NbVariables
)
1332 return PtrCU
[i
].PtrVariables
[Index
- 1].TypeByteSize
;
1336 Index
-= PtrCU
[i
].NbVariables
;
1345 // Get global variable encoding based on his index (starting by 1)
1346 // Return 0 if not found
1347 size_t DWARFManager_GetGlobalVariableTypeEncoding(size_t Index
)
1351 for (i
= 0; i
< NbCU
; i
++)
1353 if (PtrCU
[i
].NbVariables
)
1355 if (Index
<= PtrCU
[i
].NbVariables
)
1357 return PtrCU
[i
].PtrVariables
[Index
- 1].TypeEncoding
;
1361 Index
-= PtrCU
[i
].NbVariables
;
1370 // Get global variable address based on his index (starting by 1)
1371 // Return 0 if not found
1372 size_t DWARFManager_GetGlobalVariableAdr(size_t Index
)
1376 for (i
= 0; i
< NbCU
; i
++)
1378 if (PtrCU
[i
].NbVariables
)
1380 if (Index
<= PtrCU
[i
].NbVariables
)
1382 return PtrCU
[i
].PtrVariables
[Index
- 1].Addr
;
1386 Index
-= PtrCU
[i
].NbVariables
;
1395 // Get global variable memory address based on his name
1396 // Return 0 if not found
1397 // Note: Return the first occurence found
1398 size_t DWARFManager_GetGlobalVariableAdrFromName(char *VariableName
)
1402 for (i
= 0; i
< NbCU
; i
++)
1404 if (PtrCU
[i
].NbVariables
)
1406 for (j
= 0; j
< PtrCU
[i
].NbVariables
; j
++)
1408 if (!strcmp(PtrCU
[i
].PtrVariables
[j
].PtrName
,VariableName
))
1410 return PtrCU
[i
].PtrVariables
[j
].Addr
;
1420 // Get global variable name based on his index (starting by 1)
1421 // Return name's pointer text found
1422 // Return NULL if not found
1423 char *DWARFManager_GetGlobalVariableName(size_t Index
)
1427 for (i
= 0; i
< NbCU
; i
++)
1429 if (PtrCU
[i
].NbVariables
)
1431 if (Index
<= PtrCU
[i
].NbVariables
)
1433 return PtrCU
[i
].PtrVariables
[Index
- 1].PtrName
;
1437 Index
-= PtrCU
[i
].NbVariables
;
1446 // Get text line from source based on address and his tag
1447 // Return NULL if no text line has been found
1448 char *DWARFManager_GetLineSrcFromAdr(size_t Adr
, size_t Tag
)
1452 for (i
= 0; i
< NbCU
; i
++)
1454 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1456 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1458 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1460 if ((PtrCU
[i
].PtrSubProgs
[j
].StartPC
== Adr
) && (!Tag
|| (Tag
== DW_TAG_subprogram
)))
1462 return PtrCU
[i
].PtrSubProgs
[j
].PtrLineSrc
;
1466 for (k
= 0; k
< PtrCU
[i
].PtrSubProgs
[j
].NbLinesSrc
; k
++)
1468 if ((PtrCU
[i
].PtrSubProgs
[j
].PtrLinesSrc
[k
].StartPC
== Adr
) && (!Tag
|| (PtrCU
[i
].PtrSubProgs
[j
].PtrLinesSrc
[k
].Tag
== Tag
)))
1470 return PtrCU
[i
].PtrSubProgs
[j
].PtrLinesSrc
[k
].PtrLineSrc
;
1483 // Get line number based on the address and the tag
1484 // Return 0 if no line number has been found
1485 size_t DWARFManager_GetNumLineFromAdr(size_t Adr
, size_t Tag
)
1489 for (i
= 0; i
< NbCU
; i
++)
1491 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1493 for (j
= 0; (j
< PtrCU
[i
].NbSubProgs
); j
++)
1495 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1497 if ((PtrCU
[i
].PtrSubProgs
[j
].StartPC
== Adr
) && (!Tag
|| (Tag
== DW_TAG_subprogram
)))
1499 return PtrCU
[i
].PtrSubProgs
[j
].NumLineSrc
;
1503 for (k
= 0; (k
< PtrCU
[i
].PtrSubProgs
[j
].NbLinesSrc
); k
++)
1505 if ((PtrCU
[i
].PtrSubProgs
[j
].PtrLinesSrc
[k
].StartPC
== Adr
) && (!Tag
|| (PtrCU
[i
].PtrSubProgs
[j
].PtrLinesSrc
[k
].Tag
== Tag
)))
1507 return PtrCU
[i
].PtrSubProgs
[j
].PtrLinesSrc
[k
].NumLineSrc
;
1512 if (!Tag
|| (Tag
== DW_TAG_subprogram
))
1514 return PtrCU
[i
].PtrSubProgs
[j
].NumLineSrc
;
1526 // Get function name based on address and his range
1527 // Return NULL if no function name has been found
1528 char *DWARFManager_GetFunctionName(size_t Adr
)
1532 for (i
= 0; i
< NbCU
; i
++)
1534 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1536 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1538 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1540 return PtrCU
[i
].PtrSubProgs
[j
].PtrSubprogramName
;
1550 // Get text line from source based on address and num line (starting by 1)
1551 // Return NULL if no text line has been found
1552 char *DWARFManager_GetLineSrcFromAdrNumLine(size_t Adr
, size_t NumLine
)
1556 for (i
= 0; i
< NbCU
; i
++)
1558 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1560 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1562 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1564 if (PtrCU
[i
].PtrSubProgs
[j
].NumLineSrc
== NumLine
)
1566 return PtrCU
[i
].PtrSubProgs
[j
].PtrLineSrc
;
1570 for (k
= 0; k
< PtrCU
[i
].PtrSubProgs
[j
].NbLinesSrc
; k
++)
1572 if (PtrCU
[i
].PtrSubProgs
[j
].PtrLinesSrc
[k
].NumLineSrc
== NumLine
)
1574 return PtrCU
[i
].PtrSubProgs
[j
].PtrLinesSrc
[k
].PtrLineSrc
;
1587 // Get text line from source based on address and num line (starting by 1)
1588 // Return NULL if no text line has been found
1589 char *DWARFManager_GetLineSrcFromNumLineBaseAdr(size_t Adr
, size_t NumLine
)
1593 for (i
= 0; i
< NbCU
; i
++)
1595 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1597 if (NumLine
<= PtrCU
[i
].NbLinesLoadSrc
)
1599 return PtrCU
[i
].PtrLinesLoadSrc
[NumLine
- 1];