btfparse/btf/
typedef.rs

1/*
2  Copyright (c) 2024-present, Alessandro Gario
3  All rights reserved.
4
5  This source code is licensed in accordance with the terms specified in
6  the LICENSE file found in the root directory of this source tree.
7*/
8
9use crate::{
10    btf::{
11        Error as BTFError, ErrorKind as BTFErrorKind, FileHeader, Header, Kind,
12        Result as BTFResult, Type, parse_string,
13    },
14    define_type,
15    utils::Reader,
16};
17
18/// Typedef data
19#[derive(Debug, Clone)]
20struct Data {
21    /// The typedef name
22    name: Option<String>,
23
24    /// The typedef'd type
25    tid: u32,
26}
27
28impl Data {
29    /// The size of the extra data
30    pub fn size(_type_header: &Header) -> usize {
31        0
32    }
33
34    /// Creates a new `Data` object
35    pub fn new(
36        reader: &mut Reader,
37        file_header: &FileHeader,
38        type_header: &Header,
39    ) -> BTFResult<Self> {
40        let name = if type_header.name_offset() != 0 {
41            Some(parse_string(
42                reader,
43                file_header,
44                type_header.name_offset(),
45            )?)
46        } else {
47            None
48        };
49
50        Ok(Self {
51            name,
52            tid: type_header.size_or_type(),
53        })
54    }
55}
56
57define_type!(Typedef, Data, tid: u32, name: Option<String>);
58
59#[cfg(test)]
60mod tests {
61    use super::Typedef;
62    use crate::btf::{FileHeader, Header};
63    use crate::utils::{ReadableBuffer, Reader};
64
65    #[test]
66    fn test_typedef() {
67        let readable_buffer = ReadableBuffer::new(&[
68            //
69            // BTF header
70            //
71            0x9F, 0xEB, // magic
72            0x01, // version
73            0x00, // flags
74            0x18, 0x00, 0x00, 0x00, // hdr_len
75            0x00, 0x00, 0x00, 0x00, // type_off
76            0x0C, 0x00, 0x00, 0x00, // type_len
77            0x0C, 0x00, 0x00, 0x00, // str_off
78            0x07, 0x00, 0x00, 0x00, // str_len
79            //
80            // Type section
81            //
82            0x01, 0x00, 0x00, 0x00, // type header: name_offset
83            0x00, 0x00, 0x00, 0x08, // type header: info_flags
84            0x00, 0x00, 0x00, 0x00, // type header: size_or_type
85            //
86            // String section
87            //
88            0x00, // mandatory null string
89            0x76, 0x6F, 0x69, 0x64, 0x2A, 0x00, // "void*"
90        ]);
91
92        let mut reader = Reader::new(&readable_buffer);
93        let file_header = FileHeader::new(&mut reader).unwrap();
94        let type_header = Header::new(&mut reader, &file_header).unwrap();
95        let typedef_type = Typedef::new(&mut reader, &file_header, type_header).unwrap();
96        assert_eq!(typedef_type.name().as_deref(), Some("void*"));
97        assert_eq!(*typedef_type.tid(), 0);
98    }
99}