Added search paths in case of missing DWARF directories information
[clinton/Virtual-Jaguar-Rx.git] / src / debugger / localbrowser.cpp
CommitLineData
0203b5fd
JPM
1//\r
2// localbrowser.cpp - Local variables\r
3//\r
4// by Jean-Paul Mari\r
5//\r
6// JPM = Jean-Paul Mari <djipi.mari@gmail.com>\r
7//\r
8// Who When What\r
9// --- ---------- -----------------------------------------------------------\r
10// JPM 11/03/2017 Created this file\r
2b91c435
JPM
11// JPM 09/08/2018 Added a status bar and better status report\r
12// JPM 09/08/2018 Set information values in a tab\r
13//\r
14\r
15// STILL TO DO:\r
16// Feature to list the pointer(s) in the code using the allocation\r
17// To set the information display at the right\r
18// To support the array\r
0203b5fd
JPM
19//\r
20\r
21\r
22#include "debugger/localbrowser.h"\r
23#include "memory.h"\r
24#include "debugger/DBGManager.h"\r
25#include "settings.h"\r
26#include "m68000/m68kinterface.h"\r
27\r
28\r
29// \r
30LocalBrowserWindow::LocalBrowserWindow(QWidget * parent/*= 0*/) : QWidget(parent, Qt::Dialog),\r
2b91c435
JPM
31layout(new QVBoxLayout),\r
32#ifdef LOCAL_LAYOUTTEXTS\r
33text(new QTextBrowser),\r
34#else\r
35TableView(new QTableView),\r
36model(new QStandardItemModel),\r
37#endif\r
38NbLocal(0),\r
39FuncName((char *)calloc(1, 1)),\r
40LocalInfo(NULL),\r
41statusbar(new QStatusBar)\r
0203b5fd 42{\r
2b91c435 43 setWindowTitle(tr("Locals"));\r
0203b5fd 44\r
2b91c435 45 // Set the font\r
0203b5fd 46 QFont fixedFont("Lucida Console", 8, QFont::Normal);\r
0203b5fd 47 fixedFont.setStyleHint(QFont::TypeWriter);\r
0203b5fd 48\r
2b91c435
JPM
49#ifdef LOCAL_LAYOUTTEXTS\r
50 // Set original layout\r
51 text->setFont(fixedFont);\r
0203b5fd 52 layout->addWidget(text);\r
2b91c435
JPM
53#else\r
54 // Set the new layout with proper identation and readibility\r
55 model->setColumnCount(3);\r
56 model->setHeaderData(0, Qt::Horizontal, QObject::tr("Name"));\r
57 model->setHeaderData(1, Qt::Horizontal, QObject::tr("Value"));\r
58 model->setHeaderData(2, Qt::Horizontal, QObject::tr("Type"));\r
59 // Information table\r
60 TableView->setModel(model);\r
61 TableView->setEditTriggers(QAbstractItemView::NoEditTriggers);\r
62 TableView->setShowGrid(0);\r
63 TableView->setFont(fixedFont);\r
64 TableView->verticalHeader()->setDefaultSectionSize(TableView->verticalHeader()->minimumSectionSize());\r
65 TableView->verticalHeader()->setDefaultAlignment(Qt::AlignRight);\r
66 layout->addWidget(TableView);\r
67#endif\r
68\r
69 // Status bar\r
70 layout->addWidget(statusbar);\r
71 setLayout(layout);\r
0203b5fd
JPM
72}\r
73\r
74\r
75//\r
76LocalBrowserWindow::~LocalBrowserWindow(void)\r
77{\r
78 free(LocalInfo);\r
79 free(FuncName);\r
0203b5fd
JPM
80}\r
81\r
82\r
83//\r
84bool LocalBrowserWindow::UpdateInfos(void)\r
85{\r
86 size_t Adr;\r
87 char *Ptr;\r
88\r
89 if (NbLocal = DBGManager_GetNbLocalVariables(Adr = m68k_get_reg(NULL, M68K_REG_PC)))\r
90 {\r
91 if (Ptr = DBGManager_GetFunctionName(Adr))\r
92 {\r
93 if (strcmp(FuncName, Ptr))\r
94 {\r
47b6ecae 95 if (FuncName = (char *)realloc(FuncName, strlen(Ptr) + 1))\r
0203b5fd 96 {\r
47b6ecae
JPM
97 strcpy(FuncName, Ptr);\r
98\r
99 if (LocalInfo = (WatchInfo *)realloc(LocalInfo, (sizeof(WatchInfo) * NbLocal)))\r
0203b5fd 100 {\r
47b6ecae
JPM
101 for (size_t i = 0; i < NbLocal; i++)\r
102 {\r
103 // Get local variable name and his information\r
104 if (LocalInfo[i].PtrVariableName = DBGManager_GetLocalVariableName(Adr, i + 1))\r
105 {\r
106 LocalInfo[i].Op = DBGManager_GetLocalVariableOp(Adr, i + 1);\r
107 LocalInfo[i].Adr = NULL;\r
108 LocalInfo[i].PtrCPURegisterName = NULL;\r
109 LocalInfo[i].TypeTag = DBGManager_GetLocalVariableTypeTag(Adr, i + 1);\r
110 LocalInfo[i].PtrVariableBaseTypeName = DBGManager_GetLocalVariableTypeName(Adr, i + 1);\r
111 LocalInfo[i].TypeEncoding = DBGManager_GetLocalVariableTypeEncoding(Adr, i + 1);\r
112 LocalInfo[i].TypeByteSize = DBGManager_GetLocalVariableTypeByteSize(Adr, i + 1);\r
113 LocalInfo[i].Offset = DBGManager_GetLocalVariableOffset(Adr, i + 1);\r
114 }\r
115 }\r
0203b5fd
JPM
116 }\r
117 }\r
118 }\r
119\r
120 return true;\r
121 }\r
122 }\r
123\r
124 *FuncName = 0;\r
125\r
126 return false;\r
127}\r
128\r
129\r
130//\r
131void LocalBrowserWindow::RefreshContents(void)\r
132{\r
2b91c435 133#ifdef LOCAL_LAYOUTTEXTS\r
0203b5fd 134 char string[1024];\r
2b91c435
JPM
135#endif\r
136 size_t Error = LOCAL_NOERROR;\r
0203b5fd 137 QString Local;\r
2b91c435
JPM
138 QString MSG;\r
139 char Value1[100];\r
140#ifdef LOCAL_SUPPORTARRAY\r
0203b5fd 141 char Value[100];\r
2b91c435 142#endif\r
0203b5fd 143 char *PtrValue;\r
0203b5fd 144\r
e857856a
JPM
145 const char *CPURegName[] = { "D0", "D1", "D2", "D3", "D4", "D5", "D6", "D7", "A0", "A1", "A2", "A3", "A4", "A5", "A6", "A7" };\r
146\r
0203b5fd
JPM
147 if (isVisible())\r
148 {\r
2b91c435
JPM
149#ifndef LOCAL_LAYOUTTEXTS\r
150 model->setRowCount(0);\r
151#endif\r
0203b5fd
JPM
152 if (UpdateInfos())\r
153 {\r
0203b5fd
JPM
154 for (size_t i = 0; i < NbLocal; i++)\r
155 {\r
156 if (LocalInfo[i].PtrVariableName)\r
157 {\r
2b91c435
JPM
158 memset(Value1, 0, sizeof(Value1));\r
159#ifdef LOCAL_LAYOUTTEXTS\r
160 if (i)\r
161 {\r
162 Local += QString("<br>");\r
163 }\r
164#else\r
165 model->insertRow(i);\r
166#endif\r
169c1409
JPM
167 // Local or parameters variables\r
168 if (((LocalInfo[i].Op >= DBG_OP_breg0) && (LocalInfo[i].Op <= DBG_OP_breg31)) || (LocalInfo[i].Op == DBG_OP_fbreg))\r
0203b5fd
JPM
169 {\r
170 LocalInfo[i].Adr = m68k_get_reg(NULL, M68K_REG_A6) + LocalInfo[i].Offset;\r
171\r
169c1409
JPM
172 if ((LocalInfo[i].Op == DBG_OP_fbreg))\r
173 {\r
174 LocalInfo[i].Adr += 8;\r
175 }\r
176\r
0203b5fd
JPM
177 if ((LocalInfo[i].Adr >= 0) && (LocalInfo[i].Adr < vjs.DRAM_size))\r
178 {\r
2b91c435
JPM
179 if ((LocalInfo[i].TypeTag & (DBG_TAG_TYPE_array | DBG_TAG_TYPE_structure)))\r
180 {\r
181#if defined(LOCAL_SUPPORTARRAY) || defined(LOCAL_SUPPORTSTRUCTURE)\r
182 //memcpy(Value1, &jaguarMainRAM[LocalInfo[i].Adr], 20);\r
183#ifdef LOCAL_LAYOUTTEXTS\r
184 //sprintf(Value, "\"%s\"", Value1);\r
185#else\r
186 //sprintf(Value, "0x%06X, \"%s\"", LocalInfo[i].Adr, Value1);\r
187#endif\r
188 //PtrValue = Value;\r
189 PtrValue = NULL;\r
190#else\r
191 PtrValue = NULL;\r
192#endif\r
193 }\r
194 else\r
195 {\r
196 PtrValue = DBGManager_GetVariableValueFromAdr(LocalInfo[i].Adr, LocalInfo[i].TypeEncoding, LocalInfo[i].TypeByteSize);\r
197 }\r
0203b5fd
JPM
198 }\r
199 else\r
200 {\r
201 PtrValue = NULL;\r
202 }\r
203 }\r
204 else\r
205 {\r
e857856a 206 // Value from CPU register\r
0203b5fd
JPM
207 if ((LocalInfo[i].Op >= DBG_OP_reg0) && (LocalInfo[i].Op <= DBG_OP_reg31))\r
208 {\r
e857856a 209 LocalInfo[i].PtrCPURegisterName = (char *)CPURegName[(LocalInfo[i].Op - DBG_OP_reg0)];\r
2b91c435 210 PtrValue = itoa(m68k_get_reg(NULL, (m68k_register_t)((size_t)M68K_REG_D0 + (LocalInfo[i].Op - DBG_OP_reg0))), Value1, 10);\r
0203b5fd
JPM
211 }\r
212 else\r
213 {\r
214 PtrValue = NULL;\r
215 }\r
216 }\r
217\r
2b91c435
JPM
218#ifndef LOCAL_LAYOUTTEXTS\r
219 model->setItem(i, 0, new QStandardItem(QString("%1").arg(LocalInfo[i].PtrVariableName)));\r
220#endif\r
221 // Check if the local variable is use by the code\r
47b6ecae 222 if (!LocalInfo[i].Op)\r
0203b5fd 223 {\r
2b91c435 224#ifdef LOCAL_LAYOUTTEXTS\r
47b6ecae 225 sprintf(string, "<font color='#A52A2A'>%i : %s | %s | [Not used]</font>", (i + 1), (LocalInfo[i].PtrVariableBaseTypeName ? LocalInfo[i].PtrVariableBaseTypeName : (char *)"<font color='#ff0000'>N/A</font>"), LocalInfo[i].PtrVariableName);\r
2b91c435
JPM
226#else\r
227#endif\r
0203b5fd
JPM
228 }\r
229 else\r
230 {\r
2b91c435
JPM
231#ifndef LOCAL_LAYOUTTEXTS\r
232 model->setItem(i, 1, new QStandardItem(QString("%1").arg(PtrValue)));\r
233#else\r
47b6ecae
JPM
234 sprintf(string, "%i : %s | %s | ", (i + 1), (LocalInfo[i].PtrVariableBaseTypeName ? LocalInfo[i].PtrVariableBaseTypeName : (char *)"<font color='#ff0000'>N/A</font>"), LocalInfo[i].PtrVariableName);\r
235 Local += QString(string);\r
2b91c435 236\r
47b6ecae 237 if ((unsigned int)LocalInfo[i].Adr)\r
e857856a 238 {\r
47b6ecae 239 sprintf(string, "0x%06X", (unsigned int)LocalInfo[i].Adr);\r
e857856a
JPM
240 }\r
241 else\r
242 {\r
47b6ecae
JPM
243 if (LocalInfo[i].PtrCPURegisterName)\r
244 {\r
245 sprintf(string, "<font color='#0000FF'>%s</font>", LocalInfo[i].PtrCPURegisterName);\r
246 }\r
247 else\r
248 {\r
249 sprintf(string, "%s", (char *)"<font color='#ff0000'>N/A</font>");\r
250 }\r
251 }\r
2b91c435 252\r
47b6ecae
JPM
253 Local += QString(string);\r
254 sprintf(string, " | %s", (!PtrValue ? (char *)"<font color='#ff0000'>N/A</font>" : PtrValue));\r
2b91c435 255#endif\r
0203b5fd 256 }\r
2b91c435
JPM
257#ifndef LOCAL_LAYOUTTEXTS\r
258 model->setItem(i, 2, new QStandardItem(QString("%1").arg((LocalInfo[i].PtrVariableBaseTypeName ? LocalInfo[i].PtrVariableBaseTypeName : (char *)"<font color='#ff0000'>N/A</font>"))));\r
259#else\r
0203b5fd 260 Local += QString(string);\r
2b91c435 261#endif\r
0203b5fd
JPM
262 }\r
263 }\r
264\r
2b91c435
JPM
265 MSG += QString("Ready");\r
266#ifdef LOCAL_LAYOUTTEXTS\r
0203b5fd
JPM
267 text->clear();\r
268 text->setText(Local);\r
2b91c435 269#endif\r
0203b5fd
JPM
270 }\r
271 else\r
272 {\r
2b91c435
JPM
273 // No locals\r
274 MSG += QString("No locals");\r
275 Error = LOCAL_NOLOCALS;\r
276#ifdef LOCAL_LAYOUTTEXTS\r
0203b5fd 277 text->clear();\r
2b91c435
JPM
278#endif\r
279 }\r
280\r
281 // Display status bar\r
282 if (Error)\r
283 {\r
284 if ((Error & LOCAL_WARNING))\r
285 {\r
286 statusbar->setStyleSheet("background-color: lightyellow; font: bold");\r
287 }\r
288 else\r
289 {\r
290 statusbar->setStyleSheet("background-color: tomato; font: bold");\r
291 }\r
292 }\r
293 else\r
294 {\r
295 statusbar->setStyleSheet("background-color: lightgreen; font: bold");\r
0203b5fd 296 }\r
2b91c435 297 statusbar->showMessage(MSG);\r
0203b5fd
JPM
298 }\r
299}\r
300\r
301\r
a2dfb8e5 302// \r
0203b5fd
JPM
303void LocalBrowserWindow::keyPressEvent(QKeyEvent * e)\r
304{\r
305 if (e->key() == Qt::Key_Escape)\r
a2dfb8e5 306 {\r
0203b5fd 307 hide();\r
a2dfb8e5 308 }\r
0203b5fd 309}\r