Cranelift: Module data apis should allow specifying the object file section #1640
This commit is contained in:
@@ -46,6 +46,8 @@ pub struct DataDescription {
|
|||||||
pub function_relocs: Vec<(CodeOffset, ir::FuncRef)>,
|
pub function_relocs: Vec<(CodeOffset, ir::FuncRef)>,
|
||||||
/// Data addresses to write at specified offsets.
|
/// Data addresses to write at specified offsets.
|
||||||
pub data_relocs: Vec<(CodeOffset, ir::GlobalValue, Addend)>,
|
pub data_relocs: Vec<(CodeOffset, ir::GlobalValue, Addend)>,
|
||||||
|
/// Object file section
|
||||||
|
pub section: Option<(std::string::String, std::string::String)>
|
||||||
}
|
}
|
||||||
|
|
||||||
/// This is to data objects what cranelift_codegen::Context is to functions.
|
/// This is to data objects what cranelift_codegen::Context is to functions.
|
||||||
@@ -63,6 +65,7 @@ impl DataContext {
|
|||||||
data_decls: PrimaryMap::new(),
|
data_decls: PrimaryMap::new(),
|
||||||
function_relocs: vec![],
|
function_relocs: vec![],
|
||||||
data_relocs: vec![],
|
data_relocs: vec![],
|
||||||
|
section: None
|
||||||
},
|
},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -90,6 +93,11 @@ impl DataContext {
|
|||||||
self.description.init = Init::Bytes { contents };
|
self.description.init = Init::Bytes { contents };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/// 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)))
|
||||||
|
}
|
||||||
|
|
||||||
/// Declare an external function import.
|
/// Declare an external function import.
|
||||||
///
|
///
|
||||||
/// Users of the `Module` API generally should call
|
/// Users of the `Module` API generally should call
|
||||||
|
|||||||
@@ -234,6 +234,7 @@ impl Backend for ObjectBackend {
|
|||||||
ref data_decls,
|
ref data_decls,
|
||||||
ref function_relocs,
|
ref function_relocs,
|
||||||
ref data_relocs,
|
ref data_relocs,
|
||||||
|
section: ref datasection
|
||||||
} = data_ctx.description();
|
} = data_ctx.description();
|
||||||
|
|
||||||
let reloc_size = match self.isa.triple().pointer_width().unwrap() {
|
let reloc_size = match self.isa.triple().pointer_width().unwrap() {
|
||||||
@@ -264,6 +265,8 @@ impl Backend for ObjectBackend {
|
|||||||
}
|
}
|
||||||
|
|
||||||
let symbol = self.data_objects[data_id].unwrap();
|
let symbol = self.data_objects[data_id].unwrap();
|
||||||
|
let section =
|
||||||
|
if datasection.is_none() {
|
||||||
let section_kind = if let Init::Zeros { .. } = *init {
|
let section_kind = if let Init::Zeros { .. } = *init {
|
||||||
if tls {
|
if tls {
|
||||||
StandardSection::UninitializedTls
|
StandardSection::UninitializedTls
|
||||||
@@ -279,7 +282,13 @@ impl Backend for ObjectBackend {
|
|||||||
} else {
|
} else {
|
||||||
StandardSection::ReadOnlyDataWithRel
|
StandardSection::ReadOnlyDataWithRel
|
||||||
};
|
};
|
||||||
let section = self.object.section_id(section_kind);
|
self.object.section_id(section_kind)
|
||||||
|
} else {
|
||||||
|
let (seg, sec) = &datasection.as_ref().unwrap();
|
||||||
|
self.object.add_section(seg.clone().into_bytes(), sec.clone().into_bytes(),
|
||||||
|
if writable { SectionKind::Data } else { SectionKind::ReadOnlyData }
|
||||||
|
)
|
||||||
|
};
|
||||||
|
|
||||||
let align = u64::from(align.unwrap_or(1));
|
let align = u64::from(align.unwrap_or(1));
|
||||||
let offset = match *init {
|
let offset = match *init {
|
||||||
|
|||||||
Reference in New Issue
Block a user