summaryrefslogtreecommitdiff
path: root/Userland/DevTools/Profiler/SourceModel.h
diff options
context:
space:
mode:
authorStephan Unverwerth <s.unverwerth@serenityos.org>2021-12-27 01:25:58 +0100
committerAndreas Kling <kling@serenityos.org>2021-12-28 23:17:24 +0100
commitcf8427b7b46798f7e26929bb05dc5ffa33c359a5 (patch)
tree1281982d6f6857bc3e7a3713ce5060a17cc4b294 /Userland/DevTools/Profiler/SourceModel.h
parente6df1c998804cca1848c634411b42d277d9ff265 (diff)
downloadserenity-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.h54
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;
+};
+
+}