diff options
author | Stephan Unverwerth <s.unverwerth@serenityos.org> | 2021-12-27 01:25:58 +0100 |
---|---|---|
committer | Andreas Kling <kling@serenityos.org> | 2021-12-28 23:17:24 +0100 |
commit | cf8427b7b46798f7e26929bb05dc5ffa33c359a5 (patch) | |
tree | 1281982d6f6857bc3e7a3713ce5060a17cc4b294 /Userland/DevTools/Profiler/SourceModel.h | |
parent | e6df1c998804cca1848c634411b42d277d9ff265 (diff) | |
download | serenity-cf8427b7b46798f7e26929bb05dc5ffa33c359a5.zip |
Profiler: Add source code view
This adds a new view mode to profiler which displays source lines and
samples that occured at those lines. This view can be opened via the
menu or by pressing CTRL-S.
It does this by mapping file names from DWARF to "/usr/src/serenity/..."
i.e. source code should be copied to /usr/src/serenity/Userland and
/usr/src/serenity/Kernel to be visible in this mode.
Currently *all* files contributing to the selected function are loaded
completely which could be a lot of data when dealing with lots of
inlined code.
Diffstat (limited to 'Userland/DevTools/Profiler/SourceModel.h')
-rw-r--r-- | Userland/DevTools/Profiler/SourceModel.h | 54 |
1 files changed, 54 insertions, 0 deletions
diff --git a/Userland/DevTools/Profiler/SourceModel.h b/Userland/DevTools/Profiler/SourceModel.h new file mode 100644 index 0000000000..9e2fa08f9f --- /dev/null +++ b/Userland/DevTools/Profiler/SourceModel.h @@ -0,0 +1,54 @@ +/* + * Copyright (c) 2021, Stephan Unverwerth <s.unverwerth@serenityos.org> + * + * SPDX-License-Identifier: BSD-2-Clause + */ + +#pragma once + +#include <LibGUI/Model.h> + +namespace Profiler { + +class Profile; +class ProfileNode; + +struct SourceLineData { + u32 event_count { 0 }; + float percent { 0 }; + String location; + u32 line_number { 0 }; + String source_code; +}; + +class SourceModel final : public GUI::Model { +public: + static NonnullRefPtr<SourceModel> create(Profile& profile, ProfileNode& node) + { + return adopt_ref(*new SourceModel(profile, node)); + } + + enum Column { + SampleCount, + Location, + LineNumber, + SourceCode, + __Count + }; + + virtual int row_count(GUI::ModelIndex const& = GUI::ModelIndex()) const override; + virtual int column_count(GUI::ModelIndex const& = GUI::ModelIndex()) const override { return Column::__Count; } + virtual String column_name(int) const override; + virtual GUI::Variant data(GUI::ModelIndex const&, GUI::ModelRole) const override; + virtual bool is_column_sortable(int) const override { return false; } + +private: + SourceModel(Profile&, ProfileNode&); + + Profile& m_profile; + ProfileNode& m_node; + + Vector<SourceLineData> m_source_lines; +}; + +} |