Prevent source file reading issue on no-Windows system
[clinton/Virtual-Jaguar-Rx.git] / src / debugger / DWARFManager.cpp
index b6c149e..f4711b9 100644 (file)
@@ -102,6 +102,7 @@ struct CUStruct
        BaseTypeStruct *PtrTypes;\r
        size_t NbVariables;                                                             // Variables number\r
        VariablesStruct *PtrVariables;                                  // Pointer to the global variables list information structure\r
+       size_t NbFrames;                                                                // Frames number\r
 }S_CUStruct;\r
 \r
 \r
@@ -286,7 +287,7 @@ void DWARFManager_InitDMI(void)
                                                // Die type detection\r
                                                switch (return_tagval)\r
                                                {\r
-                                               case    DW_TAG_compile_unit:\r
+                                               case DW_TAG_compile_unit:\r
                                                        if (dwarf_attrlist(return_sib, &atlist, &atcnt, &error) == DW_DLV_OK)\r
                                                        {\r
                                                                for (Dwarf_Signed i = 0; i < atcnt; ++i)\r
@@ -295,21 +296,24 @@ void DWARFManager_InitDMI(void)
                                                                        {\r
                                                                                switch (return_attr)\r
                                                                                {\r
-                                                                               case    DW_AT_low_pc:\r
+                                                                                       // Start address\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
+                                                                                       // End address\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
+                                                                                       // compilation information\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
@@ -318,7 +322,8 @@ void DWARFManager_InitDMI(void)
                                                                                        }\r
                                                                                        break;\r
 \r
-                                                                               case    DW_AT_name:\r
+                                                                                       // Filename\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
@@ -327,7 +332,8 @@ void DWARFManager_InitDMI(void)
                                                                                        }\r
                                                                                        break;\r
 \r
-                                                                               case    DW_AT_comp_dir:\r
+                                                                                       // Directory name\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
@@ -346,13 +352,24 @@ void DWARFManager_InitDMI(void)
                                                        }\r
 \r
                                                        Ptr = SourceFullFilename = (char *)realloc(SourceFullFilename, strlen(SourceFilename) + strlen(SourceFileDirectory) + 2);\r
+#if defined(_WIN32)\r
                                                        sprintf(SourceFullFilename, "%s\\%s", SourceFileDirectory, SourceFilename);\r
+#else\r
+                                                       sprintf(SourceFullFilename, "%s/%s", SourceFileDirectory, SourceFilename);\r
+#endif\r
                                                        while (*Ptr)\r
                                                        {\r
+#if defined(_WIN32)\r
                                                                if (*Ptr == '/')\r
                                                                {\r
                                                                        *Ptr = '\\';\r
                                                                }\r
+#else\r
+                                                               if (*Ptr == '\\')\r
+                                                               {\r
+                                                                       *Ptr = '/';\r
+                                                               }\r
+#endif\r
                                                                Ptr++;\r
                                                        }\r
                                                        PtrCU[NbCU].PtrFullFilename = (char *)calloc(strlen(SourceFullFilename) + 1, 1);\r
@@ -415,10 +432,10 @@ void DWARFManager_InitDMI(void)
                                                        {\r
                                                                switch (return_tagval)\r
                                                                {\r
-                                                               case    DW_TAG_lexical_block:\r
+                                                               case DW_TAG_lexical_block:\r
                                                                        break;\r
 \r
-                                                               case    DW_TAG_variable:\r
+                                                               case DW_TAG_variable:\r
                                                                        if (dwarf_attrlist(return_die, &atlist, &atcnt, &error) == DW_DLV_OK)\r
                                                                        {\r
                                                                                PtrCU[NbCU].PtrVariables = (VariablesStruct *)realloc(PtrCU[NbCU].PtrVariables, ((PtrCU[NbCU].NbVariables + 1) * sizeof(VariablesStruct)));\r
@@ -432,7 +449,7 @@ void DWARFManager_InitDMI(void)
                                                                                                {\r
                                                                                                        switch (return_attr)\r
                                                                                                        {\r
-                                                                                                       case    DW_AT_location:\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].Op = (*((unsigned char *)(return_block->bl_data)));\r
@@ -450,14 +467,15 @@ void DWARFManager_InitDMI(void)
                                                                                                                }\r
                                                                                                                break;\r
 \r
-                                                                                                       case    DW_AT_type:\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
+                                                                                                               // Variable name\r
+                                                                                                       case DW_AT_name:\r
                                                                                                                if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK)\r
                                                                                                                {\r
 #ifdef DEBUG_VariableName\r
@@ -471,7 +489,7 @@ void DWARFManager_InitDMI(void)
                                                                                                                }\r
                                                                                                                break;\r
 \r
-                                                                                                       default:\r
+                                                                                                               default:\r
                                                                                                                break;\r
                                                                                                        }\r
                                                                                                }\r
@@ -486,14 +504,14 @@ void DWARFManager_InitDMI(void)
                                                                        }\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
