summaryrefslogtreecommitdiff
path: root/simpleperf/report_utils.h
diff options
context:
space:
mode:
Diffstat (limited to 'simpleperf/report_utils.h')
-rw-r--r--simpleperf/report_utils.h90
1 files changed, 90 insertions, 0 deletions
diff --git a/simpleperf/report_utils.h b/simpleperf/report_utils.h
new file mode 100644
index 00000000..e4cc23d0
--- /dev/null
+++ b/simpleperf/report_utils.h
@@ -0,0 +1,90 @@
+/*
+ * Copyright (C) 2020 The Android Open Source Project
+ *
+ * Licensed under the Apache License, Version 2.0 (the "License");
+ * you may not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+
+#pragma once
+
+#include <inttypes.h>
+
+#include <string>
+#include <string_view>
+#include <unordered_map>
+#include <vector>
+
+#include "dso.h"
+#include "thread_tree.h"
+
+namespace simpleperf {
+
+enum class CallChainExecutionType {
+ NATIVE_METHOD,
+ INTERPRETED_JVM_METHOD,
+ JIT_JVM_METHOD,
+ // ART methods near interpreted/JIT JVM methods. They're shown only when RemoveArtFrame = false.
+ ART_METHOD,
+};
+
+struct CallChainReportEntry {
+ uint64_t ip = 0;
+ const Symbol* symbol = nullptr;
+ Dso* dso = nullptr;
+ const char* dso_name = nullptr;
+ uint64_t vaddr_in_file = 0;
+ const MapEntry* map = nullptr;
+ CallChainExecutionType execution_type = CallChainExecutionType::NATIVE_METHOD;
+};
+
+class CallChainReportBuilder {
+ public:
+ CallChainReportBuilder(ThreadTree& thread_tree) : thread_tree_(thread_tree) {}
+ // If true, remove interpreter frames both before and after a Java frame.
+ // Default is true.
+ void SetRemoveArtFrame(bool enable) { remove_art_frame_ = enable; }
+ // If true, convert a JIT method into its corresponding interpreted Java method. So they can be
+ // merged in reports like flamegraph. Default is true.
+ void SetConvertJITFrame(bool enable) { convert_jit_frame_ = enable; }
+ // Add proguard mapping.txt to de-obfuscate minified symbols.
+ bool AddProguardMappingFile(std::string_view mapping_file);
+ std::vector<CallChainReportEntry> Build(const ThreadEntry* thread,
+ const std::vector<uint64_t>& ips, size_t kernel_ip_count);
+
+ private:
+ struct JavaMethod {
+ Dso* dso;
+ const Symbol* symbol;
+ JavaMethod(Dso* dso, const Symbol* symbol) : dso(dso), symbol(symbol) {}
+ };
+
+ struct ProguardMappingClass {
+ std::string original_classname;
+ // Map from minified method names to original method names.
+ std::unordered_map<std::string, std::string> method_map;
+ };
+
+ void MarkArtFrame(std::vector<CallChainReportEntry>& callchain);
+ void ConvertJITFrame(std::vector<CallChainReportEntry>& callchain);
+ void CollectJavaMethods();
+ void DeObfuscateJavaMethods(std::vector<CallChainReportEntry>& callchain);
+
+ ThreadTree& thread_tree_;
+ bool remove_art_frame_ = true;
+ bool convert_jit_frame_ = true;
+ bool java_method_initialized_ = false;
+ std::unordered_map<std::string, JavaMethod> java_method_map_;
+ // Map from minified class names to ProguardMappingClass.
+ std::unordered_map<std::string, ProguardMappingClass> proguard_class_map_;
+};
+
+} // namespace simpleperf