Add create_header_files_in_dir step

This commit is contained in:
Felix Schütt
2022-12-27 07:53:53 +01:00
parent 8e0484b648
commit f6816dd0b2
3 changed files with 94 additions and 0 deletions

11
Cargo.lock generated
View File

@@ -2253,6 +2253,16 @@ dependencies = [
"memchr",
]
[[package]]
name = "object"
version = "0.30.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "239da7f290cfa979f43f85a8efeee9a8a76d0827c356d37f9d3d7254d6b537fb"
dependencies = [
"flate2",
"memchr",
]
[[package]]
name = "once_cell"
version = "1.16.0"
@@ -4318,6 +4328,7 @@ dependencies = [
"log",
"minisign",
"nuke-dir",
"object 0.30.0",
"pathdiff",
"prettytable-rs",
"regex",

View File

@@ -87,6 +87,7 @@ semver = "1.0.14"
rpassword = "7.2.0"
pathdiff = "0.2.1"
sha2 = "0.10.6"
object = "0.30.0"
[build-dependencies]
chrono = { version = "^0.4", default-features = false, features = [ "std", "clock" ] }

View File

@@ -724,6 +724,88 @@ pub(super) fn prepare_directory_from_single_wasm_file(
Ok(())
}
/// Create the static_defs.h header files in the /include directory
fn create_header_files_in_dir(
directory: &Path,
atoms: &[(String, Vec<u8>)],
entrypoint: &Entrypoint,
prefixes: &[String],
object_format: ObjectFormat,
) -> anyhow::Result<()> {
use object::{Object, ObjectSection};
use wasmer_types::compilation::symbols::ModuleMetadataSymbolRegistry;
if object_format == ObjectFormat::Serialized {
return Ok(());
}
std::fs::create_dir_all(directory.join("include")).map_err(|e| {
anyhow::anyhow!("cannot create /include dir in {}: {e}", directory.display())
})?;
let prefix_map = entrypoint
.atoms
.iter()
.map(|a| (a.atom.clone(), Vec::new()))
.collect::<Vec<_>>();
let prefixes = PrefixMapCompilation::from_input(&prefix_map, prefixes, false)?;
for atom in entrypoint.atoms.iter() {
let atom_name = &atom.atom;
let prefix = prefixes
.get_prefix_for_atom(&atom_name)
.ok_or_else(|| anyhow::anyhow!("cannot get prefix for atom {atom_name}"))?;
let atom_bytes = atoms
.iter()
.find_map(|(name, bytes)| if name == atom_name { Some(bytes) } else { None })
.ok_or_else(|| {
anyhow::anyhow!("could not find bytes for atom {atom_name} in generate-header step")
})?;
let object_file_src = directory.join(&atom.path);
let object_file = std::fs::read(&object_file_src)
.map_err(|e| anyhow::anyhow!("could not read {}: {e}", object_file_src.display()))?;
let module_name = format!("WASMER_{prefix}_METADATA");
let obj_file = object::File::parse(&*object_file)?;
let section = obj_file.section_by_name(&module_name).ok_or_else(|| {
anyhow::anyhow!(
"missing section {module_name} in object file {}",
object_file_src.display()
)
})?;
let metadata_length = section.size();
let store = Store::default();
let module_info =
unsafe { Module::deserialize(&store, atom_bytes.as_slice()) }.map_err(|e| {
anyhow::anyhow!(
"could not deserialized module {atom_name} in generate-header step: {e}"
)
})?;
let header_file_path = directory
.join("include")
.join(format!("static_defs_{prefix}.h"));
let header_file_src = crate::c_gen::staticlib_header::generate_header_file(
&atom_name,
&format!("WASMER_{prefix}_METADATA"),
&module_info.info(),
&ModuleMetadataSymbolRegistry { prefix },
metadata_length as usize,
);
std::fs::write(&header_file_path, &header_file_src).map_err(|e| {
anyhow::anyhow!(
"could not write static_defs.h for atom {atom_name} in generate-header step: {e}"
)
})?;
}
Ok(())
}
/// Given a directory, links all the objects from the directory appropriately
fn link_exe_from_dir(
directory: &Path,