wasm: Make serialization functions more consistent

This commit is contained in:
Brian Carroll 2022-06-02 09:06:43 +02:00
parent aa8c05d535
commit 4de7490c96
No known key found for this signature in database
GPG key ID: 5C7B2EC4101703C0
2 changed files with 16 additions and 25 deletions

View file

@ -242,11 +242,11 @@ impl<'a> RelocationSection<'a> {
match type_id { match type_id {
MemoryAddrLeb => { MemoryAddrLeb => {
let idx = (*offset - section_bytes_offset) as usize; let idx = (*offset - section_bytes_offset) as usize;
overwrite_padded_u32(section_bytes, idx, value + *addend as u32); overwrite_padded_u32(&mut section_bytes[idx..], value + *addend as u32);
} }
MemoryAddrSleb => { MemoryAddrSleb => {
let idx = (*offset - section_bytes_offset) as usize; let idx = (*offset - section_bytes_offset) as usize;
overwrite_padded_i32(section_bytes, idx, value as i32 + *addend); overwrite_padded_i32(&mut section_bytes[idx..], value as i32 + *addend);
} }
_ => todo!("Linking relocation type {:?}", type_id), _ => todo!("Linking relocation type {:?}", type_id),
} }

View file

@ -122,25 +122,16 @@ macro_rules! write_unencoded {
} }
/// For relocations /// For relocations
pub fn overwrite_padded_i32(buffer: &mut [u8], offset: usize, value: i32) { pub fn overwrite_padded_i32(buffer: &mut [u8], value: i32) {
let mut x = value; let mut x = value;
for byte in buffer.iter_mut().skip(offset).take(4) { for byte in buffer.iter_mut().take(4) {
*byte = 0x80 | ((x & 0x7f) as u8); *byte = 0x80 | ((x & 0x7f) as u8);
x >>= 7; x >>= 7;
} }
buffer[offset + 4] = (x & 0x7f) as u8; buffer[4] = (x & 0x7f) as u8;
} }
pub fn overwrite_padded_u32(buffer: &mut [u8], offset: usize, value: u32) { pub fn overwrite_padded_u32(buffer: &mut [u8], value: u32) {
let mut x = value;
for byte in buffer.iter_mut().skip(offset).take(4) {
*byte = 0x80 | ((x & 0x7f) as u8);
x >>= 7;
}
buffer[offset + 4] = (x & 0x7f) as u8;
}
fn overwrite_padded_u32_help(buffer: &mut [u8], value: u32) {
let mut x = value; let mut x = value;
for byte in buffer.iter_mut().take(4) { for byte in buffer.iter_mut().take(4) {
*byte = 0x80 | ((x & 0x7f) as u8); *byte = 0x80 | ((x & 0x7f) as u8);
@ -200,11 +191,11 @@ impl SerialBuffer for std::vec::Vec<u8> {
let index = self.len(); let index = self.len();
let new_len = index + MAX_SIZE_ENCODED_U32; let new_len = index + MAX_SIZE_ENCODED_U32;
self.resize(new_len, 0); self.resize(new_len, 0);
overwrite_padded_u32_help(&mut self[index..new_len], value); overwrite_padded_u32(&mut self[index..new_len], value);
index index
} }
fn overwrite_padded_u32(&mut self, index: usize, value: u32) { fn overwrite_padded_u32(&mut self, index: usize, value: u32) {
overwrite_padded_u32_help(&mut self[index..(index + MAX_SIZE_ENCODED_U32)], value); overwrite_padded_u32(&mut self[index..(index + MAX_SIZE_ENCODED_U32)], value);
} }
} }
@ -230,11 +221,11 @@ impl<'a> SerialBuffer for Vec<'a, u8> {
let index = self.len(); let index = self.len();
let new_len = index + MAX_SIZE_ENCODED_U32; let new_len = index + MAX_SIZE_ENCODED_U32;
self.resize(new_len, 0); self.resize(new_len, 0);
overwrite_padded_u32_help(&mut self[index..new_len], value); overwrite_padded_u32(&mut self[index..new_len], value);
index index
} }
fn overwrite_padded_u32(&mut self, index: usize, value: u32) { fn overwrite_padded_u32(&mut self, index: usize, value: u32) {
overwrite_padded_u32_help(&mut self[index..(index + MAX_SIZE_ENCODED_U32)], value); overwrite_padded_u32(&mut self[index..(index + MAX_SIZE_ENCODED_U32)], value);
} }
} }
@ -332,16 +323,16 @@ mod tests {
fn test_overwrite_u32_padded() { fn test_overwrite_u32_padded() {
let mut buffer = [0, 0, 0, 0, 0]; let mut buffer = [0, 0, 0, 0, 0];
overwrite_padded_u32_help(&mut buffer, u32::MAX); overwrite_padded_u32(&mut buffer, u32::MAX);
assert_eq!(buffer, [0xff, 0xff, 0xff, 0xff, 0x0f]); assert_eq!(buffer, [0xff, 0xff, 0xff, 0xff, 0x0f]);
overwrite_padded_u32_help(&mut buffer, 0); overwrite_padded_u32(&mut buffer, 0);
assert_eq!(buffer, [0x80, 0x80, 0x80, 0x80, 0x00]); assert_eq!(buffer, [0x80, 0x80, 0x80, 0x80, 0x00]);
overwrite_padded_u32_help(&mut buffer, 127); overwrite_padded_u32(&mut buffer, 127);
assert_eq!(buffer, [0xff, 0x80, 0x80, 0x80, 0x00]); assert_eq!(buffer, [0xff, 0x80, 0x80, 0x80, 0x00]);
overwrite_padded_u32_help(&mut buffer, 128); overwrite_padded_u32(&mut buffer, 128);
assert_eq!(buffer, [0x80, 0x81, 0x80, 0x80, 0x00]); assert_eq!(buffer, [0x80, 0x81, 0x80, 0x80, 0x00]);
} }
@ -371,7 +362,7 @@ mod tests {
fn help_pad_i32(val: i32) -> [u8; MAX_SIZE_ENCODED_U32] { fn help_pad_i32(val: i32) -> [u8; MAX_SIZE_ENCODED_U32] {
let mut buffer = [0; MAX_SIZE_ENCODED_U32]; let mut buffer = [0; MAX_SIZE_ENCODED_U32];
overwrite_padded_i32(&mut buffer, 0, val); overwrite_padded_i32(&mut buffer, val);
buffer buffer
} }
@ -384,7 +375,7 @@ mod tests {
assert_eq!(help_pad_i32(i32::MIN), [0x80, 0x80, 0x80, 0x80, 0x78]); assert_eq!(help_pad_i32(i32::MIN), [0x80, 0x80, 0x80, 0x80, 0x78]);
let mut buffer = [0xff; 10]; let mut buffer = [0xff; 10];
overwrite_padded_i32(&mut buffer, 2, 0); overwrite_padded_i32(&mut buffer[2..], 0);
assert_eq!( assert_eq!(
buffer, buffer,
[0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0x00, 0xff, 0xff, 0xff] [0xff, 0xff, 0x80, 0x80, 0x80, 0x80, 0x00, 0xff, 0xff, 0xff]