From 3a5766186a65f7267c87208ac459c620ddcd1d9a Mon Sep 17 00:00:00 2001 From: sofia Date: Sun, 17 Aug 2025 17:07:19 +0300 Subject: [PATCH] Add main.rs and make usage a little nicer --- Cargo.lock | 302 +++++++++++++++++++++++++++ libtest.sh | 2 +- reid-lsp/language-configuration.json | 16 +- reid/Cargo.toml | 8 +- reid/src/ld.rs | 47 ++++- reid/src/main.rs | 193 +++++++++++++++++ 6 files changed, 554 insertions(+), 14 deletions(-) create mode 100644 reid/src/main.rs diff --git a/Cargo.lock b/Cargo.lock index dd570b7..3264d67 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -17,12 +17,59 @@ version = "2.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "320119579fcad9c21884f5c4861d16174d0e06250625266f50fe6898340abefa" +[[package]] +name = "android-tzdata" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e999941b234f3131b00bc13c22d06e8c5ff726d1b6318ac7eb276997bbb4fef0" + +[[package]] +name = "android_system_properties" +version = "0.1.5" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "819e7219dbd41043ac279b19830f2efc897156490d7fd6ea916720117ee66311" +dependencies = [ + "libc", +] + [[package]] name = "anyhow" version = "1.0.98" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e16d2d3311acee920a9eb8d33b8cbc1787ce4a264e85f964c2404b969bdcd487" +[[package]] +name = "argh" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "34ff18325c8a36b82f992e533ece1ec9f9a9db446bd1c14d4f936bac88fcd240" +dependencies = [ + "argh_derive", + "argh_shared", + "rust-fuzzy-search", +] + +[[package]] +name = "argh_derive" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "adb7b2b83a50d329d5d8ccc620f5c7064028828538bdf5646acd60dc1f767803" +dependencies = [ + "argh_shared", + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "argh_shared" +version = "0.1.13" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a464143cc82dedcdc3928737445362466b7674b5db4e2eb8e869846d6d84f4f6" +dependencies = [ + "serde", +] + [[package]] name = "async-trait" version = "0.1.88" @@ -78,6 +125,12 @@ version = "2.9.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "1b8e56985ec62d17e9c1001dc89c88ecd7dc08e47eba5ec7c29c7b5eeecde967" +[[package]] +name = "bumpalo" +version = "3.19.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "46c5e41b57b8bba42a04676d81cb89e9ee8e859a1a66f80a5a72e1cb76b34d43" + [[package]] name = "bytes" version = "1.10.1" @@ -99,6 +152,20 @@ version = "1.0.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "9555578bc9e57714c812a1f84e4fc5b4d21fcb063490c624de019f7464c91268" +[[package]] +name = "chrono" +version = "0.4.41" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c469d952047f47f91b68d1cba3f10d63c11d73e4636f24f08daf0278abf01c4d" +dependencies = [ + "android-tzdata", + "iana-time-zone", + "js-sys", + "num-traits", + "wasm-bindgen", + "windows-link", +] + [[package]] name = "colored" version = "3.0.0" @@ -108,6 +175,12 @@ dependencies = [ "windows-sys", ] +[[package]] +name = "core-foundation-sys" +version = "0.8.7" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "773648b94d0e5d620f64f280777445740e61fe701025087ec8b57f45c791888b" + [[package]] name = "crossbeam-utils" version = "0.8.21" @@ -250,12 +323,42 @@ version = "0.14.5" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "e5274423e17b7c9fc20b6e7e208532f9b19825d82dfd615708b70edd83df41f1" +[[package]] +name = "hermit-abi" +version = "0.5.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "fc0fef456e4baa96da950455cd02c081ca953b141298e41db3fc7e36b1da849c" + [[package]] name = "httparse" version = "1.10.1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "6dbf3de79e51f3d586ab4cb9d5c3e2c14aa28ed23d180cf89b4df0454a69cc87" +[[package]] +name = "iana-time-zone" +version = "0.1.63" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b0c919e5debc312ad217002b8048a17b7d83f80703865bbfcfebb0458b0b27d8" +dependencies = [ + "android_system_properties", + "core-foundation-sys", + "iana-time-zone-haiku", + "js-sys", + "log", + "wasm-bindgen", + "windows-core", +] + +[[package]] +name = "iana-time-zone-haiku" +version = "0.1.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f31827a206f56af32e590ba56d5d2d085f558508192593743f16b2306495269f" +dependencies = [ + "cc", +] + [[package]] name = "icu_collections" version = "2.0.0" @@ -374,12 +477,33 @@ dependencies = [ "libc", ] +[[package]] +name = "is-terminal" +version = "0.4.16" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "e04d7f318608d35d4b61ddd75cbdaee86b023ebe2bd5a66ee0915f0bf93095a9" +dependencies = [ + "hermit-abi", + "libc", + "windows-sys", +] + [[package]] name = "itoa" version = "1.0.15" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "4a5f13b858c8d314ee3e8f639011f7ccefe71f97f96e50151fb991f267928e2c" +[[package]] +name = "js-sys" +version = "0.3.77" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1cfaf33c695fc6e08064efbc1f72ec937429614f25eef83af942d0e227c3a28f" +dependencies = [ + "once_cell", + "wasm-bindgen", +] + [[package]] name = "lazy_static" version = "1.5.0" @@ -422,6 +546,12 @@ dependencies = [ "scopeguard", ] +[[package]] +name = "log" +version = "0.4.27" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "13dc2df351e3202783a1fe0d44375f7295ffb4049267b0f3018346dc122a1d94" + [[package]] name = "lsp-types" version = "0.94.1" @@ -656,8 +786,11 @@ checksum = "53a49587ad06b26609c52e423de037e7f57f20d53535d66e08c695f347df952a" name = "reid" version = "1.0.0-beta.4" dependencies = [ + "argh", "colored", + "log", "reid-lib", + "stderrlog", "thiserror", ] @@ -682,12 +815,24 @@ dependencies = [ "thiserror", ] +[[package]] +name = "rust-fuzzy-search" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a157657054ffe556d8858504af8a672a054a6e0bd9e8ee531059100c0fa11bb2" + [[package]] name = "rustc-demangle" version = "0.1.26" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "56f7d92ca342cea22a06f2121d944b4fd82af56988c270852495420f961d4ace" +[[package]] +name = "rustversion" +version = "1.0.22" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "b39cdef0fa800fc44525c84ccb54a029961a8215f9619753635a9c0d2538d46d" + [[package]] name = "ryu" version = "1.0.20" @@ -802,6 +947,19 @@ version = "1.2.0" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "a8f112729512f8e442d81f95a8a7ddf2b7c6b8a1a6f509a95864142b30cab2d3" +[[package]] +name = "stderrlog" +version = "0.6.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "61c910772f992ab17d32d6760e167d2353f4130ed50e796752689556af07dc6b" +dependencies = [ + "chrono", + "is-terminal", + "log", + "termcolor", + "thread_local", +] + [[package]] name = "syn" version = "2.0.104" @@ -824,6 +982,15 @@ dependencies = [ "syn", ] +[[package]] +name = "termcolor" +version = "1.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bab24d30b911b2376f3a13cc2cd443142f0c81dda04c118693e35b3835757755" +dependencies = [ + "winapi-util", +] + [[package]] name = "thiserror" version = "1.0.69" @@ -844,6 +1011,15 @@ dependencies = [ "syn", ] +[[package]] +name = "thread_local" +version = "1.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f60246a4944f24f6e018aa17cdeffb7818b76356965d03b07d6a9886e8962185" +dependencies = [ + "cfg-if", +] + [[package]] name = "tinystr" version = "0.8.1" @@ -1019,6 +1195,132 @@ version = "0.11.1+wasi-snapshot-preview1" source = "registry+https://github.com/rust-lang/crates.io-index" checksum = "ccf3ec651a847eb01de73ccad15eb7d99f80485de043efb2f370cd654f4ea44b" +[[package]] +name = "wasm-bindgen" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1edc8929d7499fc4e8f0be2262a241556cfc54a0bea223790e71446f2aab1ef5" +dependencies = [ + "cfg-if", + "once_cell", + "rustversion", + "wasm-bindgen-macro", +] + +[[package]] +name = "wasm-bindgen-backend" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "2f0a0651a5c2bc21487bde11ee802ccaf4c51935d0d3d42a6101f98161700bc6" +dependencies = [ + "bumpalo", + "log", + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-macro" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7fe63fc6d09ed3792bd0897b314f53de8e16568c2b3f7982f468c0bf9bd0b407" +dependencies = [ + "quote", + "wasm-bindgen-macro-support", +] + +[[package]] +name = "wasm-bindgen-macro-support" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "8ae87ea40c9f689fc23f209965b6fb8a99ad69aeeb0231408be24920604395de" +dependencies = [ + "proc-macro2", + "quote", + "syn", + "wasm-bindgen-backend", + "wasm-bindgen-shared", +] + +[[package]] +name = "wasm-bindgen-shared" +version = "0.2.100" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a05d73b933a847d6cccdda8f838a22ff101ad9bf93e33684f39c1f5f0eece3d" +dependencies = [ + "unicode-ident", +] + +[[package]] +name = "winapi-util" +version = "0.1.9" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "cf221c93e13a30d793f7645a0e7762c55d169dbb0a49671918a2319d289b10bb" +dependencies = [ + "windows-sys", +] + +[[package]] +name = "windows-core" +version = "0.61.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "c0fdd3ddb90610c7638aa2b3a3ab2904fb9e5cdbecc643ddb3647212781c4ae3" +dependencies = [ + "windows-implement", + "windows-interface", + "windows-link", + "windows-result", + "windows-strings", +] + +[[package]] +name = "windows-implement" +version = "0.60.0" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "a47fddd13af08290e67f4acabf4b459f647552718f683a7b415d290ac744a836" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-interface" +version = "0.59.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "bd9211b69f8dcdfa817bfd14bf1c97c9188afa36f4750130fcdf3f400eca9fa8" +dependencies = [ + "proc-macro2", + "quote", + "syn", +] + +[[package]] +name = "windows-link" +version = "0.1.3" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "5e6ad25900d524eaabdbbb96d20b4311e1e7ae1699af4fb28c17ae66c80d798a" + +[[package]] +name = "windows-result" +version = "0.3.4" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56f42bd332cc6c8eac5af113fc0c1fd6a8fd2aa08a0119358686e5160d0586c6" +dependencies = [ + "windows-link", +] + +[[package]] +name = "windows-strings" +version = "0.4.2" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "56e6c93f3a0c3b36176cb1327a4958a0353d5d166c2a35cb268ace15e91d3b57" +dependencies = [ + "windows-link", +] + [[package]] name = "windows-sys" version = "0.59.0" diff --git a/libtest.sh b/libtest.sh index 654be8a..948afbf 100755 --- a/libtest.sh +++ b/libtest.sh @@ -16,7 +16,7 @@ BINARY="$(echo $1 | cut -d'.' -f1)"".out" echo $1 -cargo run --example cli $@ && \ +cargo run -p reid $@ && \ ./$BINARY ; echo "Return value: ""$?" ## Command from: clang -v hello.o -o test diff --git a/reid-lsp/language-configuration.json b/reid-lsp/language-configuration.json index 9ca3e8f..0642e31 100644 --- a/reid-lsp/language-configuration.json +++ b/reid-lsp/language-configuration.json @@ -74,5 +74,19 @@ "indentationRules": { "increaseIndentPattern": "^((?!\\/\\/).)*(\\{[^}\"'`]*|\\([^)\"'`]*|\\[[^\\]\"'`]*)$", "decreaseIndentPattern": "^((?!.*?\\/\\*).*\\*/)?\\s*[\\)\\}\\]].*$" - } + }, + "colorizedBracketPairs": [ + [ + "(", + ")" + ], + [ + "[", + "]" + ], + [ + "{", + "}" + ] + ] } \ No newline at end of file diff --git a/reid/Cargo.toml b/reid/Cargo.toml index b3c0bf4..14cc8c3 100644 --- a/reid/Cargo.toml +++ b/reid/Cargo.toml @@ -7,9 +7,10 @@ edition = "2021" [features] -default = ["color"] +default = ["color", "cli"] color = ["colored"] +cli = ["argh", "stderrlog"] log_output = [] context_debug = [] @@ -18,4 +19,7 @@ context_debug = [] thiserror = "1.0.44" reid-lib = { path = "../reid-llvm-lib", version = "1.0.0-beta.4", registry="gitea-teascade" } -colored = {version = "3.0.0", optional = true} \ No newline at end of file +argh = { version = "0.1.13", optional = true } +stderrlog = { version = "0.6.0", optional = true } +log = "*" +colored = { version = "3.0.0", optional = true } \ No newline at end of file diff --git a/reid/src/ld.rs b/reid/src/ld.rs index 9873c66..725d79a 100644 --- a/reid/src/ld.rs +++ b/reid/src/ld.rs @@ -1,4 +1,9 @@ -use std::{path::PathBuf, process::Command, thread, time::Duration}; +use std::{ + path::PathBuf, + process::{Command, Stdio}, + thread, + time::Duration, +}; pub struct LDRunner { command: String, @@ -26,8 +31,7 @@ impl LDRunner { let dyn_linker_path = find_objectfile(&self.dynamic_linker); let crt1_path = find_objectfile("crt1.o"); - #[cfg(feature = "log_output")] - println!("LDRunner: Using dynamic linker at: {:?}", dyn_linker_path); + log::debug!("LDRunner: Using dynamic linker at: {:?}", dyn_linker_path); let mut ld = Command::new(&self.command); ld.arg("-dynamic-linker").arg(dyn_linker_path).arg(crt1_path); @@ -40,21 +44,38 @@ impl LDRunner { .arg("-o") .arg(out_path.to_str().unwrap()); - #[cfg(feature = "log_output")] - println!( + log::debug!( "LDRunner: Executing linker to objfile at {:?} => {:?}", - input_path, out_path + input_path, + out_path ); #[cfg(feature = "log_output")] dbg!(&ld); - ld.spawn().expect("Unable to execute ld!"); + let ld_output = ld.output().expect("Unable to execute ld!"); + if !ld_output.status.success() { + let code = ld_output.status.code().unwrap_or(255); + log::error!("LD exited with code {code}"); + println!("{}", unsafe { String::from_utf8_unchecked(ld_output.stderr) }); + return; + } thread::sleep(Duration::from_millis(100)); - #[cfg(feature = "log_output")] - println!("Setting executable bit to {:?}..", out_path); - Command::new("chmod").arg("+x").arg(out_path).spawn().unwrap(); + log::debug!("Setting executable bit to {:?}..", out_path); + + let chmod_output = Command::new("chmod") + .arg("+x") + .arg(out_path) + .output() + .expect("Unable to execute ld!"); + + if !chmod_output.status.success() { + let code = chmod_output.status.code().unwrap_or(255); + log::error!("chmod exited with code {code}"); + println!("{}", unsafe { String::from_utf8_unchecked(chmod_output.stderr) }); + return; + } thread::sleep(Duration::from_millis(100)); } } @@ -64,6 +85,12 @@ fn find_objectfile(name: &str) -> String { .arg(&name) .output() .expect("Unable to execute whereis"); + if !whereis.status.success() { + let code = whereis.status.code().unwrap_or(255); + log::error!("whereis exited with code {code}"); + println!("{}", unsafe { String::from_utf8_unchecked(whereis.stderr) }); + panic!(); + } let whereis_output = String::from_utf8(whereis.stdout).unwrap(); whereis_output diff --git a/reid/src/main.rs b/reid/src/main.rs new file mode 100644 index 0000000..5297358 --- /dev/null +++ b/reid/src/main.rs @@ -0,0 +1,193 @@ +use std::{env, fs, path::PathBuf}; + +use argh::FromArgs; +use log::*; +use reid::{compile_simple, ld::LDRunner, CustomIRs}; +use reid_lib::compile::CompileOutput; + +#[derive(FromArgs, PartialEq, Debug)] +/// Compile or run a Reid (.reid) file +#[argh(help_triggers("-h", "--help", "help"))] +struct Options { + #[argh(option, short = 'l', default = "log::Level::Info")] + /// log level + log_level: log::Level, + #[argh(subcommand)] + command: Command, +} + +#[derive(FromArgs, PartialEq, Debug)] +#[argh(subcommand)] +enum Command { + Build(BuildOpts), +} + +#[derive(FromArgs, PartialEq, Debug)] +/// Build an executable file without running it +#[argh(subcommand, name = "build")] +struct BuildOpts { + #[argh(option, long = "lib", short = 'l')] + /// asd + libraries: Vec, + #[argh(positional)] + path: PathBuf, +} + +fn main() { + let options: Options = argh::from_env(); + let mut errlog = stderrlog::new(); + errlog.module(module_path!()).verbosity(options.log_level); + if options.log_level as u8 > 3 { + errlog.timestamp(stderrlog::Timestamp::Second); + } + errlog.init().unwrap(); + + match options.command { + Command::Build(build) => { + let cpu = std::env::var("CPU").unwrap_or("generic".to_owned()); + let features = std::env::var("REIDFLAGS").unwrap_or("".to_owned()); + + let path = match build.path.canonicalize() { + Ok(path) => path, + Err(e) => { + error!("{e}"); + return; + } + }; + + let parent = path.with_extension(""); + let llvm_ir_path = parent.with_extension("ll"); + let object_path = parent.with_extension("o"); + let llir_path = parent.with_extension("llir"); + let mir_path = parent.with_extension("mir"); + let asm_path = parent.with_extension("asm"); + + let before = std::time::SystemTime::now(); + + let text = match fs::read_to_string(&path) { + Ok(text) => text, + Err(e) => { + error!("Could not read file: {e}"); + return; + } + }; + + match compile_simple(&text, PathBuf::from(&path), Some(cpu), vec![features]) { + Ok(( + CompileOutput { + triple: _triple, + assembly, + obj_buffer, + llvm_ir: _llvm_ir, + }, + CustomIRs { llir, mir }, + )) => { + #[cfg(feature = "log_output")] + { + println!("{}", _llvm_ir); + println!("Compiled with triple: {}\n", &_triple); + println!("Output LLVM IR to {:?}", llvm_ir_path); + println!("Output Assembly to {:?}", asm_path); + println!("Output Object-file to {:?}\n", object_path); + println!("Output LLIR-file to {:?}\n", llir_path); + println!("Output MIR-file to {:?}\n", mir_path); + } + + fs::write(&llvm_ir_path, &_llvm_ir).expect("Could not write LLVM IR -file!"); + fs::write(&asm_path, &assembly).expect("Could not write Assembly-file!"); + fs::write(&object_path, &obj_buffer).expect("Could not write Object-file!"); + fs::write(&llir_path, &llir).expect("Could not write LLIR-file!"); + fs::write(&mir_path, &mir).expect("Could not write MIR-file!"); + let after = std::time::SystemTime::now(); + println!( + "Compilation took: {:.2}ms\n", + (after.duration_since(before).unwrap().as_micros() as f32) / 1000. + ); + + println!("Linking {:?}", &object_path); + + let linker = std::env::var("LD").unwrap_or("ld".to_owned()); + let mut linker = LDRunner::from_command(&linker).with_library("c").with_library("m"); + for library in build.libraries { + linker = linker.with_library(&library); + } + linker.invoke(&object_path, &object_path.with_extension("out")); + } + Err(e) => panic!("{}", e), + }; + } + } +} + +// fn main() -> Result<(), std::io::Error> { +// let args: Vec = env::args().collect(); +// let mut iter = args.into_iter().skip(1); +// if let Some(filename) = iter.next() { +// let mut libraries = Vec::new(); +// while let Some(libname) = iter.next() { +// libraries.push(libname); +// } + +// let path = PathBuf::from(filename).canonicalize().unwrap(); +// let parent = path.with_extension(""); +// let llvm_ir_path = parent.with_extension("ll"); +// let object_path = parent.with_extension("o"); +// let llir_path = parent.with_extension("llir"); +// let mir_path = parent.with_extension("mir"); +// let asm_path = parent.with_extension("asm"); + +// let before = std::time::SystemTime::now(); + +// let text = fs::read_to_string(&path)?; + +// let cpu = std::env::var("CPU").unwrap_or("generic".to_owned()); +// let features = std::env::var("REIDFLAGS").unwrap_or("".to_owned()); + +// match compile_simple(&text, PathBuf::from(&path), Some(cpu), vec![features]) { +// Ok(( +// CompileOutput { +// triple: _triple, +// assembly, +// obj_buffer, +// llvm_ir: _llvm_ir, +// }, +// CustomIRs { llir, mir }, +// )) => { +// #[cfg(feature = "log_output")] +// { +// println!("{}", _llvm_ir); +// println!("Compiled with triple: {}\n", &_triple); +// println!("Output LLVM IR to {:?}", llvm_ir_path); +// println!("Output Assembly to {:?}", asm_path); +// println!("Output Object-file to {:?}\n", object_path); +// println!("Output LLIR-file to {:?}\n", llir_path); +// println!("Output MIR-file to {:?}\n", mir_path); +// } + +// fs::write(&llvm_ir_path, &_llvm_ir).expect("Could not write LLVM IR -file!"); +// fs::write(&asm_path, &assembly).expect("Could not write Assembly-file!"); +// fs::write(&object_path, &obj_buffer).expect("Could not write Object-file!"); +// fs::write(&llir_path, &llir).expect("Could not write LLIR-file!"); +// fs::write(&mir_path, &mir).expect("Could not write MIR-file!"); +// let after = std::time::SystemTime::now(); +// println!( +// "Compilation took: {:.2}ms\n", +// (after.duration_since(before).unwrap().as_micros() as f32) / 1000. +// ); + +// println!("Linking {:?}", &object_path); + +// let linker = std::env::var("LD").unwrap_or("ld".to_owned()); +// let mut linker = LDRunner::from_command(&linker).with_library("c").with_library("m"); +// for library in libraries { +// linker = linker.with_library(&library); +// } +// linker.invoke(&object_path, &object_path.with_extension("out")); +// } +// Err(e) => panic!("{}", e), +// }; +// } else { +// println!("Please input compiled file path!") +// } +// Ok(()) +// }