summaryrefslogtreecommitdiff
path: root/simpleperf/OfflineUnwinder_impl.h
diff options
context:
space:
mode:
Diffstat (limited to 'simpleperf/OfflineUnwinder_impl.h')
-rw-r--r--simpleperf/OfflineUnwinder_impl.h20
1 files changed, 20 insertions, 0 deletions
diff --git a/simpleperf/OfflineUnwinder_impl.h b/simpleperf/OfflineUnwinder_impl.h
index 01f03369..1a523547 100644
--- a/simpleperf/OfflineUnwinder_impl.h
+++ b/simpleperf/OfflineUnwinder_impl.h
@@ -17,6 +17,7 @@
#pragma once
#include <unwindstack/Maps.h>
+#include <unwindstack/Regs.h>
#include "thread_tree.h"
@@ -31,4 +32,23 @@ class UnwindMaps : public unwindstack::Maps {
std::vector<const MapEntry*> entries_;
};
+class OfflineUnwinderImpl : public OfflineUnwinder {
+ public:
+ OfflineUnwinderImpl(bool collect_stat) : collect_stat_(collect_stat) {
+ unwindstack::Elf::SetCachingEnabled(true);
+ }
+
+ bool UnwindCallChain(const ThreadEntry& thread, const RegSet& regs, const char* stack,
+ size_t stack_size, std::vector<uint64_t>* ips,
+ std::vector<uint64_t>* sps) override;
+
+ void LoadMetaInfo(const std::unordered_map<std::string, std::string>& info_map) override;
+ unwindstack::Regs* GetBacktraceRegs(const RegSet& regs);
+
+ private:
+ bool collect_stat_;
+ std::unordered_map<pid_t, UnwindMaps> cached_maps_;
+ uint64_t arm64_pac_mask_ = 0;
+};
+
} // namespace simpleperf