1use 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#[derive(Debug, Clone)]
20struct Data {
21 name: Option<String>,
23
24 tid: u32,
26}
27
28impl Data {
29 pub fn size(_type_header: &Header) -> usize {
31 0
32 }
33
34 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 0x9F, 0xEB, 0x01, 0x00, 0x18, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x0C, 0x00, 0x00, 0x00, 0x07, 0x00, 0x00, 0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, 0x00, 0x00, 0x76, 0x6F, 0x69, 0x64, 0x2A, 0x00, ]);
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}