@@ -17,32 +17,30 @@ pub struct DwarfReader {
17
17
pub ptr : * const u8 ,
18
18
}
19
19
20
- #[ repr( C , packed) ]
21
- struct Unaligned < T > ( T ) ;
22
-
20
+ #[ deny( unsafe_op_in_unsafe_fn) ]
23
21
impl DwarfReader {
24
22
pub fn new ( ptr : * const u8 ) -> DwarfReader {
25
23
DwarfReader { ptr }
26
24
}
27
25
28
- // DWARF streams are packed, so e.g., a u32 would not necessarily be aligned
29
- // on a 4-byte boundary. This may cause problems on platforms with strict
30
- // alignment requirements. By wrapping data in a "packed" struct, we are
31
- // telling the backend to generate "misalignment-safe" code.
26
+ /// Read a type T and then bump the pointer by that amount.
27
+ ///
28
+ /// DWARF streams are "packed", so all types must be read at align 1.
32
29
pub unsafe fn read < T : Copy > ( & mut self ) -> T {
33
- let Unaligned ( result) = * ( self . ptr as * const Unaligned < T > ) ;
34
- self . ptr = self . ptr . add ( mem:: size_of :: < T > ( ) ) ;
35
- result
30
+ unsafe {
31
+ let result = self . ptr . cast :: < T > ( ) . read_unaligned ( ) ;
32
+ self . ptr = self . ptr . byte_add ( mem:: size_of :: < T > ( ) ) ;
33
+ result
34
+ }
36
35
}
37
36
38
- // ULEB128 and SLEB128 encodings are defined in Section 7.6 - "Variable
39
- // Length Data".
37
+ /// ULEB128 and SLEB128 encodings are defined in Section 7.6 - "Variable Length Data".
40
38
pub unsafe fn read_uleb128 ( & mut self ) -> u64 {
41
39
let mut shift: usize = 0 ;
42
40
let mut result: u64 = 0 ;
43
41
let mut byte: u8 ;
44
42
loop {
45
- byte = self . read :: < u8 > ( ) ;
43
+ byte = unsafe { self . read :: < u8 > ( ) } ;
46
44
result |= ( ( byte & 0x7F ) as u64 ) << shift;
47
45
shift += 7 ;
48
46
if byte & 0x80 == 0 {
@@ -57,7 +55,7 @@ impl DwarfReader {
57
55
let mut result: u64 = 0 ;
58
56
let mut byte: u8 ;
59
57
loop {
60
- byte = self . read :: < u8 > ( ) ;
58
+ byte = unsafe { self . read :: < u8 > ( ) } ;
61
59
result |= ( ( byte & 0x7F ) as u64 ) << shift;
62
60
shift += 7 ;
63
61
if byte & 0x80 == 0 {
0 commit comments