From adf2f7479a34e01f03c24aa2695c3ce6c2f925eb Mon Sep 17 00:00:00 2001 From: "Taha. Dostifam" Date: Thu, 25 Sep 2025 00:13:41 +0330 Subject: [PATCH] feat: dibuilder and sanitizer completed --- crates/cli/src/main.rs | 13 ++++++++----- crates/codegen/src/builder/exprs.rs | 13 ++++++++----- crates/codegen/src/context/context.rs | 6 +++++- crates/codegen/src/options.rs | 3 +++ examples/main.cyr | 7 ++++++- flake.nix | 1 + 6 files changed, 31 insertions(+), 12 deletions(-) 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/builder/exprs.rs b/crates/codegen/src/builder/exprs.rs index 10e4db47..6d7ba497 100644 --- a/crates/codegen/src/builder/exprs.rs +++ b/crates/codegen/src/builder/exprs.rs @@ -1,7 +1,10 @@ -use crate::{builder::{ - module::{CodeGenBuilder, LocalIRValue}, - values::{InternalValue, InternalValueKind}, -}, llvm_set_current_location}; +use crate::{ + builder::{ + module::{CodeGenBuilder, LocalIRValue}, + values::{InternalValue, InternalValueKind}, + }, + llvm_set_current_location, +}; use ast::{ LiteralKind, SelfModifierKind, StringPrefix, operators::{InfixOperator, PrefixOperator, UnaryOperator}, @@ -9,7 +12,7 @@ use ast::{ }; use inkwell::{ AddressSpace, FloatPredicate, IntPredicate, - debug_info::{AsDIScope, DILocation}, + debug_info::AsDIScope, types::{BasicMetadataTypeEnum, BasicTypeEnum}, values::{ArrayValue, BasicMetadataValueEnum, BasicValue, BasicValueEnum, IntValue, PointerValue}, }; diff --git a/crates/codegen/src/context/context.rs b/crates/codegen/src/context/context.rs index e38ce200..896aca4e 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 5e4a7e95..ca32d42e 100644 --- a/examples/main.cyr +++ b/examples/main.cyr @@ -1,7 +1,12 @@ import std::string{String}; import std::libc{printf, malloc, free}; +func alloc() { + #ptr = malloc(24); +} + func main() { - #a = 10; + printf("Hello, Cyrus!\n"); + alloc(); } diff --git a/flake.nix b/flake.nix index af014150..3f25c91f 100755 --- a/flake.nix +++ b/flake.nix @@ -109,6 +109,7 @@ llvm_18.lib llvm_18.dev libxml2 + lldb_18 ]; shellHook = '' export LIBRARY_PATH="${pkgs.glibc.static}/lib:${pkgs.glibc}/lib:${pkgs.gcc_multi}/lib:${pkgs.llvm_18.lib}/lib:${pkgs.libxml2}/lib:$LIBRARY_PATH"