X-Git-Url: http://git.hcoop.net/clinton/Virtual-Jaguar-Rx.git/blobdiff_plain/5fa7aa73305908579b14bd1dc27417352bf5acdf..f0dd2f7b7cc2f165b00dedcbc5bf6fbaa2ca136d:/src/debugger/DWARFManager.cpp diff --git a/src/debugger/DWARFManager.cpp b/src/debugger/DWARFManager.cpp index bd6507b..9c497f4 100644 --- a/src/debugger/DWARFManager.cpp +++ b/src/debugger/DWARFManager.cpp @@ -9,7 +9,7 @@ // --- ---------- ------------------------------------------------------------ // JPM Dec./2016 Created this file, and added the DWARF format support // JPM Sept./2018 Added LEB128 decoding features, and improve the DWARF parsing information -// JPM Oct./2018 Improve the DWARF parsing information, the source file text reading, and Support the used lines source DWARF structure +// JPM Oct./2018 Improve the DWARF parsing information, and the source file text reading; support the used source lines from DWARF structure, and the search paths for the files // // To Do @@ -152,6 +152,8 @@ Dwarf_Ptr errarg; Dwarf_Error error; Dwarf_Debug dbg; CUStruct *PtrCU; +char **ListSearchPaths; +size_t NbSearchPaths; // @@ -161,6 +163,9 @@ void DWARFManager_CloseDMI(void); bool DWARFManager_ElfClose(void); char *DWARFManager_GetLineSrcFromNumLine(char *PtrSrcFile, size_t NumLine); void DWARFManager_InitInfosVariable(VariablesStruct *PtrVariables); +void DWARFManager_SourceFileSearchPathsInit(void); +void DWARFManager_SourceFileSearchPathsReset(void); +void DWARFManager_SourceFileSearchPathsClose(void); // @@ -170,16 +175,50 @@ Dwarf_Handler DWARFManager_ErrorHandler(Dwarf_Ptr perrarg) } +// Dwarf manager list search paths init +void DWARFManager_SourceFileSearchPathsInit(void) +{ + ListSearchPaths = NULL; + NbSearchPaths = 0; +} + + +// Dwarf manager list search paths reset +void DWARFManager_SourceFileSearchPathsReset(void) +{ + ListSearchPaths = NULL; + NbSearchPaths = 0; +} + + +// Dwarf manager list search paths close +void DWARFManager_SourceFileSearchPathsClose(void) +{ + DWARFManager_SourceFileSearchPathsReset(); +} + + // Dwarf manager init void DWARFManager_Init(void) { + DWARFManager_SourceFileSearchPathsInit(); LibDwarf = DW_DLV_NO_ENTRY; } +// Dwarf manager settings +void DWARFManager_Set(size_t NbPathsInList, char **PtrListPaths) +{ + // Search paths init + ListSearchPaths = PtrListPaths; + NbSearchPaths = NbPathsInList; +} + + // Dwarf manager Reset bool DWARFManager_Reset(void) { + DWARFManager_SourceFileSearchPathsReset(); return DWARFManager_ElfClose(); } @@ -187,6 +226,7 @@ bool DWARFManager_Reset(void) // Dwarf manager Close bool DWARFManager_Close(void) { + DWARFManager_SourceFileSearchPathsClose(); return(DWARFManager_Reset()); } @@ -394,23 +434,46 @@ void DWARFManager_InitDMI(void) dwarf_dealloc(dbg, atlist, DW_DLA_LIST); } - // Check filename validity + // Check filename presence if (!PtrCU[NbCU].PtrSourceFilename) { PtrCU[NbCU].PtrSourceFilename = (char *)calloc(1, 1); } - // Check directory validity + // Check directory presence if (!PtrCU[NbCU].PtrSourceFileDirectory) { - PtrCU[NbCU].PtrSourceFileDirectory = (char *)calloc(2, 1); - PtrCU[NbCU].PtrSourceFileDirectory[0] = '.'; + // Check if file exists in the search paths + for (size_t i = 0; i < NbSearchPaths; i++) + { + PtrCU[NbCU].PtrFullFilename = (char *)realloc(PtrCU[NbCU].PtrFullFilename, strlen(PtrCU[NbCU].PtrSourceFilename) + strlen((const char *)ListSearchPaths[i]) + 2); +#if defined(_WIN32) + sprintf(PtrCU[NbCU].PtrFullFilename, "%s\\%s", ListSearchPaths[i], PtrCU[NbCU].PtrSourceFilename); +#else + sprintf(PtrCU[NbCU].PtrFullFilename, "%s/%s", ListSearchPaths[i], PtrCU[NbCU].PtrSourceFilename); +#endif + if (!fopen_s(&SrcFile, PtrCU[NbCU].PtrFullFilename, "rb")) + { + PtrCU[NbCU].PtrSourceFileDirectory = (char *)realloc(PtrCU[NbCU].PtrSourceFileDirectory, strlen(ListSearchPaths[i]) + 1); + strcpy(PtrCU[NbCU].PtrSourceFileDirectory, ListSearchPaths[i]); + } + } + + // File directory doesn't exits + if (!PtrCU[NbCU].PtrSourceFileDirectory) + { + PtrCU[NbCU].PtrSourceFileDirectory = (char *)realloc(PtrCU[NbCU].PtrSourceFileDirectory, 2); + strcpy(PtrCU[NbCU].PtrSourceFileDirectory, "."); + } } // Create full filename Ptr = PtrCU[NbCU].PtrFullFilename = (char *)realloc(PtrCU[NbCU].PtrFullFilename, strlen(PtrCU[NbCU].PtrSourceFilename) + strlen(PtrCU[NbCU].PtrSourceFileDirectory) + 2); +#if defined(_WIN32) sprintf(PtrCU[NbCU].PtrFullFilename, "%s\\%s", PtrCU[NbCU].PtrSourceFileDirectory, PtrCU[NbCU].PtrSourceFilename); - +#else + sprintf(PtrCU[NbCU].PtrFullFilename, "%s/%s", PtrCU[NbCU].PtrSourceFileDirectory, PtrCU[NbCU].PtrSourceFilename); +#endif // Conform slashes and backslashes while (*Ptr) { @@ -1064,14 +1127,6 @@ void DWARFManager_InitDMI(void) PtrCU[NbCU].PtrLinesSrc[i].PtrLineSrc = PtrCU[NbCU].PtrLinesLoadSrc[PtrCU[NbCU].PtrLinesSrc[i].NumLineSrc - 1]; } } - - // Setup memory range for the code if CU doesn't have already this information - // It is taken from the used lines structure - if (!PtrCU[NbCU].LowPC && !PtrCU[NbCU].HighPC) - { - PtrCU[NbCU].LowPC = PtrCU[NbCU].PtrLinesSrc[0].StartPC; - PtrCU[NbCU].HighPC = PtrCU[NbCU].PtrLinesSrc[PtrCU[NbCU].NbLinesSrc - 1].StartPC; - } } // Init global variables information based on types information @@ -1243,13 +1298,11 @@ void DWARFManager_InitInfosVariable(VariablesStruct *PtrVariables) // Return NULL if no symbol name exists char *DWARFManager_GetSymbolnameFromAdr(size_t Adr) { - size_t i, j; - - for (i = 0; i < NbCU; i++) + for (size_t i = 0; i < NbCU; i++) { if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC)) { - for (j = 0; (j < PtrCU[i].NbSubProgs); j++) + for (size_t j = 0; j < PtrCU[i].NbSubProgs; j++) { if ((PtrCU[i].PtrSubProgs[j].StartPC == Adr)) { @@ -1268,9 +1321,7 @@ char *DWARFManager_GetSymbolnameFromAdr(size_t Adr) // Return the existence status (true or false) in Error char *DWARFManager_GetFullSourceFilenameFromAdr(size_t Adr, bool *Error) { - size_t i; - - for (i = 0; i < NbCU; i++) + for (size_t i = 0; i < NbCU; i++) { if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC)) { @@ -1283,7 +1334,7 @@ char *DWARFManager_GetFullSourceFilenameFromAdr(size_t Adr, bool *Error) } -// Get text line source based on line number (starting by 1) +// Get text line source based on line number (starting from 1) // Return NULL if no text line exists or if line number is 0 char *DWARFManager_GetLineSrcFromNumLine(char *PtrSrcFile, size_t NumLine) { @@ -1307,13 +1358,11 @@ char *DWARFManager_GetLineSrcFromNumLine(char *PtrSrcFile, size_t NumLine) // Get number of variables referenced by the function range address size_t DWARFManager_GetNbLocalVariables(size_t Adr) { - size_t i, j; - - for (i = 0; i < NbCU; i++) + for (size_t i = 0; i < NbCU; i++) { if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC)) { - for (j = 0; j < PtrCU[i].NbSubProgs; j++) + for (size_t j = 0; j < PtrCU[i].NbSubProgs; j++) { if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC)) { @@ -1327,18 +1376,16 @@ size_t DWARFManager_GetNbLocalVariables(size_t Adr) } -// Get local variable name based on his index (starting by 1) +// Get local variable name based on his index (starting from 1) // Return name's pointer text found // Return NULL if not found char *DWARFManager_GetLocalVariableName(size_t Adr, size_t Index) { - size_t i, j; - - for (i = 0; i < NbCU; i++) + for (size_t i = 0; i < NbCU; i++) { if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC)) { - for (j = 0; j < PtrCU[i].NbSubProgs; j++) + for (size_t j = 0; j < PtrCU[i].NbSubProgs; j++) { if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC)) { @@ -1352,17 +1399,15 @@ char *DWARFManager_GetLocalVariableName(size_t Adr, size_t Index) } -// Get local variable's type tag based on his index (starting by 1) +// Get local variable's type tag based on his index (starting from 1) // Return 0 if not found size_t DWARFManager_GetLocalVariableTypeTag(size_t Adr, size_t Index) { - size_t i, j; - - for (i = 0; i < NbCU; i++) + for (size_t i = 0; i < NbCU; i++) { if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC)) { - for (j = 0; j < PtrCU[i].NbSubProgs; j++) + for (size_t j = 0; j < PtrCU[i].NbSubProgs; j++) { if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC)) { @@ -1376,16 +1421,15 @@ size_t DWARFManager_GetLocalVariableTypeTag(size_t Adr, size_t Index) } -// +// Get the local variable's offset based on a index (starting from 1) +// Return 0 if no offset has been found int DWARFManager_GetLocalVariableOffset(size_t Adr, size_t Index) { - size_t i, j; - - for (i = 0; i < NbCU; i++) + for (size_t i = 0; i < NbCU; i++) { if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC)) { - for (j = 0; j < PtrCU[i].NbSubProgs; j++) + for (size_t j = 0; j < PtrCU[i].NbSubProgs; j++) { if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC)) { @@ -1399,18 +1443,16 @@ int DWARFManager_GetLocalVariableOffset(size_t Adr, size_t Index) } -// Get local variable Type Byte Size based on his address and index (starting by 1) +// Get local variable Type Byte Size based on his address and index (starting from 1) // Return 0 if not found // May return 0 if there is no Type Byte Size linked to the variable's address and index size_t DWARFManager_GetLocalVariableTypeByteSize(size_t Adr, size_t Index) { - size_t i, j; - - for (i = 0; i < NbCU; i++) + for (size_t i = 0; i < NbCU; i++) { if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC)) { - for (j = 0; j < PtrCU[i].NbSubProgs; j++) + for (size_t j = 0; j < PtrCU[i].NbSubProgs; j++) { if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC)) { @@ -1424,18 +1466,16 @@ size_t DWARFManager_GetLocalVariableTypeByteSize(size_t Adr, size_t Index) } -// Get local variable Type Encoding based on his address and index (starting by 1) +// Get local variable Type Encoding based on his address and index (starting from 1) // Return 0 if not found // May return 0 if there is no Type Encoding linked to the variable's address and index size_t DWARFManager_GetLocalVariableTypeEncoding(size_t Adr, size_t Index) { - size_t i, j; - - for (i = 0; i < NbCU; i++) + for (size_t i = 0; i < NbCU; i++) { if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC)) { - for (j = 0; j < PtrCU[i].NbSubProgs; j++) + for (size_t j = 0; j < PtrCU[i].NbSubProgs; j++) { if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC)) { @@ -1449,17 +1489,15 @@ size_t DWARFManager_GetLocalVariableTypeEncoding(size_t Adr, size_t Index) } -// Get local variable Op based on his address and index (starting by 1) +// Get local variable Op based on his address and index (starting from 1) // Return 0 if not found, may return 0 if there isn't Op linked to the variable's index size_t DWARFManager_GetLocalVariableOp(size_t Adr, size_t Index) { - size_t i, j; - - for (i = 0; i < NbCU; i++) + for (size_t i = 0; i < NbCU; i++) { if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC)) { - for (j = 0; j < PtrCU[i].NbSubProgs; j++) + for (size_t j = 0; j < PtrCU[i].NbSubProgs; j++) { if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC)) { @@ -1473,17 +1511,15 @@ size_t DWARFManager_GetLocalVariableOp(size_t Adr, size_t Index) } -// Get local variable type name based on his index (starting by 1) and an address +// Get local variable type name based on his index (starting from 1) and an address // Return NULL if not found, may also return NULL if there is no type linked to the variable's index char *DWARFManager_GetLocalVariableTypeName(size_t Adr, size_t Index) { - size_t i, j; - - for (i = 0; i < NbCU; i++) + for (size_t i = 0; i < NbCU; i++) { if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC)) { - for (j = 0; j < PtrCU[i].NbSubProgs; j++) + for (size_t j = 0; j < PtrCU[i].NbSubProgs; j++) { if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC)) { @@ -1501,9 +1537,9 @@ char *DWARFManager_GetLocalVariableTypeName(size_t Adr, size_t Index) // Return number of variables size_t DWARFManager_GetNbGlobalVariables(void) { - size_t NbVariables = 0, i; + size_t NbVariables = 0; - for (i = 0; i < NbCU; i++) + for (size_t i = 0; i < NbCU; i++) { NbVariables += PtrCU[i].NbVariables; } @@ -1512,14 +1548,12 @@ size_t DWARFManager_GetNbGlobalVariables(void) } -// Get global variable type name based on his index (starting by 1) +// Get global variable type name based on his index (starting from 1) // Return NULL if not found // May return NULL if there is not type linked to the variable's index char *DWARFManager_GetGlobalVariableTypeName(size_t Index) { - size_t i; - - for (i = 0; i < NbCU; i++) + for (size_t i = 0; i < NbCU; i++) { if (PtrCU[i].NbVariables) { @@ -1538,13 +1572,11 @@ char *DWARFManager_GetGlobalVariableTypeName(size_t Index) } -// Get global variable's type tag based on his index (starting by 1) +// Get global variable's type tag based on his index (starting from 1) // Return 0 if not found size_t DWARFManager_GetGlobalVariableTypeTag(size_t Index) { - size_t i; - - for (i = 0; i < NbCU; i++) + for (size_t i = 0; i < NbCU; i++) { if (PtrCU[i].NbVariables) { @@ -1563,13 +1595,11 @@ size_t DWARFManager_GetGlobalVariableTypeTag(size_t Index) } -// Get global variable byte size based on his index (starting by 1) +// Get global variable byte size based on his index (starting from 1) // Return 0 if not found size_t DWARFManager_GetGlobalVariableTypeByteSize(size_t Index) { - size_t i; - - for (i = 0; i < NbCU; i++) + for (size_t i = 0; i < NbCU; i++) { if (PtrCU[i].NbVariables) { @@ -1588,13 +1618,11 @@ size_t DWARFManager_GetGlobalVariableTypeByteSize(size_t Index) } -// Get global variable encoding based on his index (starting by 1) +// Get global variable encoding based on his index (starting from 1) // Return 0 if not found size_t DWARFManager_GetGlobalVariableTypeEncoding(size_t Index) { - size_t i; - - for (i = 0; i < NbCU; i++) + for (size_t i = 0; i < NbCU; i++) { if (PtrCU[i].NbVariables) { @@ -1613,13 +1641,11 @@ size_t DWARFManager_GetGlobalVariableTypeEncoding(size_t Index) } -// Get global variable address based on his index (starting by 1) +// Get global variable memory address based on his index (starting from 1) // Return 0 if not found size_t DWARFManager_GetGlobalVariableAdr(size_t Index) { - size_t i; - - for (i = 0; i < NbCU; i++) + for (size_t i = 0; i < NbCU; i++) { if (PtrCU[i].NbVariables) { @@ -1642,13 +1668,11 @@ size_t DWARFManager_GetGlobalVariableAdr(size_t Index) // Return 0 if not found, or will return the first occurence found size_t DWARFManager_GetGlobalVariableAdrFromName(char *VariableName) { - size_t i, j; - - for (i = 0; i < NbCU; i++) + for (size_t i = 0; i < NbCU; i++) { if (PtrCU[i].NbVariables) { - for (j = 0; j < PtrCU[i].NbVariables; j++) + for (size_t j = 0; j < PtrCU[i].NbVariables; j++) { if (!strcmp(PtrCU[i].PtrVariables[j].PtrName,VariableName)) { @@ -1662,13 +1686,11 @@ size_t DWARFManager_GetGlobalVariableAdrFromName(char *VariableName) } -// Get global variable name based on his index (starting by 1) +// Get global variable name based on his index (starting from 1) // Return name's pointer text found, or will return NULL if no variable can be found char *DWARFManager_GetGlobalVariableName(size_t Index) { - size_t i; - - for (i = 0; i < NbCU; i++) + for (size_t i = 0; i < NbCU; i++) { if (PtrCU[i].NbVariables) { @@ -1693,13 +1715,11 @@ char *DWARFManager_GetGlobalVariableName(size_t Index) // Return NULL if no text line has been found char *DWARFManager_GetLineSrcFromAdr(size_t Adr, size_t Tag) { - size_t i, j, k; - - for (i = 0; i < NbCU; i++) + for (size_t i = 0; i < NbCU; i++) { if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC)) { - for (j = 0; j < PtrCU[i].NbSubProgs; j++) + for (size_t j = 0; j < PtrCU[i].NbSubProgs; j++) { if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC)) { @@ -1709,7 +1729,7 @@ char *DWARFManager_GetLineSrcFromAdr(size_t Adr, size_t Tag) } else { - for (k = 0; k < PtrCU[i].PtrSubProgs[j].NbLinesSrc; k++) + for (size_t k = 0; k < PtrCU[i].PtrSubProgs[j].NbLinesSrc; k++) { if (PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].StartPC <= Adr) { @@ -1739,13 +1759,11 @@ char *DWARFManager_GetLineSrcFromAdr(size_t Adr, size_t Tag) // Return 0 if no line number has been found size_t DWARFManager_GetNumLineFromAdr(size_t Adr, size_t Tag) { - size_t i, j, k; - - for (i = 0; i < NbCU; i++) + for (size_t i = 0; i < NbCU; i++) { if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC)) { - for (j = 0; (j < PtrCU[i].NbSubProgs); j++) + for (size_t j = 0; j < PtrCU[i].NbSubProgs; j++) { if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC)) { @@ -1755,7 +1773,7 @@ size_t DWARFManager_GetNumLineFromAdr(size_t Adr, size_t Tag) } else { - for (k = 0; (k < PtrCU[i].PtrSubProgs[j].NbLinesSrc); k++) + for (size_t k = 0; k < PtrCU[i].PtrSubProgs[j].NbLinesSrc; k++) { if ((PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].StartPC == Adr) && (!Tag || (PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].Tag == Tag))) { @@ -1782,13 +1800,11 @@ size_t DWARFManager_GetNumLineFromAdr(size_t Adr, size_t Tag) // Return NULL if no function name has been found, otherwise will return the function name in the range of the provided address char *DWARFManager_GetFunctionName(size_t Adr) { - size_t i, j; - - for (i = 0; i < NbCU; i++) + for (size_t i = 0; i < NbCU; i++) { if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC)) { - for (j = 0; j < PtrCU[i].NbSubProgs; j++) + for (size_t j = 0; j < PtrCU[i].NbSubProgs; j++) { if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC)) { @@ -1802,17 +1818,15 @@ char *DWARFManager_GetFunctionName(size_t Adr) } -// Get text line from source based on address and num line (starting by 1) +// Get text line from source based on address and num line (starting from 1) // Return NULL if no text line has been found char *DWARFManager_GetLineSrcFromAdrNumLine(size_t Adr, size_t NumLine) { - size_t i, j, k; - - for (i = 0; i < NbCU; i++) + for (size_t i = 0; i < NbCU; i++) { if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC)) { - for (j = 0; j < PtrCU[i].NbSubProgs; j++) + for (size_t j = 0; j < PtrCU[i].NbSubProgs; j++) { if ((Adr >= PtrCU[i].PtrSubProgs[j].LowPC) && (Adr < PtrCU[i].PtrSubProgs[j].HighPC)) { @@ -1822,7 +1836,7 @@ char *DWARFManager_GetLineSrcFromAdrNumLine(size_t Adr, size_t NumLine) } else { - for (k = 0; k < PtrCU[i].PtrSubProgs[j].NbLinesSrc; k++) + for (size_t k = 0; k < PtrCU[i].PtrSubProgs[j].NbLinesSrc; k++) { if (PtrCU[i].PtrSubProgs[j].PtrLinesSrc[k].NumLineSrc == NumLine) { @@ -1839,13 +1853,11 @@ char *DWARFManager_GetLineSrcFromAdrNumLine(size_t Adr, size_t NumLine) } -// Get text line pointer from source, based on address and line number (starting by 1) +// Get text line pointer from source, based on address and line number (starting from 1) // Return NULL if no text line has been found, or if requested number line is above the source total number of lines char *DWARFManager_GetLineSrcFromNumLineBaseAdr(size_t Adr, size_t NumLine) { - size_t i; - - for (i = 0; i < NbCU; i++) + for (size_t i = 0; i < NbCU; i++) { if ((Adr >= PtrCU[i].LowPC) && (Adr < PtrCU[i].HighPC)) {