Local variables window detects now if a variable is used or not by the code
[clinton/Virtual-Jaguar-Rx.git] / src / debugger / DWARFManager.cpp
index 573292c..b6c149e 100644 (file)
@@ -21,6 +21,7 @@
 \r
 //\r
 //#define DEBUG_NumCU 0x6                                              // CU number to debug or undefine it\r
+//#define DEBUG_VariableName "argc"                            // Variable name to look for or undefine it\r
 \r
 \r
 // Source line internal structure\r
@@ -43,10 +44,23 @@ struct BaseTypeStruct
        char *PtrName;                                                  // Type's name\r
 }S_BaseTypeStruct;\r
 \r
+// Definitions for the variables's typetag\r
+#define        TypeTag_structure       0x01                    // structure\r
+#define        TypeTag_pointer         0x02                    // pointer\r
+#define        TypeTag_0x04            0x04\r
+#define        TypeTag_arraytype       0x08                    // array type\r
+#define        TypeTag_consttype       0x10                    // const type\r
+#define        TypeTag_typedef         0x20                    // typedef\r
+\r
 // Variables internal structure\r
 struct VariablesStruct\r
 {\r
-       size_t Addr;                                                    // Variable memory address\r
+       size_t Op;                                                              // Variable's DW_OP\r
+       union\r
+       {\r
+               size_t Addr;                                            // Variable memory address\r
+               int Offset;                                                     // Variable stack offset (signed)\r
+       };\r
        char *PtrName;                                                  // Variable's name\r
        size_t TypeOffset;                                              // Offset pointing on the Variable's Type\r
        size_t TypeByteSize;                                    // Variable's Type byte size\r
@@ -62,10 +76,13 @@ struct SubProgStruct
        size_t NumLineSrc;\r
        size_t StartPC;\r
        size_t LowPC, HighPC;\r
+       size_t FrameBase;\r
        char *PtrLineSrc;\r
-       char *PtrSubprogramName;\r
-       size_t NbLinesSrc;\r
-       DMIStruct_LineSrc *PtrLinesSrc;\r
+       char *PtrSubprogramName;                                                // Sub program name\r
+       size_t NbLinesSrc;                                                              // Number of lines source used by the sub program\r
+       DMIStruct_LineSrc *PtrLinesSrc;                                 // Pointer of the lines source for the sub program\r
+       size_t NbVariables;                                                             // Variables number\r
+       VariablesStruct *PtrVariables;                                  // Pointer to the local variables list information structure\r
 }S_SubProgStruct;\r
 \r
 // Compilation Unit internal structure\r
@@ -84,7 +101,7 @@ struct CUStruct
        size_t NbTypes;\r
        BaseTypeStruct *PtrTypes;\r
        size_t NbVariables;                                                             // Variables number\r
-       VariablesStruct *PtrVariables;                                  // Pointer to the variables list information structure\r
+       VariablesStruct *PtrVariables;                                  // Pointer to the global variables list information structure\r
 }S_CUStruct;\r
 \r
 \r
@@ -103,6 +120,7 @@ void DWARFManager_InitDMI(void);
 void DWARFManager_CloseDMI(void);\r
 bool DWARFManager_ElfClose(void);\r
 char *DWARFManager_GetLineSrcFromNumLine(char *PtrSrcFile, size_t NumLine);\r
+void DWARFManager_InitInfosVariable(VariablesStruct *PtrVariables);\r
 \r
 \r
 //\r
@@ -186,6 +204,13 @@ void DWARFManager_CloseDMI(void)
 \r
                while (PtrCU[NbCU].NbSubProgs--)\r
                {\r
+                       while (PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables--)\r
+                       {\r
+                               free(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].PtrName);\r
+                               free(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].PtrTypeName);\r
+                       }\r
+                       free(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables);\r
+\r
                        free(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrLinesSrc);\r
                        free(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrSubprogramName);\r
                }\r
@@ -220,11 +245,11 @@ void DWARFManager_InitDMI(void)
        Dwarf_Addr return_lowpc, return_highpc, return_lineaddr;\r
        Dwarf_Block *return_block;\r
        Dwarf_Signed atcnt, cnt;\r
-       Dwarf_Die return_sib, return_die;\r
+       Dwarf_Die return_sib, return_die, return_sub, return_subdie;\r
        Dwarf_Off return_offset;\r
        Dwarf_Line *linebuf;\r
        FILE *SrcFile;\r
