Added detection for the unsigned/signed short type
[clinton/Virtual-Jaguar-Rx.git] / src / debugger / DBGManager.cpp
index 7dd3015..1d024e3 100644 (file)
-//
-// DBGManager.cpp: Debugger information manager
-//
-// by Jean-Paul Mari
-//
-// JPM = Jean-Paul Mari <djipi.mari@gmail.com>
-//
-// WHO  WHEN        WHAT
-// ---  ----------  ------------------------------------------------------------
-// JPM  12/21/2016  Created this file
-// JPM              Various efforts to set the ELF format support
-// JPM              Various efforts to set the DWARF format support
-
-#include <stdlib.h>
-#include <string.h>
-#include <stdint.h>
-#include "libelf\libelf.h"
-#include "libelf\gelf.h"
-#include "log.h"
-#include "ELFManager.h"
-#include "DwarfManager.h"
-#include "DBGManager.h"
-#include "HWLABELManager.h"
-#include "settings.h"
-#include "memory.h"
-
-
-// 
-char *DBGManager_GetVariableValueFromAdr(uint32_t Adr, uint32_t TypeEncoding, uint32_t TypeByteSize);
-
-
-//
-struct Value
-{
-       union
-       {
-               char C[10];
-               double D;
-               float F;
-               int32_t SI;
-               int64_t SL;
-               uint32_t UI;
-               uint64_t UL;
-       };
-}S_Value;
-
-
-// Common debugger variables
-int    DBGType;
-char value[1000];
-
-
-// Common debugger initialisation
-void DBGManager_Init(void)
-{
-       DBGType = DBG_NO_TYPE;
-       ELFManager_Init();
-       DWARFManager_Init();
-}
-
-
-// Common debugger reset
-void DBGManager_Reset(void)
-{
-       if ((DBGType & DBG_DWARF))
-       {
-               DWARFManager_Reset();
-       }
-
-       if ((DBGType & DBG_ELF))
-       {
-               ELFManager_Reset();
-       }
-
-       DBGType = vjs.displayHWlabels ? DBG_HWLABEL : DBG_NO_TYPE;
-}
-
-
-// Common debugger set
-void DBGManager_SetType(int DBGTypeSet)
-{
-       DBGType |= DBGTypeSet;
-}
-
-
-// Common debugger close
-void DBGManager_Close(void)
-{
-       if ((DBGType & DBG_DWARF))
-       {
-               DWARFManager_Close();
-       }
-
-       if ((DBGType & DBG_ELF))
-       {
-               ELFManager_Close();
-       }
-}
-
-
-// Get source filename based on the memeory address
-// return NULL if no source filename
-char *DBGManager_GetFullSourceFilenameFromAdr(size_t Adr, bool *Error)
-{
-       if ((DBGType & DBG_ELFDWARF))
-       {
-               return DWARFManager_GetFullSourceFilenameFromAdr(Adr, Error);
-       }
-       else
-       {
-               return  NULL;
-       }
-}
-
-
-// Get number of external variables
-// Return 0 if none has been found
-size_t DBGManager_GetNbExternalVariables(void)
-{
-       if ((DBGType & DBG_ELFDWARF))
-       {
-               return DWARFManager_GetNbExternalVariables();
-       }
-       else
-       {
-               return  0;
-       }
-}
-
-
-//
-size_t DBGManager_GetAdrFromSymbolName(char *SymbolName)
-{
-       if ((DBGType & DBG_ELF))
-       {
-               return ELFManager_GetAdrFromSymbolName(SymbolName);
-       }
-       else
-       {
-               return 0;
-       }
-}
-
-
-// Get external variable's Address based on his Name
-// Return found Address
-// Return NULL if no Address has been found
-size_t DBGManager_GetExternalVariableAdrFromName(char *VariableName)
-{
-       if ((DBGType & DBG_ELFDWARF))
-       {
-               return DWARFManager_GetExternalVariableAdrFromName(VariableName);
-       }
-       else
-       {
-               return 0;
-       }
-}
-
-
-//
-size_t DBGManager_GetExternalVariableTypeTag(size_t Index)
-{
-       if ((DBGType & DBG_ELFDWARF))
-       {
-               return DWARFManager_GetExternalVariableTypeTag(Index);
-       }
-       else
-       {
-               return  0;
-       }
-}
-
-
-// Get external variable's type name based on his Index
-// Return type name's text pointer found
-// Return NULL if no type name has been found
-char *DBGManager_GetExternalVariableTypeName(size_t Index)
-{
-       if ((DBGType & DBG_ELFDWARF))
-       {
-               return DWARFManager_GetExternalVariableTypeName(Index);
-       }
-       else
-       {
-               return  NULL;
-       }
-}
-
-
-// Get external variable's Address based on his Index
-// Return the Address found
-// Return 0 if no Address has been found
-size_t DBGManager_GetExternalVariableAdr(size_t Index)
-{
-       if ((DBGType & DBG_ELFDWARF))
-       {
-               return DWARFManager_GetExternalVariableAdr(Index);
-       }
-       else
-       {
-               return  0;
-       }
-}
-
-
-// Get external variable's type byte size based on his Index
-// Return the type's byte size found
-// Return 0 if no type's byte size has been found
-size_t DBGManager_GetExternalVariableTypeByteSize(size_t Index)
-{
-       if ((DBGType & DBG_ELFDWARF))
-       {
-               return DWARFManager_GetExternalVariableTypeByteSize(Index);
-       }
-       else
-       {
-               return  0;
-       }
-}
-
-
-// Get external variable's type encoding based on his Index
-// Return the type encoding found
-// Return 0 if no type encoding has been found
-size_t DBGManager_GetExternalVariableTypeEncoding(size_t Index)
-{
-       if ((DBGType & DBG_ELFDWARF))
-       {
-               return DWARFManager_GetExternalVariableTypeEncoding(Index);
-       }
-       else
-       {
-               return  0;
-       }
-}
-
-
-// Get external variable value based on his Index
-// Return value as a text pointer
-// Note: Pointer may point on a 0 lenght text
-char *DBGManager_GetExternalVariableValue(size_t Index)
-{
-       uint32_t Adr = 0;
-       uint32_t TypeEncoding = DBG_NO_TYPEENCODING;
-       uint32_t TypeByteSize = 0;
-
-       if ((DBGType & DBG_ELFDWARF))
-       {
-               Adr = DWARFManager_GetExternalVariableAdr(Index);
-               TypeEncoding = DWARFManager_GetExternalVariableTypeEncoding(Index);
-               TypeByteSize = DWARFManager_GetExternalVariableTypeByteSize(Index);
-       }
-
-       return DBGManager_GetVariableValueFromAdr(Adr, TypeEncoding, TypeByteSize);
-}
-
-
-// Get variable value based on his Adresse, Encoding Type and Size
-// Return value as a text pointer
-// Note: Pointer may point on a 0 lenght text if Adress is NULL
-char *DBGManager_GetVariableValueFromAdr(uint32_t Adr, uint32_t TypeEncoding, uint32_t TypeByteSize)
-{
-       Value V;
-       char *Ptrvalue = value;
-
-       value[0] = 0;
-
-       if (Adr)
-       {
-               memset(&V, 0, sizeof(Value));
-#if 0
-               for (uint32_t i = 0; i < TypeByteSize; i++)
-                       jaguarMainRAM[Adr + i] = 0;
-                       //jaguarMainRAM[Adr + i] = rand();
-               jaguarMainRAM[Adr + TypeByteSize - 1] = 0x10;
-#endif
-#if 1
-               for (uint32_t i = 0, j = TypeByteSize; i < TypeByteSize; i++, j--)
-               {
-                       V.C[i] = jaguarMainRAM[Adr + j - 1];
-               }
-#endif
-
-               switch (TypeEncoding)
-               {
-               case DBG_ATE_address:
-                       break;
-
-               case DBG_ATE_boolean:
-                       break;
-
-               case DBG_ATE_complex_float:
-                       break;
-
-               case DBG_ATE_float:
-                       switch (TypeByteSize)
-                       {
-                       case 4:
-                               sprintf(value, "%F", V.F);
-                               break;
-
-                       case 8:
-                               //V.D = (double)jaguarMainRAM[Adr];
-                               //sprintf(value, "%10.10F", V.D);
-                               sprintf(value, "%F", V.D);
-                               break;
-
-                       default:
-                               break;
-                       }
-                       break;
-
-               case DBG_ATE_signed:
-                       switch (TypeByteSize)
-                       {
-                       case 4:
-                               sprintf(value, "%i", V.SI);
-                               break;
-
-                       case 8:
-                               sprintf(value, "%i", V.SL);
-                               break;
-
-                       default:
-                               break;
-                       }
-                       break;
-
-               case DBG_ATE_signed_char:
-                       break;
-
-               case DBG_ATE_unsigned:
-                       switch (TypeByteSize)
-                       {
-                       case 4:
-                               sprintf(value, "%u", V.UI);
-                               break;
-
-                       case 8:
-                               sprintf(value, "%u", V.UL);
-                               break;
-
-                       default:
-                               break;
-                       }
-                       break;
-
-               case DBG_ATE_unsigned_char:
-                       break;
-
-               case DBG_ATE_ptr:
-                       switch (TypeByteSize)
-                       {
-                       case 4:
-                               sprintf(value, "0x%06x", V.UI);
-                               break;
-
-                       default:
-                               break;
-                       }
-
-               default:
-                       break;
-               }
-       }
-
-       return Ptrvalue;
-}
-
-
-// Get external variable name based on his Index
-// Return variable name's text pointer found
-// Return NULL if no variable name has been found
-char *DBGManager_GetExternalVariableName(size_t Index)
-{
-       if ((DBGType & DBG_ELFDWARF))
-       {
-               return DWARFManager_GetExternalVariableName(Index);
-       }
-       else
-       {
-               return  NULL;
-       }
-}
-
-
-// Get line number from address and his tag
-// Return line number on the symbol name found
-// Return 0 if no symbol name has been found
-size_t DBGManager_GetNumLineFromAdr(size_t Adr, size_t Tag)
-{
-       if ((DBGType & DBG_ELFDWARF))
-       {
-               return DWARFManager_GetNumLineFromAdr(Adr, Tag);
-       }
-       else
-       {
-               return  0;
-       }
-}
-
-
-// Get symbol name from address
-// Return text pointer on the symbol name found
-// Return NULL if no symbol name has been found
-char *DBGManager_GetSymbolnameFromAdr(size_t Adr)
-{
-       char *Symbolname = NULL;
-
-       if ((DBGType & DBG_HWLABEL) || vjs.displayHWlabels)
-       {
-               Symbolname = HWLABELManager_GetSymbolnameFromAdr(Adr);
-       }
-
-       if (Symbolname == NULL)
-       {
-               if ((DBGType & DBG_ELFDWARF))
-               {
-                       Symbolname = DWARFManager_GetSymbolnameFromAdr(Adr);
-               }
-
-               if ((DBGType & DBG_ELF) && (Symbolname == NULL))
-               {
-                       Symbolname = ELFManager_GetSymbolnameFromAdr(Adr);
-               }
-       }
-
-       return  Symbolname;
-}
-
-
-// Get source line based on the Address and his Tag
-// Return text pointer on the source line found
-// Return NULL if no source line has been found
-char *DBGManager_GetLineSrcFromAdr(size_t Adr, size_t Tag)
-{
-       char *Symbolname = NULL;
-
-       if ((DBGType & DBG_ELFDWARF))
-       {
-               Symbolname = DWARFManager_GetLineSrcFromAdr(Adr, Tag);
-       }
-
-       return  Symbolname;
-}
-
-
-// Get text line from source based on address and num line (starting by 1)
-// Return NULL if no text line has been found
-char *DBGManager_GetLineSrcFromAdrNumLine(size_t Adr, size_t NumLine)
-{
-       char *Symbolname = NULL;
-
-       if ((DBGType & DBG_ELFDWARF))
-       {
-               Symbolname = DWARFManager_GetLineSrcFromAdrNumLine(Adr, NumLine);
-       }
-
-       return  Symbolname;
-}
-
-
-// Get text line from source based on address and num line (starting by 1)
-// Return NULL if no text line has been found
-char *DBGManager_GetLineSrcFromNumLineBaseAdr(size_t Adr, size_t NumLine)
-{
-       char *Symbolname = NULL;
-
-       if ((DBGType & DBG_ELFDWARF))
-       {
-               Symbolname = DWARFManager_GetLineSrcFromNumLineBaseAdr(Adr, NumLine);
-       }
-
-       return  Symbolname;
-}
-
+//\r
+// DBGManager.cpp: Debugger information manager\r
+//\r
+// by Jean-Paul Mari\r
+//\r
+// JPM = Jean-Paul Mari <djipi.mari@gmail.com>\r
+//\r
+// WHO  WHEN        WHAT\r
+// ---  ----------  ------------------------------------------------------------\r
+// JPM  12/21/2016  Created this file\r
+// JPM              Various efforts to set the ELF format support\r
+// JPM              Various efforts to set the DWARF format support\r
+// JPM  09/15/2018  Support the unsigned char\r
+// JPM   Oct./2018  Cosmetic changes, added source file search paths, and ELF function name\r
+// JPM  Sept./2019  Support the unsigned/signed short type\r
+//\r
+\r
+// To Do\r
+// To think about unique format to handle variations from ELF, DWARF, etc.\r
+//\r
+\r
+\r
+#include <stdlib.h>\r
+#include <string.h>\r
+#include <stdint.h>\r
+#include "libelf/libelf.h"\r
+#include "libelf/gelf.h"\r
+#include "log.h"\r
+#include "ELFManager.h"\r
+#include "DwarfManager.h"\r
+#include "DBGManager.h"\r
+#include "HWLABELManager.h"\r
+#include "settings.h"\r
+#include "memory.h"\r
+\r
+\r
+//\r
+struct Value\r
+{\r
+       union\r
+       {\r
+               char Ct[10];\r
+               char C;\r
+               bool B;\r
+               double D;\r
+               float F;\r
+               int16_t SS;\r
+               int32_t SI;\r
+               int64_t SL;\r
+               uint16_t US;\r
+               uint32_t UI;\r
+               uint64_t UL;\r
+       };\r
+}S_Value;\r
+\r
+\r
+//\r
+void DBGManager_SourceFileSearchPathsInit(void);\r
+void DBGManager_SourceFileSearchPathsReset(void);\r
+void DBGManager_SourceFileSearchPathsClose(void);\r
+\r
+\r
+// Common debugger variables\r
+size_t DBGType;\r
+char value[1000];\r
+size_t NbSFSearchPaths;\r
+char **SourceFileSearchPaths;\r
+\r
+\r
+// Init the source file search paths\r
+void DBGManager_SourceFileSearchPathsInit(void)\r
+{\r
+       NbSFSearchPaths = 0;\r
+       SourceFileSearchPaths = NULL;\r
+}\r
+\r
+\r
+// Set the source file search paths\r
+// Create individual path for each one provided in the list (separate with ';')\r
+void DBGManager_SourceFileSearchPathsSet(char *ListPaths)\r
+{\r
+       // Check presence of a previous list\r
+       if (NbSFSearchPaths)\r
+       {\r
+               // Reset previous list\r
+               DBGManager_SourceFileSearchPathsReset();\r
+       }\r
+\r
+       // Check if there is a paths list\r
+       if (strlen(ListPaths))\r
+       {\r
+               // Get number of paths\r
+               char *Ptr = ListPaths;\r
+               while(*Ptr)\r
+               {\r
+                       while (*Ptr && (*Ptr++ != ';'));\r
+                       {\r
+                               NbSFSearchPaths++;\r
+                       }\r
+               }\r
+\r
+               // Isolate each search path\r
+               SourceFileSearchPaths = (char **)calloc(NbSFSearchPaths, sizeof(char *));\r
+               size_t i = 0;\r
+               Ptr = ListPaths;\r
+\r
+               while (*Ptr)\r
+               {\r
+                       // Search the path separator (';')\r
+                       char *Ptr1 = Ptr;\r
+                       while (*Ptr && (*Ptr++ != ';'));\r
+\r
+                       // Copy the inidividual search path\r
+                       SourceFileSearchPaths[i] = (char *)calloc(1, (Ptr - Ptr1) + 1);\r
+                       strncpy(SourceFileSearchPaths[i], Ptr1, (Ptr - Ptr1));\r
+                       if (SourceFileSearchPaths[i][strlen(SourceFileSearchPaths[i]) - 1] == ';')\r
+                       {\r
+                               SourceFileSearchPaths[i][strlen(SourceFileSearchPaths[i]) - 1] = 0;\r
+                       }\r
+                       i++;\r
+               }\r
+       }\r
+\r
+       DWARFManager_Set(NbSFSearchPaths, SourceFileSearchPaths);\r
+}\r
+\r
+\r
+// Reset the source file search paths\r
+void DBGManager_SourceFileSearchPathsReset(void)\r
+{\r
+       // Free each path\r
+       while (NbSFSearchPaths)\r
+       {\r
+               free(SourceFileSearchPaths[--NbSFSearchPaths]);\r
+       }\r
+\r
+       // Free the pointers list\r
+       free(SourceFileSearchPaths);\r
+       SourceFileSearchPaths = NULL;\r
+}\r
+\r
+\r
+// Close the source file search paths\r
+void DBGManager_SourceFileSearchPathsClose(void)\r
+{\r
+       DBGManager_SourceFileSearchPathsReset();\r
+}\r
+\r
+\r
+// Common debugger initialisation\r
+void DBGManager_Init(void)\r
+{\r
+       // DBG initialisations\r
+       DBGType = DBG_NO_TYPE;\r
+       DBGManager_SourceFileSearchPathsInit();\r
+\r
+       // ELF initialisation \r
+       ELFManager_Init();\r
+       // DWARF initialisation\r
+       DWARFManager_Init();\r
+}\r
+\r
+\r
+// Common debugger reset\r
+void DBGManager_Reset(void)\r
+{\r
+       if ((DBGType & DBG_DWARF))\r
+       {\r
+               DWARFManager_Reset();\r
+       }\r
+\r
+       if ((DBGType & DBG_ELF))\r
+       {\r
+               ELFManager_Reset();\r
+       }\r
+\r
+       //DBGType = vjs.displayHWlabels ? DBG_HWLABEL : DBG_NO_TYPE;\r
+       DBGType = DBG_NO_TYPE;\r
+}\r
+\r
+\r
+// Common debugger close\r
+void DBGManager_Close(void)\r
+{\r
+       if ((DBGType & DBG_DWARF))\r
+       {\r
+               DWARFManager_Close();\r
+       }\r
+\r
+       if ((DBGType & DBG_ELF))\r
+       {\r
+               ELFManager_Close();\r
+       }\r
+\r
+       DBGManager_SourceFileSearchPathsClose();\r
+       DBGType = DBG_NO_TYPE;\r
+}\r
+\r
+\r
+// Common debugger set\r
+void DBGManager_SetType(size_t DBGTypeSet)\r
+{\r
+       DBGType |= DBGTypeSet;\r
+}\r
+\r
+\r
+// Get debugger type\r
+size_t DBGManager_GetType(void)\r
+{\r
+       return DBGType;\r
+}\r
+\r
+\r
+// Get source filename based on the memeory address\r
+// return NULL if no source filename\r
+char *DBGManager_GetFullSourceFilenameFromAdr(size_t Adr, bool *Error)\r
+{\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               return DWARFManager_GetFullSourceFilenameFromAdr(Adr, Error);\r
+       }\r
+       else\r
+       {\r
+               return  NULL;\r
+       }\r
+}\r
+\r
+\r
+// Get number of local variables\r
+// Return 0 if none has been found\r
+size_t DBGManager_GetNbLocalVariables(size_t Adr)\r
+{\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               return DWARFManager_GetNbLocalVariables(Adr);\r
+       }\r
+       else\r
+       {\r
+               return  0;\r
+       }\r
+}\r
+\r
+\r
+// Get number of global variables\r
+// Return 0 if none has been found\r
+size_t DBGManager_GetNbGlobalVariables(void)\r
+{\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               return DWARFManager_GetNbGlobalVariables();\r
+       }\r
+       else\r
+       {\r
+               return  0;\r
+       }\r
+}\r
+\r
+\r
+// Get address from symbol name\r
+// Return found address\r
+// Return NULL if no symbol has been found\r
+size_t DBGManager_GetAdrFromSymbolName(char *SymbolName)\r
+{\r
+       if (SymbolName)\r
+       {\r
+               if ((DBGType & DBG_ELF))\r
+               {\r
+                       return ELFManager_GetAdrFromSymbolName(SymbolName);\r
+               }\r
+       }\r
+\r
+       return 0;\r
+}\r
+\r
+\r
+// Get global variable's Address based on his Name\r
+// Return found Address\r
+// Return NULL if no Address has been found\r
+size_t DBGManager_GetGlobalVariableAdrFromName(char *VariableName)\r
+{\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               return DWARFManager_GetGlobalVariableAdrFromName(VariableName);\r
+       }\r
+       else\r
+       {\r
+               return 0;\r
+       }\r
+}\r
+\r
+\r
+// Get local variable's type encoding based on his address and Index\r
+// Return the type encoding found\r
+// Return 0 if no type encoding has been found\r
+size_t DBGManager_GetLocalVariableTypeEncoding(size_t Adr, size_t Index)\r
+{\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               return DWARFManager_GetLocalVariableTypeEncoding(Adr, Index);\r
+       }\r
+       else\r
+       {\r
+               return  0;\r
+       }\r
+}\r
+\r
+\r
+//\r
+int DBGManager_GetLocalVariableOffset(size_t Adr, size_t Index)\r
+{\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               return DWARFManager_GetLocalVariableOffset(Adr, Index);\r
+       }\r
+       else\r
+       {\r
+               return  0;\r
+       }\r
+}\r
+\r
+\r
+// Get local variable's type byte size based on his address and Index\r
+// Return the type's byte size found\r
+// Return 0 if no type's byte size has been found\r
+size_t DBGManager_GetLocalVariableTypeByteSize(size_t Adr, size_t Index)\r
+{\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               return DWARFManager_GetLocalVariableTypeByteSize(Adr, Index);\r
+       }\r
+       else\r
+       {\r
+               return  0;\r
+       }\r
+}\r
+\r
+\r
+//\r
+size_t DBGManager_GetLocalVariableTypeTag(size_t Adr, size_t Index)\r
+{\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               return DWARFManager_GetLocalVariableTypeTag(Adr, Index);\r
+       }\r
+       else\r
+       {\r
+               return  0;\r
+       }\r
+}\r
+\r
+\r
+//\r
+size_t DBGManager_GetGlobalVariableTypeTag(size_t Index)\r
+{\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               return DWARFManager_GetGlobalVariableTypeTag(Index);\r
+       }\r
+       else\r
+       {\r
+               return  0;\r
+       }\r
+}\r
+\r
+\r
+// Get global variable's type name based on his Index\r
+// Return type name's text pointer found\r
+// Return NULL if no type name has been found\r
+char *DBGManager_GetGlobalVariableTypeName(size_t Index)\r
+{\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               return DWARFManager_GetGlobalVariableTypeName(Index);\r
+       }\r
+       else\r
+       {\r
+               return  NULL;\r
+       }\r
+}\r
+\r
+\r
+// Get global variable's Address based on his Index\r
+// Return the Address found\r
+// Return 0 if no Address has been found\r
+size_t DBGManager_GetGlobalVariableAdr(size_t Index)\r
+{\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               return DWARFManager_GetGlobalVariableAdr(Index);\r
+       }\r
+       else\r
+       {\r
+               return  0;\r
+       }\r
+}\r
+\r
+\r
+// Get global variable's type byte size based on his Index\r
+// Return the type's byte size found\r
+// Return 0 if no type's byte size has been found\r
+size_t DBGManager_GetGlobalVariableTypeByteSize(size_t Index)\r
+{\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               return DWARFManager_GetGlobalVariableTypeByteSize(Index);\r
+       }\r
+       else\r
+       {\r
+               return  0;\r
+       }\r
+}\r
+\r
+\r
+// Get global variable's type encoding based on his Index\r
+// Return the type encoding found\r
+// Return 0 if no type encoding has been found\r
+size_t DBGManager_GetGlobalVariableTypeEncoding(size_t Index)\r
+{\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               return DWARFManager_GetGlobalVariableTypeEncoding(Index);\r
+       }\r
+       else\r
+       {\r
+               return  0;\r
+       }\r
+}\r
+\r
+\r
+// Get global variable value based on his Index\r
+// Return value as a text pointer\r
+// Note: Pointer may point on a 0 lenght text\r
+char *DBGManager_GetGlobalVariableValue(size_t Index)\r
+{\r
+       size_t Adr = 0;\r
+       size_t TypeEncoding = DBG_NO_TYPEENCODING;\r
+       size_t TypeByteSize = 0;\r
+\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               Adr = DWARFManager_GetGlobalVariableAdr(Index);\r
+               TypeEncoding = DWARFManager_GetGlobalVariableTypeEncoding(Index);\r
+               TypeByteSize = DWARFManager_GetGlobalVariableTypeByteSize(Index);\r
+       }\r
+\r
+       return DBGManager_GetVariableValueFromAdr(Adr, TypeEncoding, TypeByteSize);\r
+}\r
+\r
+\r
+// Get variable value based on his Adresse, Encoding Type and Size\r
+// Return value as a text pointer\r
+// Note: Pointer may point on a 0 length text\r
+char *DBGManager_GetVariableValueFromAdr(size_t Adr, size_t TypeEncoding, size_t TypeByteSize)\r
+{\r
+       Value V;\r
+       char *Ptrvalue = value;\r
+\r
+       value[0] = 0;\r
+\r
+#if 0\r
+       if (Adr)\r
+#endif\r
+       {\r
+               memset(&V, 0, sizeof(Value));\r
+#if 0\r
+               for (uint32_t i = 0; i < TypeByteSize; i++)\r
+                       jaguarMainRAM[Adr + i] = 0;\r
+                       //jaguarMainRAM[Adr + i] = rand();\r
+               jaguarMainRAM[Adr + TypeByteSize - 1] = 0x10;\r
+#else\r
+               for (size_t i = 0, j = TypeByteSize; i < TypeByteSize; i++, j--)\r
+               {\r
+                       V.Ct[i] = jaguarMainRAM[Adr + j - 1];\r
+               }\r
+#endif\r
+               switch (TypeEncoding)\r
+               {\r
+               case DBG_ATE_address:\r
+                       break;\r
+\r
+               case DBG_ATE_boolean:\r
+                       sprintf(value, "%s", V.B ? "true" : "false");\r
+                       break;\r
+\r
+               case DBG_ATE_complex_float:\r
+                       break;\r
+\r
+               case DBG_ATE_float:\r
+                       switch (TypeByteSize)\r
+                       {\r
+                       case 4:\r
+                               sprintf(value, "%F", V.F);\r
+                               break;\r
+\r
+                       case 8:\r
+                               //V.D = (double)jaguarMainRAM[Adr];\r
+                               //sprintf(value, "%10.10F", V.D);\r
+                               sprintf(value, "%F", V.D);\r
+                               break;\r
+\r
+                       default:\r
+                               break;\r
+                       }\r
+                       break;\r
+\r
+               case DBG_ATE_signed:\r
+                       switch (TypeByteSize)\r
+                       {\r
+                       case 2:\r
+                               sprintf(value, "%i", V.SS);\r
+                               break;\r
+\r
+                       case 4:\r
+                               sprintf(value, "%i", V.SI);\r
+                               break;\r
+\r
+                       case 8:\r
+                               sprintf(value, "%i", V.SL);\r
+                               break;\r
+\r
+                       default:\r
+                               break;\r
+                       }\r
+                       break;\r
+\r
+               case DBG_ATE_signed_char:\r
+                       break;\r
+\r
+               case DBG_ATE_unsigned:\r
+                       switch (TypeByteSize)\r
+                       {\r
+                       case 2:\r
+                               sprintf(value, "%u", V.US);\r
+                               break;\r
+\r
+                       case 4:\r
+                               sprintf(value, "%u", V.UI);\r
+                               break;\r
+\r
+                       case 8:\r
+                               sprintf(value, "%u", V.UL);\r
+                               break;\r
+\r
+                       default:\r
+                               break;\r
+                       }\r
+                       break;\r
+\r
+               case DBG_ATE_unsigned_char:\r
+                       sprintf(value, "%u", (unsigned int(V.C)));\r
+                       break;\r
+\r
+               case DBG_ATE_ptr:\r
+                       switch (TypeByteSize)\r
+                       {\r
+                       case 4:\r
+                               sprintf(value, "0x%06x", V.UI);\r
+                               break;\r
+\r
+                       default:\r
+                               break;\r
+                       }\r
+\r
+               default:\r
+                       break;\r
+               }\r
+       }\r
+\r
+       return Ptrvalue;\r
+}\r
+\r
+\r
+// Get local variable's type name based on his Index\r
+// Return type name's text pointer found\r
+// Return NULL if no type name has been found\r
+char *DBGManager_GetLocalVariableTypeName(size_t Adr, size_t Index)\r
+{\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               return DWARFManager_GetLocalVariableTypeName(Adr, Index);\r
+       }\r
+       else\r
+       {\r
+               return  NULL;\r
+       }\r
+}\r
+\r
+\r
+// Get local variable Op based on his Index\r
+// Return variable Op's found\r
+// Return 0 if no variable Op has been found\r
+size_t DBGManager_GetLocalVariableOp(size_t Adr, size_t Index)\r
+{\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               return DWARFManager_GetLocalVariableOp(Adr, Index);\r
+       }\r
+       else\r
+       {\r
+               return  0;\r
+       }\r
+}\r
+\r
+\r
+// Get local variable name based on his Index\r
+// Return variable name's text pointer found\r
+// Return NULL if no variable name has been found\r
+char *DBGManager_GetLocalVariableName(size_t Adr, size_t Index)\r
+{\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               return DWARFManager_GetLocalVariableName(Adr, Index);\r
+       }\r
+       else\r
+       {\r
+               return  NULL;\r
+       }\r
+}\r
+\r
+\r
+// Get global variable name based on his Index\r
+// Return variable name's text pointer found\r
+// Return NULL if no variable name has been found\r
+char *DBGManager_GetGlobalVariableName(size_t Index)\r
+{\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               return DWARFManager_GetGlobalVariableName(Index);\r
+       }\r
+       else\r
+       {\r
+               return  NULL;\r
+       }\r
+}\r
+\r
+\r
+// Get function name from address\r
+// Return function name found\r
+// Return NULL if no function name has been found\r
+char *DBGManager_GetFunctionName(size_t Adr)\r
+{\r
+       char *Symbolname = NULL;\r
+\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               Symbolname = DWARFManager_GetFunctionName(Adr);\r
+       }\r
+\r
+       if ((DBGType & DBG_ELF) && (Symbolname == NULL))\r
+       {\r
+               Symbolname = ELFManager_GetFunctionName(Adr);\r
+       }\r
+\r
+       return  Symbolname;\r
+}\r
+\r
+\r
+// Get line number from address and his tag\r
+// Return line number on the symbol name found\r
+// Return 0 if no symbol name has been found\r
+size_t DBGManager_GetNumLineFromAdr(size_t Adr, size_t Tag)\r
+{\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               return DWARFManager_GetNumLineFromAdr(Adr, Tag);\r
+       }\r
+       else\r
+       {\r
+               return  0;\r
+       }\r
+}\r
+\r
+\r
+// Get symbol name from address\r
+// Return text pointer on the symbol name found\r
+// Return NULL if no symbol name has been found\r
+char *DBGManager_GetSymbolNameFromAdr(size_t Adr)\r
+{\r
+       char *Symbolname;\r
+\r
+       //if ((DBGType & DBG_HWLABEL) || vjs.displayHWlabels)\r
+       if (vjs.displayHWlabels)\r
+       {\r
+               Symbolname = HWLABELManager_GetSymbolnameFromAdr(Adr);\r
+       }\r
+       else\r
+       {\r
+               Symbolname = NULL;\r
+       }\r
+#ifdef _MSC_VER\r
+#pragma message("Warning: !!! Need to set the DBG_HWLABEL in DBGType instead to use the setting value !!!")\r
+#else\r
+       #warning "!!! Need to set the DBG_HWLABEL in DBGType instead to use the setting value !!!"\r
+#endif // _MSC_VER\r
+\r
+       if (Symbolname == NULL)\r
+       {\r
+               if ((DBGType & DBG_ELFDWARF))\r
+               {\r
+                       Symbolname = DWARFManager_GetSymbolnameFromAdr(Adr);\r
+               }\r
+\r
+               if ((DBGType & DBG_ELF) && (Symbolname == NULL))\r
+               {\r
+                       Symbolname = ELFManager_GetSymbolnameFromAdr(Adr);\r
+               }\r
+       }\r
+\r
+       return  Symbolname;\r
+}\r
+\r
+\r
+// Get source line based on the Address and his Tag\r
+// Return text pointer on the source line found\r
+// Return NULL if no source line has been found\r
+char *DBGManager_GetLineSrcFromAdr(size_t Adr, size_t Tag)\r
+{\r
+       char *TextLine = NULL;\r
+\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               TextLine = DWARFManager_GetLineSrcFromAdr(Adr, Tag);\r
+       }\r
+\r
+       return  TextLine;\r
+}\r
+\r
+\r
+// Get text line from source based on address and num line (starting from 1)\r
+// Return NULL if no text line has been found\r
+char *DBGManager_GetLineSrcFromAdrNumLine(size_t Adr, size_t NumLine)\r
+{\r
+       char *TextLine = NULL;\r
+\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               TextLine = DWARFManager_GetLineSrcFromAdrNumLine(Adr, NumLine);\r
+       }\r
+\r
+       return  TextLine;\r
+}\r
+\r
+\r
+// Get text line from source based on address and num line (starting from 1)\r
+// Return NULL if no text line has been found\r
+char *DBGManager_GetLineSrcFromNumLineBaseAdr(size_t Adr, size_t NumLine)\r
+{\r
+       char *TextLine = NULL;\r
+\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               TextLine = DWARFManager_GetLineSrcFromNumLineBaseAdr(Adr, NumLine);\r
+       }\r
+\r
+       return  TextLine;\r
+}\r
+\r
+\r
+// Get number of source code filenames\r
+size_t DBGManager_GetNbFullSourceFilename(void)\r
+{\r
+       size_t Nbr = 0;\r
+\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               Nbr = DWARFManager_GetNbFullSourceFilename();\r
+       }\r
+\r
+       return Nbr;\r
+}\r
+\r
+\r
+// Get source code filename based on index\r
+char *DBGManager_GetNumFullSourceFilename(size_t Index)\r
+{\r
+       char *FullSourceFilename = NULL;\r
+\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               FullSourceFilename = DWARFManager_GetNumFullSourceFilename(Index);\r
+       }\r
+\r
+       return  FullSourceFilename;\r
+}\r