diff --git a/crates/cli/src/main.rs b/crates/cli/src/main.rs index 28c1512b..ad6e4c37 100644 --- a/crates/cli/src/main.rs +++ b/crates/cli/src/main.rs @@ -1,5 +1,7 @@ use clap::{Parser, ValueEnum}; -use codegen::options::{BuildDir, CodeGenLinkerOptions, CodeGenOptions, CodeGenSanitizer, CodeModelOptions, RelocModeOptions}; +use codegen::options::{ + BuildDir, CodeGenLinkerOptions, CodeGenOptions, CodeGenSanitizer, CodeModelOptions, RelocModeOptions, +}; use commands::*; use diagcentral::display_single_custom_diag; use project_layout::PROJECT_FILE_PATH; @@ -112,6 +114,9 @@ struct CompilerOptions { #[clap(long, help = "Disables all warnings.")] disable_warnings: bool, + #[clap(long, help = "Build artifacts in release mode, with optimizations.")] + release: bool, + #[clap(long, help = "Set cyrus standard library path.")] stdlib: Option, @@ -119,10 +124,7 @@ struct CompilerOptions { display_target_machine: bool, #[clap(long = "sanitize", help = "Enables dynamic code analysis for bug detection.")] - #[clap( - value_enum, - value_delimiter = ',' - )] + #[clap(value_enum, value_delimiter = ',')] pub sanitizer: Vec, #[clap(long, value_enum, default_value_t = RelocMode::default(), @@ -214,6 +216,7 @@ impl Sanitizer { impl CompilerOptions { pub fn to_compiler_options(&self) -> CodeGenOptions { CodeGenOptions { + release: self.release, sanitizer: self.sanitizer.iter().map(|s| s.to_compiler_sanitizer()).collect(), linker_flags: self.linkerflags.clone(), linker_options: CodeGenLinkerOptions::default(), diff --git a/crates/codegen/src/context/context.rs b/crates/codegen/src/context/context.rs index dc19e34d..7ada77ed 100644 --- a/crates/codegen/src/context/context.rs +++ b/crates/codegen/src/context/context.rs @@ -164,9 +164,13 @@ impl CodeGenContext { linker_command.arg("-o").arg(output_path); linker_command.args(object_files_str_list); - linker_command.args(self.opts.linker_flags.clone()); + if !self.opts.release { + linker_command.arg("-g"); + linker_command.arg("-fno-omit-frame-pointer"); + } + if !self.opts.sanitizer.is_empty() { let sanitizer_flags: Vec = self.opts.sanitizer.iter().map(|s| s.to_string()).collect(); let joined_flags = sanitizer_flags.join(","); diff --git a/crates/codegen/src/options.rs b/crates/codegen/src/options.rs index ccb48fc4..41185e53 100644 --- a/crates/codegen/src/options.rs +++ b/crates/codegen/src/options.rs @@ -4,6 +4,7 @@ use serde::Deserialize; #[derive(Deserialize, Debug, Clone)] pub struct CodeGenOptions { + pub release: bool, pub sanitizer: Vec, pub linker: Option, pub linker_options: CodeGenLinkerOptions, @@ -82,11 +83,13 @@ impl CodeGenOptions { linker_options: CodeGenLinkerOptions::default(), linker_flags: Vec::new(), sanitizer: Vec::new(), + release: false, } } pub fn override_options(&mut self, instance: Self) { *self = Self { + release: instance.release || self.release, linker: instance.linker.or(self.linker.clone()), project_type: instance.project_type.or(self.project_type.clone()), project_name: instance.project_name.or(self.project_name.clone()), diff --git a/examples/main.cyr b/examples/main.cyr index a444ec61..35702cb7 100644 --- a/examples/main.cyr +++ b/examples/main.cyr @@ -1,8 +1,6 @@ import std::libc{printf}; -fn main() { - -} +fn main() {} // pub config = const struct { // host = "127.0.0.1",