2 // callstackbrowser.cpp - Call Stack
6 // JPM = Jean-Paul Mari <djipi.mari@gmail.com>
9 // --- ---------- -----------------------------------------------------------
10 // JPM 08/31/2018 Created this file
11 // JPM 09/12/2018 Added a status bar and better status report
12 // JPM 10/20/2018 Added the return address information in the call stack
13 // JPM 08/09/2019 Prevent crash in case of call stack is out of range
14 // JPM Aug./2020 Added different layouts
17 // To set the information display at the right
18 // To use DWARF frame information?
19 // To check if call stack pointer is used (DWARF information?)
22 #include "debugger/callstackbrowser.h"
24 #include "debugger/DBGManager.h"
25 #include "m68000/m68kinterface.h"
30 CallStackBrowserWindow::CallStackBrowserWindow(QWidget
* parent
/*= 0*/) : QWidget(parent
, Qt::Dialog
),
32 text(new QTextBrowser
),
34 TableView(new QTableView
),
35 model(new QStandardItemModel
),
37 statusbar(new QStatusBar
),
38 layout(new QVBoxLayout
)
40 setWindowTitle(tr("Call Stack"));
43 QFont
fixedFont("Lucida Console", 8, QFont::Normal
);
44 fixedFont
.setStyleHint(QFont::TypeWriter
);
47 // Set original layout
48 text
->setFont(fixedFont
);
49 layout
->addWidget(text
);
51 // Set the new layout with proper identation and readibility
52 model
->setColumnCount(3);
53 model
->setHeaderData(0, Qt::Horizontal
, QObject::tr("Name"));
54 model
->setHeaderData(1, Qt::Horizontal
, QObject::tr("Line"));
55 model
->setHeaderData(2, Qt::Horizontal
, QObject::tr("Return address"));
57 TableView
->setModel(model
);
58 TableView
->setEditTriggers(QAbstractItemView::NoEditTriggers
);
59 TableView
->setShowGrid(0);
60 TableView
->setFont(fixedFont
);
61 TableView
->verticalHeader()->setDefaultSectionSize(TableView
->verticalHeader()->minimumSectionSize());
62 TableView
->verticalHeader()->setDefaultAlignment(Qt::AlignRight
);
63 layout
->addWidget(TableView
);
67 layout
->addWidget(statusbar
);
73 CallStackBrowserWindow::~CallStackBrowserWindow(void)
79 void CallStackBrowserWindow::RefreshContents(void)
82 size_t Error
= CS_NOERROR
;
83 unsigned int a6
, Sa6
, ret
;
96 #ifndef CS_LAYOUTTEXTS
97 model
->setRowCount(0);
99 if ((a6
= m68k_get_reg(NULL
, M68K_REG_A6
)) && DBGManager_GetType())
101 while ((Sa6
= a6
) && !NumError
)
103 if ((Sa6
>= (m68k_get_reg(NULL
, M68K_REG_SP
) - 4)) && (Sa6
< vjs
.DRAM_size
))
105 a6
= GET32(jaguarMainRAM
, Sa6
);
106 ret
= GET32(jaguarMainRAM
, Sa6
+ 4);
107 #ifdef CS_LAYOUTTEXTS
108 sprintf(string
, "0x%06X | Ret: 0x%06X | From: %s - 0x%06X | Line: %s", Sa6
, ret
, (FuncName
= DBGManager_GetFunctionName(ret
)), (unsigned int)DBGManager_GetAdrFromSymbolName(FuncName
), DBGManager_GetLineSrcFromAdr(ret
, DBG_NO_TAG
));
109 CallStack
+= QString(string
);
112 CallStack
+= QString("<br>");
115 model
->insertRow(NbRaw
);
116 model
->setItem(NbRaw
, 0, new QStandardItem(QString("%1").arg((FuncName
= DBGManager_GetFunctionName(ret
)) ? FuncName
: "(N/A)")));
117 FunctionName
= QString(FuncName
= DBGManager_GetLineSrcFromAdr(ret
, DBG_NO_TAG
));
118 //FunctionName.replace(" ", " ");
119 model
->setItem(NbRaw
, 1, new QStandardItem(QString("%1").arg(FuncName
? FunctionName
: "(N/A)")));
120 sprintf(msg
, "0x%06X", ret
);
121 model
->setItem(NbRaw
++, 2, new QStandardItem(QString("%1").arg(msg
)));
129 #ifdef CS_LAYOUTTEXTS
131 text
->setText(CallStack
);
136 sprintf(msg
, "Ready");
141 sprintf(msg
, "Call Stack out of range");
146 sprintf(msg
, "Call Stack in limbo");
153 sprintf(msg
, "Call Stack not available");
154 Error
= CS_NOCALLSTACK
;
155 #ifdef CS_LAYOUTTEXTS
160 // Display status bar
163 if ((Error
& CS_WARNING
))
165 statusbar
->setStyleSheet("background-color: lightyellow; font: bold");
169 statusbar
->setStyleSheet("background-color: tomato; font: bold");
174 statusbar
->setStyleSheet("background-color: lightgreen; font: bold");
176 statusbar
->showMessage(QString(msg
));
182 void CallStackBrowserWindow::keyPressEvent(QKeyEvent
* e
)
184 if (e
->key() == Qt::Key_Escape
)