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