1#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
3pub enum Format {
4 Dwarf64 = 8,
6 Dwarf32 = 4,
8}
9
10impl Format {
11 #[inline]
13 pub fn initial_length_size(self) -> u8 {
14 match self {
15 Format::Dwarf32 => 4,
16 Format::Dwarf64 => 12,
17 }
18 }
19
20 #[inline]
22 pub fn word_size(self) -> u8 {
23 match self {
24 Format::Dwarf32 => 4,
25 Format::Dwarf64 => 8,
26 }
27 }
28}
29
30#[derive(Clone, Copy, Debug, PartialEq, Eq)]
32#[non_exhaustive]
33pub enum Vendor {
34 Default,
36 AArch64,
38}
39
40#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
44#[repr(C)]
47pub struct Encoding {
48 pub address_size: u8,
50
51 pub format: Format,
53
54 pub version: u16,
56}
57
58#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
60pub struct LineEncoding {
61 pub minimum_instruction_length: u8,
63
64 pub maximum_operations_per_instruction: u8,
67
68 pub default_is_stmt: bool,
70
71 pub line_base: i8,
73
74 pub line_range: u8,
76}
77
78impl Default for LineEncoding {
79 fn default() -> Self {
80 LineEncoding {
82 minimum_instruction_length: 1,
83 maximum_operations_per_instruction: 1,
84 default_is_stmt: true,
85 line_base: -5,
86 line_range: 14,
87 }
88 }
89}
90
91#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, PartialOrd, Ord)]
96pub struct Register(pub u16);
97
98#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
100pub struct DebugAbbrevOffset<T = usize>(pub T);
101
102#[derive(Debug, Clone, Copy, PartialEq, Eq)]
104pub struct DebugAddrOffset<T = usize>(pub T);
105
106#[derive(Debug, Clone, Copy, PartialEq, Eq)]
108pub struct DebugAddrBase<T = usize>(pub T);
109
110#[derive(Debug, Clone, Copy, PartialEq, Eq)]
112pub struct DebugAddrIndex<T = usize>(pub T);
113
114#[derive(Debug, Clone, Copy, PartialEq, Eq)]
116pub struct DebugArangesOffset<T = usize>(pub T);
117
118#[derive(Debug, Clone, Copy, PartialEq, Eq, Ord, PartialOrd, Hash)]
120pub struct DebugInfoOffset<T = usize>(pub T);
121
122#[derive(Debug, Clone, Copy, PartialEq, Eq)]
124pub struct DebugLineOffset<T = usize>(pub T);
125
126#[derive(Debug, Clone, Copy, PartialEq, Eq)]
128pub struct DebugLineStrOffset<T = usize>(pub T);
129
130#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
133pub struct LocationListsOffset<T = usize>(pub T);
134
135#[derive(Debug, Clone, Copy, PartialEq, Eq)]
137pub struct DebugLocListsBase<T = usize>(pub T);
138
139#[derive(Debug, Clone, Copy, PartialEq, Eq)]
141pub struct DebugLocListsIndex<T = usize>(pub T);
142
143#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
145pub struct DebugMacinfoOffset<T = usize>(pub T);
146
147#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
149pub struct DebugMacroOffset<T = usize>(pub T);
150
151#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
157pub struct RawRangeListsOffset<T = usize>(pub T);
158
159#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
162pub struct RangeListsOffset<T = usize>(pub T);
163
164#[derive(Debug, Clone, Copy, PartialEq, Eq)]
166pub struct DebugRngListsBase<T = usize>(pub T);
167
168#[derive(Debug, Clone, Copy, PartialEq, Eq)]
170pub struct DebugRngListsIndex<T = usize>(pub T);
171
172#[derive(Debug, Clone, Copy, PartialEq, Eq)]
174pub struct DebugStrOffset<T = usize>(pub T);
175
176#[derive(Debug, Clone, Copy, PartialEq, Eq)]
178pub struct DebugStrOffsetsBase<T = usize>(pub T);
179
180#[derive(Debug, Clone, Copy, PartialEq, Eq)]
182pub struct DebugStrOffsetsIndex<T = usize>(pub T);
183
184#[derive(Debug, Clone, Copy, PartialEq, Eq, Ord, PartialOrd, Hash)]
186pub struct DebugTypesOffset<T = usize>(pub T);
187
188#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
190pub struct DebugTypeSignature(pub u64);
191
192#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
194pub struct DebugFrameOffset<T = usize>(pub T);
195
196impl<T> From<T> for DebugFrameOffset<T> {
197 #[inline]
198 fn from(o: T) -> Self {
199 DebugFrameOffset(o)
200 }
201}
202
203#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
205pub struct EhFrameOffset<T = usize>(pub T);
206
207impl<T> From<T> for EhFrameOffset<T> {
208 #[inline]
209 fn from(o: T) -> Self {
210 EhFrameOffset(o)
211 }
212}
213
214#[derive(Debug, Clone, Copy, PartialEq, Eq, Ord, PartialOrd, Hash)]
216pub enum UnitSectionOffset<T = usize> {
217 DebugInfoOffset(DebugInfoOffset<T>),
219 DebugTypesOffset(DebugTypesOffset<T>),
221}
222
223impl<T> From<DebugInfoOffset<T>> for UnitSectionOffset<T> {
224 fn from(offset: DebugInfoOffset<T>) -> Self {
225 UnitSectionOffset::DebugInfoOffset(offset)
226 }
227}
228
229impl<T> From<DebugTypesOffset<T>> for UnitSectionOffset<T> {
230 fn from(offset: DebugTypesOffset<T>) -> Self {
231 UnitSectionOffset::DebugTypesOffset(offset)
232 }
233}
234
235impl<T> UnitSectionOffset<T>
236where
237 T: Clone,
238{
239 pub fn as_debug_info_offset(&self) -> Option<DebugInfoOffset<T>> {
241 match self {
242 UnitSectionOffset::DebugInfoOffset(offset) => Some(offset.clone()),
243 UnitSectionOffset::DebugTypesOffset(_) => None,
244 }
245 }
246 pub fn as_debug_types_offset(&self) -> Option<DebugTypesOffset<T>> {
248 match self {
249 UnitSectionOffset::DebugInfoOffset(_) => None,
250 UnitSectionOffset::DebugTypesOffset(offset) => Some(offset.clone()),
251 }
252 }
253}
254
255#[derive(Debug, Clone, Copy, PartialEq, Eq, Ord, PartialOrd, Hash)]
257pub enum SectionId {
258 DebugAbbrev,
260 DebugAddr,
262 DebugAranges,
264 DebugCuIndex,
266 DebugFrame,
268 EhFrame,
270 EhFrameHdr,
272 DebugInfo,
274 DebugLine,
276 DebugLineStr,
278 DebugLoc,
280 DebugLocLists,
282 DebugMacinfo,
284 DebugMacro,
286 DebugPubNames,
288 DebugPubTypes,
290 DebugRanges,
292 DebugRngLists,
294 DebugStr,
296 DebugStrOffsets,
298 DebugTuIndex,
300 DebugTypes,
302}
303
304impl SectionId {
305 pub fn name(self) -> &'static str {
307 match self {
308 SectionId::DebugAbbrev => ".debug_abbrev",
309 SectionId::DebugAddr => ".debug_addr",
310 SectionId::DebugAranges => ".debug_aranges",
311 SectionId::DebugCuIndex => ".debug_cu_index",
312 SectionId::DebugFrame => ".debug_frame",
313 SectionId::EhFrame => ".eh_frame",
314 SectionId::EhFrameHdr => ".eh_frame_hdr",
315 SectionId::DebugInfo => ".debug_info",
316 SectionId::DebugLine => ".debug_line",
317 SectionId::DebugLineStr => ".debug_line_str",
318 SectionId::DebugLoc => ".debug_loc",
319 SectionId::DebugLocLists => ".debug_loclists",
320 SectionId::DebugMacinfo => ".debug_macinfo",
321 SectionId::DebugMacro => ".debug_macro",
322 SectionId::DebugPubNames => ".debug_pubnames",
323 SectionId::DebugPubTypes => ".debug_pubtypes",
324 SectionId::DebugRanges => ".debug_ranges",
325 SectionId::DebugRngLists => ".debug_rnglists",
326 SectionId::DebugStr => ".debug_str",
327 SectionId::DebugStrOffsets => ".debug_str_offsets",
328 SectionId::DebugTuIndex => ".debug_tu_index",
329 SectionId::DebugTypes => ".debug_types",
330 }
331 }
332
333 pub fn dwo_name(self) -> Option<&'static str> {
335 Some(match self {
336 SectionId::DebugAbbrev => ".debug_abbrev.dwo",
337 SectionId::DebugCuIndex => ".debug_cu_index",
338 SectionId::DebugInfo => ".debug_info.dwo",
339 SectionId::DebugLine => ".debug_line.dwo",
340 SectionId::DebugLoc => ".debug_loc.dwo",
343 SectionId::DebugLocLists => ".debug_loclists.dwo",
344 SectionId::DebugMacinfo => ".debug_macinfo.dwo",
345 SectionId::DebugMacro => ".debug_macro.dwo",
346 SectionId::DebugRngLists => ".debug_rnglists.dwo",
347 SectionId::DebugStr => ".debug_str.dwo",
348 SectionId::DebugStrOffsets => ".debug_str_offsets.dwo",
349 SectionId::DebugTuIndex => ".debug_tu_index",
350 SectionId::DebugTypes => ".debug_types.dwo",
351 _ => return None,
352 })
353 }
354
355 pub fn xcoff_name(self) -> Option<&'static str> {
357 Some(match self {
358 SectionId::DebugAbbrev => ".dwabrev",
359 SectionId::DebugAranges => ".dwarnge",
360 SectionId::DebugFrame => ".dwframe",
361 SectionId::DebugInfo => ".dwinfo",
362 SectionId::DebugLine => ".dwline",
363 SectionId::DebugLoc => ".dwloc",
364 SectionId::DebugMacinfo => ".dwmac",
365 SectionId::DebugPubNames => ".dwpbnms",
366 SectionId::DebugPubTypes => ".dwpbtyp",
367 SectionId::DebugRanges => ".dwrnges",
368 SectionId::DebugStr => ".dwstr",
369 _ => return None,
370 })
371 }
372
373 pub fn is_string(self) -> bool {
377 matches!(self, SectionId::DebugStr | SectionId::DebugLineStr)
378 }
379}
380
381#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
384pub struct DwoId(pub u64);
385
386#[derive(Debug, Clone, Copy, PartialEq, Eq)]
389pub enum DwarfFileType {
390 Main,
392 Dwo,
394 }
396
397impl Default for DwarfFileType {
398 fn default() -> Self {
399 DwarfFileType::Main
400 }
401}