-       size_t i, j, k, TypeOffset;\r
+       size_t i, j, k;\r
        char *return_string;\r
        char *Ptr;\r
        char *SourceFilename = NULL;\r
@@ -380,6 +405,7 @@ void DWARFManager_InitDMI(void)
                                        {\r
                                        }\r
 \r
+                                       // Check if the CU has child\r
                                        if (dwarf_child(return_sib, &return_die, &error) == DW_DLV_OK)\r
                                        {\r
                                                do\r
@@ -409,9 +435,16 @@ void DWARFManager_InitDMI(void)
                                                                                                        case    DW_AT_location:\r
                                                                                                                if (dwarf_formblock(return_attr1, &return_block, &error) == DW_DLV_OK)\r
                                                                                                                {\r
-                                                                                                                       if (return_block->bl_len == 5)\r
+                                                                                                                       PtrCU[NbCU].PtrVariables[PtrCU[NbCU].NbVariables].Op = (*((unsigned char *)(return_block->bl_data)));\r
+\r
+                                                                                                                       switch (return_block->bl_len)\r
                                                                                                                        {\r
+                                                                                                                       case 5:\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
+                                                                                                                               break;\r
+\r
+                                                                                                                       default:\r
+                                                                                                                               break;\r
                                                                                                                        }\r
                                                                                                                        dwarf_dealloc(dbg, return_block, DW_DLA_BLOCK);\r
                                                                                                                }\r
@@ -427,9 +460,14 @@ void DWARFManager_InitDMI(void)
                                                                                                        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
+#ifdef DEBUG_VariableName\r
+                                                                                                                       if (!strcmp(return_string, DEBUG_VariableName))\r
+#endif\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
                                                                                                                }\r
                                                                                                                break;\r
 \r
@@ -535,7 +573,7 @@ void DWARFManager_InitDMI(void)
                                                                                                {\r
                                                                                                        switch (return_attr)\r
                                                                                                        {\r
-                                                                                                       case    DW_AT_low_pc:\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
@@ -543,21 +581,28 @@ void DWARFManager_InitDMI(void)
                                                                                                                }\r
                                                                                                                break;\r
 \r
-                                                                                                       case    DW_AT_high_pc:\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
+                                                                                                       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
+                                                                                                       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
+                                                                                                               }\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
@@ -593,6 +638,116 @@ void DWARFManager_InitDMI(void)
                                                                                        }\r
                                                                                }\r
 \r
