/rust/registry/src/index.crates.io-1949cf8c6b5b557f/gimli-0.33.0/src/read/pubnames.rs
Line | Count | Source |
1 | | use crate::common::{DebugInfoOffset, SectionId}; |
2 | | use crate::endianity::Endianity; |
3 | | use crate::read::lookup::{DebugLookup, LookupEntryIter, PubStuffEntry, PubStuffParser}; |
4 | | use crate::read::{EndianSlice, Reader, Result, Section, UnitOffset}; |
5 | | |
6 | | /// A single parsed pubname. |
7 | | #[derive(Debug, Clone)] |
8 | | pub struct PubNamesEntry<R: Reader> { |
9 | | unit_header_offset: DebugInfoOffset<R::Offset>, |
10 | | die_offset: UnitOffset<R::Offset>, |
11 | | name: R, |
12 | | } |
13 | | |
14 | | impl<R: Reader> PubNamesEntry<R> { |
15 | | /// Returns the name this entry refers to. |
16 | 0 | pub fn name(&self) -> &R { |
17 | 0 | &self.name |
18 | 0 | } |
19 | | |
20 | | /// Returns the offset into the .debug_info section for the header of the compilation unit |
21 | | /// which contains this name. |
22 | 0 | pub fn unit_header_offset(&self) -> DebugInfoOffset<R::Offset> { |
23 | 0 | self.unit_header_offset |
24 | 0 | } |
25 | | |
26 | | /// Returns the offset into the compilation unit for the debugging information entry which |
27 | | /// has this name. |
28 | 0 | pub fn die_offset(&self) -> UnitOffset<R::Offset> { |
29 | 0 | self.die_offset |
30 | 0 | } |
31 | | } |
32 | | |
33 | | impl<R: Reader> PubStuffEntry<R> for PubNamesEntry<R> { |
34 | 0 | fn new( |
35 | 0 | die_offset: UnitOffset<R::Offset>, |
36 | 0 | name: R, |
37 | 0 | unit_header_offset: DebugInfoOffset<R::Offset>, |
38 | 0 | ) -> Self { |
39 | 0 | PubNamesEntry { |
40 | 0 | unit_header_offset, |
41 | 0 | die_offset, |
42 | 0 | name, |
43 | 0 | } |
44 | 0 | } |
45 | | } |
46 | | |
47 | | /// The `DebugPubNames` struct represents the DWARF public names information |
48 | | /// found in the `.debug_pubnames` section. |
49 | | #[derive(Debug, Clone)] |
50 | | pub struct DebugPubNames<R: Reader>(DebugLookup<R, PubStuffParser<R, PubNamesEntry<R>>>); |
51 | | |
52 | | impl<'input, Endian> DebugPubNames<EndianSlice<'input, Endian>> |
53 | | where |
54 | | Endian: Endianity, |
55 | | { |
56 | | /// Construct a new `DebugPubNames` instance from the data in the `.debug_pubnames` |
57 | | /// section. |
58 | | /// |
59 | | /// It is the caller's responsibility to read the `.debug_pubnames` section and |
60 | | /// present it as a `&[u8]` slice. That means using some ELF loader on |
61 | | /// Linux, a Mach-O loader on macOS, etc. |
62 | | /// |
63 | | /// ``` |
64 | | /// use gimli::{DebugPubNames, LittleEndian}; |
65 | | /// |
66 | | /// # let buf = []; |
67 | | /// # let read_debug_pubnames_section_somehow = || &buf; |
68 | | /// let debug_pubnames = |
69 | | /// DebugPubNames::new(read_debug_pubnames_section_somehow(), LittleEndian); |
70 | | /// ``` |
71 | 0 | pub fn new(debug_pubnames_section: &'input [u8], endian: Endian) -> Self { |
72 | 0 | Self::from(EndianSlice::new(debug_pubnames_section, endian)) |
73 | 0 | } |
74 | | } |
75 | | |
76 | | impl<R: Reader> DebugPubNames<R> { |
77 | | /// Iterate the pubnames in the `.debug_pubnames` section. |
78 | | /// |
79 | | /// ``` |
80 | | /// use gimli::{DebugPubNames, EndianSlice, LittleEndian}; |
81 | | /// |
82 | | /// # let buf = []; |
83 | | /// # let read_debug_pubnames_section_somehow = || &buf; |
84 | | /// let debug_pubnames = |
85 | | /// DebugPubNames::new(read_debug_pubnames_section_somehow(), LittleEndian); |
86 | | /// |
87 | | /// let mut iter = debug_pubnames.items(); |
88 | | /// while let Some(pubname) = iter.next().unwrap() { |
89 | | /// println!("pubname {} found!", pubname.name().to_string_lossy()); |
90 | | /// } |
91 | | /// ``` |
92 | 0 | pub fn items(&self) -> PubNamesEntryIter<R> { |
93 | 0 | PubNamesEntryIter(self.0.items()) |
94 | 0 | } |
95 | | } |
96 | | |
97 | | impl<R: Reader> Section<R> for DebugPubNames<R> { |
98 | 0 | fn id() -> SectionId { |
99 | 0 | SectionId::DebugPubNames |
100 | 0 | } |
101 | | |
102 | 0 | fn reader(&self) -> &R { |
103 | 0 | self.0.reader() |
104 | 0 | } |
105 | | } |
106 | | |
107 | | impl<R: Reader> From<R> for DebugPubNames<R> { |
108 | 0 | fn from(debug_pubnames_section: R) -> Self { |
109 | 0 | DebugPubNames(DebugLookup::from(debug_pubnames_section)) |
110 | 0 | } |
111 | | } |
112 | | |
113 | | /// An iterator over the pubnames from a `.debug_pubnames` section. |
114 | | #[derive(Debug, Clone)] |
115 | | pub struct PubNamesEntryIter<R: Reader>(LookupEntryIter<R, PubStuffParser<R, PubNamesEntry<R>>>); |
116 | | |
117 | | impl<R: Reader> PubNamesEntryIter<R> { |
118 | | /// Advance the iterator and return the next pubname. |
119 | | /// |
120 | | /// Returns the newly parsed pubname as `Ok(Some(pubname))`. Returns |
121 | | /// `Ok(None)` when iteration is complete and all pubnames have already been |
122 | | /// parsed and yielded. If an error occurs while parsing the next pubname, |
123 | | /// then this error is returned as `Err(e)`, and all subsequent calls return |
124 | | /// `Ok(None)`. |
125 | 0 | pub fn next(&mut self) -> Result<Option<PubNamesEntry<R>>> { |
126 | 0 | self.0.next() |
127 | 0 | } |
128 | | } |
129 | | |
130 | | #[cfg(feature = "fallible-iterator")] |
131 | | impl<R: Reader> fallible_iterator::FallibleIterator for PubNamesEntryIter<R> { |
132 | | type Item = PubNamesEntry<R>; |
133 | | type Error = crate::read::Error; |
134 | | |
135 | | fn next(&mut self) -> ::core::result::Result<Option<Self::Item>, Self::Error> { |
136 | | self.0.next() |
137 | | } |
138 | | } |
139 | | |
140 | | impl<R: Reader> Iterator for PubNamesEntryIter<R> { |
141 | | type Item = Result<PubNamesEntry<R>>; |
142 | | |
143 | 0 | fn next(&mut self) -> Option<Self::Item> { |
144 | 0 | self.0.next().transpose() |
145 | 0 | } |
146 | | } |