Skip to content

feat: support risc-v #709

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open

feat: support risc-v #709

wants to merge 1 commit into from

Conversation

lievenhey
Copy link
Contributor

Requires KDAB/perfparser#39 to be merged. Fixes: #705

@lievenhey
Copy link
Contributor Author

@dendibakh I added some support for risc-v. I can't really test this, but the result looks sane.

Requires KDAB/perfparser#39 to be merged.
Fixes: #705
@dendibakh
Copy link

Thanks @lievenhey! Is there an easy way for me to test this? IIRC, building hotspots from sources is not trivial. But if I can update a few libs and test, then I can test the fix.

@lievenhey
Copy link
Contributor Author

@dendibakh there is a ci job running which builds an appimage. You can download the current appimage here https://github.com/KDAB/hotspot/actions/runs/14440980603?pr=709

@dendibakh
Copy link

Thanks @lievenhey. The appimage is x86, so I can't install it on my P550 board. However, I installed it on a Linux x86 system and opened the profile there. I can see the correct function names, which is good.
image
I can't see the disassembly for the solution function though -- it shows a blank window.

@lievenhey
Copy link
Contributor Author

Yeah the disassembly is a little bit funky but I am working on a better solution.

@lievenhey
Copy link
Contributor Author

I am still not sure if hotspot works with bigger recordings of riscv programs. But I don't have a risc-v board so I can't test it.

@dendibakh
Copy link

I see. How hard do you think it would be to add the riscv disasm support to hotspot (assuming you have access to a riscv board)?

Anyway, from my perspective, this patch is already a step forward.

@lievenhey
Copy link
Contributor Author

We are using objdump for the disassembly. If you have a objdump version which supports riscv you can set that in Settings -> Unwind -> objdump path. Then it should work.

@dendibakh
Copy link

I installed riscv binutils with sudo apt install binutils-riscv64-unknown-elf and added /usr/bin/riscv64-unknown-elf-objdump in Settings -> Unwind -> objdump path. Now when I try to show disassembly for a function, the application crashes.

/tmp/.mount_hotspoe5cYDy/AppRun.wrapped: line 6:  8792 Segmentation fault      (core dumped) LD_LIBRARY_PATH="$d/usr/lib":$LD_LIBRARY_PATH "$bin/hotspot" "$@"

@dendibakh dendibakh mentioned this pull request May 29, 2025
@milianw
Copy link
Member

milianw commented May 29, 2025

Can you get us a backtrace for the crash by any chance? Ideally self-compiled?

@dendibakh
Copy link

Can you get us a backtrace for the crash by any chance? Ideally self-compiled?

@milianw , I tried getting a stack trace but it seems the image provided by @lievenhey doesn't have symbols. So, when I run it under gdb it shows no useful data.