+                                                                               if (dwarf_child(return_die, &return_subdie, &error) == DW_DLV_OK)\r
+                                                                               {\r
+                                                                                       do\r
+                                                                                       {\r
+                                                                                               return_sub = return_subdie;\r
+                                                                                               if ((dwarf_tag(return_subdie, &return_tagval, &error) == DW_DLV_OK))\r
+                                                                                               {\r
+                                                                                                       switch (return_tagval)\r
+                                                                                                       {\r
+                                                                                                       case DW_TAG_formal_parameter:\r
+                                                                                                       case DW_TAG_variable:\r
+                                                                                                               if (dwarf_attrlist(return_subdie, &atlist, &atcnt, &error) == DW_DLV_OK)\r
+                                                                                                               {\r
+                                                                                                                       PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables = (VariablesStruct *)realloc(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables, ((PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables + 1) * sizeof(VariablesStruct)));\r
+                                                                                                                       memset(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables + PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables, 0, sizeof(VariablesStruct));\r
+\r
+                                                                                                                       for (Dwarf_Signed i = 0; i < atcnt; ++i)\r
+                                                                                                                       {\r
+                                                                                                                               if (dwarf_whatattr(atlist[i], &return_attr, &error) == DW_DLV_OK)\r
+                                                                                                                               {\r
+                                                                                                                                       if (dwarf_attr(return_subdie, return_attr, &return_attr1, &error) == DW_DLV_OK)\r
+                                                                                                                                       {\r
+                                                                                                                                               switch (return_attr)\r
+                                                                                                                                               {\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
+\r
+                                                                                                                                                               switch (return_block->bl_len)\r
+                                                                                                                                                               {\r
+                                                                                                                                                               case 1:\r
+                                                                                                                                                                       break;\r
+\r
+                                                                                                                                                               case 2:\r
+                                                                                                                                                                       PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].Offset = *((char *)(return_block->bl_data) + 1);\r
+\r
+                                                                                                                                                                       switch (return_tagval)\r
+                                                                                                                                                                       {\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
+                                                                                                                                                                               break;\r
+\r
+                                                                                                                                                                       default:\r
+                                                                                                                                                                               break;\r
+                                                                                                                                                                       }\r
+\r
+                                                                                                                                                               default:\r
+                                                                                                                                                                       break;\r
+                                                                                                                                                               }\r
+                                                                                                                                                               dwarf_dealloc(dbg, return_block, DW_DLA_BLOCK);\r
+                                                                                                                                                       }\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].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
+                                                                                                                                                       if (dwarf_formstring(return_attr1, &return_string, &error) == DW_DLV_OK)\r
+                                                                                                                                                       {\r
+#ifdef DEBUG_VariableName\r
+                                                                                                                                                               if (!strcmp(return_string, DEBUG_VariableName))\r
+#endif\r
+                                                                                                                                                               {\r
+                                                                                                                                                                       PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].PtrName = (char *)calloc(strlen(return_string) + 1, 1);\r
+                                                                                                                                                                       strcpy(PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].PtrVariables[PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables].PtrName, return_string);\r
+                                                                                                                                                                       dwarf_dealloc(dbg, return_string, DW_DLA_STRING);\r
+                                                                                                                                                               }\r
+                                                                                                                                                       }\r
+                                                                                                                                                       break;\r
+\r
+                                                                                                                                               case    DW_AT_decl_file:\r
+                                                                                                                                                       break;\r
+\r
+                                                                                                                                               case    DW_AT_decl_line:\r
+                                                                                                                                                       break;\r
+\r
+                                                                                                                                               default:\r
+                                                                                                                                                       break;\r
+                                                                                                                                               }\r
+                                                                                                                                       }\r
+                                                                                                                               }\r
+\r
+                                                                                                                               dwarf_dealloc(dbg, atlist[i], DW_DLA_ATTR);\r
+                                                                                                                       }\r
+\r
+                                                                                                                       PtrCU[NbCU].PtrSubProgs[PtrCU[NbCU].NbSubProgs].NbVariables++;\r
+\r
+                                                                                                                       dwarf_dealloc(dbg, atlist, DW_DLA_LIST);\r
+                                                                                                               }\r
+                                                                                                               break;\r
+\r
+                                                                                                       case DW_TAG_label:\r
+                                                                                                               break;\r
+\r
+                                                                                                       default:\r
+                                                                                                               break;\r
+                                                                                                       }\r
+                                                                                               }\r
+                                                                                       }\r
+                                                                                       while (dwarf_siblingof(dbg, return_sub, &return_subdie, &error) == DW_DLV_OK);\r
+                                                                               }\r
+\r
                                                                                PtrCU[NbCU].NbSubProgs++;\r
                                                                        }\r
                                                                        break;\r
@@ -601,12 +756,15 @@ void DWARFManager_InitDMI(void)
                                                                        break;\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
+                                       {\r
                                                dwarf_dealloc(dbg, linebuf[i], DW_DLA_LINE);\r
+                                       }\r
                                        dwarf_dealloc(dbg, linebuf, DW_DLA_LIST);\r
                                }\r
 \r
@@ -703,98 +861,18 @@ void DWARFManager_InitDMI(void)
                                        }\r
                                }\r
 \r
-                               // Init variables information based on types information\r
+                               // Init global 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
+                                       DWARFManager_InitInfosVariable(PtrCU[NbCU].PtrVariables + i);\r
+                               }\r
 \r
-                                       for (j = 0; j < PtrCU[NbCU].NbTypes; j++)\r
+                               // Init local variables information based on types information\r
+                               for (i = 0; i < PtrCU[NbCU].NbSubProgs; i++)\r
+                               {\r
+                                       for (j = 0; j < PtrCU[NbCU].PtrSubProgs[i].NbVariables; j++)\r
                                        {\r
-                                               if (TypeOffset == PtrCU[NbCU].PtrTypes[j].Offset)\r
-                                               {\r
-                                                       switch (PtrCU[NbCU].PtrTypes[j].Tag)\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
-                                                               {\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
-\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
-\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
-\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
-                                                       }\r
-                                               }\r
+                                               DWARFManager_InitInfosVariable(PtrCU[NbCU].PtrSubProgs[i].PtrVariables + j);\r
                                        }\r
                                }\r
                        }\r
@@ -809,6 +887,110 @@ void DWARFManager_InitDMI(void)
 }\r
 \r
 \r
