044bd03fe4ae5531592c04e771d61b2fe03d906f
2 // DBGManager.cpp: Debugger information manager
6 // JPM = Jean-Paul Mari <djipi.mari@gmail.com>
9 // --- ---------- ------------------------------------------------------------
10 // JPM 12/21/2016 Created this file
11 // JPM Various efforts to set the ELF format support
12 // JPM Various efforts to set the DWARF format support
17 #include "libelf/libelf.h"
18 #include "libelf/gelf.h"
20 #include "ELFManager.h"
21 #include "DwarfManager.h"
22 #include "DBGManager.h"
23 #include "HWLABELManager.h"
29 char *DBGManager_GetVariableValueFromAdr(uint32_t Adr
, uint32_t TypeEncoding
, uint32_t TypeByteSize
);
48 // Common debugger variables
53 // Common debugger initialisation
54 void DBGManager_Init(void)
56 DBGType
= DBG_NO_TYPE
;
62 // Common debugger reset
63 void DBGManager_Reset(void)
65 if ((DBGType
& DBG_DWARF
))
70 if ((DBGType
& DBG_ELF
))
75 //DBGType = vjs.displayHWlabels ? DBG_HWLABEL : DBG_NO_TYPE;
76 DBGType
= DBG_NO_TYPE
;
80 // Common debugger set
81 void DBGManager_SetType(size_t DBGTypeSet
)
83 DBGType
|= DBGTypeSet
;
87 // Common debugger close
88 void DBGManager_Close(void)
90 if ((DBGType
& DBG_DWARF
))
95 if ((DBGType
& DBG_ELF
))
102 // Get source filename based on the memeory address
103 // return NULL if no source filename
104 char *DBGManager_GetFullSourceFilenameFromAdr(size_t Adr
, bool *Error
)
106 if ((DBGType
& DBG_ELFDWARF
))
108 return DWARFManager_GetFullSourceFilenameFromAdr(Adr
, Error
);
117 // Get number of external variables
118 // Return 0 if none has been found
119 size_t DBGManager_GetNbExternalVariables(void)
121 if ((DBGType
& DBG_ELFDWARF
))
123 return DWARFManager_GetNbExternalVariables();
133 size_t DBGManager_GetAdrFromSymbolName(char *SymbolName
)
135 if ((DBGType
& DBG_ELF
))
137 return ELFManager_GetAdrFromSymbolName(SymbolName
);
146 // Get external variable's Address based on his Name
147 // Return found Address
148 // Return NULL if no Address has been found
149 size_t DBGManager_GetExternalVariableAdrFromName(char *VariableName
)
151 if ((DBGType
& DBG_ELFDWARF
))
153 return DWARFManager_GetExternalVariableAdrFromName(VariableName
);
163 size_t DBGManager_GetExternalVariableTypeTag(size_t Index
)
165 if ((DBGType
& DBG_ELFDWARF
))
167 return DWARFManager_GetExternalVariableTypeTag(Index
);
176 // Get external variable's type name based on his Index
177 // Return type name's text pointer found
178 // Return NULL if no type name has been found
179 char *DBGManager_GetExternalVariableTypeName(size_t Index
)
181 if ((DBGType
& DBG_ELFDWARF
))
183 return DWARFManager_GetExternalVariableTypeName(Index
);
192 // Get external variable's Address based on his Index
193 // Return the Address found
194 // Return 0 if no Address has been found
195 size_t DBGManager_GetExternalVariableAdr(size_t Index
)
197 if ((DBGType
& DBG_ELFDWARF
))
199 return DWARFManager_GetExternalVariableAdr(Index
);
208 // Get external variable's type byte size based on his Index
209 // Return the type's byte size found
210 // Return 0 if no type's byte size has been found
211 size_t DBGManager_GetExternalVariableTypeByteSize(size_t Index
)
213 if ((DBGType
& DBG_ELFDWARF
))
215 return DWARFManager_GetExternalVariableTypeByteSize(Index
);
224 // Get external variable's type encoding based on his Index
225 // Return the type encoding found
226 // Return 0 if no type encoding has been found
227 size_t DBGManager_GetExternalVariableTypeEncoding(size_t Index
)
229 if ((DBGType
& DBG_ELFDWARF
))
231 return DWARFManager_GetExternalVariableTypeEncoding(Index
);
240 // Get external variable value based on his Index
241 // Return value as a text pointer
242 // Note: Pointer may point on a 0 lenght text
243 char *DBGManager_GetExternalVariableValue(size_t Index
)
246 uint32_t TypeEncoding
= DBG_NO_TYPEENCODING
;
247 uint32_t TypeByteSize
= 0;
249 if ((DBGType
& DBG_ELFDWARF
))
251 Adr
= DWARFManager_GetExternalVariableAdr(Index
);
252 TypeEncoding
= DWARFManager_GetExternalVariableTypeEncoding(Index
);
253 TypeByteSize
= DWARFManager_GetExternalVariableTypeByteSize(Index
);
256 return DBGManager_GetVariableValueFromAdr(Adr
, TypeEncoding
, TypeByteSize
);
260 // Get variable value based on his Adresse, Encoding Type and Size
261 // Return value as a text pointer
262 // Note: Pointer may point on a 0 lenght text if Adress is NULL
263 char *DBGManager_GetVariableValueFromAdr(uint32_t Adr
, uint32_t TypeEncoding
, uint32_t TypeByteSize
)
266 char *Ptrvalue
= value
;
272 memset(&V
, 0, sizeof(Value
));
274 for (uint32_t i
= 0; i
< TypeByteSize
; i
++)
275 jaguarMainRAM
[Adr
+ i
] = 0;
276 //jaguarMainRAM[Adr + i] = rand();
277 jaguarMainRAM
[Adr
+ TypeByteSize
- 1] = 0x10;
280 for (uint32_t i
= 0, j
= TypeByteSize
; i
< TypeByteSize
; i
++, j
--)
282 V
.C
[i
] = jaguarMainRAM
[Adr
+ j
- 1];
286 switch (TypeEncoding
)
288 case DBG_ATE_address
:
291 case DBG_ATE_boolean
:
294 case DBG_ATE_complex_float
:
298 switch (TypeByteSize
)
301 sprintf(value
, "%F", V
.F
);
305 //V.D = (double)jaguarMainRAM[Adr];
306 //sprintf(value, "%10.10F", V.D);
307 sprintf(value
, "%F", V
.D
);
316 switch (TypeByteSize
)
319 sprintf(value
, "%i", V
.SI
);
323 sprintf(value
, "%i", V
.SL
);
331 case DBG_ATE_signed_char
:
334 case DBG_ATE_unsigned
:
335 switch (TypeByteSize
)
338 sprintf(value
, "%u", V
.UI
);
342 sprintf(value
, "%u", V
.UL
);
350 case DBG_ATE_unsigned_char
:
354 switch (TypeByteSize
)
357 sprintf(value
, "0x%06x", V
.UI
);
373 // Get external variable name based on his Index
374 // Return variable name's text pointer found
375 // Return NULL if no variable name has been found
376 char *DBGManager_GetExternalVariableName(size_t Index
)
378 if ((DBGType
& DBG_ELFDWARF
))
380 return DWARFManager_GetExternalVariableName(Index
);
389 // Get line number from address and his tag
390 // Return line number on the symbol name found
391 // Return 0 if no symbol name has been found
392 size_t DBGManager_GetNumLineFromAdr(size_t Adr
, size_t Tag
)
394 if ((DBGType
& DBG_ELFDWARF
))
396 return DWARFManager_GetNumLineFromAdr(Adr
, Tag
);
405 // Get symbol name from address
406 // Return text pointer on the symbol name found
407 // Return NULL if no symbol name has been found
408 char *DBGManager_GetSymbolnameFromAdr(size_t Adr
)
412 //if ((DBGType & DBG_HWLABEL) || vjs.displayHWlabels)
413 if (vjs
.displayHWlabels
)
415 Symbolname
= HWLABELManager_GetSymbolnameFromAdr(Adr
);
422 #pragma message("Warning: !!! Need to set the DBG_HWLABEL in DBGType instead to use the setting value !!!")
424 #warning "!!! Need to set the DBG_HWLABEL in DBGType instead to use the setting value !!!"
427 if (Symbolname
== NULL
)
429 if ((DBGType
& DBG_ELFDWARF
))
431 Symbolname
= DWARFManager_GetSymbolnameFromAdr(Adr
);
434 if ((DBGType
& DBG_ELF
) && (Symbolname
== NULL
))
436 Symbolname
= ELFManager_GetSymbolnameFromAdr(Adr
);
444 // Get source line based on the Address and his Tag
445 // Return text pointer on the source line found
446 // Return NULL if no source line has been found
447 char *DBGManager_GetLineSrcFromAdr(size_t Adr
, size_t Tag
)
449 char *Symbolname
= NULL
;
451 if ((DBGType
& DBG_ELFDWARF
))
453 Symbolname
= DWARFManager_GetLineSrcFromAdr(Adr
, Tag
);
460 // Get text line from source based on address and num line (starting by 1)
461 // Return NULL if no text line has been found
462 char *DBGManager_GetLineSrcFromAdrNumLine(size_t Adr
, size_t NumLine
)
464 char *Symbolname
= NULL
;
466 if ((DBGType
& DBG_ELFDWARF
))
468 Symbolname
= DWARFManager_GetLineSrcFromAdrNumLine(Adr
, NumLine
);
475 // Get text line from source based on address and num line (starting by 1)
476 // Return NULL if no text line has been found
477 char *DBGManager_GetLineSrcFromNumLineBaseAdr(size_t Adr
, size_t NumLine
)
479 char *Symbolname
= NULL
;
481 if ((DBGType
& DBG_ELFDWARF
))
483 Symbolname
= DWARFManager_GetLineSrcFromNumLineBaseAdr(Adr
, NumLine
);