#![allow(missing_docs)] use crate::Format; use test_assembler::{Label, Section}; pub trait GimliSectionMethods { fn sleb(self, val: i64) -> Self; fn uleb(self, val: u64) -> Self; fn initial_length(self, format: Format, length: &Label, start: &Label) -> Self; fn word(self, size: u8, val: u64) -> Self; fn word_label(self, size: u8, val: &Label) -> Self; } impl GimliSectionMethods for Section { fn sleb(mut self, mut val: i64) -> Self { while val & !0x3f != 0 && val | 0x3f != -1 { self = self.D8(val as u8 | 0x80); val >>= 7; } self.D8(val as u8 & 0x7f) } fn uleb(mut self, mut val: u64) -> Self { while val & !0x7f != 0 { self = self.D8(val as u8 | 0x80); val >>= 7; } self.D8(val as u8) } fn initial_length(self, format: Format, length: &Label, start: &Label) -> Self { match format { Format::Dwarf32 => self.D32(length).mark(start), Format::Dwarf64 => self.D32(0xffff_ffff).D64(length).mark(start), } } fn word(self, size: u8, val: u64) -> Self { match size { 4 => self.D32(val as u32), 8 => self.D64(val), _ => panic!("unsupported word size"), } } fn word_label(self, size: u8, val: &Label) -> Self { match size { 4 => self.D32(val), 8 => self.D64(val), _ => panic!("unsupported word size"), } } }