From 4d8cf563f3c943e10b861c28de7f8f06520cc236 Mon Sep 17 00:00:00 2001 From: Joshua Nelson Date: Thu, 13 Feb 2020 16:25:41 -0500 Subject: [PATCH] Use zeroinit API for faerie and object (#1209) * use new zeroinit API for faerie * use bss for cranelift-object * don't crash when initializing bss * fix formatting * Improve code locality Co-Authored-By: Philip Craig * use `as` instead of try_into() for usize -> u64 * don't allocate unnecessarily in `faerie` Co-authored-by: Philip Craig --- cranelift/faerie/src/backend.rs | 33 ++++++++++++++--------------- cranelift/object/src/backend.rs | 37 ++++++++++++++++----------------- 2 files changed, 34 insertions(+), 36 deletions(-) diff --git a/cranelift/faerie/src/backend.rs b/cranelift/faerie/src/backend.rs index f10d457778..c0cb086a6d 100644 --- a/cranelift/faerie/src/backend.rs +++ b/cranelift/faerie/src/backend.rs @@ -217,20 +217,6 @@ impl Backend for FaerieBackend { ref data_relocs, } = data_ctx.description(); - let size = init.size(); - let mut bytes = Vec::with_capacity(size); - match *init { - Init::Uninitialized => { - panic!("data is not initialized yet"); - } - Init::Zeros { .. } => { - bytes.resize(size, 0); - } - Init::Bytes { ref contents } => { - bytes.extend_from_slice(contents); - } - } - for &(offset, id) in function_relocs { let to = &namespace.get_function_decl(&function_decls[id]).name; self.artifact @@ -256,9 +242,22 @@ impl Backend for FaerieBackend { .map_err(|e| ModuleError::Backend(e.to_string()))?; } - self.artifact - .define(name, bytes) - .expect("inconsistent declaration"); + match *init { + Init::Uninitialized => { + panic!("data is not initialized yet"); + } + Init::Zeros { size } => { + self.artifact + .define_zero_init(name, size) + .expect("inconsistent declaration"); + } + Init::Bytes { ref contents } => { + self.artifact + .define(name, contents.to_vec()) + .expect("inconsistent declaration"); + } + } + Ok(FaerieCompiledData {}) } diff --git a/cranelift/object/src/backend.rs b/cranelift/object/src/backend.rs index 0859046685..85af3b5a5d 100644 --- a/cranelift/object/src/backend.rs +++ b/cranelift/object/src/backend.rs @@ -243,20 +243,6 @@ impl Backend for ObjectBackend { ref data_relocs, } = data_ctx.description(); - let size = init.size(); - let mut data = Vec::with_capacity(size); - match *init { - Init::Uninitialized => { - panic!("data is not initialized yet"); - } - Init::Zeros { .. } => { - data.resize(size, 0); - } - Init::Bytes { ref contents } => { - data.extend_from_slice(contents); - } - } - let reloc_size = match self.isa.triple().pointer_width().unwrap() { PointerWidth::U16 => 16, PointerWidth::U32 => 32, @@ -285,16 +271,29 @@ impl Backend for ObjectBackend { } let symbol = self.data_objects[data_id].unwrap(); - let section = self.object.section_id(if writable { + let section_kind = if let Init::Zeros { .. } = *init { + StandardSection::UninitializedData + } else if writable { StandardSection::Data } else if relocs.is_empty() { StandardSection::ReadOnlyData } else { StandardSection::ReadOnlyDataWithRel - }); - let offset = - self.object - .add_symbol_data(symbol, section, &data, u64::from(align.unwrap_or(1))); + }; + let section = self.object.section_id(section_kind); + + let align = u64::from(align.unwrap_or(1)); + let offset = match *init { + Init::Uninitialized => { + panic!("data is not initialized yet"); + } + Init::Zeros { size } => self + .object + .add_symbol_bss(symbol, section, size as u64, align), + Init::Bytes { ref contents } => self + .object + .add_symbol_data(symbol, section, &contents, align), + }; if !relocs.is_empty() { self.relocs.push(SymbolRelocs { section,