1 | //===-- UnwindTable.h -------------------------------------------*- C++ -*-===// |
2 | // |
3 | // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
4 | // See https://llvm.org/LICENSE.txt for license information. |
5 | // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | |
9 | #ifndef LLDB_SYMBOL_UNWINDTABLE_H |
10 | #define LLDB_SYMBOL_UNWINDTABLE_H |
11 | |
12 | #include <map> |
13 | #include <mutex> |
14 | #include <optional> |
15 | |
16 | #include "lldb/lldb-private.h" |
17 | |
18 | namespace lldb_private { |
19 | |
20 | // A class which holds all the FuncUnwinders objects for a given ObjectFile. |
21 | // The UnwindTable is populated with FuncUnwinders objects lazily during the |
22 | // debug session. |
23 | |
24 | class UnwindTable { |
25 | public: |
26 | /// Create an Unwind table using the data in the given module. |
27 | explicit UnwindTable(Module &module); |
28 | |
29 | ~UnwindTable(); |
30 | |
31 | lldb_private::CallFrameInfo *GetObjectFileUnwindInfo(); |
32 | |
33 | lldb_private::DWARFCallFrameInfo *GetEHFrameInfo(); |
34 | lldb_private::DWARFCallFrameInfo *GetDebugFrameInfo(); |
35 | |
36 | lldb_private::CompactUnwindInfo *GetCompactUnwindInfo(); |
37 | |
38 | ArmUnwindInfo *GetArmUnwindInfo(); |
39 | SymbolFile *GetSymbolFile(); |
40 | |
41 | lldb::FuncUnwindersSP GetFuncUnwindersContainingAddress(const Address &addr, |
42 | SymbolContext &sc); |
43 | |
44 | bool GetAllowAssemblyEmulationUnwindPlans(); |
45 | |
46 | // Normally when we create a new FuncUnwinders object we track it in this |
47 | // UnwindTable so it can be reused later. But for the target modules show- |
48 | // unwind we want to create brand new UnwindPlans for the function of |
49 | // interest - so ignore any existing FuncUnwinders for that function and |
50 | // don't add this new one to our UnwindTable. This FuncUnwinders object does |
51 | // have a reference to the UnwindTable but the lifetime of this uncached |
52 | // FuncUnwinders is expected to be short so in practice this will not be a |
53 | // problem. |
54 | lldb::FuncUnwindersSP |
55 | GetUncachedFuncUnwindersContainingAddress(const Address &addr, |
56 | const SymbolContext &sc); |
57 | |
58 | ArchSpec GetArchitecture(); |
59 | |
60 | private: |
61 | void Dump(Stream &s); |
62 | |
63 | void Initialize(); |
64 | std::optional<AddressRange> GetAddressRange(const Address &addr, |
65 | const SymbolContext &sc); |
66 | |
67 | typedef std::map<lldb::addr_t, lldb::FuncUnwindersSP> collection; |
68 | typedef collection::iterator iterator; |
69 | typedef collection::const_iterator const_iterator; |
70 | |
71 | Module &m_module; |
72 | collection m_unwinds; |
73 | |
74 | bool m_initialized; // delay some initialization until ObjectFile is set up |
75 | std::mutex m_mutex; |
76 | |
77 | std::unique_ptr<CallFrameInfo> m_object_file_unwind_up; |
78 | std::unique_ptr<DWARFCallFrameInfo> m_eh_frame_up; |
79 | std::unique_ptr<DWARFCallFrameInfo> m_debug_frame_up; |
80 | std::unique_ptr<CompactUnwindInfo> m_compact_unwind_up; |
81 | std::unique_ptr<ArmUnwindInfo> m_arm_unwind_up; |
82 | |
83 | UnwindTable(const UnwindTable &) = delete; |
84 | const UnwindTable &operator=(const UnwindTable &) = delete; |
85 | }; |
86 | |
87 | } // namespace lldb_private |
88 | |
89 | #endif // LLDB_SYMBOL_UNWINDTABLE_H |
90 | |