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 // Variables internal structure
48 struct VariablesStruct
50 size_t Op
; // Variable's DW_OP
53 size_t Addr
; // Variable memory address
54 int Offset
; // Variable stack offset (signed)
56 char *PtrName
; // Variable's name
57 size_t TypeOffset
; // Offset pointing on the Variable's Type
58 size_t TypeByteSize
; // Variable's Type byte size
59 size_t TypeTag
; // Variable's Type Tag
60 size_t TypeEncoding
; // Variable's Type encoding
61 char *PtrTypeName
; // Variable's Type name
64 // Sub program internal structure
73 char *PtrSubprogramName
; // Sub program name
74 size_t NbLinesSrc
; // Number of lines source used by the sub program
75 DMIStruct_LineSrc
*PtrLinesSrc
; // Pointer of the lines source for the sub program
76 size_t NbVariables
; // Variables number
77 VariablesStruct
*PtrVariables
; // Pointer to the local variables list information structure
80 // Compilation Unit internal structure
85 char *PtrProducer
; // Pointer to the "Producer" information (compiler and compilation options used)
86 char *PtrFullFilename
; // Pointer to full namefile (directory & filename)
87 size_t SizeLoadSrc
; // Source code size
88 char *PtrLoadSrc
; // Pointer to loaded source code
89 size_t NbLinesLoadSrc
; // Lines source number
90 char **PtrLinesLoadSrc
; // Pointer lists to each source line put in QT html/text conformity
91 size_t NbSubProgs
; // Number of sub programs / routines
92 SubProgStruct
*PtrSubProgs
; // Pointer to the sub programs / routines information structure
94 BaseTypeStruct
*PtrTypes
;
95 size_t NbVariables
; // Variables number
96 VariablesStruct
*PtrVariables
; // Pointer to the global variables list information structure
110 Dwarf_Handler
DWARFManager_ErrorHandler(Dwarf_Ptr perrarg
);
111 void DWARFManager_InitDMI(void);
112 void DWARFManager_CloseDMI(void);
113 bool DWARFManager_ElfClose(void);
114 char *DWARFManager_GetLineSrcFromNumLine(char *PtrSrcFile
, size_t NumLine
);
115 void DWARFManager_InitInfosVariable(VariablesStruct
*PtrVariables
);
119 Dwarf_Handler
DWARFManager_ErrorHandler(Dwarf_Ptr perrarg
)
125 // Dwarf manager init
126 void DWARFManager_Init(void)
128 LibDwarf
= DW_DLV_NO_ENTRY
;
132 // Dwarf manager Reset
133 bool DWARFManager_Reset(void)
135 return DWARFManager_ElfClose();
139 // Dwarf manager Close
140 bool DWARFManager_Close(void)
142 return(DWARFManager_Reset());
146 // Dwarf manager Elf init
147 int DWARFManager_ElfInit(Elf
*ElfPtr
)
149 if ((LibDwarf
= dwarf_elf_init(ElfPtr
, DW_DLC_READ
, (Dwarf_Handler
)DWARFManager_ErrorHandler
, errarg
, &dbg
, &error
)) == DW_DLV_OK
)
151 DWARFManager_InitDMI();
158 // Dwarf manager Elf close
159 bool DWARFManager_ElfClose(void)
161 if (LibDwarf
== DW_DLV_OK
)
163 DWARFManager_CloseDMI();
165 if (dwarf_finish(dbg
, &error
) == DW_DLV_OK
)
167 LibDwarf
= DW_DLV_NO_ENTRY
;
182 // Dwarf manager Compilation Units close
183 void DWARFManager_CloseDMI(void)
187 free(PtrCU
[NbCU
].PtrFullFilename
);
188 free(PtrCU
[NbCU
].PtrLoadSrc
);
189 free(PtrCU
[NbCU
].PtrProducer
);
191 while (PtrCU
[NbCU
].NbLinesLoadSrc
--)
193 free(PtrCU
[NbCU
].PtrLinesLoadSrc
[PtrCU
[NbCU
].NbLinesLoadSrc
]);
195 free(PtrCU
[NbCU
].PtrLinesLoadSrc
);
197 while (PtrCU
[NbCU
].NbSubProgs
--)
199 while (PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbVariables
--)
201 free(PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrVariables
[PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbVariables
].PtrName
);
202 free(PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrVariables
[PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbVariables
].PtrTypeName
);
204 free(PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrVariables
);
206 free(PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrLinesSrc
);
207 free(PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrSubprogramName
);
209 free(PtrCU
[NbCU
].PtrSubProgs
);
211 while (PtrCU
[NbCU
].NbTypes
--)
213 free(PtrCU
[NbCU
].PtrTypes
[PtrCU
[NbCU
].NbTypes
].PtrName
);
215 free(PtrCU
[NbCU
].PtrTypes
);
217 while (PtrCU
[NbCU
].NbVariables
--)
219 free(PtrCU
[NbCU
].PtrVariables
[PtrCU
[NbCU
].NbVariables
].PtrName
);
220 free(PtrCU
[NbCU
].PtrVariables
[PtrCU
[NbCU
].NbVariables
].PtrTypeName
);
222 free(PtrCU
[NbCU
].PtrVariables
);
229 // Dwarf manager Compilation Units initialisations
230 void DWARFManager_InitDMI(void)
232 Dwarf_Unsigned next_cu_header
, return_uvalue
;
234 Dwarf_Attribute
*atlist
;
235 Dwarf_Attribute return_attr1
;
236 Dwarf_Half return_tagval
, return_attr
;
237 Dwarf_Addr return_lowpc
, return_highpc
, return_lineaddr
;
238 Dwarf_Block
*return_block
;
239 Dwarf_Signed atcnt
, cnt
;
240 Dwarf_Die return_sib
, return_die
, return_sub
, return_subdie
;
241 Dwarf_Off return_offset
;
247 char *SourceFilename
= NULL
;
248 char *SourceFileDirectory
= NULL
;
249 char *SourceFullFilename
= NULL
;
251 // Initialisation for the Compilation Units table
255 // loop on the available Compilation Unit
256 while (dwarf_next_cu_header(dbg
, NULL
, NULL
, NULL
, NULL
, &next_cu_header
, &error
) == DW_DLV_OK
)
258 // Allocation of an additional Compilation Unit structure in the table
259 if (Ptr
= (char *)realloc(PtrCU
, ((NbCU
+ 1) * sizeof(CUStruct
))))
261 // Compilation Unit RAZ
262 PtrCU
= (CUStruct
*)Ptr
;
263 memset(PtrCU
+ NbCU
, 0, sizeof(CUStruct
));
267 if (NbCU
== DEBUG_NumCU
)
270 // Get 1st Die from the Compilation Unit
271 if (dwarf_siblingof(dbg
, NULL
, &return_sib
, &error
) == DW_DLV_OK
)
274 if ((dwarf_tag(return_sib
, &return_tagval
, &error
) == DW_DLV_OK
))
276 PtrCU
[NbCU
].Tag
= return_tagval
;
278 // Die type detection
279 switch (return_tagval
)
281 case DW_TAG_compile_unit
:
282 if (dwarf_attrlist(return_sib
, &atlist
, &atcnt
, &error
) == DW_DLV_OK
)
284 for (Dwarf_Signed i
= 0; i
< atcnt
; ++i
)
286 if (dwarf_whatattr(atlist
[i
], &return_attr
, &error
) == DW_DLV_OK
)
291 if (dwarf_lowpc(return_sib
, &return_lowpc
, &error
) == DW_DLV_OK
)
293 PtrCU
[NbCU
].LowPC
= return_lowpc
;
298 if (dwarf_highpc(return_sib
, &return_highpc
, &error
) == DW_DLV_OK
)
300 PtrCU
[NbCU
].HighPC
= return_highpc
;
305 if (dwarf_formstring(atlist
[i
], &return_string
, &error
) == DW_DLV_OK
)
307 PtrCU
[NbCU
].PtrProducer
= (char *)calloc(strlen(return_string
) + 1, 1);
308 strcpy(PtrCU
[NbCU
].PtrProducer
, return_string
);
309 dwarf_dealloc(dbg
, return_string
, DW_DLA_STRING
);
314 if (dwarf_formstring(atlist
[i
], &return_string
, &error
) == DW_DLV_OK
)
316 SourceFilename
= (char *)realloc(SourceFilename
, strlen(return_string
) + 1);
317 strcpy(SourceFilename
, return_string
);
318 dwarf_dealloc(dbg
, return_string
, DW_DLA_STRING
);
323 if (dwarf_formstring(atlist
[i
], &return_string
, &error
) == DW_DLV_OK
)
325 SourceFileDirectory
= (char *)realloc(SourceFileDirectory
, strlen(return_string
) + 1);
326 strcpy(SourceFileDirectory
, return_string
);
327 dwarf_dealloc(dbg
, return_string
, DW_DLA_STRING
);
335 dwarf_dealloc(dbg
, atlist
[i
], DW_DLA_ATTR
);
337 dwarf_dealloc(dbg
, atlist
, DW_DLA_LIST
);
340 Ptr
= SourceFullFilename
= (char *)realloc(SourceFullFilename
, strlen(SourceFilename
) + strlen(SourceFileDirectory
) + 2);
341 sprintf(SourceFullFilename
, "%s\\%s", SourceFileDirectory
, SourceFilename
);
350 PtrCU
[NbCU
].PtrFullFilename
= (char *)calloc(strlen(SourceFullFilename
) + 1, 1);
351 strcpy((char *)PtrCU
[NbCU
].PtrFullFilename
, SourceFullFilename
);
354 if (!fopen_s(&SrcFile
, SourceFullFilename
, "rt"))
356 if (!(SrcFile
= fopen(SourceFullFilename
, "rt")))
359 if (!fseek(SrcFile
, 0, SEEK_END
))
361 if ((PtrCU
[NbCU
].SizeLoadSrc
= ftell(SrcFile
)) > 0)
363 if (PtrCU
[NbCU
].PtrLoadSrc
= Ptr
= (char *)calloc((PtrCU
[NbCU
].SizeLoadSrc
+ 1), 1))
366 if (PtrCU
[NbCU
].SizeLoadSrc
< fread(Ptr
, 1, PtrCU
[NbCU
].SizeLoadSrc
, SrcFile
))
368 free(PtrCU
[NbCU
].PtrLoadSrc
);
369 PtrCU
[NbCU
].PtrLoadSrc
= NULL
;
370 PtrCU
[NbCU
].SizeLoadSrc
= 0;
378 PtrCU
[NbCU
].NbLinesLoadSrc
++;
395 // Get the source lines table located in the Compilation Unit
396 if (dwarf_srclines(return_sib
, &linebuf
, &cnt
, &error
) == DW_DLV_OK
)
400 // Check if the CU has child
401 if (dwarf_child(return_sib
, &return_die
, &error
) == DW_DLV_OK
)
405 return_sib
= return_die
;
406 if ((dwarf_tag(return_die
, &return_tagval
, &error
) == DW_DLV_OK
))
408 switch (return_tagval
)
410 case DW_TAG_lexical_block
:
413 case DW_TAG_variable
:
414 if (dwarf_attrlist(return_die
, &atlist
, &atcnt
, &error
) == DW_DLV_OK
)
416 PtrCU
[NbCU
].PtrVariables
= (VariablesStruct
*)realloc(PtrCU
[NbCU
].PtrVariables
, ((PtrCU
[NbCU
].NbVariables
+ 1) * sizeof(VariablesStruct
)));
417 memset(PtrCU
[NbCU
].PtrVariables
+ PtrCU
[NbCU
].NbVariables
, 0, sizeof(VariablesStruct
));
419 for (Dwarf_Signed i
= 0; i
< atcnt
; ++i
)
421 if (dwarf_whatattr(atlist
[i
], &return_attr
, &error
) == DW_DLV_OK
)
423 if (dwarf_attr(return_die
, return_attr
, &return_attr1
, &error
) == DW_DLV_OK
)
428 if (dwarf_formblock(return_attr1
, &return_block
, &error
) == DW_DLV_OK
)
430 PtrCU
[NbCU
].PtrVariables
[PtrCU
[NbCU
].NbVariables
].Op
= (*((unsigned char *)(return_block
->bl_data
)));
432 switch (return_block
->bl_len
)
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));
441 dwarf_dealloc(dbg
, return_block
, DW_DLA_BLOCK
);
446 if (dwarf_global_formref(return_attr1
, &return_offset
, &error
) == DW_DLV_OK
)
448 PtrCU
[NbCU
].PtrVariables
[PtrCU
[NbCU
].NbVariables
].TypeOffset
= return_offset
;
453 if (dwarf_formstring(return_attr1
, &return_string
, &error
) == DW_DLV_OK
)
455 #ifdef DEBUG_VariableName
456 if (!strcmp(return_string
, DEBUG_VariableName
))
459 PtrCU
[NbCU
].PtrVariables
[PtrCU
[NbCU
].NbVariables
].PtrName
= (char *)calloc(strlen(return_string
) + 1, 1);
460 strcpy(PtrCU
[NbCU
].PtrVariables
[PtrCU
[NbCU
].NbVariables
].PtrName
, return_string
);
461 dwarf_dealloc(dbg
, return_string
, DW_DLA_STRING
);
472 dwarf_dealloc(dbg
, atlist
[i
], DW_DLA_ATTR
);
475 PtrCU
[NbCU
].NbVariables
++;
477 dwarf_dealloc(dbg
, atlist
, DW_DLA_LIST
);
481 case DW_TAG_base_type
:
483 case DW_TAG_structure_type
:
484 case DW_TAG_pointer_type
:
485 case DW_TAG_const_type
:
486 case DW_TAG_array_type
:
487 case DW_TAG_subrange_type
:
488 case DW_TAG_subroutine_type
:
489 if (dwarf_attrlist(return_die
, &atlist
, &atcnt
, &error
) == DW_DLV_OK
)
491 PtrCU
[NbCU
].PtrTypes
= (BaseTypeStruct
*)realloc(PtrCU
[NbCU
].PtrTypes
, ((PtrCU
[NbCU
].NbTypes
+ 1) * sizeof(BaseTypeStruct
)));
492 memset(PtrCU
[NbCU
].PtrTypes
+ PtrCU
[NbCU
].NbTypes
, 0, sizeof(BaseTypeStruct
));
493 PtrCU
[NbCU
].PtrTypes
[PtrCU
[NbCU
].NbTypes
].Tag
= return_tagval
;
495 if (dwarf_dieoffset(return_die
, &return_offset
, &error
) == DW_DLV_OK
)
497 PtrCU
[NbCU
].PtrTypes
[PtrCU
[NbCU
].NbTypes
].Offset
= return_offset
;
500 for (Dwarf_Signed i
= 0; i
< atcnt
; ++i
)
502 if (dwarf_whatattr(atlist
[i
], &return_attr
, &error
) == DW_DLV_OK
)
504 if (dwarf_attr(return_die
, return_attr
, &return_attr1
, &error
) == DW_DLV_OK
)
509 if (dwarf_global_formref(return_attr1
, &return_offset
, &error
) == DW_DLV_OK
)
511 PtrCU
[NbCU
].PtrTypes
[PtrCU
[NbCU
].NbTypes
].TypeOffset
= return_offset
;
515 case DW_AT_byte_size
:
516 if (dwarf_formudata(return_attr1
, &return_uvalue
, &error
) == DW_DLV_OK
)
518 PtrCU
[NbCU
].PtrTypes
[PtrCU
[NbCU
].NbTypes
].ByteSize
= return_uvalue
;
523 if (dwarf_formudata(return_attr1
, &return_uvalue
, &error
) == DW_DLV_OK
)
525 PtrCU
[NbCU
].PtrTypes
[PtrCU
[NbCU
].NbTypes
].Encoding
= return_uvalue
;
530 if (dwarf_formstring(return_attr1
, &return_string
, &error
) == DW_DLV_OK
)
532 PtrCU
[NbCU
].PtrTypes
[PtrCU
[NbCU
].NbTypes
].PtrName
= (char *)calloc(strlen(return_string
) + 1, 1);
533 strcpy(PtrCU
[NbCU
].PtrTypes
[PtrCU
[NbCU
].NbTypes
].PtrName
, return_string
);
534 dwarf_dealloc(dbg
, return_string
, DW_DLA_STRING
);
544 dwarf_dealloc(dbg
, atlist
[i
], DW_DLA_ATTR
);
547 PtrCU
[NbCU
].NbTypes
++;
549 dwarf_dealloc(dbg
, atlist
, DW_DLA_LIST
);
553 case DW_TAG_subprogram
:
554 if (dwarf_attrlist(return_die
, &atlist
, &atcnt
, &error
) == DW_DLV_OK
)
556 PtrCU
[NbCU
].PtrSubProgs
= (SubProgStruct
*)realloc(PtrCU
[NbCU
].PtrSubProgs
, ((PtrCU
[NbCU
].NbSubProgs
+ 1) * sizeof(SubProgStruct
)));
557 memset((void *)(PtrCU
[NbCU
].PtrSubProgs
+ PtrCU
[NbCU
].NbSubProgs
), 0, sizeof(SubProgStruct
));
558 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].Tag
= return_tagval
;
560 for (Dwarf_Signed i
= 0; i
< atcnt
; ++i
)
562 if (dwarf_whatattr(atlist
[i
], &return_attr
, &error
) == DW_DLV_OK
)
564 if (dwarf_attr(return_die
, return_attr
, &return_attr1
, &error
) == DW_DLV_OK
)
569 if (dwarf_lowpc(return_die
, &return_lowpc
, &error
) == DW_DLV_OK
)
571 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].StartPC
= return_lowpc
;
572 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].LowPC
= return_lowpc
;
577 if (dwarf_highpc(return_die
, &return_highpc
, &error
) == DW_DLV_OK
)
579 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].HighPC
= return_highpc
;
583 case DW_AT_decl_line
:
584 if (dwarf_formudata(return_attr1
, &return_uvalue
, &error
) == DW_DLV_OK
)
586 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NumLineSrc
= return_uvalue
;
590 case DW_AT_frame_base
:
591 if (dwarf_formudata(return_attr1
, &return_uvalue
, &error
) == DW_DLV_OK
)
593 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].FrameBase
= return_uvalue
;
598 if (dwarf_formstring(return_attr1
, &return_string
, &error
) == DW_DLV_OK
)
600 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrSubprogramName
= (char *)calloc(strlen(return_string
) + 1, 1);
601 strcpy(PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrSubprogramName
, return_string
);
602 dwarf_dealloc(dbg
, return_string
, DW_DLA_STRING
);
611 dwarf_dealloc(dbg
, atlist
[i
], DW_DLA_ATTR
);
613 dwarf_dealloc(dbg
, atlist
, DW_DLA_LIST
);
615 for (i
= 0; i
< (size_t)cnt
; ++i
)
617 if (dwarf_lineaddr(linebuf
[i
], &return_lineaddr
, &error
) == DW_DLV_OK
)
619 if (dwarf_lineno(linebuf
[i
], &return_uvalue
, &error
) == DW_DLV_OK
)
621 if ((return_lineaddr
>= return_lowpc
) && (return_lineaddr
<= return_highpc
))
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
));
624 memset((void *)(PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrLinesSrc
+ PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbLinesSrc
), 0, sizeof(DMIStruct_LineSrc
));
625 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrLinesSrc
[PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbLinesSrc
].StartPC
= return_lineaddr
;
626 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrLinesSrc
[PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbLinesSrc
].NumLineSrc
= return_uvalue
;
627 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbLinesSrc
++;
633 if (dwarf_child(return_die
, &return_subdie
, &error
) == DW_DLV_OK
)
637 return_sub
= return_subdie
;
638 if ((dwarf_tag(return_subdie
, &return_tagval
, &error
) == DW_DLV_OK
))
640 switch (return_tagval
)
642 case DW_TAG_formal_parameter
:
643 case DW_TAG_variable
:
644 if (dwarf_attrlist(return_subdie
, &atlist
, &atcnt
, &error
) == DW_DLV_OK
)
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
)));
647 memset(PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrVariables
+ PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbVariables
, 0, sizeof(VariablesStruct
));
649 for (Dwarf_Signed i
= 0; i
< atcnt
; ++i
)
651 if (dwarf_whatattr(atlist
[i
], &return_attr
, &error
) == DW_DLV_OK
)
653 if (dwarf_attr(return_subdie
, return_attr
, &return_attr1
, &error
) == DW_DLV_OK
)
658 if (dwarf_formblock(return_attr1
, &return_block
, &error
) == DW_DLV_OK
)
660 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrVariables
[PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbVariables
].Op
= *((unsigned char *)(return_block
->bl_data
));
662 switch (return_block
->bl_len
)
668 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrVariables
[PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbVariables
].Offset
= *((char *)(return_block
->bl_data
) + 1);
670 if (return_tagval
== DW_TAG_variable
)
672 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrVariables
[PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbVariables
].Offset
-= 0x80;
679 dwarf_dealloc(dbg
, return_block
, DW_DLA_BLOCK
);
684 if (dwarf_global_formref(return_attr1
, &return_offset
, &error
) == DW_DLV_OK
)
686 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrVariables
[PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbVariables
].TypeOffset
= return_offset
;
691 if (dwarf_formstring(return_attr1
, &return_string
, &error
) == DW_DLV_OK
)
693 #ifdef DEBUG_VariableName
694 if (!strcmp(return_string
, DEBUG_VariableName
))
697 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrVariables
[PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbVariables
].PtrName
= (char *)calloc(strlen(return_string
) + 1, 1);
698 strcpy(PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].PtrVariables
[PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbVariables
].PtrName
, return_string
);
699 dwarf_dealloc(dbg
, return_string
, DW_DLA_STRING
);
710 dwarf_dealloc(dbg
, atlist
[i
], DW_DLA_ATTR
);
713 PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
].NbVariables
++;
715 dwarf_dealloc(dbg
, atlist
, DW_DLA_LIST
);
727 while (dwarf_siblingof(dbg
, return_sub
, &return_subdie
, &error
) == DW_DLV_OK
);
730 PtrCU
[NbCU
].NbSubProgs
++;
739 while (dwarf_siblingof(dbg
, return_sib
, &return_die
, &error
) == DW_DLV_OK
);
742 // Release the memory used by the source lines
743 for (i
= 0; i
< (size_t)cnt
; ++i
)
744 dwarf_dealloc(dbg
, linebuf
[i
], DW_DLA_LINE
);
745 dwarf_dealloc(dbg
, linebuf
, DW_DLA_LIST
);
748 // Set the source code lines for QT html/text conformity
749 if (PtrCU
[NbCU
].NbLinesLoadSrc
)
751 if (PtrCU
[NbCU
].PtrLinesLoadSrc
= (char **)calloc(PtrCU
[NbCU
].NbLinesLoadSrc
, sizeof(char *)))
753 for (j
= 0; j
< PtrCU
[NbCU
].NbLinesLoadSrc
; j
++)
755 if (PtrCU
[NbCU
].PtrLinesLoadSrc
[j
] = (char *)calloc(10000, sizeof(char)))
757 if (Ptr
= DWARFManager_GetLineSrcFromNumLine(PtrCU
[NbCU
].PtrLoadSrc
, (j
+ 1)))
766 strcat(PtrCU
[NbCU
].PtrLinesLoadSrc
[j
], " ");
767 i
+= strlen(" ");
771 strcat(PtrCU
[NbCU
].PtrLinesLoadSrc
[j
], "<");
776 strcat(PtrCU
[NbCU
].PtrLinesLoadSrc
[j
], ">");
781 strcpy(PtrCU
[NbCU
].PtrLinesLoadSrc
[j
], "&");
782 i
+= strlen("&");
787 strcpy(PtrCU
[NbCU
].PtrLinesLoadSrc
[j
], """);
788 i
+= strlen(""");
792 PtrCU
[NbCU
].PtrLinesLoadSrc
[j
][i
++] = *Ptr
;
798 PtrCU
[NbCU
].PtrLinesLoadSrc
[j
] = (char *)realloc(PtrCU
[NbCU
].PtrLinesLoadSrc
[j
], i
+ 1);
802 // Init lines source information based on each source code line numbers
803 for (j
= 0; j
< PtrCU
[NbCU
].NbSubProgs
; j
++)
805 // Check if the subprog / function's line exists in the source code
806 if (PtrCU
[NbCU
].PtrSubProgs
[j
].NumLineSrc
<= PtrCU
[NbCU
].NbLinesLoadSrc
)
808 PtrCU
[NbCU
].PtrSubProgs
[j
].PtrLineSrc
= PtrCU
[NbCU
].PtrLinesLoadSrc
[PtrCU
[NbCU
].PtrSubProgs
[j
].NumLineSrc
- 1];
811 for (k
= 0; k
< PtrCU
[NbCU
].PtrSubProgs
[j
].NbLinesSrc
; k
++)
813 if (PtrCU
[NbCU
].PtrSubProgs
[j
].PtrLinesSrc
[k
].NumLineSrc
<= PtrCU
[NbCU
].NbLinesLoadSrc
)
815 PtrCU
[NbCU
].PtrSubProgs
[j
].PtrLinesSrc
[k
].PtrLineSrc
= PtrCU
[NbCU
].PtrLinesLoadSrc
[PtrCU
[NbCU
].PtrSubProgs
[j
].PtrLinesSrc
[k
].NumLineSrc
- 1];
823 // Set each source lines pointer to NULL
824 if (PtrCU
[NbCU
].NbSubProgs
)
826 // Check the presence of source lines dedicated to the sub progs
827 if (PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
- 1].NbLinesSrc
)
829 i
= PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
- 1].PtrLinesSrc
[PtrCU
[NbCU
].PtrSubProgs
[PtrCU
[NbCU
].NbSubProgs
- 1].NbLinesSrc
- 1].NumLineSrc
;
830 if (PtrCU
[NbCU
].PtrLinesLoadSrc
= (char **)calloc(i
, sizeof(char *)))
832 for (j
= 0; j
< i
; j
++)
834 PtrCU
[NbCU
].PtrLinesLoadSrc
[j
] = NULL
;
841 // Init global variables information based on types information
842 for (i
= 0; i
< PtrCU
[NbCU
].NbVariables
; i
++)
844 DWARFManager_InitInfosVariable(PtrCU
[NbCU
].PtrVariables
+ i
);
847 // Init local variables information based on types information
848 for (i
= 0; i
< PtrCU
[NbCU
].NbSubProgs
; i
++)
850 for (j
= 0; j
< PtrCU
[NbCU
].PtrSubProgs
[i
].NbVariables
; j
++)
852 DWARFManager_InitInfosVariable(PtrCU
[NbCU
].PtrSubProgs
[i
].PtrVariables
+ j
);
861 free(SourceFilename
);
862 free(SourceFileDirectory
);
863 free(SourceFullFilename
);
868 void DWARFManager_InitInfosVariable(VariablesStruct
*PtrVariables
)
870 size_t j
, TypeOffset
;
872 PtrVariables
->PtrTypeName
= (char *)calloc(1000, 1);
873 TypeOffset
= PtrVariables
->TypeOffset
;
875 for (j
= 0; j
< PtrCU
[NbCU
].NbTypes
; j
++)
877 if (TypeOffset
== PtrCU
[NbCU
].PtrTypes
[j
].Offset
)
879 switch (PtrCU
[NbCU
].PtrTypes
[j
].Tag
)
881 case DW_TAG_structure_type
:
882 PtrVariables
->TypeTag
|= 0x1;
883 if ((TypeOffset
= PtrCU
[NbCU
].PtrTypes
[j
].TypeOffset
))
889 if ((PtrVariables
->TypeTag
& 0x2))
891 strcat(PtrVariables
->PtrTypeName
, " *");
896 case DW_TAG_pointer_type
:
897 PtrVariables
->TypeTag
|= 0x2;
898 PtrVariables
->TypeByteSize
= PtrCU
[NbCU
].PtrTypes
[j
].ByteSize
;
899 PtrVariables
->TypeEncoding
= 0x10;
900 if (!(TypeOffset
= PtrCU
[NbCU
].PtrTypes
[j
].TypeOffset
))
902 strcat(PtrVariables
->PtrTypeName
, "void *");
911 PtrVariables
->TypeTag
|= 0x20;
912 strcat(PtrVariables
->PtrTypeName
, PtrCU
[NbCU
].PtrTypes
[j
].PtrName
);
913 if ((TypeOffset
= PtrCU
[NbCU
].PtrTypes
[j
].TypeOffset
))
919 case DW_TAG_subrange_type
:
920 PtrVariables
->TypeTag
|= 0x4;
923 case DW_TAG_array_type
:
924 PtrVariables
->TypeTag
|= 0x8;
925 if ((TypeOffset
= PtrCU
[NbCU
].PtrTypes
[j
].TypeOffset
))
931 case DW_TAG_const_type
:
932 PtrVariables
->TypeTag
|= 0x10;
933 strcat(PtrVariables
->PtrTypeName
, "const ");
934 if ((TypeOffset
= PtrCU
[NbCU
].PtrTypes
[j
].TypeOffset
))
940 case DW_TAG_base_type
:
941 strcat(PtrVariables
->PtrTypeName
, PtrCU
[NbCU
].PtrTypes
[j
].PtrName
);
942 if ((PtrVariables
->TypeTag
& 0x2))
944 strcat(PtrVariables
->PtrTypeName
, " *");
948 PtrVariables
->TypeByteSize
= PtrCU
[NbCU
].PtrTypes
[j
].ByteSize
;
949 PtrVariables
->TypeEncoding
= PtrCU
[NbCU
].PtrTypes
[j
].Encoding
;
951 if ((PtrVariables
->TypeTag
& 0x8))
953 strcat(PtrVariables
->PtrTypeName
, "[]");
965 // Get symbol name based from address
966 // Return NULL if no symbol name exists
967 char *DWARFManager_GetSymbolnameFromAdr(size_t Adr
)
971 for (i
= 0; i
< NbCU
; i
++)
973 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
975 for (j
= 0; (j
< PtrCU
[i
].NbSubProgs
); j
++)
977 if ((PtrCU
[i
].PtrSubProgs
[j
].StartPC
== Adr
))
979 return PtrCU
[i
].PtrSubProgs
[j
].PtrSubprogramName
;
989 // Get complete source filename based from address
990 // Return NULL if no source filename exists
991 // Return the existence status (true or false) in Error
992 char *DWARFManager_GetFullSourceFilenameFromAdr(size_t Adr
, bool *Error
)
996 for (i
= 0; i
< NbCU
; i
++)
998 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1000 *Error
= PtrCU
[i
].PtrLoadSrc
? true : false;
1001 return PtrCU
[i
].PtrFullFilename
;
1009 // Get text line source based on line number (starting by 1)
1010 // Return NULL if no text line exists or if line number is 0
1011 char *DWARFManager_GetLineSrcFromNumLine(char *PtrSrcFile
, size_t NumLine
)
1014 char *PtrLineSrc
= NULL
;
1018 while (i
!= NumLine
)
1020 PtrLineSrc
= PtrSrcFile
;
1021 while (*PtrSrcFile
++);
1030 // Get number of variables referenced by the function range address
1031 size_t DWARFManager_GetNbLocalVariables(size_t Adr
)
1035 for (i
= 0; i
< NbCU
; i
++)
1037 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1039 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1041 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1043 return PtrCU
[i
].PtrSubProgs
[j
].NbVariables
;
1053 // Get local variable name based on his index (starting by 1)
1054 // Return name's pointer text found
1055 // Return NULL if not found
1056 char *DWARFManager_GetLocalVariableName(size_t Adr
, size_t Index
)
1060 for (i
= 0; i
< NbCU
; i
++)
1062 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1064 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1066 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1068 return PtrCU
[i
].PtrSubProgs
[j
].PtrVariables
[Index
- 1].PtrName
;
1078 // Get local variable's type tag based on his index (starting by 1)
1079 // Return 0 if not found
1080 size_t DWARFManager_GetLocalVariableTypeTag(size_t Adr
, size_t Index
)
1084 for (i
= 0; i
< NbCU
; i
++)
1086 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1088 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1090 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1092 return PtrCU
[i
].PtrSubProgs
[j
].PtrVariables
[Index
- 1].TypeTag
;
1103 int DWARFManager_GetLocalVariableOffset(size_t Adr
, size_t Index
)
1107 for (i
= 0; i
< NbCU
; i
++)
1109 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1111 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1113 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1115 return PtrCU
[i
].PtrSubProgs
[j
].PtrVariables
[Index
- 1].Offset
;
1125 // Get local variable Type Byte Size based on his address and index (starting by 1)
1126 // Return 0 if not found
1127 // May return 0 if there is no Type Byte Size linked to the variable's address and index
1128 size_t DWARFManager_GetLocalVariableTypeByteSize(size_t Adr
, size_t Index
)
1132 for (i
= 0; i
< NbCU
; i
++)
1134 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1136 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1138 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1140 return PtrCU
[i
].PtrSubProgs
[j
].PtrVariables
[Index
- 1].TypeByteSize
;
1150 // Get local variable Type Encoding based on his address and index (starting by 1)
1151 // Return 0 if not found
1152 // May return 0 if there is no Type Encoding linked to the variable's address and index
1153 size_t DWARFManager_GetLocalVariableTypeEncoding(size_t Adr
, size_t Index
)
1157 for (i
= 0; i
< NbCU
; i
++)
1159 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1161 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1163 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1165 return PtrCU
[i
].PtrSubProgs
[j
].PtrVariables
[Index
- 1].TypeEncoding
;
1175 // Get local variable Op based on his address and index (starting by 1)
1176 // Return 0 if not found
1177 // May return 0 if there isn't Op linked to the variable's index
1178 size_t DWARFManager_GetLocalVariableOp(size_t Adr
, size_t Index
)
1182 for (i
= 0; i
< NbCU
; i
++)
1184 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1186 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1188 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1190 return PtrCU
[i
].PtrSubProgs
[j
].PtrVariables
[Index
- 1].Op
;
1200 // Get local variable type name based on his index (starting by 1)
1201 // Return NULL if not found
1202 // May return NULL if there is not type linked to the variable's index
1203 char *DWARFManager_GetLocalVariableTypeName(size_t Adr
, size_t Index
)
1207 for (i
= 0; i
< NbCU
; i
++)
1209 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1211 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1213 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1215 return PtrCU
[i
].PtrSubProgs
[j
].PtrVariables
[Index
- 1].PtrTypeName
;
1225 // Get Compilation Unit / global variables numbers
1226 // Return variables number
1227 size_t DWARFManager_GetNbGlobalVariables(void)
1229 size_t NbVariables
= 0, i
;
1231 for (i
= 0; i
< NbCU
; i
++)
1233 NbVariables
+= PtrCU
[i
].NbVariables
;
1240 // Get global variable type name based on his index (starting by 1)
1241 // Return NULL if not found
1242 // May return NULL if there is not type linked to the variable's index
1243 char *DWARFManager_GetGlobalVariableTypeName(size_t Index
)
1247 for (i
= 0; i
< NbCU
; i
++)
1249 if (PtrCU
[i
].NbVariables
)
1251 if (Index
<= PtrCU
[i
].NbVariables
)
1253 return PtrCU
[i
].PtrVariables
[Index
- 1].PtrTypeName
;
1257 Index
-= PtrCU
[i
].NbVariables
;
1266 // Get global variable's type tag based on his index (starting by 1)
1267 // Return 0 if not found
1268 size_t DWARFManager_GetGlobalVariableTypeTag(size_t Index
)
1272 for (i
= 0; i
< NbCU
; i
++)
1274 if (PtrCU
[i
].NbVariables
)
1276 if (Index
<= PtrCU
[i
].NbVariables
)
1278 return PtrCU
[i
].PtrVariables
[Index
- 1].TypeTag
;
1282 Index
-= PtrCU
[i
].NbVariables
;
1291 // Get global variable byte size based on his index (starting by 1)
1292 // Return 0 if not found
1293 size_t DWARFManager_GetGlobalVariableTypeByteSize(size_t Index
)
1297 for (i
= 0; i
< NbCU
; i
++)
1299 if (PtrCU
[i
].NbVariables
)
1301 if (Index
<= PtrCU
[i
].NbVariables
)
1303 return PtrCU
[i
].PtrVariables
[Index
- 1].TypeByteSize
;
1307 Index
-= PtrCU
[i
].NbVariables
;
1316 // Get global variable encoding based on his index (starting by 1)
1317 // Return 0 if not found
1318 size_t DWARFManager_GetGlobalVariableTypeEncoding(size_t Index
)
1322 for (i
= 0; i
< NbCU
; i
++)
1324 if (PtrCU
[i
].NbVariables
)
1326 if (Index
<= PtrCU
[i
].NbVariables
)
1328 return PtrCU
[i
].PtrVariables
[Index
- 1].TypeEncoding
;
1332 Index
-= PtrCU
[i
].NbVariables
;
1341 // Get global variable address based on his index (starting by 1)
1342 // Return 0 if not found
1343 size_t DWARFManager_GetGlobalVariableAdr(size_t Index
)
1347 for (i
= 0; i
< NbCU
; i
++)
1349 if (PtrCU
[i
].NbVariables
)
1351 if (Index
<= PtrCU
[i
].NbVariables
)
1353 return PtrCU
[i
].PtrVariables
[Index
- 1].Addr
;
1357 Index
-= PtrCU
[i
].NbVariables
;
1366 // Get global variable memory address based on his name
1367 // Return 0 if not found
1368 // Note: Return the first occurence found
1369 size_t DWARFManager_GetGlobalVariableAdrFromName(char *VariableName
)
1373 for (i
= 0; i
< NbCU
; i
++)
1375 if (PtrCU
[i
].NbVariables
)
1377 for (j
= 0; j
< PtrCU
[i
].NbVariables
; j
++)
1379 if (!strcmp(PtrCU
[i
].PtrVariables
[j
].PtrName
,VariableName
))
1381 return PtrCU
[i
].PtrVariables
[j
].Addr
;
1391 // Get global variable name based on his index (starting by 1)
1392 // Return name's pointer text found
1393 // Return NULL if not found
1394 char *DWARFManager_GetGlobalVariableName(size_t Index
)
1398 for (i
= 0; i
< NbCU
; i
++)
1400 if (PtrCU
[i
].NbVariables
)
1402 if (Index
<= PtrCU
[i
].NbVariables
)
1404 return PtrCU
[i
].PtrVariables
[Index
- 1].PtrName
;
1408 Index
-= PtrCU
[i
].NbVariables
;
1417 // Get text line from source based on address and his tag
1418 // Return NULL if no text line has been found
1419 char *DWARFManager_GetLineSrcFromAdr(size_t Adr
, size_t Tag
)
1423 for (i
= 0; i
< NbCU
; i
++)
1425 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1427 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1429 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1431 if ((PtrCU
[i
].PtrSubProgs
[j
].StartPC
== Adr
) && (!Tag
|| (Tag
== DW_TAG_subprogram
)))
1433 return PtrCU
[i
].PtrSubProgs
[j
].PtrLineSrc
;
1437 for (k
= 0; k
< PtrCU
[i
].PtrSubProgs
[j
].NbLinesSrc
; k
++)
1439 if ((PtrCU
[i
].PtrSubProgs
[j
].PtrLinesSrc
[k
].StartPC
== Adr
) && (!Tag
|| (PtrCU
[i
].PtrSubProgs
[j
].PtrLinesSrc
[k
].Tag
== Tag
)))
1441 return PtrCU
[i
].PtrSubProgs
[j
].PtrLinesSrc
[k
].PtrLineSrc
;
1454 // Get line number based on the address and the tag
1455 // Return 0 if no line number has been found
1456 size_t DWARFManager_GetNumLineFromAdr(size_t Adr
, size_t Tag
)
1460 for (i
= 0; i
< NbCU
; i
++)
1462 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1464 for (j
= 0; (j
< PtrCU
[i
].NbSubProgs
); j
++)
1466 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1468 if ((PtrCU
[i
].PtrSubProgs
[j
].StartPC
== Adr
) && (!Tag
|| (Tag
== DW_TAG_subprogram
)))
1470 return PtrCU
[i
].PtrSubProgs
[j
].NumLineSrc
;
1474 for (k
= 0; (k
< PtrCU
[i
].PtrSubProgs
[j
].NbLinesSrc
); k
++)
1476 if ((PtrCU
[i
].PtrSubProgs
[j
].PtrLinesSrc
[k
].StartPC
== Adr
) && (!Tag
|| (PtrCU
[i
].PtrSubProgs
[j
].PtrLinesSrc
[k
].Tag
== Tag
)))
1478 return PtrCU
[i
].PtrSubProgs
[j
].PtrLinesSrc
[k
].NumLineSrc
;
1483 if (!Tag
|| (Tag
== DW_TAG_subprogram
))
1485 return PtrCU
[i
].PtrSubProgs
[j
].NumLineSrc
;
1497 // Get function name based on address and his range
1498 // Return NULL if no function name has been found
1499 char *DWARFManager_GetFunctionName(size_t Adr
)
1503 for (i
= 0; i
< NbCU
; i
++)
1505 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1507 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1509 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1511 return PtrCU
[i
].PtrSubProgs
[j
].PtrSubprogramName
;
1521 // Get text line from source based on address and num line (starting by 1)
1522 // Return NULL if no text line has been found
1523 char *DWARFManager_GetLineSrcFromAdrNumLine(size_t Adr
, size_t NumLine
)
1527 for (i
= 0; i
< NbCU
; i
++)
1529 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1531 for (j
= 0; j
< PtrCU
[i
].NbSubProgs
; j
++)
1533 if ((Adr
>= PtrCU
[i
].PtrSubProgs
[j
].LowPC
) && (Adr
< PtrCU
[i
].PtrSubProgs
[j
].HighPC
))
1535 if (PtrCU
[i
].PtrSubProgs
[j
].NumLineSrc
== NumLine
)
1537 return PtrCU
[i
].PtrSubProgs
[j
].PtrLineSrc
;
1541 for (k
= 0; k
< PtrCU
[i
].PtrSubProgs
[j
].NbLinesSrc
; k
++)
1543 if (PtrCU
[i
].PtrSubProgs
[j
].PtrLinesSrc
[k
].NumLineSrc
== NumLine
)
1545 return PtrCU
[i
].PtrSubProgs
[j
].PtrLinesSrc
[k
].PtrLineSrc
;
1558 // Get text line from source based on address and num line (starting by 1)
1559 // Return NULL if no text line has been found
1560 char *DWARFManager_GetLineSrcFromNumLineBaseAdr(size_t Adr
, size_t NumLine
)
1564 for (i
= 0; i
< NbCU
; i
++)
1566 if ((Adr
>= PtrCU
[i
].LowPC
) && (Adr
< PtrCU
[i
].HighPC
))
1568 if (NumLine
<= PtrCU
[i
].NbLinesLoadSrc
)
1570 return PtrCU
[i
].PtrLinesLoadSrc
[NumLine
- 1];