+// \r
+void DWARFManager_InitInfosVariable(VariablesStruct *PtrVariables)\r
+{\r
+       size_t j, TypeOffset;\r
+\r
+       PtrVariables->PtrTypeName = (char *)calloc(1000, 1);\r
+       TypeOffset = PtrVariables->TypeOffset;\r
+\r
+       for (j = 0; j < PtrCU[NbCU].NbTypes; j++)\r
+       {\r
+               if (TypeOffset == PtrCU[NbCU].PtrTypes[j].Offset)\r
+               {\r
+                       switch (PtrCU[NbCU].PtrTypes[j].Tag)\r
+                       {\r
+                       case DW_TAG_structure_type:\r
+                               PtrVariables->TypeTag |= 0x1;\r
+                               if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
+                               {\r
+                                       j = -1;\r
+                               }\r
+                               else\r
+                               {\r
+                                       if ((PtrVariables->TypeTag & 0x2))\r
+                                       {\r
+                                               strcat(PtrVariables->PtrTypeName, " *");\r
+                                       }\r
+                               }\r
+                               break;\r
+\r
+                       case DW_TAG_pointer_type:\r
+                               PtrVariables->TypeTag |= 0x2;\r
+                               PtrVariables->TypeByteSize = PtrCU[NbCU].PtrTypes[j].ByteSize;\r
+                               PtrVariables->TypeEncoding = 0x10;\r
+                               if (!(TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
+                               {\r
+                                       strcat(PtrVariables->PtrTypeName, "void *");\r
+                               }\r
+                               else\r
+                               {\r
+                                       j = -1;\r
+                               }\r
+                               break;\r
+\r
+                       case DW_TAG_typedef:\r
+                               if (!(PtrVariables->TypeTag & 0x20))\r
+                               {\r
+                                       PtrVariables->TypeTag |= 0x20;\r
+                                       strcat(PtrVariables->PtrTypeName, PtrCU[NbCU].PtrTypes[j].PtrName);\r
+                               }\r
+                               if ((TypeOffset = PtrCU[NbCU].PtrTypes[j].TypeOffset))\r
+                               {\r
+                                       j = -1;\r
+                               }\r
+                               break;\r
+\r
+                       case DW_TAG_subrange_type:\r
+                               PtrVariables->TypeTag |= 0x4;\r
+                               break;\r
+\r
+                       case DW_TAG_array_type:\r
+                               PtrVariables->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
+                               PtrVariables->TypeTag |= 0x10;\r
+                               strcat(PtrVariables->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
+                               if (!(PtrVariables->TypeTag & 0x20))\r
+                               {\r
+                                       strcat(PtrVariables->PtrTypeName, PtrCU[NbCU].PtrTypes[j].PtrName);\r
+                               }\r
+                               if ((PtrVariables->TypeTag & 0x2))\r
+                               {\r
+                                       strcat(PtrVariables->PtrTypeName, " *");\r
+                               }\r
+                               else\r
+                               {\r
+                                       PtrVariables->TypeByteSize = PtrCU[NbCU].PtrTypes[j].ByteSize;\r
+                                       PtrVariables->TypeEncoding = PtrCU[NbCU].PtrTypes[j].Encoding;\r
+                               }\r
+                               if ((PtrVariables->TypeTag & 0x8))\r
+                               {\r
+                                       strcat(PtrVariables->PtrTypeName, "[]");\r
+                               }\r
+                               break;\r
+\r
+                       default:\r
+                               break;\r
+                       }\r
+               }\r
+       }\r
+}\r
+\r
+\r
 // Get symbol name based from address\r
 // Return NULL if no symbol name exists\r
 char *DWARFManager_GetSymbolnameFromAdr(size_t Adr)\r
@@ -874,9 +1056,204 @@ char *DWARFManager_GetLineSrcFromNumLine(char *PtrSrcFile, size_t NumLine)
 }\r
 \r
 \r
-// Get Compilation Unit / External variables numbers\r
+// Get number of variables referenced by the function range address\r
+size_t DWARFManager_GetNbLocalVariables(size_t Adr)\r
+{\r
+       size_t i, j;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
+               {\r
+                       for (j = 0; j < PtrCU[i].NbSubProgs; j++)\r
+                       {\r
+                               if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
+                               {\r
+                                       return PtrCU[i].PtrSubProgs[j].NbVariables;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return 0;\r
+}\r
+\r
+\r
+// Get local variable name based on his index (starting by 1)\r
+// Return name's pointer text found\r
+// Return NULL if not found\r
+char *DWARFManager_GetLocalVariableName(size_t Adr, size_t Index)\r
+{\r
+       size_t i, j;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
+               {\r
+                       for (j = 0; j < PtrCU[i].NbSubProgs; j++)\r
+                       {\r
+                               if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
+                               {\r
+                                       return PtrCU[i].PtrSubProgs[j].PtrVariables[Index - 1].PtrName;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return NULL;\r
+}\r
+\r
+\r
+// Get local variable's type tag based on his index (starting by 1)\r
+// Return 0 if not found\r
+size_t DWARFManager_GetLocalVariableTypeTag(size_t Adr, size_t Index)\r
+{\r
+       size_t i, j;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
+               {\r
+                       for (j = 0; j < PtrCU[i].NbSubProgs; j++)\r
+                       {\r
+                               if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
+                               {\r
+                                       return PtrCU[i].PtrSubProgs[j].PtrVariables[Index - 1].TypeTag;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return 0;\r
+}\r
+\r
+\r
+//\r
+int DWARFManager_GetLocalVariableOffset(size_t Adr, size_t Index)\r
+{\r
+       size_t i, j;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
+               {\r
+                       for (j = 0; j < PtrCU[i].NbSubProgs; j++)\r
+                       {\r
+                               if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
+                               {\r
+                                       return PtrCU[i].PtrSubProgs[j].PtrVariables[Index - 1].Offset;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return 0;\r
+}\r
+\r
+\r
+// Get local variable Type Byte Size based on his address and index (starting by 1)\r
+// Return 0 if not found\r
+// May return 0 if there is no Type Byte Size linked to the variable's address and index\r
+size_t DWARFManager_GetLocalVariableTypeByteSize(size_t Adr, size_t Index)\r
+{\r
+       size_t i, j;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
+               {\r
+                       for (j = 0; j < PtrCU[i].NbSubProgs; j++)\r
+                       {\r
+                               if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
+                               {\r
+                                       return PtrCU[i].PtrSubProgs[j].PtrVariables[Index - 1].TypeByteSize;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return 0;\r
+}\r
+\r
+\r
+// Get local variable Type Encoding based on his address and index (starting by 1)\r
+// Return 0 if not found\r
+// May return 0 if there is no Type Encoding linked to the variable's address and index\r
+size_t DWARFManager_GetLocalVariableTypeEncoding(size_t Adr, size_t Index)\r
+{\r
+       size_t i, j;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
+               {\r
+                       for (j = 0; j < PtrCU[i].NbSubProgs; j++)\r
+                       {\r
+                               if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
+                               {\r
+                                       return PtrCU[i].PtrSubProgs[j].PtrVariables[Index - 1].TypeEncoding;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return 0;\r
+}\r
+\r
+\r
+// Get local variable Op based on his address and index (starting by 1)\r
+// Return 0 if not found\r
+// May return 0 if there isn't Op linked to the variable's index\r
+size_t DWARFManager_GetLocalVariableOp(size_t Adr, size_t Index)\r
+{\r
+       size_t i, j;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
+               {\r
+                       for (j = 0; j < PtrCU[i].NbSubProgs; j++)\r
+                       {\r
+                               if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
+                               {\r
+                                       return PtrCU[i].PtrSubProgs[j].PtrVariables[Index - 1].Op;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return 0;\r
+}\r
+\r
+\r
+// Get local variable type name based on his index (starting by 1)\r
+// Return NULL if not found\r
+// May return NULL if there is not type linked to the variable's index\r
+char *DWARFManager_GetLocalVariableTypeName(size_t Adr, size_t Index)\r
+{\r
+       size_t i, j;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
+               {\r
+                       for (j = 0; j < PtrCU[i].NbSubProgs; j++)\r
+                       {\r
+                               if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
+                               {\r
+                                       return PtrCU[i].PtrSubProgs[j].PtrVariables[Index - 1].PtrTypeName;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return NULL;\r
+}\r
+\r
+\r
+// Get Compilation Unit / global variables numbers\r
 // Return variables number\r
-size_t DWARFManager_GetNbExternalVariables(void)\r
+size_t DWARFManager_GetNbGlobalVariables(void)\r
 {\r
        size_t NbVariables = 0, i;\r
 \r
@@ -889,10 +1266,10 @@ size_t DWARFManager_GetNbExternalVariables(void)
 }\r
 \r
 \r
-// Get external variable type name based on his index (starting by 1)\r
+// Get global variable type name based on his index (starting by 1)\r
 // Return NULL if not found\r
 // May return NULL if there is not type linked to the variable's index\r
-char *DWARFManager_GetExternalVariableTypeName(size_t Index)\r
+char *DWARFManager_GetGlobalVariableTypeName(size_t Index)\r
 {\r
        size_t i;\r
 \r
@@ -915,9 +1292,9 @@ char *DWARFManager_GetExternalVariableTypeName(size_t Index)
 }\r
 \r
 \r
-// Get external variable's type tag based on his index (starting by 1)\r
+// Get global variable's type tag based on his index (starting by 1)\r
 // Return 0 if not found\r
-size_t DWARFManager_GetExternalVariableTypeTag(size_t Index)\r
+size_t DWARFManager_GetGlobalVariableTypeTag(size_t Index)\r
 {\r
        size_t i;\r
 \r
@@ -940,9 +1317,9 @@ size_t DWARFManager_GetExternalVariableTypeTag(size_t Index)
 }\r
 \r
 \r
-// Get external variable byte size based on his index (starting by 1)\r
+// Get global variable byte size based on his index (starting by 1)\r
 // Return 0 if not found\r
-size_t DWARFManager_GetExternalVariableTypeByteSize(size_t Index)\r
+size_t DWARFManager_GetGlobalVariableTypeByteSize(size_t Index)\r
 {\r
        size_t i;\r
 \r
@@ -965,9 +1342,9 @@ size_t DWARFManager_GetExternalVariableTypeByteSize(size_t Index)
 }\r
 \r
 \r
-// Get external variable encoding based on his index (starting by 1)\r
+// Get global variable encoding based on his index (starting by 1)\r
 // Return 0 if not found\r
-size_t DWARFManager_GetExternalVariableTypeEncoding(size_t Index)\r
+size_t DWARFManager_GetGlobalVariableTypeEncoding(size_t Index)\r
 {\r
        size_t i;\r
 \r
@@ -990,9 +1367,9 @@ size_t DWARFManager_GetExternalVariableTypeEncoding(size_t Index)
 }\r
 \r
 \r
-// Get external variable address based on his index (starting by 1)\r
+// Get global variable address based on his index (starting by 1)\r
 // Return 0 if not found\r
-size_t DWARFManager_GetExternalVariableAdr(size_t Index)\r
+size_t DWARFManager_GetGlobalVariableAdr(size_t Index)\r
 {\r
        size_t i;\r
 \r
@@ -1015,10 +1392,10 @@ size_t DWARFManager_GetExternalVariableAdr(size_t Index)
 }\r
 \r
 \r
-// Get external variable memory address based on his name\r
+// Get global variable memory address based on his name\r
 // Return 0 if not found\r
 // Note: Return the first occurence found\r
-size_t DWARFManager_GetExternalVariableAdrFromName(char *VariableName)\r
+size_t DWARFManager_GetGlobalVariableAdrFromName(char *VariableName)\r
 {\r
        size_t i, j;\r
 \r
@@ -1040,10 +1417,10 @@ size_t DWARFManager_GetExternalVariableAdrFromName(char *VariableName)
 }\r
 \r
 \r
-// Get external variable name based on his index (starting by 1)\r
+// Get global variable name based on his index (starting by 1)\r
 // Return name's pointer text found\r
 // Return NULL if not found\r
-char *DWARFManager_GetExternalVariableName(size_t Index)\r
+char *DWARFManager_GetGlobalVariableName(size_t Index)\r
 {\r
        size_t i;\r
 \r
@@ -1146,6 +1523,30 @@ size_t DWARFManager_GetNumLineFromAdr(size_t Adr, size_t Tag)
 }\r
 \r
 \r
+// Get function name based on address and his range\r
+// Return NULL if no function name has been found\r
+char *DWARFManager_GetFunctionName(size_t Adr)\r
+{\r
+       size_t i, j;\r
+\r
+       for (i = 0; i < NbCU; i++)\r
+       {\r
+               if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC))\r
+               {\r
+                       for (j = 0; j < PtrCU[i].NbSubProgs; j++)\r
+                       {\r
+                               if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC))\r
+                               {\r
+                                       return PtrCU[i].PtrSubProgs[j].PtrSubprogramName;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       return NULL;\r
+}\r
+\r
+\r
 // Get text line from source based on address and num line (starting by 1)\r
 // Return NULL if no text line has been found\r
 char *DWARFManager_GetLineSrcFromAdrNumLine(size_t Adr, size_t NumLine)\r