Add main.rs and make usage a little nicer
This commit is contained in:
		
							parent
							
								
									8d8d6ac336
								
							
						
					
					
						commit
						3a5766186a
					
				
							
								
								
									
										302
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							
							
						
						
									
										302
									
								
								Cargo.lock
									
									
									
										generated
									
									
									
								
							| @ -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" | ||||
|  | ||||
| @ -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 | ||||
|  | ||||
| @ -74,5 +74,19 @@ | ||||
|     "indentationRules": { | ||||
|         "increaseIndentPattern": "^((?!\\/\\/).)*(\\{[^}\"'`]*|\\([^)\"'`]*|\\[[^\\]\"'`]*)$", | ||||
|         "decreaseIndentPattern": "^((?!.*?\\/\\*).*\\*/)?\\s*[\\)\\}\\]].*$" | ||||
|     } | ||||
|     }, | ||||
|     "colorizedBracketPairs": [ | ||||
|         [ | ||||
|             "(", | ||||
|             ")" | ||||
|         ], | ||||
|         [ | ||||
|             "[", | ||||
|             "]" | ||||
|         ], | ||||
|         [ | ||||
|             "{", | ||||
|             "}" | ||||
|         ] | ||||
|     ] | ||||
| } | ||||
| @ -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" } | ||||
| 
 | ||||
| argh = { version = "0.1.13", optional = true } | ||||
| stderrlog = { version = "0.6.0", optional = true } | ||||
| log = "*" | ||||
| colored = { version = "3.0.0", optional = true } | ||||
| @ -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 | ||||
|  | ||||
							
								
								
									
										193
									
								
								reid/src/main.rs
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										193
									
								
								reid/src/main.rs
									
									
									
									
									
										Normal file
									
								
							| @ -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<String>, | ||||
|     #[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<String> = 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(())
 | ||||
| // }
 | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user