// JPM 12/03/2016 DWARF format support\r
\r
\r
-#include <stdlib.h>\r
-#include <stdio.h>\r
-#include <stdint.h>\r
-#include <string.h>\r
-#include <libdwarf.h>\r
-#include <dwarf.h>\r
+#include <stdlib.h>\r
+#include <stdio.h>\r
+#include <stdint.h>\r
+#include <string.h>\r
+#include <libdwarf.h>\r
+#include <dwarf.h>\r
+\r
+\r
+//\r
+//#define DEBUG_NumCU 0x42 // CU number to debug or undefine it\r
\r
\r
// Source line internal structure\r
PtrCU = (CUStruct *)Ptr;\r
memset(PtrCU + NbCU, 0, sizeof(CUStruct));\r
\r
- // Get 1st Die from the Compilation Unit\r
- if (dwarf_siblingof(dbg, NULL, &return_sib, &error) == DW_DLV_OK)\r
+ // Debug specific CU\r
+#ifdef DEBUG_NumCU\r
+ if (NbCU == DEBUG_NumCU)\r
+#endif\r
{\r
- // Get Die's Tag\r
- if ((dwarf_tag(return_sib, &return_tagval, &error) == DW_DLV_OK))\r
+ // Get 1st Die from the Compilation Unit\r
+ if (dwarf_siblingof(dbg, NULL, &return_sib, &error) == DW_DLV_OK)\r
{\r
- PtrCU[NbCU].Tag = return_tagval;\r
-\r
- // Die type detection\r
- switch (return_tagval)\r
+ // Get Die's Tag\r
+ if ((dwarf_tag(return_sib, &return_tagval, &error) == DW_DLV_OK))\r
{\r
- case DW_TAG_compile_unit:\r
- if (dwarf_attrlist(return_sib, &atlist, &atcnt, &error) == DW_DLV_OK)\r
+ PtrCU[NbCU].Tag = return_tagval;\r
+\r
+ // Die type detection\r
+ switch (return_tagval)\r
{\r
- for (Dwarf_Signed i = 0; i < atcnt; ++i)\r
+ case DW_TAG_compile_unit:\r
+ if (dwarf_attrlist(return_sib, &atlist, &atcnt, &error) == DW_DLV_OK)\r
{\r
- if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK)\r
+ for (Dwarf_Signed i = 0; i < atcnt; ++i)\r
{\r
- switch (return_attr)\r
+ if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK)\r
{\r
- case DW_AT_low_pc:\r
- if (dwarf_lowpc(return_sib, &return_lowpc, &error) == DW_DLV_OK)\r
+ switch (return_attr)\r
{\r
- PtrCU[NbCU].LowPC = return_lowpc;\r
- }\r
- break;\r
+ case DW_AT_low_pc:\r
+ if (dwarf_lowpc(return_sib, &return_lowpc, &error) == DW_DLV_OK)\r
+ {\r
+ PtrCU[NbCU].LowPC = return_lowpc;\r
+ }\r
+ break;\r
\r
- case DW_AT_high_pc:\r
- if (dwarf_highpc(return_sib, &return_highpc, &error) == DW_DLV_OK)\r
- {\r
- PtrCU[NbCU].HighPC = return_highpc;\r
- }\r
- break;\r
+ case DW_AT_high_pc:\r
+ if (dwarf_highpc(return_sib, &return_highpc, &error) == DW_DLV_OK)\r
+ {\r
+ PtrCU[NbCU].HighPC = return_highpc;\r
+ }\r
+ break;\r
\r
- case DW_AT_producer:\r
- if (dwarf_formstring(atlist[i], &return_string, &error) == DW_DLV_OK)\r
- {\r
- PtrCU[NbCU].PtrProducer = (char *)calloc(strlen(return_string) + 1, 1);\r
- strcpy(PtrCU[NbCU].PtrProducer, return_string);\r
- dwarf_dealloc(dbg, return_string, DW_DLA_STRING);\r
- }\r
- break;\r
+ case DW_AT_producer:\r
+ if (dwarf_formstring(atlist[i], &return_string, &error) == DW_DLV_OK)\r
+ {\r
+ PtrCU[NbCU].PtrProducer = (char *)calloc(strlen(return_string) + 1, 1);\r
+ strcpy(PtrCU[NbCU].PtrProducer, return_string);\r
+ dwarf_dealloc(dbg, return_string, DW_DLA_STRING);\r
+ }\r
+ break;\r
\r
- case DW_AT_name:\r
- if (dwarf_formstring(atlist[i], &return_string, &error) == DW_DLV_OK)\r
- {\r
- SourceFilename = (char *)realloc(SourceFilename, strlen(return_string) + 1);\r
- strcpy(SourceFilename, return_string);\r
- dwarf_dealloc(dbg, return_string, DW_DLA_STRING);\r
- }\r
- break;\r
+ case DW_AT_name:\r
+ if (dwarf_formstring(atlist[i], &return_string, &error) == DW_DLV_OK)\r
+ {\r
+ SourceFilename = (char *)realloc(SourceFilename, strlen(return_string) + 1);\r
+ strcpy(SourceFilename, return_string);\r
+ dwarf_dealloc(dbg, return_string, DW_DLA_STRING);\r
+ }\r
+ break;\r
\r
- case DW_AT_comp_dir:\r
- if (dwarf_formstring(atlist[i], &return_string, &error) == DW_DLV_OK)\r
- {\r
- SourceFileDirectory = (char *)realloc(SourceFileDirectory, strlen(return_string) + 1);\r
- strcpy(SourceFileDirectory, return_string);\r
- dwarf_dealloc(dbg, return_string, DW_DLA_STRING);\r
- }\r
- break;\r
+ case DW_AT_comp_dir:\r
+ if (dwarf_formstring(atlist[i], &return_string, &error) == DW_DLV_OK)\r
+ {\r
+ SourceFileDirectory = (char *)realloc(SourceFileDirectory, strlen(return_string) + 1);\r
+ strcpy(SourceFileDirectory, return_string);\r
+ dwarf_dealloc(dbg, return_string, DW_DLA_STRING);\r
+ }\r
+ break;\r
\r
- default:\r
- break;\r
+ default:\r
+ break;\r
+ }\r
}\r
+ dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR);\r
}\r
- dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR);\r
+ dwarf_dealloc(dbg, atlist, DW_DLA_LIST);\r
}\r
- dwarf_dealloc(dbg, atlist, DW_DLA_LIST);\r
- }\r
\r
- Ptr = SourceFullFilename = (char *)realloc(SourceFullFilename, strlen(SourceFilename) + strlen(SourceFileDirectory) + 2);\r
- sprintf(SourceFullFilename, "%s\\%s", SourceFileDirectory, SourceFilename);\r
- while (*Ptr)\r
- {\r
- if (*Ptr == '/')\r
+ Ptr = SourceFullFilename = (char *)realloc(SourceFullFilename, strlen(SourceFilename) + strlen(SourceFileDirectory) + 2);\r
+ sprintf(SourceFullFilename, "%s\\%s", SourceFileDirectory, SourceFilename);\r
+ while (*Ptr)\r
{\r
- *Ptr = '\\';\r
+ if (*Ptr == '/')\r
+ {\r
+ *Ptr = '\\';\r
+ }\r
+ Ptr++;\r
}\r
- Ptr++;\r
- }\r
- PtrCU[NbCU].PtrFullFilename = (char *)calloc(strlen(SourceFullFilename) + 1, 1);\r
- strcpy((char *)PtrCU[NbCU].PtrFullFilename, SourceFullFilename);\r
+ PtrCU[NbCU].PtrFullFilename = (char *)calloc(strlen(SourceFullFilename) + 1, 1);\r
+ strcpy((char *)PtrCU[NbCU].PtrFullFilename, SourceFullFilename);\r
\r
#ifndef __CYGWIN__\r
- if (!fopen_s(&SrcFile, SourceFullFilename, "rt"))\r
+ if (!fopen_s(&SrcFile, SourceFullFilename, "rt"))\r
#else\r
- if (!(SrcFile = fopen(SourceFullFilename, "rt")))\r
+ if (!(SrcFile = fopen(SourceFullFilename, "rt")))\r
#endif\r
- {\r
- if (!fseek(SrcFile, 0, SEEK_END))\r
{\r
- if ((PtrCU[NbCU].SizeLoadSrc = ftell(SrcFile)) > 0)\r
+ if (!fseek(SrcFile, 0, SEEK_END))\r
{\r
- if (PtrCU[NbCU].PtrLoadSrc = Ptr = (char *)calloc((PtrCU[NbCU].SizeLoadSrc + 1), 1))\r
+ if ((PtrCU[NbCU].SizeLoadSrc = ftell(SrcFile)) > 0)\r
{\r
- rewind(SrcFile);\r
- if (PtrCU[NbCU].SizeLoadSrc < fread(Ptr, 1, PtrCU[NbCU].SizeLoadSrc, SrcFile))\r
+ if (PtrCU[NbCU].PtrLoadSrc = Ptr = (char *)calloc((PtrCU[NbCU].SizeLoadSrc + 1), 1))\r
{\r
- free(PtrCU[NbCU].PtrLoadSrc);\r
- PtrCU[NbCU].PtrLoadSrc = NULL;\r
- PtrCU[NbCU].SizeLoadSrc = 0;\r
- }\r
- else\r
- {\r
- do\r
+ rewind(SrcFile);\r
+ if (PtrCU[NbCU].SizeLoadSrc < fread(Ptr, 1, PtrCU[NbCU].SizeLoadSrc, SrcFile))\r
+ {\r
+ free(PtrCU[NbCU].PtrLoadSrc);\r
+ PtrCU[NbCU].PtrLoadSrc = NULL;\r
+ PtrCU[NbCU].SizeLoadSrc = 0;\r
+ }\r
+ else\r
{\r
- if (*Ptr == 0xa)\r
+ do\r
{\r
- PtrCU[NbCU].NbLinesLoadSrc++;\r
- *Ptr = 0;\r
- }\r
- } while (*++Ptr);\r
+ if (*Ptr == 0xa)\r
+ {\r
+ PtrCU[NbCU].NbLinesLoadSrc++;\r
+ *Ptr = 0;\r
+ }\r
+ } while (*++Ptr);\r
+ }\r
}\r
}\r
}\r
+ fclose(SrcFile);\r
}\r
- fclose(SrcFile);\r
- }\r
- break;\r
+ break;\r
\r
- default:\r
- break;\r
+ default:\r
+ break;\r
+ }\r
}\r
- }\r
\r
- // Get the source lines table located in the Compilation Unit\r
- if (dwarf_srclines(return_sib, &linebuf, &cnt, &error) == DW_DLV_OK)\r
- {\r
- }\r
+ // Get the source lines table located in the Compilation Unit\r
+ if (dwarf_srclines(return_sib, &linebuf, &cnt, &error) == DW_DLV_OK)\r
+ {\r
+ }\r
\r
- if (dwarf_child(return_sib, &return_die, &error) == DW_DLV_OK)\r
- {\r
- do\r
+ if (dwarf_child(return_sib, &return_die, &error) == DW_DLV_OK)\r
{\r
- return_sib = return_die;\r
- if ((dwarf_tag(return_die, &return_tagval, &error) == DW_DLV_OK))\r
+ do\r
{\r
- switch (return_tagval)\r
+ return_sib = return_die;\r
+ if ((dwarf_tag(return_die, &return_tagval, &error) == DW_DLV_OK))\r
{\r
- case DW_TAG_lexical_block:\r
- break;\r
-\r
- case DW_TAG_variable:\r
- if (dwarf_attrlist(return_die, &atlist, &atcnt, &error) == DW_DLV_OK)\r
+ switch (return_tagval)\r
{\r
- PtrCU[NbCU].PtrVariables = (VariablesStruct *)realloc(PtrCU[NbCU].PtrVariables, ((PtrCU[NbCU].NbVariables + 1) * sizeof(VariablesStruct)));\r
- memset(PtrCU[NbCU].PtrVariables + PtrCU[NbCU].NbVariables, 0, sizeof(VariablesStruct));\r
+ case DW_TAG_lexical_block:\r
+ break;\r
\r
- for (Dwarf_Signed i = 0; i < atcnt; ++i)\r
+ case DW_TAG_variable:\r
+ if (dwarf_attrlist(return_die, &atlist, &atcnt, &error) == DW_DLV_OK)\r
{\r
- if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK)\r
+ PtrCU[NbCU].PtrVariables = (VariablesStruct *)realloc(PtrCU[NbCU].PtrVariables, ((PtrCU[NbCU].NbVariables + 1) * sizeof(VariablesStruct)));\r
+ memset(PtrCU[NbCU].PtrVariables + PtrCU[NbCU].NbVariables, 0, sizeof(VariablesStruct));\r
+\r
+ for (Dwarf_Signed i = 0; i < atcnt; ++i)\r
{\r
- if (dwarf_attr(return_die, return_attr, &return_attr1, &error) == DW_DLV_OK)\r
+ if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK)\r
{\r
- switch (return_attr)\r
+ if (dwarf_attr(return_die, return_attr, &return_attr1, &error) == DW_DLV_OK)\r
{\r
- case DW_AT_location:\r
- if (dwarf_formblock(return_attr1, &return_block, &error) == DW_DLV_OK)\r
+ switch (return_attr)\r
{\r
- if (return_block->bl_len == 5)\r
+ case DW_AT_location:\r
+ if (dwarf_formblock(return_attr1, &return_block, &error) == DW_DLV_OK)\r
{\r
- PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].Addr = (*((unsigned char *)(return_block->bl_data) + 1) << 24) + (*((unsigned char *)(return_block->bl_data) + 2) << 16) + (*((unsigned char *)(return_block->bl_data) + 3) << 8) + (*((unsigned char *)(return_block->bl_data) + 4));\r
+ if (return_block->bl_len == 5)\r
+ {\r
+ PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].Addr = (*((unsigned char *)(return_block->bl_data) + 1) << 24) + (*((unsigned char *)(return_block->bl_data) + 2) << 16) + (*((unsigned char *)(return_block->bl_data) + 3) << 8) + (*((unsigned char *)(return_block->bl_data) + 4));\r
+ }\r
+ dwarf_dealloc(dbg, return_block, DW_DLA_BLOCK);\r
}\r
- dwarf_dealloc(dbg, return_block, DW_DLA_BLOCK);\r
- }\r
- break;\r
+ break;\r
\r
- case DW_AT_type:\r
- if (dwarf_global_formref(return_attr1, &return_offset, &error) == DW_DLV_OK)\r
- {\r
- PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].TypeOffset = return_offset;\r
- }\r
- break;\r
+ case DW_AT_type:\r
+ if (dwarf_global_formref(return_attr1, &return_offset, &error) == DW_DLV_OK)\r
+ {\r
+ PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].TypeOffset = return_offset;\r
+ }\r
+ break;\r
\r
- case DW_AT_name:\r
- if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK)\r
- {\r
- PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrName = (char *)calloc(strlen(return_string) + 1, 1);\r
- strcpy(PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrName, return_string);\r
- dwarf_dealloc(dbg, return_string, DW_DLA_STRING);\r
- }\r
- break;\r
+ case DW_AT_name:\r
+ if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK)\r
+ {\r
+ PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrName = (char *)calloc(strlen(return_string) + 1, 1);\r
+ strcpy(PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].PtrName, return_string);\r
+ dwarf_dealloc(dbg, return_string, DW_DLA_STRING);\r
+ }\r
+ break;\r
\r
- default:\r
- break;\r
+ default:\r
+ break;\r
+ }\r
}\r
}\r
- }\r
-\r
- dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR);\r
- }\r
-\r
- PtrCU[NbCU].NbVariables++;\r
\r
- dwarf_dealloc(dbg, atlist, DW_DLA_LIST);\r
- }\r
- break;\r
+ dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR);\r
+ }\r
\r
- case DW_TAG_base_type:\r
- case DW_TAG_typedef:\r
- case DW_TAG_structure_type:\r
- case DW_TAG_pointer_type:\r
- case DW_TAG_const_type:\r
- case DW_TAG_array_type:\r
- case DW_TAG_subrange_type:\r
- case DW_TAG_subroutine_type:\r
- if (dwarf_attrlist(return_die, &atlist, &atcnt, &error) == DW_DLV_OK)\r
- {\r
- PtrCU[NbCU].PtrTypes = (BaseTypeStruct *)realloc(PtrCU[NbCU].PtrTypes, ((PtrCU[NbCU].NbTypes + 1) * sizeof(BaseTypeStruct)));\r
- memset(PtrCU[NbCU].PtrTypes + PtrCU[NbCU].NbTypes, 0, sizeof(BaseTypeStruct));\r
- PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].Tag = return_tagval;\r
+ PtrCU[NbCU].NbVariables++;\r
\r
- if (dwarf_dieoffset(return_die, &return_offset, &error) == DW_DLV_OK)\r
- {\r
- PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].Offset = return_offset;\r
+ dwarf_dealloc(dbg, atlist, DW_DLA_LIST);\r
}\r
-\r
- for (Dwarf_Signed i = 0; i < atcnt; ++i)\r
+ break;\r
+\r
+ case DW_TAG_base_type:\r
+ case DW_TAG_typedef:\r
+ case DW_TAG_structure_type:\r
+ case DW_TAG_pointer_type:\r
+ case DW_TAG_const_type:\r
+ case DW_TAG_array_type:\r
+ case DW_TAG_subrange_type:\r
+ case DW_TAG_subroutine_type:\r
+ if (dwarf_attrlist(return_die, &atlist, &atcnt, &error) == DW_DLV_OK)\r
{\r
- if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK)\r
+ PtrCU[NbCU].PtrTypes = (BaseTypeStruct *)realloc(PtrCU[NbCU].PtrTypes, ((PtrCU[NbCU].NbTypes + 1) * sizeof(BaseTypeStruct)));\r
+ memset(PtrCU[NbCU].PtrTypes + PtrCU[NbCU].NbTypes, 0, sizeof(BaseTypeStruct));\r
+ PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].Tag = return_tagval;\r
+\r
+ if (dwarf_dieoffset(return_die, &return_offset, &error) == DW_DLV_OK)\r
+ {\r
+ PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].Offset = return_offset;\r
+ }\r
+\r
+ for (Dwarf_Signed i = 0; i < atcnt; ++i)\r
{\r
- if (dwarf_attr(return_die, return_attr, &return_attr1, &error) == DW_DLV_OK)\r
+ if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK)\r
{\r
- switch (return_attr)\r
+ if (dwarf_attr(return_die, return_attr, &return_attr1, &error) == DW_DLV_OK)\r
{\r
- case DW_AT_type:\r
- if (dwarf_global_formref(return_attr1, &return_offset, &error) == DW_DLV_OK)\r
+ switch (return_attr)\r
{\r
- PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].TypeOffset = return_offset;\r
- }\r
- break;\r
+ case DW_AT_type:\r
+ if (dwarf_global_formref(return_attr1, &return_offset, &error) == DW_DLV_OK)\r
+ {\r
+ PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].TypeOffset = return_offset;\r
+ }\r
+ break;\r
\r
- case DW_AT_byte_size:\r
- if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK)\r
- {\r
- PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].ByteSize = return_uvalue;\r
- }\r
- break;\r
+ case DW_AT_byte_size:\r
+ if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK)\r
+ {\r
+ PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].ByteSize = return_uvalue;\r
+ }\r
+ break;\r
\r
- case DW_AT_encoding:\r
- if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK)\r
- {\r
- PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].Encoding = return_uvalue;\r
- }\r
- break;\r
+ case DW_AT_encoding:\r
+ if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK)\r
+ {\r
+ PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].Encoding = return_uvalue;\r
+ }\r
+ break;\r
\r
- case DW_AT_name:\r
- if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK)\r
- {\r
- PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].PtrName = (char *)calloc(strlen(return_string) + 1, 1);\r
- strcpy(PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].PtrName, return_string);\r
- dwarf_dealloc(dbg, return_string, DW_DLA_STRING);\r
- }\r
- break;\r
+ case DW_AT_name:\r
+ if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK)\r
+ {\r
+ PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].PtrName = (char *)calloc(strlen(return_string) + 1, 1);\r
+ strcpy(PtrCU[NbCU].PtrTypes[PtrCU[NbCU].NbTypes].PtrName, return_string);\r
+ dwarf_dealloc(dbg, return_string, DW_DLA_STRING);\r
+ }\r
+ break;\r
\r
- default:\r
- break;\r
+ default:\r
+ break;\r
+ }\r
}\r
}\r
- }\r
\r
- dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR);\r
- }\r
-\r
- PtrCU[NbCU].NbTypes++;\r
+ dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR);\r
+ }\r
\r
- dwarf_dealloc(dbg, atlist, DW_DLA_LIST);\r
- }\r
- break;\r
+ PtrCU[NbCU].NbTypes++;\r
\r
- case DW_TAG_subprogram:\r
- if (dwarf_attrlist(return_die, &atlist, &atcnt, &error) == DW_DLV_OK)\r
- {\r
- PtrCU[NbCU].PtrSubProgs = (SubProgStruct *)realloc(PtrCU[NbCU].PtrSubProgs, ((PtrCU[NbCU].NbSubProgs + 1) * sizeof(SubProgStruct)));\r
- memset((void *)(PtrCU[NbCU].PtrSubProgs + PtrCU[NbCU].NbSubProgs), 0, sizeof(SubProgStruct));\r
- PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].Tag = return_tagval;\r
+ dwarf_dealloc(dbg, atlist, DW_DLA_LIST);\r
+ }\r
+ break;\r
\r
- for (Dwarf_Signed i = 0; i < atcnt; ++i)\r
+ case DW_TAG_subprogram:\r
+ if (dwarf_attrlist(return_die, &atlist, &atcnt, &error) == DW_DLV_OK)\r
{\r
- if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK)\r
+ PtrCU[NbCU].PtrSubProgs = (SubProgStruct *)realloc(PtrCU[NbCU].PtrSubProgs, ((PtrCU[NbCU].NbSubProgs + 1) * sizeof(SubProgStruct)));\r
+ memset((void *)(PtrCU[NbCU].PtrSubProgs + PtrCU[NbCU].NbSubProgs), 0, sizeof(SubProgStruct));\r
+ PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].Tag = return_tagval;\r
+\r
+ for (Dwarf_Signed i = 0; i < atcnt; ++i)\r
{\r
- if (dwarf_attr(return_die, return_attr, &return_attr1, &error) == DW_DLV_OK)\r
+ if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK)\r
{\r
- switch (return_attr)\r
+ if (dwarf_attr(return_die, return_attr, &return_attr1, &error) == DW_DLV_OK)\r
{\r
- case DW_AT_low_pc:\r
- if (dwarf_lowpc(return_die, &return_lowpc, &error) == DW_DLV_OK)\r
+ switch (return_attr)\r
{\r
- PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].StartPC = return_lowpc;\r
- PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].LowPC = return_lowpc;\r
- }\r
- break;\r
+ case DW_AT_low_pc:\r
+ if (dwarf_lowpc(return_die, &return_lowpc, &error) == DW_DLV_OK)\r
+ {\r
+ PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].StartPC = return_lowpc;\r
+ PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].LowPC = return_lowpc;\r
+ }\r
+ break;\r
\r
- case DW_AT_high_pc:\r
- if (dwarf_highpc(return_die, &return_highpc, &error) == DW_DLV_OK)\r
- {\r
- PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].HighPC = return_highpc;\r
- }\r
- break;\r
+ case DW_AT_high_pc:\r
+ if (dwarf_highpc(return_die, &return_highpc, &error) == DW_DLV_OK)\r
+ {\r
+ PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].HighPC = return_highpc;\r
+ }\r
+ break;\r
\r
- case DW_AT_decl_line:\r
- if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK)\r
- {\r
- PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NumLineSrc = return_uvalue;\r
- }\r
- break;\r
+ case DW_AT_decl_line:\r
+ if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK)\r
+ {\r
+ PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NumLineSrc = return_uvalue;\r
+ }\r
+ break;\r
\r
- case DW_AT_name:\r
- if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK)\r
- {\r
- PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrSubprogramName = (char *)calloc(strlen(return_string) + 1, 1);\r
- strcpy(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrSubprogramName, return_string);\r
- dwarf_dealloc(dbg, return_string, DW_DLA_STRING);\r
- }\r
- break;\r
+ case DW_AT_name:\r
+ if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK)\r
+ {\r
+ PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrSubprogramName = (char *)calloc(strlen(return_string) + 1, 1);\r
+ strcpy(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrSubprogramName, return_string);\r
+ dwarf_dealloc(dbg, return_string, DW_DLA_STRING);\r
+ }\r
+ break;\r
\r
- default:\r
- break;\r
+ default:\r
+ break;\r
+ }\r
}\r
}\r
+ dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR);\r
}\r
- dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR);\r
- }\r
- dwarf_dealloc(dbg, atlist, DW_DLA_LIST);\r
+ dwarf_dealloc(dbg, atlist, DW_DLA_LIST);\r
\r
- for (i = 0; i < (size_t)cnt; ++i)\r
- {\r
- if (dwarf_lineaddr(linebuf[i], &return_lineaddr, &error) == DW_DLV_OK)\r
+ for (i = 0; i < (size_t)cnt; ++i)\r
{\r
- if (dwarf_lineno(linebuf[i], &return_uvalue, &error) == DW_DLV_OK)\r
+ if (dwarf_lineaddr(linebuf[i], &return_lineaddr, &error) == DW_DLV_OK)\r
{\r
- if ((return_lineaddr >= return_lowpc) && (return_lineaddr <= return_highpc))\r
+ if (dwarf_lineno(linebuf[i], &return_uvalue, &error) == DW_DLV_OK)\r
{\r
- PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc = (DMIStruct_LineSrc *)realloc(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc, (PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc + 1) * sizeof(DMIStruct_LineSrc));\r
- memset((void *)(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc), 0, sizeof(DMIStruct_LineSrc));\r
- PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc].StartPC = return_lineaddr;\r
- PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc].NumLineSrc = return_uvalue;\r
- PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc++;\r
+ if ((return_lineaddr >= return_lowpc) && (return_lineaddr <= return_highpc))\r
+ {\r
+ PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc = (DMIStruct_LineSrc *)realloc(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc, (PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc + 1) * sizeof(DMIStruct_LineSrc));\r
+ memset((void *)(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc), 0, sizeof(DMIStruct_LineSrc));\r
+ PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc].StartPC = return_lineaddr;\r
+ PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc].NumLineSrc = return_uvalue;\r
+ PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbLinesSrc++;\r
+ }\r
}\r
}\r
- } \r
+ }\r
+\r
+ PtrCU[NbCU].NbSubProgs++;\r
}\r
- \r
- PtrCU[NbCU].NbSubProgs++;\r
- }\r
- break;\r
+ break;\r
\r
- default:\r
- break;\r
+ default:\r
+ break;\r
+ }\r
}\r
- }\r
+ } while (dwarf_siblingof(dbg, return_sib, &return_die, &error) == DW_DLV_OK);\r
}\r
- while (dwarf_siblingof(dbg, return_sib, &return_die, &error) == DW_DLV_OK);\r
- }\r
\r
- // Release the memory used by the source lines\r
- for (i = 0; i < (size_t)cnt; ++i)\r
- dwarf_dealloc(dbg, linebuf[i], DW_DLA_LINE);\r
- dwarf_dealloc(dbg, linebuf, DW_DLA_LIST);\r
- }\r
+ // Release the memory used by the source lines\r
+ for (i = 0; i < (size_t)cnt; ++i)\r
+ dwarf_dealloc(dbg, linebuf[i], DW_DLA_LINE);\r
+ dwarf_dealloc(dbg, linebuf, DW_DLA_LIST);\r
+ }\r
\r
- // Set the source code lines for QT html/text conformity\r
- if (PtrCU[NbCU].NbLinesLoadSrc)\r
- {\r
- if (PtrCU[NbCU].PtrLinesLoadSrc = (char **)calloc(PtrCU[NbCU].NbLinesLoadSrc, sizeof(char *)))\r
+ // Set the source code lines for QT html/text conformity\r
+ if (PtrCU[NbCU].NbLinesLoadSrc)\r
{\r
- for (j = 0; j < PtrCU[NbCU].NbLinesLoadSrc; j++)\r
+ if (PtrCU[NbCU].PtrLinesLoadSrc = (char **)calloc(PtrCU[NbCU].NbLinesLoadSrc, sizeof(char *)))\r
{\r
- if (PtrCU[NbCU].PtrLinesLoadSrc[j] = (char *)calloc(10000, sizeof(char)))\r
+ for (j = 0; j < PtrCU[NbCU].NbLinesLoadSrc; j++)\r
{\r
- if (Ptr = DWARFManager_GetLineSrcFromNumLine(PtrCU[NbCU].PtrLoadSrc, (j + 1)))\r
+ if (PtrCU[NbCU].PtrLinesLoadSrc[j] = (char *)calloc(10000, sizeof(char)))\r
{\r
- i = 0;\r
-\r
- while (*Ptr)\r
+ if (Ptr = DWARFManager_GetLineSrcFromNumLine(PtrCU[NbCU].PtrLoadSrc, (j + 1)))\r
{\r
- switch (*Ptr)\r
+ i = 0;\r
+\r
+ while (*Ptr)\r
{\r
- case 9:\r
- strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], " ");\r
- i += strlen(" ");\r
- break;\r
-\r
- case '<':\r
- strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], "<");\r
- i += strlen("<");\r
- break;\r
-\r
- case '>':\r
- strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], ">");\r
- i += strlen(">");\r
- break;\r
+ switch (*Ptr)\r
+ {\r
+ case 9:\r
+ strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], " ");\r
+ i += strlen(" ");\r
+ break;\r
+\r
+ case '<':\r
+ strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], "<");\r
+ i += strlen("<");\r
+ break;\r
+\r
+ case '>':\r
+ strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], ">");\r
+ i += strlen(">");\r
+ break;\r
#if 0\r
- case '&':\r
- strcpy(PtrCU[NbCU].PtrLinesLoadSrc[j], "&");\r
- i += strlen("&");\r
- break;\r
+ case '&':\r
+ strcpy(PtrCU[NbCU].PtrLinesLoadSrc[j], "&");\r
+ i += strlen("&");\r
+ break;\r
#endif\r
#if 0\r
- case '"':\r
- strcpy(PtrCU[NbCU].PtrLinesLoadSrc[j], """);\r
- i += strlen(""");\r
- break;\r
+ case '"':\r
+ strcpy(PtrCU[NbCU].PtrLinesLoadSrc[j], """);\r
+ i += strlen(""");\r
+ break;\r
#endif\r
- default:\r
- PtrCU[NbCU].PtrLinesLoadSrc[j][i++] = *Ptr;\r
- break;\r
+ default:\r
+ PtrCU[NbCU].PtrLinesLoadSrc[j][i++] = *Ptr;\r
+ break;\r
+ }\r
+ Ptr++;\r
}\r
- Ptr++;\r
}\r
+ PtrCU[NbCU].PtrLinesLoadSrc[j] = (char *)realloc(PtrCU[NbCU].PtrLinesLoadSrc[j], i + 1);\r
}\r
- PtrCU[NbCU].PtrLinesLoadSrc[j] = (char *)realloc(PtrCU[NbCU].PtrLinesLoadSrc[j], i + 1);\r
}\r
}\r
}\r
- }\r
- else\r
- {\r
- // Set each source lines pointer to NULL\r
- if (PtrCU[NbCU].NbSubProgs)\r
+ else\r
{\r
- i = PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs - 1].PtrLinesSrc[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs - 1].NbLinesSrc - 1].NumLineSrc;\r
- if (PtrCU[NbCU].PtrLinesLoadSrc = (char **)calloc(i, sizeof(char *)))\r
+ // Set each source lines pointer to NULL\r
+ if (PtrCU[NbCU].NbSubProgs)\r
{\r
- for (j = 0; j < i; j++)\r
+ i = PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs - 1].PtrLinesSrc[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs - 1].NbLinesSrc - 1].NumLineSrc;\r
+ if (PtrCU[NbCU].PtrLinesLoadSrc = (char **)calloc(i, sizeof(char *)))\r
{\r
- PtrCU[NbCU].PtrLinesLoadSrc[j] = NULL;\r
+ for (j = 0; j < i; j++)\r
+ {\r
+ PtrCU[NbCU].PtrLinesLoadSrc[j] = NULL;\r
+ }\r
}\r
}\r
}\r
- }\r
\r
- // Init lines source information based on each source code line numbers\r
- for (j = 0; j < PtrCU[NbCU].NbSubProgs; j++)\r
- {\r
- PtrCU[NbCU].PtrSubProgs[j].PtrLineSrc = PtrCU[NbCU].PtrLinesLoadSrc[PtrCU[NbCU].PtrSubProgs[j].NumLineSrc - 1];\r
-\r
- for (k = 0; k < PtrCU[NbCU].PtrSubProgs[j].NbLinesSrc; k++)\r
+ // Init lines source information based on each source code line numbers\r
+ for (j = 0; j < PtrCU[NbCU].NbSubProgs; j++)\r
{\r
- PtrCU[NbCU].PtrSubProgs[j].PtrLinesSrc[k].PtrLineSrc = PtrCU[NbCU].PtrLinesLoadSrc[PtrCU[NbCU].PtrSubProgs[j].PtrLinesSrc[k].NumLineSrc - 1];\r
- }\r
- }\r
+ // Check if the subprog / function's line exists in the source code\r
+ if (PtrCU[NbCU].PtrSubProgs[j].NumLineSrc <= PtrCU[NbCU].NbLinesLoadSrc)\r
+ {\r
+ PtrCU[NbCU].PtrSubProgs[j].PtrLineSrc = PtrCU[NbCU].PtrLinesLoadSrc[PtrCU[NbCU].PtrSubProgs[j].NumLineSrc - 1];\r
+ }\r
\r
- // Init variables information based on types information\r
- for (i = 0; i < PtrCU[NbCU].NbVariables; i++)\r
- {\r
- PtrCU[NbCU].PtrVariables[i].PtrTypeName = (char *)calloc(1000, 1);\r
- TypeOffset = PtrCU[NbCU].PtrVariables[i].TypeOffset;\r
+ for (k = 0; k < PtrCU[NbCU].PtrSubProgs[j].NbLinesSrc; k++)\r
+ {\r
+ PtrCU[NbCU].PtrSubProgs[j].PtrLinesSrc[k].PtrLineSrc = PtrCU[NbCU].PtrLinesLoadSrc[PtrCU[NbCU].PtrSubProgs[j].PtrLinesSrc[k].NumLineSrc - 1];\r
+ }\r
+ }\r
\r
- for (j = 0; j < PtrCU[NbCU].NbTypes; j++)\r
+ // Init variables information based on types information\r
+ for (i = 0; i < PtrCU[NbCU].NbVariables; i++)\r
{\r
- if (TypeOffset == PtrCU[NbCU].PtrTypes[j].Offset)\r
+ PtrCU[NbCU].PtrVariables[i].PtrTypeName = (char *)calloc(1000, 1);\r
+ TypeOffset = PtrCU[NbCU].PtrVariables[i].TypeOffset;\r
+\r
+ for (j = 0; j < PtrCU[NbCU].NbTypes; j++)\r
{\r
- switch (PtrCU[NbCU].PtrTypes[j].Tag)\r
+ if (TypeOffset == PtrCU[NbCU].PtrTypes[j].Offset)\r
{\r
- case DW_TAG_structure_type:\r
- PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x1;\r
- if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
- {\r
- j = -1;\r
- }\r
- else\r
+ switch (PtrCU[NbCU].PtrTypes[j].Tag)\r
{\r
- if ((PtrCU[NbCU].PtrVariables[i].TypeTag & 0x2))\r
+ case DW_TAG_structure_type:\r
+ PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x1;\r
+ if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
{\r
- strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, " *");\r
+ j = -1;\r
}\r
- }\r
- break;\r
+ else\r
+ {\r
+ if ((PtrCU[NbCU].PtrVariables[i].TypeTag & 0x2))\r
+ {\r
+ strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, " *");\r
+ }\r
+ }\r
+ break;\r
\r
- case DW_TAG_pointer_type:\r
- PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x2;\r
- PtrCU[NbCU].PtrVariables[i].TypeByteSize = PtrCU[NbCU].PtrTypes[j].ByteSize;\r
- PtrCU[NbCU].PtrVariables[i].TypeEncoding = 0x10;\r
- if (!(TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
- {\r
- strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, "void *");\r
- }\r
- else\r
- {\r
- j = -1;\r
- }\r
- break;\r
+ case DW_TAG_pointer_type:\r
+ PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x2;\r
+ PtrCU[NbCU].PtrVariables[i].TypeByteSize = PtrCU[NbCU].PtrTypes[j].ByteSize;\r
+ PtrCU[NbCU].PtrVariables[i].TypeEncoding = 0x10;\r
+ if (!(TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
+ {\r
+ strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, "void *");\r
+ }\r
+ else\r
+ {\r
+ j = -1;\r
+ }\r
+ break;\r
\r
- case DW_TAG_typedef:\r
- PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x20;\r
- strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, PtrCU[NbCU].PtrTypes[j].PtrName);\r
- if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
- {\r
- j = -1;\r
- }\r
- break;\r
+ case DW_TAG_typedef:\r
+ PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x20;\r
+ strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, PtrCU[NbCU].PtrTypes[j].PtrName);\r
+ if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
+ {\r
+ j = -1;\r
+ }\r
+ break;\r
\r
- case DW_TAG_subrange_type:\r
- PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x4;\r
- break;\r
+ case DW_TAG_subrange_type:\r
+ PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x4;\r
+ break;\r
\r
- case DW_TAG_array_type:\r
- PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x8;\r
- if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
- {\r
- j = -1;\r
- }\r
- break;\r
+ case DW_TAG_array_type:\r
+ PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x8;\r
+ if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
+ {\r
+ j = -1;\r
+ }\r
+ break;\r
\r
- case DW_TAG_const_type:\r
- PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x10;\r
- strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, "const ");\r
- if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
- {\r
- j = -1;\r
- }\r
- break;\r
+ case DW_TAG_const_type:\r
+ PtrCU[NbCU].PtrVariables[i].TypeTag |= 0x10;\r
+ strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, "const ");\r
+ if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
+ {\r
+ j = -1;\r
+ }\r
+ break;\r
\r
- case DW_TAG_base_type:\r
- strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, PtrCU[NbCU].PtrTypes[j].PtrName);\r
- if ((PtrCU[NbCU].PtrVariables[i].TypeTag & 0x2))\r
- {\r
- strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, " *");\r
- }\r
- else\r
- {\r
- PtrCU[NbCU].PtrVariables[i].TypeByteSize = PtrCU[NbCU].PtrTypes[j].ByteSize;\r
- PtrCU[NbCU].PtrVariables[i].TypeEncoding = PtrCU[NbCU].PtrTypes[j].Encoding;\r
- }\r
- if ((PtrCU[NbCU].PtrVariables[i].TypeTag & 0x8))\r
- {\r
- strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, "[]");\r
- }\r
- break;\r
+ case DW_TAG_base_type:\r
+ strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, PtrCU[NbCU].PtrTypes[j].PtrName);\r
+ if ((PtrCU[NbCU].PtrVariables[i].TypeTag & 0x2))\r
+ {\r
+ strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, " *");\r
+ }\r
+ else\r
+ {\r
+ PtrCU[NbCU].PtrVariables[i].TypeByteSize = PtrCU[NbCU].PtrTypes[j].ByteSize;\r
+ PtrCU[NbCU].PtrVariables[i].TypeEncoding = PtrCU[NbCU].PtrTypes[j].Encoding;\r
+ }\r
+ if ((PtrCU[NbCU].PtrVariables[i].TypeTag & 0x8))\r
+ {\r
+ strcat(PtrCU[NbCU].PtrVariables[i].PtrTypeName, "[]");\r
+ }\r
+ break;\r
\r
- default:\r
- break;\r
+ default:\r
+ break;\r
+ }\r
}\r
}\r
}\r
{\r
if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
{\r
- return PtrCU[i].PtrLinesLoadSrc[NumLine - 1];\r
+ if (NumLine <= PtrCU[i].NbLinesLoadSrc)\r
+ {\r
+ return PtrCU[i].PtrLinesLoadSrc[NumLine - 1];\r
+ }\r
+ else\r
+ {\r
+ return NULL;\r
+ }\r
}\r
}\r
\r