diff --git a/Cargo.lock b/Cargo.lock index 8d73830f4f..0e769ed75b 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -489,6 +489,7 @@ dependencies = [ name = "cranelift-object" version = "0.64.0" dependencies = [ + "anyhow", "cranelift-codegen", "cranelift-module", "object", diff --git a/cranelift/faerie/src/backend.rs b/cranelift/faerie/src/backend.rs index 192cf455f2..be2ad792cc 100644 --- a/cranelift/faerie/src/backend.rs +++ b/cranelift/faerie/src/backend.rs @@ -211,10 +211,12 @@ impl Backend for FaerieBackend { ref data_decls, ref function_relocs, ref data_relocs, - section: ref datasection, + ref custom_segment_section, } = data_ctx.description(); - assert!(datasection.is_none(), "Custom sections not supported"); + 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; diff --git a/cranelift/module/src/data_context.rs b/cranelift/module/src/data_context.rs index 0b732b41f7..56e8b36024 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. @@ -47,7 +49,7 @@ pub struct DataDescription { /// Data addresses to write at specified offsets. pub data_relocs: Vec<(CodeOffset, ir::GlobalValue, Addend)>, /// Object file section - pub section: Option<(std::string::String, std::string::String)>, + pub custom_segment_section: Option<(String, String)>, } /// This is to data objects what cranelift_codegen::Context is to functions. @@ -65,7 +67,7 @@ impl DataContext { data_decls: PrimaryMap::new(), function_relocs: vec![], data_relocs: vec![], - section: None, + custom_segment_section: None, }, } } @@ -94,10 +96,10 @@ impl DataContext { } /// Override the segment/section for data, only supported on Object backend - pub fn set_section(&mut self, seg: &str, sec: &str) { - self.description.section = Some(( - std::string::String::from(seg), - std::string::String::from(sec), + pub fn set_segment_section(&mut self, seg: &str, sec: &str) { + self.description.custom_segment_section = Some(( + seg.to_owned(), + sec.to_owned(), )) } diff --git a/cranelift/object/Cargo.toml b/cranelift/object/Cargo.toml index 8c4c44fc74..18429a5158 100644 --- a/cranelift/object/Cargo.toml +++ b/cranelift/object/Cargo.toml @@ -14,6 +14,7 @@ cranelift-module = { path = "../module", version = "0.64.0" } cranelift-codegen = { path = "../codegen", version = "0.64.0", default-features = false, features = ["std"] } object = { version = "0.18", default-features = false, features = ["write"] } target-lexicon = "0.10" +anyhow = "1.0" [badges] maintenance = { status = "experimental" } diff --git a/cranelift/object/src/backend.rs b/cranelift/object/src/backend.rs index 1b88023028..5d0c0d0060 100644 --- a/cranelift/object/src/backend.rs +++ b/cranelift/object/src/backend.rs @@ -234,7 +234,7 @@ impl Backend for ObjectBackend { ref data_decls, ref function_relocs, ref data_relocs, - section: ref datasection, + ref custom_segment_section, } = data_ctx.description(); let reloc_size = match self.isa.triple().pointer_width().unwrap() { @@ -265,7 +265,7 @@ impl Backend for ObjectBackend { } let symbol = self.data_objects[data_id].unwrap(); - let section = if datasection.is_none() { + let section = if custom_segment_section.is_none() { let section_kind = if let Init::Zeros { .. } = *init { if tls { StandardSection::UninitializedTls @@ -283,8 +283,10 @@ impl Backend for ObjectBackend { }; self.object.section_id(section_kind) } else { - assert!(!tls, "Tls data cannot be in named section"); - let (seg, sec) = &datasection.as_ref().unwrap(); + 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(), diff --git a/cranelift/simplejit/src/backend.rs b/cranelift/simplejit/src/backend.rs index f4c6af2da1..d8928f1529 100644 --- a/cranelift/simplejit/src/backend.rs +++ b/cranelift/simplejit/src/backend.rs @@ -361,11 +361,9 @@ impl<'simple_jit_backend> Backend for SimpleJITBackend { ref data_decls, ref function_relocs, ref data_relocs, - section: ref datasection, + custom_segment_section: _, } = data.description(); - assert!(datasection.is_none(), "Custom sections not supported"); - let size = init.size(); let storage = if writable { self.memory