[Inferior 1 (process 3227653) exited with code 0213]
Core was generated by `/usr/libexec/ibus-ui-gtk3'.
Program terminated with signal SIGSEGV, Segmentation fault.

I don't know how to build hotspots and I'm afraid it will take me a lot of time to do it.

The crash that I see can be reproduced on an x86 system as I described above.

@GitMensch
Copy link
Contributor

I tried getting a stack trace but it seems the image provided by lievenhey doesn't have symbols. So, when I run it under gdb it shows no useful data.

@dendibakh Been there before - but don't be afraid, the CI run also has debug info and there's a documentation how to use it (please suggest changes if you stumble over something as this was written after doing it more than once, sometimes you leave important pieces out then...) https://github.com/KDAB/hotspot/blob/master/HACKING.md#debugging-the-appimage

@dendibakh
Copy link

Thanks @GitMensch , that helps!
Here is the backtrace:

Thread 1 "hotspot" received signal SIGSEGV, Segmentation fault.
Downloading source file /github/workspace/src/models/highlightedtext.cpp
HighlightedText::lineAt (this=0x2af92d0, index=4) at /github/workspace/src/models/highlightedtext.cpp:356
warning: 356    /github/workspace/src/models/highlightedtext.cpp: No such file or directory
(gdb) bt
#0  HighlightedText::lineAt (this=0x2af92d0, index=4) at /github/workspace/src/models/highlightedtext.cpp:356
#1  0x000000000051d36c in SourceCodeModel::data (this=0x2af92b0, index=..., role=260)
    at /github/workspace/src/models/sourcecodemodel.cpp:180
#2  0x00000000004fa141 in QModelIndex::data (arole=<optimized out>, this=0x7ffd2c920120) at /usr/include/QtCore/qabstractitemmodel.h:460
#3  CodeDelegate::paint (this=0x2c08660, painter=0x7ffd2c920468, option=..., index=...) at /github/workspace/src/models/codedelegate.cpp:71
#4  0x0000716846628118 in QTreeView::drawRow(QPainter*, QStyleOptionViewItem const&, QModelIndex const&) const ()
   from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#5  0x000071684662bfd5 in QTreeView::drawTree(QPainter*, QRegion const&) const () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#6  0x0000716846632128 in QTreeView::paintEvent(QPaintEvent*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#7  0x00007168463a981e in QWidget::event(QEvent*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#8  0x0000716846452d2e in QFrame::event(QEvent*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#9  0x00007168454b91f2 in QCoreApplicationPrivate::sendThroughObjectEventFilters(QObject*, QEvent*) ()
   from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Core.so.5
#10 0x000071684636aa4e in QApplicationPrivate::notify_helper(QObject*, QEvent*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#11 0x00007168454b947a in QCoreApplication::notifyInternal2(QObject*, QEvent*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Core.so.5
#12 0x00007168463a2446 in QWidgetPrivate::sendPaintEvent(QRegion const&) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#13 0x00007168463a2c96 in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#14 0x00007168463a406e in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#15 0x00007168463a3e95 in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#16 0x00007168463a29a2 in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#17 0x00007168463a406e in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#18 0x00007168463a3e95 in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#19 0x00007168463a29a2 in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#20 0x00007168463a406e in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#21 0x00007168463a3e95 in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#22 0x00007168463a29a2 in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#23 0x00007168463a406e in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#24 0x00007168463a29a2 in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#25 0x00007168463a406e in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#26 0x00007168463a29a2 in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#27 0x00007168463a406e in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#28 0x00007168463a29a2 in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#29 0x00007168463a406e in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#30 0x00007168463a3e95 in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#31 0x00007168463a29a2 in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#32 0x00007168463a406e in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#33 0x00007168463a29a2 in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#34 0x00007168463a406e in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#35 0x00007168463a3e95 in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#36 0x00007168463a3e95 in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#37 0x00007168463a29a2 in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#38 0x00007168463a406e in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#39 0x00007168463a29a2 in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#40 0x00007168463a406e in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) ()
   from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#41 0x00007168463a29a2 in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#42 0x00007168463a406e in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) ()
   from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#43 0x00007168463a29a2 in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#44 0x00007168463a406e in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) ()
   from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#45 0x00007168463a29a2 in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#46 0x00007168463a406e in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) ()
   from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#47 0x00007168463a29a2 in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#48 0x00007168463a406e in QWidgetPrivate::paintSiblingsRecursive(QPaintDevice*, QList<QObject*> const&, int, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) ()
   from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#49 0x00007168463a29a2 in QWidgetPrivate::drawWidget(QPaintDevice*, QRegion const&, QPoint const&, QFlags<QWidgetPrivate::DrawWidgetFlag>, QPainter*, QWidgetRepaintManager*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#50 0x000071684637b0ef in ?? () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#51 0x00007168463aa1b7 in QWidget::event(QEvent*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#52 0x0000716847406237 in KXmlGuiWindow::event(QEvent*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libKF5XmlGui.so.5
#53 0x000071684636aa5f in QApplicationPrivate::notify_helper(QObject*, QEvent*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Widgets.so.5
#54 0x00007168454b947a in QCoreApplication::notifyInternal2(QObject*, QEvent*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Core.so.5
#55 0x00007168454bc207 in QCoreApplicationPrivate::sendPostedEvents(QObject*, int, QThreadData*) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Core.so.5
#56 0x000071684550db63 in ?? () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Core.so.5
#57 0x00007168451255bf in ?? () from /tmp/.mount_hotspocd6Q6X/usr/lib/libglib-2.0.so.0
#58 0x0000716845126432 in g_main_context_dispatch () from /tmp/.mount_hotspocd6Q6X/usr/lib/libglib-2.0.so.0
#59 0x0000716845126616 in ?? () from /tmp/.mount_hotspocd6Q6X/usr/lib/libglib-2.0.so.0
#60 0x00007168451266da in g_main_context_iteration () from /tmp/.mount_hotspocd6Q6X/usr/lib/libglib-2.0.so.0
#61 0x000071684550d234 in QEventDispatcherGlib::processEvents(QFlags<QEventLoop::ProcessEventsFlag>) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Core.so.5
#62 0x00007168454b7ffb in QEventLoop::exec(QFlags<QEventLoop::ProcessEventsFlag>) () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Core.so.5
#63 0x00007168454bfc3c in QCoreApplication::exec() () from /tmp/.mount_hotspocd6Q6X/usr/lib/libQt5Core.so.5
#64 0x0000000000445211 in main (argc=<optimized out>, argv=<optimized out>) at /github/workspace/src/main.cpp:304

@milianw , @lievenhey , let me know if anything else is needed.

@GitMensch
Copy link
Contributor

As there are two possible null references - can you execute p line (we already know the index is 4) and if this works p *line along with p line->layout()?

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

RISC-V support
4 participants