+                                                               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
@@ -513,28 +531,28 @@ void DWARFManager_InitDMI(void)
                                                                                                {\r
                                                                                                        switch (return_attr)\r
                                                                                                        {\r
-                                                                                                       case    DW_AT_type:\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
+                                                                                                       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
+                                                                                                       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
+                                                                                                       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
@@ -543,7 +561,7 @@ void DWARFManager_InitDMI(void)
                                                                                                                }\r
                                                                                                                break;\r
 \r
-                                                                                                       default:\r
+                                                                                                               default:\r
                                                                                                                break;\r
                                                                                                        }\r
                                                                                                }\r
@@ -558,7 +576,7 @@ void DWARFManager_InitDMI(void)
                                                                        }\r
                                                                        break;\r
 \r
-                                                               case    DW_TAG_subprogram:\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
@@ -573,6 +591,7 @@ void DWARFManager_InitDMI(void)
                                                                                                {\r
                                                                                                        switch (return_attr)\r
                                                                                                        {\r
+                                                                                                               // start address\r
                                                                                                        case DW_AT_low_pc:\r
                                                                                                                if (dwarf_lowpc(return_die, &return_lowpc, &error) == DW_DLV_OK)\r
                                                                                                                {\r
@@ -581,6 +600,7 @@ void DWARFManager_InitDMI(void)
                                                                                                                }\r
                                                                                                                break;\r
 \r
+                                                                                                               // end address\r
                                                                                                        case DW_AT_high_pc:\r
                                                                                                                if (dwarf_highpc(return_die, &return_highpc, &error) == DW_DLV_OK)\r
                                                                                                                {\r
@@ -588,6 +608,7 @@ void DWARFManager_InitDMI(void)
                                                                                                                }\r
                                                                                                                break;\r
 \r
+                                                                                                               // Line number\r
                                                                                                        case DW_AT_decl_line:\r
                                                                                                                if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK)\r
                                                                                                                {\r
@@ -595,13 +616,16 @@ void DWARFManager_InitDMI(void)
                                                                                                                }\r
                                                                                                                break;\r
 \r
+                                                                                                               // Frame\r
                                                                                                        case DW_AT_frame_base:\r
                                                                                                                if (dwarf_formudata(return_attr1, &return_uvalue, &error) == DW_DLV_OK)\r
                                                                                                                {\r
                                                                                                                        PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].FrameBase = return_uvalue;\r
+                                                                                                                       PtrCU[NbCU].NbFrames++;\r
                                                                                                                }\r
                                                                                                                break;\r
 \r
+                                                                                                               // function name\r
                                                                                                        case DW_AT_name:\r
                                                                                                                if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK)\r
                                                                                                                {\r
@@ -611,6 +635,25 @@ void DWARFManager_InitDMI(void)
                                                                                                                }\r
                                                                                                                break;\r
 \r
