diff --git a/cranelift/faerie/src/backend.rs b/cranelift/faerie/src/backend.rs index 84352b2696..8fae42a0b4 100644 --- a/cranelift/faerie/src/backend.rs +++ b/cranelift/faerie/src/backend.rs @@ -211,8 +211,17 @@ impl Backend for FaerieBackend { ref data_decls, ref function_relocs, ref data_relocs, + ref custom_segment_section, } = data_ctx.description(); + if let Some((segment, section)) = custom_segment_section { + return Err(cranelift_module::ModuleError::Backend(anyhow::anyhow!( + "Custom section not supported by cranelift-faerie: `{}:{}`", + segment, + section + ))); + } + for &(offset, id) in function_relocs { let to = &namespace.get_function_decl(&function_decls[id]).name; self.artifact diff --git a/cranelift/module/src/data_context.rs b/cranelift/module/src/data_context.rs index 94dbeb0b98..bca8471a77 100644 --- a/cranelift/module/src/data_context.rs +++ b/cranelift/module/src/data_context.rs @@ -3,7 +3,9 @@ use cranelift_codegen::binemit::{Addend, CodeOffset}; use cranelift_codegen::entity::PrimaryMap; use cranelift_codegen::ir; +use std::borrow::ToOwned; use std::boxed::Box; +use std::string::String; use std::vec::Vec; /// This specifies how data is to be initialized. @@ -46,6 +48,8 @@ pub struct DataDescription { pub function_relocs: Vec<(CodeOffset, ir::FuncRef)>, /// Data addresses to write at specified offsets. pub data_relocs: Vec<(CodeOffset, ir::GlobalValue, Addend)>, + /// Object file section + pub custom_segment_section: Option<(String, String)>, } /// This is to data objects what cranelift_codegen::Context is to functions. @@ -63,6 +67,7 @@ impl DataContext { data_decls: PrimaryMap::new(), function_relocs: vec![], data_relocs: vec![], + custom_segment_section: None, }, } } @@ -90,6 +95,11 @@ impl DataContext { self.description.init = Init::Bytes { contents }; } + /// Override the segment/section for data, only supported on Object backend + pub fn set_segment_section(&mut self, seg: &str, sec: &str) { + self.description.custom_segment_section = Some((seg.to_owned(), sec.to_owned())) + } + /// Declare an external function import. /// /// Users of the `Module` API generally should call diff --git a/cranelift/object/src/backend.rs b/cranelift/object/src/backend.rs index 04ec319091..1dd93a054d 100644 --- a/cranelift/object/src/backend.rs +++ b/cranelift/object/src/backend.rs @@ -271,6 +271,7 @@ impl Backend for ObjectBackend { ref data_decls, ref function_relocs, ref data_relocs, + ref custom_segment_section, } = data_ctx.description(); let reloc_size = match self.isa.triple().pointer_width().unwrap() { @@ -301,22 +302,40 @@ impl Backend for ObjectBackend { } let symbol = self.data_objects[data_id].unwrap(); - let section_kind = if let Init::Zeros { .. } = *init { - if tls { - StandardSection::UninitializedTls + let section = if custom_segment_section.is_none() { + let section_kind = if let Init::Zeros { .. } = *init { + if tls { + StandardSection::UninitializedTls + } else { + StandardSection::UninitializedData + } + } else if tls { + StandardSection::Tls + } else if writable { + StandardSection::Data + } else if relocs.is_empty() { + StandardSection::ReadOnlyData } else { - StandardSection::UninitializedData - } - } else if tls { - StandardSection::Tls - } else if writable { - StandardSection::Data - } else if relocs.is_empty() { - StandardSection::ReadOnlyData + StandardSection::ReadOnlyDataWithRel + }; + self.object.section_id(section_kind) } else { - StandardSection::ReadOnlyDataWithRel + if tls { + return Err(cranelift_module::ModuleError::Backend(anyhow::anyhow!( + "Custom section not supported for TLS" + ))); + } + let (seg, sec) = &custom_segment_section.as_ref().unwrap(); + self.object.add_section( + seg.clone().into_bytes(), + sec.clone().into_bytes(), + if writable { + SectionKind::Data + } else { + SectionKind::ReadOnlyData + }, + ) }; - let section = self.object.section_id(section_kind); let align = u64::from(align.unwrap_or(1)); let offset = match *init { diff --git a/cranelift/simplejit/src/backend.rs b/cranelift/simplejit/src/backend.rs index fc22d62f92..d8928f1529 100644 --- a/cranelift/simplejit/src/backend.rs +++ b/cranelift/simplejit/src/backend.rs @@ -361,6 +361,7 @@ impl<'simple_jit_backend> Backend for SimpleJITBackend { ref data_decls, ref function_relocs, ref data_relocs, + custom_segment_section: _, } = data.description(); let size = init.size();