OpenCores
URL https://opencores.org/ocsvn/riscv_vhdl/riscv_vhdl/trunk

Subversion Repositories riscv_vhdl

[/] [riscv_vhdl/] [trunk/] [debugger/] [src/] [gui_plugin/] [CpuWidgets/] [StackTraceArea.cpp] - Blame information for rev 2

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 2 sergeykhbr
/**
2
 * @file
3
 * @copyright  Copyright 2017 GNSS Sensor Ltd. All right reserved.
4
 * @author     Sergey Khabarov - sergeykhbr@gmail.com
5
 * @brief      Stack Trace main area.
6
 */
7
 
8
#include "coreservices/ielfreader.h"
9
#include "StackTraceArea.h"
10
#include "moc_StackTraceArea.h"
11
 
12
#include <memory>
13
#include <string.h>
14
#include <QtWidgets/QBoxLayout>
15
#include <QtWidgets/QLabel>
16
#include <QtWidgets/QHeaderView>
17
#include <QtWidgets/QScrollBar>
18
 
19
namespace debugger {
20
 
21
StackTraceArea::StackTraceArea(IGui *gui, QWidget *parent)
22
    : QTableWidget(parent) {
23
    igui_ = gui;
24
 
25
    clear();
26
    QFont font("Courier");
27
    font.setStyleHint(QFont::Monospace);
28
    font.setPointSize(8);
29
    font.setFixedPitch(true);
30
    setFont(font);
31
    setContentsMargins(QMargins(0, 0, 0, 0));
32
    QFontMetrics fm(font);
33
    setMinimumWidth(50 + fm.width(tr(
34
    "0x0001040 (some_symbol_name+0x40)  0x0001040 (some_symbol_name+0x40)")));
35
    lineHeight_ = fm.height() + 4;
36
    hideLineIdx_ = 0;
37
    symbolList_.make_nil();
38
 
39
    setColumnCount(COL_Total);
40
    setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding);
41
    setListSize(1);
42
 
43
    verticalHeader()->setVisible(false);        // remove row indexes
44
    setShowGrid(false);                         // remove borders
45
    setSelectionMode(QAbstractItemView::SingleSelection);
46
    setSelectionBehavior(QAbstractItemView::SelectRows); //select full row
47
 
48
    // change selected row color
49
    QPalette *palette = new QPalette();
50
    palette->setColor(QPalette::Highlight, Qt::gray);
51
    setPalette(*palette);
52
 
53
    setHorizontalHeaderLabels(
54
        QString("call;at address").split(";"));
55
    setColumnWidth(COL_at_addr,
56
        10 + fm.width(tr("0x0001040 (some_symbol_name+0x40)")));
57
    setColumnWidth(COL_call_addr,
58
        10 + fm.width(tr("0x0001040 (some_symbol_name+0x40)")));
59
 
60
    connect(this, SIGNAL(signalHandleResponse()),
61
            this, SLOT(slotHandleResponse()));
62
 
63
    connect(this, SIGNAL(cellDoubleClicked(int, int)),
64
            this, SLOT(slotCellDoubleClicked(int, int)));
65
}
66
 
67
StackTraceArea::~StackTraceArea() {
68
    igui_->removeFromQueue(static_cast<IGuiCmdHandler *>(this));
69
}
70
 
71
void StackTraceArea::slotUpdateByTimer() {
72
    AttributeType cmdStack("stack");
73
    igui_->registerCommand(static_cast<IGuiCmdHandler *>(this),
74
                            &cmdStack, true);
75
}
76
 
77
void StackTraceArea::setListSize(int sz) {
78
    if (sz > rowCount()) {
79
        for (int i = hideLineIdx_; i < rowCount(); i++) {
80
            showRow(i);
81
        }
82
        hideLineIdx_ = sz;
83
 
84
        Qt::ItemFlags fl;
85
        int rowcnt_cur = rowCount();
86
        setRowCount(sz);
87
        for (int i = rowcnt_cur; i < rowCount(); i++) {
88
            for (int n = 0; n < COL_Total; n++) {
89
                setItem(i, n, new QTableWidgetItem());
90
                fl = item(i, n)->flags();
91
                fl &= ~Qt::ItemIsEditable;
92
                //fl &= ~Qt::ItemIsSelectable;
93
                item(i, n)->setFlags(fl);
94
            }
95
            setRowHeight(i, lineHeight_);
96
        }
97
    } else {
98
        for (int i = hideLineIdx_; i < sz; i++) {
99
            showRow(i);
100
        }
101
        hideLineIdx_ = sz;
102
        for (int i = sz; i < rowCount(); i++) {
103
            hideRow(i);
104
        }
105
    }
106
}
107
 
108
void StackTraceArea::handleResponse(AttributeType *req,
109
                                    AttributeType *resp) {
110
    if (strstr(req->to_string(), "stack") == 0) {
111
        return;
112
    }
113
    if (!symbolList_.is_nil()) {
114
        return;
115
    }
116
    symbolList_ = *resp;
117
    emit signalHandleResponse();
118
}
119
 
120
void StackTraceArea::slotHandleResponse() {
121
    if (!symbolList_.is_list()) {
122
        return;
123
    }
124
    QTableWidgetItem *pw;
125
    uint64_t addr;
126
    int list_sz = static_cast<int>(symbolList_.size());
127
    setListSize(list_sz);
128
    symbolAddr_.make_list(list_sz);
129
 
130
    for (int i = 0; i < list_sz; i++) {
131
        AttributeType &symb = symbolList_[i];
132
        AttributeType &saddr = symbolAddr_[i];
133
        saddr.make_list(2);
134
 
135
        // [from, ['symb_name',symb_offset], to, ['symb_name',symb_offset]]
136
        addr = symb[2].to_uint64();
137
        saddr[COL_call_addr].make_uint64(addr);
138
        pw = item(i, COL_call_addr);
139
        pw->setText(makeSymbolQString(addr, symb[3]));
140
 
141
        addr = symb[0u].to_uint64();
142
        saddr[COL_at_addr].make_uint64(addr);
143
        pw = item(i, COL_at_addr);
144
        pw->setText(makeSymbolQString(addr, symb[1]));
145
    }
146
    symbolList_.make_nil();
147
}
148
 
149
QString StackTraceArea::makeSymbolQString(uint64_t addr, AttributeType &info) {
150
    QString ret = QString("%1 ").arg(addr, 8, 16, QChar('0'));
151
    if (!info.is_list() || info.size() != 2) {
152
        return ret;
153
    }
154
    if (!info[0u].is_string() || info[0u].size() == 0) {
155
        return ret;
156
    }
157
    ret += "(";
158
    ret += QString(tr(info[0u].to_string()));
159
    uint64_t offset = info[1].to_uint64();
160
    if (offset) {
161
        ret += QString("+%1h").arg(offset, 0, 16);
162
    }
163
    ret += ")";
164
    return ret;
165
}
166
 
167
void StackTraceArea::slotCellDoubleClicked(int row, int column) {
168
    uint64_t addr;
169
    if (row >= static_cast<int>(symbolAddr_.size())) {
170
        return;
171
    }
172
    addr = symbolAddr_[row][column].to_uint64();
173
 
174
    emit signalShowFunction(addr, 0);
175
}
176
 
177
}  // namespace debugger

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.