// 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
+//\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 "memory.h"\r
\r
\r
-// \r
-char *DBGManager_GetVariableValueFromAdr(uint32_t Adr, uint32_t TypeEncoding, uint32_t TypeByteSize);\r
-\r
-\r
//\r
struct Value\r
{\r
union\r
{\r
- char C[10];\r
+ char Ct[10];\r
+ char C;\r
+ bool B;\r
double D;\r
float F;\r
int32_t SI;\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
\r
\r
-// Common debugger set\r
-void DBGManager_SetType(size_t DBGTypeSet)\r
-{\r
- DBGType |= DBGTypeSet;\r
-}\r
-\r
-\r
// Common debugger close\r
void DBGManager_Close(void)\r
{\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
}\r
\r
\r
-// Get number of external variables\r
+// Get number of local variables\r
// Return 0 if none has been found\r
-size_t DBGManager_GetNbExternalVariables(void)\r
+size_t DBGManager_GetNbLocalVariables(size_t Adr)\r
{\r
if ((DBGType & DBG_ELFDWARF))\r
{\r
- return DWARFManager_GetNbExternalVariables();\r
+ return DWARFManager_GetNbLocalVariables(Adr);\r
}\r
else\r
{\r
}\r
\r
\r
-//\r
-size_t DBGManager_GetAdrFromSymbolName(char *SymbolName)\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_ELF))\r
+ if ((DBGType & DBG_ELFDWARF))\r
{\r
- return ELFManager_GetAdrFromSymbolName(SymbolName);\r
+ return DWARFManager_GetNbGlobalVariables();\r
}\r
else\r
{\r
- return 0;\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 external variable's Address based on his Name\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_GetExternalVariableAdrFromName(char *VariableName)\r
+size_t DBGManager_GetGlobalVariableAdrFromName(char *VariableName)\r
{\r
if ((DBGType & DBG_ELFDWARF))\r
{\r
- return DWARFManager_GetExternalVariableAdrFromName(VariableName);\r
+ return DWARFManager_GetGlobalVariableAdrFromName(VariableName);\r
}\r
else\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_GetExternalVariableTypeTag(size_t Index)\r
+size_t DBGManager_GetGlobalVariableTypeTag(size_t Index)\r
{\r
if ((DBGType & DBG_ELFDWARF))\r
{\r
- return DWARFManager_GetExternalVariableTypeTag(Index);\r
+ return DWARFManager_GetGlobalVariableTypeTag(Index);\r
}\r
else\r
{\r
}\r
\r
\r
-// Get external variable's type name based on his Index\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_GetExternalVariableTypeName(size_t Index)\r
+char *DBGManager_GetGlobalVariableTypeName(size_t Index)\r
{\r
if ((DBGType & DBG_ELFDWARF))\r
{\r
- return DWARFManager_GetExternalVariableTypeName(Index);\r
+ return DWARFManager_GetGlobalVariableTypeName(Index);\r
}\r
else\r
{\r
}\r
\r
\r
-// Get external variable's Address based on his Index\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_GetExternalVariableAdr(size_t Index)\r
+size_t DBGManager_GetGlobalVariableAdr(size_t Index)\r
{\r
if ((DBGType & DBG_ELFDWARF))\r
{\r
- return DWARFManager_GetExternalVariableAdr(Index);\r
+ return DWARFManager_GetGlobalVariableAdr(Index);\r
}\r
else\r
{\r
}\r
\r
\r
-// Get external variable's type byte size based on his Index\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_GetExternalVariableTypeByteSize(size_t Index)\r
+size_t DBGManager_GetGlobalVariableTypeByteSize(size_t Index)\r
{\r
if ((DBGType & DBG_ELFDWARF))\r
{\r
- return DWARFManager_GetExternalVariableTypeByteSize(Index);\r
+ return DWARFManager_GetGlobalVariableTypeByteSize(Index);\r
}\r
else\r
{\r
}\r
\r
\r
-// Get external variable's type encoding based on his Index\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_GetExternalVariableTypeEncoding(size_t Index)\r
+size_t DBGManager_GetGlobalVariableTypeEncoding(size_t Index)\r
{\r
if ((DBGType & DBG_ELFDWARF))\r
{\r
- return DWARFManager_GetExternalVariableTypeEncoding(Index);\r
+ return DWARFManager_GetGlobalVariableTypeEncoding(Index);\r
}\r
else\r
{\r
}\r
\r
\r
-// Get external variable value based on his Index\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_GetExternalVariableValue(size_t Index)\r
+char *DBGManager_GetGlobalVariableValue(size_t Index)\r
{\r
- uint32_t Adr = 0;\r
- uint32_t TypeEncoding = DBG_NO_TYPEENCODING;\r
- uint32_t TypeByteSize = 0;\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_GetExternalVariableAdr(Index);\r
- TypeEncoding = DWARFManager_GetExternalVariableTypeEncoding(Index);\r
- TypeByteSize = DWARFManager_GetExternalVariableTypeByteSize(Index);\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
// 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 lenght text if Adress is NULL\r
-char *DBGManager_GetVariableValueFromAdr(uint32_t Adr, uint32_t TypeEncoding, uint32_t TypeByteSize)\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
jaguarMainRAM[Adr + i] = 0;\r
//jaguarMainRAM[Adr + i] = rand();\r
jaguarMainRAM[Adr + TypeByteSize - 1] = 0x10;\r
-#endif\r
-#if 1\r
- for (uint32_t i = 0, j = TypeByteSize; i < TypeByteSize; i++, j--)\r
+#else\r
+ for (size_t i = 0, j = TypeByteSize; i < TypeByteSize; i++, j--)\r
{\r
- V.C[i] = jaguarMainRAM[Adr + j - 1];\r
+ V.Ct[i] = jaguarMainRAM[Adr + j - 1];\r
}\r
#endif\r
-\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_unsigned_char:\r
+ sprintf(value, "%u", (unsigned int(V.C)));\r
break;\r
\r
case DBG_ATE_ptr:\r
}\r
\r
\r
-// Get external variable name based on his Index\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_GetExternalVariableName(size_t Index)\r
+char *DBGManager_GetGlobalVariableName(size_t Index)\r
{\r
if ((DBGType & DBG_ELFDWARF))\r
{\r
- return DWARFManager_GetExternalVariableName(Index);\r
+ return DWARFManager_GetGlobalVariableName(Index);\r
}\r
else\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
// 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
+char *DBGManager_GetSymbolNameFromAdr(size_t Adr)\r
{\r
char *Symbolname;\r
\r
{\r
Symbolname = NULL;\r
}\r
-#ifdef _MSC_VER
-#pragma message("Warning: !!! Need to set the DBG_HWLABEL in DBGType instead to use the setting value !!!")
-#else
- #warning "!!! Need to set the DBG_HWLABEL in DBGType instead to use the setting value !!!"
+#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
// Return NULL if no source line has been found\r
char *DBGManager_GetLineSrcFromAdr(size_t Adr, size_t Tag)\r
{\r
- char *Symbolname = NULL;\r
+ char *TextLine = NULL;\r
\r
if ((DBGType & DBG_ELFDWARF))\r
{\r
- Symbolname = DWARFManager_GetLineSrcFromAdr(Adr, Tag);\r
+ TextLine = DWARFManager_GetLineSrcFromAdr(Adr, Tag);\r
}\r
\r
- return Symbolname;\r
+ return TextLine;\r
}\r
\r
\r
-// Get text line from source based on address and num line (starting by 1)\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 *Symbolname = NULL;\r
+ char *TextLine = NULL;\r
\r
if ((DBGType & DBG_ELFDWARF))\r
{\r
- Symbolname = DWARFManager_GetLineSrcFromAdrNumLine(Adr, NumLine);\r
+ TextLine = DWARFManager_GetLineSrcFromAdrNumLine(Adr, NumLine);\r
}\r
\r
- return Symbolname;\r
+ return TextLine;\r
}\r
\r
\r
-// Get text line from source based on address and num line (starting by 1)\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 *Symbolname = NULL;\r
+ char *TextLine = NULL;\r
\r
if ((DBGType & DBG_ELFDWARF))\r
{\r
- Symbolname = DWARFManager_GetLineSrcFromNumLineBaseAdr(Adr, NumLine);\r
+ TextLine = DWARFManager_GetLineSrcFromNumLineBaseAdr(Adr, NumLine);\r
}\r
\r
- return Symbolname;\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