std/sys/personality/dwarf/
mod.rs
1#![allow(unused)]
8#![forbid(unsafe_op_in_unsafe_fn)]
9
10#[cfg(test)]
11mod tests;
12
13pub mod eh;
14
15pub struct DwarfReader {
16 pub ptr: *const u8,
17}
18
19impl DwarfReader {
20 pub fn new(ptr: *const u8) -> DwarfReader {
21 DwarfReader { ptr }
22 }
23
24 pub unsafe fn read<T: Copy>(&mut self) -> T {
28 unsafe {
29 let result = self.ptr.cast::<T>().read_unaligned();
30 self.ptr = self.ptr.byte_add(size_of::<T>());
31 result
32 }
33 }
34
35 pub unsafe fn read_uleb128(&mut self) -> u64 {
37 let mut shift: usize = 0;
38 let mut result: u64 = 0;
39 let mut byte: u8;
40 loop {
41 byte = unsafe { self.read::<u8>() };
42 result |= ((byte & 0x7F) as u64) << shift;
43 shift += 7;
44 if byte & 0x80 == 0 {
45 break;
46 }
47 }
48 result
49 }
50
51 pub unsafe fn read_sleb128(&mut self) -> i64 {
52 let mut shift: u32 = 0;
53 let mut result: u64 = 0;
54 let mut byte: u8;
55 loop {
56 byte = unsafe { self.read::<u8>() };
57 result |= ((byte & 0x7F) as u64) << shift;
58 shift += 7;
59 if byte & 0x80 == 0 {
60 break;
61 }
62 }
63 if shift < u64::BITS && (byte & 0x40) != 0 {
65 result |= (!0 as u64) << shift;
66 }
67 result as i64
68 }
69}