From c13e54167b8d5637f7a4502117ea2594959f160a Mon Sep 17 00:00:00 2001 From: Jean-Paul Mari Date: Mon, 24 May 2021 03:33:59 -0400 Subject: [PATCH] Code refactoring for the variables support --- docs/vj_HistoryNotes.txt | 1 + src/debugger/DBGManager.cpp | 195 +++++++++++++++++++++--------------- src/debugger/DBGManager.h | 32 +++++- 3 files changed, 146 insertions(+), 82 deletions(-) diff --git a/docs/vj_HistoryNotes.txt b/docs/vj_HistoryNotes.txt index ca4ccf8..d6152fa 100644 --- a/docs/vj_HistoryNotes.txt +++ b/docs/vj_HistoryNotes.txt @@ -42,6 +42,7 @@ Release 5 (TBA) 28) Fixed potential crash with the debugger tabs reset 29) Added a search feature in the All Watch variables window 30) Support the structure's members in the Local variables window +31) Code refactoring for the variables support in debugger mode Release 4a (15th August 2019) ----------------------------- diff --git a/src/debugger/DBGManager.cpp b/src/debugger/DBGManager.cpp index a2f358d..edbc766 100644 --- a/src/debugger/DBGManager.cpp +++ b/src/debugger/DBGManager.cpp @@ -16,6 +16,7 @@ // JPM Aug./2019 Added new functions mainly for source text lines // JPM Sept./2019 Support the unsigned/signed short type // RG Jan./2021 Linux build fixes +// JPM May/2021 Code refactoring for the variables // // To Do @@ -229,6 +230,53 @@ char *DBGManager_GetFullSourceFilenameFromAdr(size_t Adr, DBGstatus *Status) } +// Get number of variables +// A NULL address will return the numbre of global variables, otherwise it will return the number of local variables +size_t DBGManager_GetNbVariables(size_t Adr) +{ + if ((DBGType & DBG_ELFDWARF)) + { + return DWARFManager_GetNbVariables(Adr); + } + else + { + return 0; + } +} + + +// Get variable's information +// A NULL address will return the pointer to the global variable structure, otherwise it will return the local's one +S_VariablesStruct* DBGManager_GetInfosVariable(size_t Adr, size_t Index) +{ + if ((DBGType & DBG_ELFDWARF)) + { + return (S_VariablesStruct*)DWARFManager_GetInfosVariable(Adr, Index); + } + else + { + return NULL; + } +} + + +// Get global variable's Address based on his Name +// Return found Address +// Return NULL if no Address has been found +size_t DBGManager_GetGlobalVariableAdrFromName(char *VariableName) +{ + if ((DBGType & DBG_ELFDWARF)) + { + return DWARFManager_GetGlobalVariableAdrFromName(VariableName); + } + else + { + return 0; + } +} + + +#if 0 // Get number of local variables // Return 0 if none has been found size_t DBGManager_GetNbLocalVariables(size_t Adr) @@ -257,6 +305,7 @@ size_t DBGManager_GetNbGlobalVariables(void) return 0; } } +#endif // Get address from symbol name @@ -276,22 +325,7 @@ size_t DBGManager_GetAdrFromSymbolName(char *SymbolName) } -// Get global variable's Address based on his Name -// Return found Address -// Return NULL if no Address has been found -size_t DBGManager_GetGlobalVariableAdrFromName(char *VariableName) -{ - if ((DBGType & DBG_ELFDWARF)) - { - return DWARFManager_GetGlobalVariableAdrFromName(VariableName); - } - else - { - return 0; - } -} - - +#if 0 // Get local variable's type encoding based on his address and Index // Return the type encoding found // Return 0 if no type encoding has been found @@ -450,6 +484,71 @@ char *DBGManager_GetGlobalVariableValue(size_t Index) } +// Get local 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_GetLocalVariableTypeName(size_t Adr, size_t Index) +{ + if ((DBGType & DBG_ELFDWARF)) + { + return DWARFManager_GetLocalVariableTypeName(Adr, Index); + } + else + { + return NULL; + } +} + + +// Get local variable Op based on his Index +// Return variable Op's found +// Return 0 if no variable Op has been found +size_t DBGManager_GetLocalVariableOp(size_t Adr, size_t Index) +{ + if ((DBGType & DBG_ELFDWARF)) + { + return DWARFManager_GetLocalVariableOp(Adr, Index); + } + else + { + return 0; + } +} + + +// Get local variable name based on his Index +// Return variable name's text pointer found +// Return NULL if no variable name has been found +char *DBGManager_GetLocalVariableName(size_t Adr, size_t Index) +{ + if ((DBGType & DBG_ELFDWARF)) + { + return DWARFManager_GetLocalVariableName(Adr, Index); + } + else + { + return NULL; + } +} + + +// Get global variable name based on his Index +// Return variable name's text pointer found +// Return NULL if no variable name has been found +char *DBGManager_GetGlobalVariableName(size_t Index) +{ + if ((DBGType & DBG_ELFDWARF)) + { + return DWARFManager_GetGlobalVariableName(Index); + } + else + { + return NULL; + } +} +#endif + + // Get variable value based on his Adresse, Encoding Type and Size // Return value as a text pointer // Note: Pointer may point on a 0 length text @@ -573,70 +672,6 @@ char *DBGManager_GetVariableValueFromAdr(size_t Adr, size_t TypeEncoding, size_t } -// Get local 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_GetLocalVariableTypeName(size_t Adr, size_t Index) -{ - if ((DBGType & DBG_ELFDWARF)) - { - return DWARFManager_GetLocalVariableTypeName(Adr, Index); - } - else - { - return NULL; - } -} - - -// Get local variable Op based on his Index -// Return variable Op's found -// Return 0 if no variable Op has been found -size_t DBGManager_GetLocalVariableOp(size_t Adr, size_t Index) -{ - if ((DBGType & DBG_ELFDWARF)) - { - return DWARFManager_GetLocalVariableOp(Adr, Index); - } - else - { - return 0; - } -} - - -// Get local variable name based on his Index -// Return variable name's text pointer found -// Return NULL if no variable name has been found -char *DBGManager_GetLocalVariableName(size_t Adr, size_t Index) -{ - if ((DBGType & DBG_ELFDWARF)) - { - return DWARFManager_GetLocalVariableName(Adr, Index); - } - else - { - return NULL; - } -} - - -// Get global variable name based on his Index -// Return variable name's text pointer found -// Return NULL if no variable name has been found -char *DBGManager_GetGlobalVariableName(size_t Index) -{ - if ((DBGType & DBG_ELFDWARF)) - { - return DWARFManager_GetGlobalVariableName(Index); - } - else - { - return NULL; - } -} - - // Get function name from address // Return function name found // Return NULL if no function name has been found diff --git a/src/debugger/DBGManager.h b/src/debugger/DBGManager.h index 5695eb0..8cd45b0 100644 --- a/src/debugger/DBGManager.h +++ b/src/debugger/DBGManager.h @@ -240,6 +240,26 @@ typedef enum { DBGOP; +// Variables internal structure +typedef struct VariablesStruct +{ + size_t Op; // Variable's DW_OP + union + { + size_t Addr; // Variable memory address + int Offset; // Variable stack offset (signed) + }; + char *PtrName; // Variable's name + size_t TypeOffset; // Offset pointing on the Variable's Type + size_t TypeByteSize; // Variable's Type byte size + size_t TypeTag; // Variable's Type Tag + size_t TypeEncoding; // Variable's Type encoding + char *PtrTypeName; // Variable's Type name + size_t NbTabVariables; // Number of Variable's members + VariablesStruct **TabVariables; // Variable's Members (used for structures at the moment) +}S_VariablesStruct; + + // Internal manager extern void DBGManager_Init(void); extern void DBGManager_SetType(size_t DBGTypeSet); @@ -259,7 +279,6 @@ extern size_t DBGManager_GetSrcNbListPtrFromIndex(size_t Index, bool Used); extern size_t *DBGManager_GetSrcNumLinesPtrFromIndex(size_t Index, bool Used); // General manager -extern char *DBGManager_GetVariableValueFromAdr(size_t Adr, size_t TypeEncoding, size_t TypeByteSize); extern size_t DBGManager_GetSrcLanguageFromIndex(size_t Index); // Functions manager @@ -274,6 +293,15 @@ extern char *DBGManager_GetFullSourceFilenameFromAdr(size_t Adr, DBGstatus *Stat extern char *DBGManager_GetNumFullSourceFilename(size_t Index); extern char *DBGManager_GetNumSourceFilename(size_t Index); +// Variables manager +extern size_t DBGManager_GetNbVariables(size_t Adr); +extern S_VariablesStruct* DBGManager_GetInfosVariable(size_t Adr, size_t Index); +extern char *DBGManager_GetVariableValueFromAdr(size_t Adr, size_t TypeEncoding, size_t TypeByteSize); + +// Global variables manager +extern size_t DBGManager_GetGlobalVariableAdrFromName(char *VariableName); + +#if 0 // Global variables manager extern size_t DBGManager_GetNbGlobalVariables(void); extern char *DBGManager_GetGlobalVariableName(size_t Index); @@ -281,7 +309,6 @@ extern size_t DBGManager_GetGlobalVariableTypeEncoding(size_t Index); extern char *DBGManager_GetGlobalVariableTypeName(size_t Index); extern size_t DBGManager_GetGlobalVariableTypeByteSize(size_t Index); extern size_t DBGManager_GetGlobalVariableAdr(size_t Index); -extern size_t DBGManager_GetGlobalVariableAdrFromName(char *VariableName); extern char *DBGManager_GetGlobalVariableValue(size_t Index); extern size_t DBGManager_GetGlobalVariableTypeTag(size_t Index); @@ -294,6 +321,7 @@ extern size_t DBGManager_GetLocalVariableTypeByteSize(size_t Adr, size_t Index); extern size_t DBGManager_GetLocalVariableTypeTag(size_t Adr, size_t Index); extern size_t DBGManager_GetLocalVariableOp(size_t Adr, size_t Index); extern int DBGManager_GetLocalVariableOffset(size_t Adr, size_t Index); +#endif #endif // __DBGMANAGER_H__ -- 2.20.1