Fixed a crash when DWARF report a source line number exceeding the number of lines...
[clinton/Virtual-Jaguar-Rx.git] / src / debugger / DWARFManager.cpp
index 0a3012c..dfc2ffc 100644 (file)
 // 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
@@ -241,539 +245,548 @@ void DWARFManager_InitDMI(void)
                        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], "&nbsp;");\r
-                                                                               i += strlen("&nbsp;");\r
-                                                                               break;\r
-\r
-                                                                       case '<':\r
-                                                                               strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], "&lt;");\r
-                                                                               i += strlen("&lt;");\r
-                                                                               break;\r
-\r
-                                                                       case '>':\r
-                                                                               strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], "&gt;");\r
-                                                                               i += strlen("&gt;");\r
-                                                                               break;\r
+                                                                               switch (*Ptr)\r
+                                                                               {\r
+                                                                               case 9:\r
+                                                                                       strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], "&nbsp;");\r
+                                                                                       i += strlen("&nbsp;");\r
+                                                                                       break;\r
+\r
+                                                                               case '<':\r
+                                                                                       strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], "&lt;");\r
+                                                                                       i += strlen("&lt;");\r
+                                                                                       break;\r
+\r
+                                                                               case '>':\r
+                                                                                       strcat(PtrCU[NbCU].PtrLinesLoadSrc[j], "&gt;");\r
+                                                                                       i += strlen("&gt;");\r
+                                                                                       break;\r
 #if 0\r
-                                                                       case '&':\r
-                                                                               strcpy(PtrCU[NbCU].PtrLinesLoadSrc[j], "&amp;");\r
-                                                                               i += strlen("&amp;");\r
-                                                                               break;\r
+                                                                               case '&':\r
+                                                                                       strcpy(PtrCU[NbCU].PtrLinesLoadSrc[j], "&amp;");\r
+                                                                                       i += strlen("&amp;");\r
+                                                                                       break;\r
 #endif\r
 #if 0\r
-                                                                       case '"':\r
-                                                                               strcpy(PtrCU[NbCU].PtrLinesLoadSrc[j], "&quot;");\r
-                                                                               i += strlen("&quot;");\r
-                                                                               break;\r
+                                                                               case '"':\r
+                                                                                       strcpy(PtrCU[NbCU].PtrLinesLoadSrc[j], "&quot;");\r
+                                                                                       i += strlen("&quot;");\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
@@ -1173,7 +1186,14 @@ char *DWARFManager_GetLineSrcFromNumLineBaseAdr(size_t Adr, size_t NumLine)
        {\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