nac3artiq: embed linker script, put intermediate objects in temp dir
This commit is contained in:
parent
1fea51d9b3
commit
7d66195eae
|
@ -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"
|
||||
|
|
|
@ -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" ];
|
||||
|
|
|
@ -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" }
|
||||
|
|
|
@ -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() {
|
||||
|
|
Loading…
Reference in New Issue