+                                                                                                       case DW_AT_sibling:\r
+                                                                                                               break;\r
+\r
+                                                                                                       case DW_AT_GNU_all_tail_call_sites:\r
+                                                                                                               break;\r
+\r
+                                                                                                       case DW_AT_type:\r
+                                                                                                               break;\r
+\r
+                                                                                                       case DW_AT_prototyped:\r
+                                                                                                               break;\r
+\r
+                                                                                                               // File number\r
+                                                                                                       case DW_AT_decl_file:\r
+                                                                                                               break;\r
+\r
+                                                                                                       case DW_AT_external:\r
+                                                                                                               break;\r
+\r
                                                                                                        default:\r
                                                                                                                break;\r
                                                                                                        }\r
@@ -662,7 +705,7 @@ void DWARFManager_InitDMI(void)
                                                                                                                                        {\r
                                                                                                                                                switch (return_attr)\r
                                                                                                                                                {\r
-                                                                                                                                               case    DW_AT_location:\r
+                                                                                                                                               case DW_AT_location:\r
                                                                                                                                                        if (dwarf_formblock(return_attr1, &return_block, &error) == DW_DLV_OK)\r
                                                                                                                                                        {\r
                                                                                                                                                                PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].Op = *((unsigned char *)(return_block->bl_data));\r
@@ -677,11 +720,11 @@ void DWARFManager_InitDMI(void)
 \r
                                                                                                                                                                        switch (return_tagval)\r
                                                                                                                                                                        {\r
-                                                                                                                                                                       case    DW_TAG_variable:\r
+                                                                                                                                                                       case DW_TAG_variable:\r
                                                                                                                                                                                PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].Offset -= 0x80;\r
                                                                                                                                                                                break;\r
 \r
-                                                                                                                                                                       case    DW_TAG_formal_parameter:\r
+                                                                                                                                                                       case DW_TAG_formal_parameter:\r
                                                                                                                                                                                break;\r
 \r
                                                                                                                                                                        default:\r
@@ -695,14 +738,14 @@ void DWARFManager_InitDMI(void)
                                                                                                                                                        }\r
                                                                                                                                                        break;\r
 \r
-                                                                                                                                               case    DW_AT_type:\r
+                                                                                                                                               case DW_AT_type:\r
                                                                                                                                                        if (dwarf_global_formref(return_attr1, &return_offset, &error) == DW_DLV_OK)\r
                                                                                                                                                        {\r
                                                                                                                                                                PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].TypeOffset = return_offset;\r
                                                                                                                                                        }\r
                                                                                                                                                        break;\r
 \r
-                                                                                                                                               case    DW_AT_name:\r
+                                                                                                                                               case DW_AT_name:\r
                                                                                                                                                        if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK)\r
                                                                                                                                                        {\r
 #ifdef DEBUG_VariableName\r
@@ -716,10 +759,10 @@ void DWARFManager_InitDMI(void)
                                                                                                                                                        }\r
                                                                                                                                                        break;\r
 \r
-                                                                                                                                               case    DW_AT_decl_file:\r
+                                                                                                                                               case DW_AT_decl_file:\r
                                                                                                                                                        break;\r
 \r
-                                                                                                                                               case    DW_AT_decl_line:\r
+                                                                                                                                               case DW_AT_decl_line:\r
                                                                                                                                                        break;\r
 \r
                                                                                                                                                default:\r
@@ -887,7 +930,7 @@ void DWARFManager_InitDMI(void)
 }\r
 \r
 \r
