File Coverage

src/panda/dwarf.h
Criterion Covered Total %
statement 2 6 33.3
branch n/a
condition n/a
subroutine n/a
pod n/a
total 2 6 33.3


line stmt bran cond sub pod time code
1             #pragma once
2              
3             #include "SharedObjectInfo.h"
4             #include
5             #include
6             #include
7             #include
8             #include
9             #include
10             #include
11             #include
12              
13             namespace panda { namespace backtrace {
14              
15             namespace dwarf {
16              
17             struct HighLow {
18             Dwarf_Addr high;
19             Dwarf_Addr low;
20             };
21              
22             enum class Match { yes, no, unknown };
23              
24 0           struct FunctionDetails {
25             panda::string name;
26             std::uint64_t line_no = 0;
27             };
28              
29 0           struct CUDetails {
30             panda::string name;
31             };
32              
33             struct DieHolder;
34             struct LookupResult;
35              
36             struct DieRC: panda::Refcnt {
37             Dwarf_Die die;
38             Dwarf_Debug debug;
39             panda::iptr parent;
40              
41             DieRC(Dwarf_Die die_, Dwarf_Debug debug_, panda::iptr parent_);
42             ~DieRC();
43              
44             Dwarf_Die resolve_ref(Dwarf_Die source, Dwarf_Half attribute) noexcept;
45             panda::iptr discover(Dwarf_Die target) noexcept;
46             panda::iptr discover(Dwarf_Off target_offset, DieHolder& node) noexcept;
47             string gather_fqn() noexcept;
48             FunctionDetails refine_fn(LookupResult& lr) noexcept;
49             void refine_fn_ao(Dwarf_Die abstract_origin, FunctionDetails& details) noexcept;
50             void refine_fn_name(Dwarf_Die it, FunctionDetails& details) noexcept;
51             void refine_fn_line(LookupResult& lr, FunctionDetails& details) noexcept;
52             void refine_fn_line_fallback(Dwarf_Die it, FunctionDetails& details) noexcept;
53             void refine_fn_spec(Dwarf_Die specification, FunctionDetails& details) noexcept;
54             CUDetails refine_cu() noexcept;
55             };
56              
57             struct DieHolder {
58             Dwarf_Die die;
59             Dwarf_Debug debug;
60             DieHolder *parent;
61             panda::iptr owner;
62              
63             DieHolder(panda::iptr owner);
64             DieHolder(Dwarf_Die die_, Dwarf_Debug debug_, DieHolder* parent);
65             DieHolder(const DieHolder&) = delete;
66             DieHolder(DieHolder&&) = delete;
67              
68             panda::iptr detach();
69              
70             panda::optional get_addr() noexcept;
71             Match contains(std::uint64_t offset) noexcept;
72             ~DieHolder();
73             };
74              
75 0           struct LookupResult {
76 0           LookupResult() {}
77             LookupResult(const LookupResult&) = delete;
78             LookupResult(LookupResult&&);
79              
80             bool is_complete() noexcept;
81             StackframePtr get_frame(std::uint64_t ip, const SharedObjectInfo& so) noexcept;
82              
83             panda::iptr cu;
84             panda::iptr subprogram;
85             std::uint64_t offset{0};
86             };
87              
88 16182           struct CU {
89             Dwarf_Debug debug;
90             int number;
91              
92             Dwarf_Unsigned header_length = 0;
93             Dwarf_Unsigned abbrev_offset = 0;
94             Dwarf_Half address_size = 0;
95             Dwarf_Half version_stamp = 0;
96             Dwarf_Half offset_size = 0;
97             Dwarf_Half extension_size = 0;
98             Dwarf_Unsigned typeoffset = 0;
99             Dwarf_Half header_type = DW_UT_compile;
100             Dwarf_Sig8 signature;
101             panda::iptr cu_die;
102             CU(Dwarf_Debug debug, int number_);
103              
104             LookupResult resolve(std::uint64_t offset) noexcept;
105             bool resolve(std::uint64_t offset, DieHolder& die, LookupResult& lr) noexcept;
106             bool examine(std::uint64_t offset, DieHolder& die, LookupResult& lr) noexcept;
107             };
108             using CUPtr = std::unique_ptr;
109             }
110              
111              
112             struct DwarfInfo;
113              
114             struct DwarfInfo {
115             using file_guard_t = std::unique_ptr>;
116              
117             SharedObjectInfo so_info;
118             Dwarf_Ptr err_arg = nullptr;
119             Dwarf_Debug debug = nullptr;
120             std::list CUs;
121             file_guard_t guard;
122              
123 16182           DwarfInfo(const SharedObjectInfo& info_):so_info{info_}{}
124             ~DwarfInfo();
125              
126             bool load(file_guard_t&& guard) noexcept;
127             StackframePtr resolve(std::uint64_t ip) noexcept;
128             };
129             using DwarfInfoMap = std::map>;
130              
131              
132             void install_backtracer();
133              
134             }}