Cranelift: Module data apis should allow specifying the object file section #1640

This commit is contained in:
Carlo Kok
2020-06-06 16:08:21 +02:00
parent 4bb58940c7
commit 6b47079884
2 changed files with 32 additions and 15 deletions

View File

@@ -234,6 +234,7 @@ impl Backend for ObjectBackend {
ref data_decls,
ref function_relocs,
ref data_relocs,
section: ref datasection
} = data_ctx.description();
let reloc_size = match self.isa.triple().pointer_width().unwrap() {
@@ -264,22 +265,30 @@ 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 datasection.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::ReadOnlyDataWithRel
};
self.object.section_id(section_kind)
} else {
StandardSection::UninitializedData
}
} else if tls {
StandardSection::Tls
} else if writable {
StandardSection::Data
} else if relocs.is_empty() {
StandardSection::ReadOnlyData
} else {
StandardSection::ReadOnlyDataWithRel
};
let section = self.object.section_id(section_kind);
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 offset = match *init {