-// \r
+// Variables information initialisation\r
 void DWARFManager_InitInfosVariable(VariablesStruct *PtrVariables)\r
 {\r
        size_t j, TypeOffset;\r
@@ -901,23 +944,25 @@ void DWARFManager_InitInfosVariable(VariablesStruct *PtrVariables)
                {\r
                        switch (PtrCU[NbCU].PtrTypes[j].Tag)\r
                        {\r
+                               // Structure type tag\r
                        case DW_TAG_structure_type:\r
-                               PtrVariables->TypeTag |= 0x1;\r
+                               PtrVariables->TypeTag |= TypeTag_structure;\r
                                if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
                                {\r
                                        j = -1;\r
                                }\r
                                else\r
                                {\r
-                                       if ((PtrVariables->TypeTag & 0x2))\r
+                                       if ((PtrVariables->TypeTag & TypeTag_pointer))\r
                                        {\r
                                                strcat(PtrVariables->PtrTypeName, " *");\r
                                        }\r
                                }\r
                                break;\r
 \r
+                               // Pointer type tag\r
                        case DW_TAG_pointer_type:\r
-                               PtrVariables->TypeTag |= 0x2;\r
+                               PtrVariables->TypeTag |= TypeTag_pointer;\r
                                PtrVariables->TypeByteSize = PtrCU[NbCU].PtrTypes[j].ByteSize;\r
                                PtrVariables->TypeEncoding = 0x10;\r
                                if (!(TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
@@ -930,10 +975,11 @@ void DWARFManager_InitInfosVariable(VariablesStruct *PtrVariables)
                                }\r
                                break;\r
 \r
+                               // Typedef type tag\r
                        case DW_TAG_typedef:\r
-                               if (!(PtrVariables->TypeTag & 0x20))\r
+                               if (!(PtrVariables->TypeTag & TypeTag_typedef))\r
                                {\r
-                                       PtrVariables->TypeTag |= 0x20;\r
+                                       PtrVariables->TypeTag |= TypeTag_typedef;\r
                                        strcat(PtrVariables->PtrTypeName, PtrCU[NbCU].PtrTypes[j].PtrName);\r
                                }\r
                                if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
@@ -942,20 +988,23 @@ void DWARFManager_InitInfosVariable(VariablesStruct *PtrVariables)
                                }\r
                                break;\r
 \r
+                               // ? type tag\r
                        case DW_TAG_subrange_type:\r
-                               PtrVariables->TypeTag |= 0x4;\r
+                               PtrVariables->TypeTag |= TypeTag_0x04;\r
                                break;\r
 \r
+                               // Array type tag\r
                        case DW_TAG_array_type:\r
-                               PtrVariables->TypeTag |= 0x8;\r
+                               PtrVariables->TypeTag |= TypeTag_arraytype;\r
                                if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
                                {\r
                                        j = -1;\r
                                }\r
                                break;\r
 \r
+                               // Const type tag\r
                        case DW_TAG_const_type:\r
-                               PtrVariables->TypeTag |= 0x10;\r
+                               PtrVariables->TypeTag |= TypeTag_consttype;\r
                                strcat(PtrVariables->PtrTypeName, "const ");\r
                                if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
                                {\r
@@ -963,12 +1012,13 @@ void DWARFManager_InitInfosVariable(VariablesStruct *PtrVariables)
                                }\r
                                break;\r
 \r
+                               // Base type tag\r
                        case DW_TAG_base_type:\r
-                               if (!(PtrVariables->TypeTag & 0x20))\r
+                               if (!(PtrVariables->TypeTag & TypeTag_typedef))\r
                                {\r
                                        strcat(PtrVariables->PtrTypeName, PtrCU[NbCU].PtrTypes[j].PtrName);\r
                                }\r
-                               if ((PtrVariables->TypeTag & 0x2))\r
+                               if ((PtrVariables->TypeTag & TypeTag_pointer))\r
                                {\r
                                        strcat(PtrVariables->PtrTypeName, " *");\r
                                }\r
@@ -977,7 +1027,7 @@ void DWARFManager_InitInfosVariable(VariablesStruct *PtrVariables)
                                        PtrVariables->TypeByteSize = PtrCU[NbCU].PtrTypes[j].ByteSize;\r
                                        PtrVariables->TypeEncoding = PtrCU[NbCU].PtrTypes[j].Encoding;\r
                                }\r
-                               if ((PtrVariables->TypeTag & 0x8))\r
+                               if ((PtrVariables->TypeTag & TypeTag_arraytype))\r
                                {\r
                                        strcat(PtrVariables->PtrTypeName, "[]");\r
                                }\r