Worked started for the source tracing
[clinton/Virtual-Jaguar-Rx.git] / src / debugger / DBGManager.cpp
index af92c17..d86ecf9 100644 (file)
 // 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  09/15/2018  Support the unsigned char\r
+// JPM   Oct./2018  Cosmetic changes, added source file search paths, and ELF function name\r
+// JPM   Aug./2019  Added new functions mainly for source text lines\r
+//\r
 \r
 // To Do\r
+// To think about unique format to handle variations from ELF, DWARF, etc.\r
 //\r
 \r
 \r
@@ -48,16 +52,109 @@ struct Value
 }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
@@ -80,20 +177,6 @@ void DBGManager_Reset(void)
 }\r
 \r
 \r
-// Get debugger type\r
-size_t DBGManager_GetType(void)\r
-{\r
-       return DBGType;\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
@@ -106,6 +189,23 @@ void DBGManager_Close(void)
        {\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
@@ -529,14 +629,19 @@ char *DBGManager_GetGlobalVariableName(size_t Index)
 // 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
-               return DWARFManager_GetFunctionName(Adr);\r
+               Symbolname = DWARFManager_GetFunctionName(Adr);\r
        }\r
-       else\r
+\r
+       if ((DBGType & DBG_ELF) && (Symbolname == NULL))\r
        {\r
-               return  NULL;\r
+               Symbolname = ELFManager_GetFunctionName(Adr);\r
        }\r
+\r
+       return  Symbolname;\r
 }\r
 \r
 \r
@@ -600,43 +705,141 @@ char *DBGManager_GetSymbolNameFromAdr(size_t Adr)
 // 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_GetNbSources(void)\r
+{\r
+       size_t Nbr = 0;\r
+\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               Nbr = DWARFManager_GetNbSources();\r
+       }\r
+\r
+       return Nbr;\r
+}\r
+\r
+\r
+// Get source code filename based on index\r
+char *DBGManager_GetNumSourceFilename(size_t Index)\r
+{\r
+       char *SourceFilename = NULL;\r
+\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               SourceFilename = DWARFManager_GetNumSourceFilename(Index);\r
+       }\r
+\r
+       return  SourceFilename;\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
+\r
+\r
+// Get number of lines of texts source list from source index\r
+size_t DBGManager_GetSrcNbListPtrFromIndex(size_t Index, bool Used)\r
+{\r
+       size_t NbListPtr = 0;\r
+\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               NbListPtr = DWARFManager_GetSrcNbListPtrFromIndex(Index, Used);\r
+       }\r
+\r
+       return  NbListPtr;\r
+}\r
+\r
+\r
+// Get pointer to the lines number list from source index\r
+size_t *DBGManager_GetSrcNumLinesPtrFromIndex(size_t Index, bool Used)\r
+{\r
+       size_t *PtrNumLines = NULL;\r
+\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               PtrNumLines = DWARFManager_GetSrcNumLinesPtrFromIndex(Index, Used);\r
+       }\r
+\r
+       return  PtrNumLines;\r
+}\r
+\r
+\r
+// Get text source list pointers from source index\r
+char **DBGManager_GetSrcListPtrFromIndex(size_t Index, bool Used)\r
+{\r
+       char **PtrSource = NULL;\r
+\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               PtrSource = DWARFManager_GetSrcListPtrFromIndex(Index, Used);\r
+       }\r
+\r
+       return  PtrSource;\r
+}\r
+\r
+\r
+// Get source language\r
+size_t DBGManager_GetSrcLanguageFromIndex(size_t Index)\r
+{\r
+       size_t Language = 0;\r
+\r
+       if ((DBGType & DBG_ELFDWARF))\r
+       {\r
+               Language = DWARFManager_GetSrcLanguageFromIndex(Index);\r
+       }\r
+\r
+       return  Language;\r
 }\r
 \r