nac3artiq: embed linker script, put intermediate objects in temp dir

This commit is contained in:
Sebastien Bourdeauducq 2021-11-06 13:03:45 +08:00
parent 1fea51d9b3
commit 7d66195eae
5 changed files with 36 additions and 4 deletions

24
Cargo.lock generated
View File

@ -492,6 +492,7 @@ dependencies = [
"nac3parser",
"parking_lot",
"pyo3",
"tempfile",
]
[[package]]
@ -920,6 +921,15 @@ version = "0.6.25"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f497285884f3fcff424ffc933e56d7cbca511def0c9831a7f9b5f6153e3cc89b"
[[package]]
name = "remove_dir_all"
version = "0.5.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3acd125665422973a33ac9d3dd2df85edad0f4ae9b00dafb1a05e43a9f5ef8e7"
dependencies = [
"winapi",
]
[[package]]
name = "runkernel"
version = "0.1.0"
@ -1058,6 +1068,20 @@ dependencies = [
"unicode-xid",
]
[[package]]
name = "tempfile"
version = "3.2.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "dac1c663cfc93810f88aed9b8941d48cabf856a1b111c29a40439018d870eb22"
dependencies = [
"cfg-if",
"libc",
"rand",
"redox_syscall",
"remove_dir_all",
"winapi",
]
[[package]]
name = "term"
version = "0.7.0"

View File

@ -12,7 +12,7 @@
pkgs.rustPlatform.buildRustPackage {
name = "nac3artiq";
src = self;
cargoSha256 = "sha256-o/3QRbe1WEOA7NPyO1bXCLxUxUWBex8bPcApl/aT040=";
cargoSha256 = "sha256-otKLhr58HYMjVXAof6AdObNpggPnvK6qOl7I+4LWIP8=";
nativeBuildInputs = [ pkgs.python3 pkgs.llvm_12 ];
buildInputs = [ pkgs.python3 pkgs.libffi pkgs.libxml2 pkgs.llvm_12 ];
cargoBuildFlags = [ "--package" "nac3artiq" ];

View File

@ -12,5 +12,6 @@ crate-type = ["cdylib"]
pyo3 = { version = "0.14", features = ["extension-module"] }
inkwell = { git = "https://github.com/TheDan64/inkwell", branch = "master", features = ["llvm12-0"] }
parking_lot = "0.11"
tempfile = "3"
nac3parser = { path = "../nac3parser" }
nac3core = { path = "../nac3core" }

View File

@ -1,6 +1,5 @@
use std::collections::{HashMap, HashSet};
use std::fs;
use std::path::Path;
use std::process::Command;
use std::sync::Arc;
@ -26,6 +25,8 @@ use nac3core::{
typecheck::{type_inferencer::PrimitiveStore, typedef::Type},
};
use tempfile::{self, TempDir};
use crate::{codegen::ArtiqCodeGenerator, symbol_resolver::Resolver};
mod codegen;
@ -68,6 +69,7 @@ struct Nac3 {
to_be_registered: Vec<PyObject>,
primitive_ids: PrimitivePythonId,
global_value_ids: Arc<Mutex<HashSet<u64>>>,
working_directory: TempDir,
}
impl Nac3 {
@ -283,6 +285,9 @@ impl Nac3 {
.unwrap(),
};
let working_directory = tempfile::Builder::new().prefix("nac3-").tempdir().unwrap();
fs::write(working_directory.path().join("kernel.ld"), include_bytes!("kernel.ld")).unwrap();
Ok(Nac3 {
isa,
time_fns,
@ -296,6 +301,7 @@ impl Nac3 {
pyid_to_type: Default::default(),
to_be_registered: Default::default(),
global_value_ids: Default::default(),
working_directory
})
}
@ -405,6 +411,7 @@ impl Nac3 {
calls: instance.calls,
};
let isa = self.isa;
let working_directory = self.working_directory.path().to_owned();
let f = Arc::new(WithCall::new(Box::new(move |module| {
let builder = PassManagerBuilder::create();
builder.set_optimization_level(OptimizationLevel::Default);
@ -436,7 +443,7 @@ impl Nac3 {
.write_to_file(
module,
FileType::Object,
Path::new(&format!("{}.o", module.get_name().to_str().unwrap())),
&working_directory.join(&format!("{}.o", module.get_name().to_str().unwrap())),
)
.expect("couldn't write module to file");
})));
@ -460,7 +467,7 @@ impl Nac3 {
"module.elf".to_string(),
];
if isa != Isa::Host {
linker_args.push("-Tkernel.ld".to_string());
linker_args.push("-T".to_string() + self.working_directory.path().join("kernel.ld").to_str().unwrap());
}
linker_args.extend(thread_names.iter().map(|name| name.to_owned() + ".o"));
if let Ok(linker_status) = Command::new("ld.lld").args(linker_args).status() {