This commit is contained in:
Edgar 2024-02-09 09:03:27 +01:00
parent e23671c91a
commit 0d7ab09531
No known key found for this signature in database
GPG key ID: 70ADAE8F35904387
3 changed files with 108 additions and 160 deletions

112
Cargo.lock generated
View file

@ -28,9 +28,9 @@ dependencies = [
[[package]] [[package]]
name = "anstream" name = "anstream"
version = "0.6.9" version = "0.6.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "3fde6067df7359f2d6335ec1a50c1f8f825801687d10da0cc4c6b08e3f6afd15" checksum = "6e2e1ebcb11de5c03c67de28a7df593d32191b44939c482e97702baaaa6ab6a5"
dependencies = [ dependencies = [
"anstyle", "anstyle",
"anstyle-parse", "anstyle-parse",
@ -42,9 +42,9 @@ dependencies = [
[[package]] [[package]]
name = "anstyle" name = "anstyle"
version = "1.0.4" version = "1.0.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "7079075b41f533b8c61d2a4d073c4676e1f8b249ff94a393b0595db304e0dd87" checksum = "8901269c6307e8d93993578286ac0edf7f195079ffff5ebdeea6a59ffb7e36bc"
[[package]] [[package]]
name = "anstyle-parse" name = "anstyle-parse"
@ -177,9 +177,9 @@ checksum = "baf1de4339761588bc0619e3cbc0120ee582ebb74b53b4efbf79117bd2da40fd"
[[package]] [[package]]
name = "clap" name = "clap"
version = "4.4.18" version = "4.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "1e578d6ec4194633722ccf9544794b71b1385c3c027efe0c55db226fc880865c" checksum = "80c21025abd42669a92efc996ef13cfb2c5c627858421ea58d5c3b331a6c134f"
dependencies = [ dependencies = [
"clap_builder", "clap_builder",
"clap_derive", "clap_derive",
@ -187,9 +187,9 @@ dependencies = [
[[package]] [[package]]
name = "clap_builder" name = "clap_builder"
version = "4.4.18" version = "4.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "4df4df40ec50c46000231c914968278b1eb05098cf8f1b3a518a95030e71d1c7" checksum = "458bf1f341769dfcf849846f65dffdf9146daa56bcd2a47cb4e1de9915567c99"
dependencies = [ dependencies = [
"anstream", "anstream",
"anstyle", "anstyle",
@ -199,9 +199,9 @@ dependencies = [
[[package]] [[package]]
name = "clap_derive" name = "clap_derive"
version = "4.4.7" version = "4.5.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "cf9804afaaf59a91e75b022a30fb7229a7901f60c755489cc61c9b423b836442" checksum = "307bc0538d5f0f83b8248db3087aa92fe504e4691294d0c96c0eabc33f47ba47"
dependencies = [ dependencies = [
"heck", "heck",
"proc-macro2", "proc-macro2",
@ -211,9 +211,9 @@ dependencies = [
[[package]] [[package]]
name = "clap_lex" name = "clap_lex"
version = "0.6.0" version = "0.7.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "702fc72eb24e5a1e48ce58027a675bc24edd52096d5397d4aea7c6dd9eca0bd1" checksum = "98cc8fbded0c607b7ba9dd60cd98df59af97e84d24e49c8557331cfc26d301ce"
[[package]] [[package]]
name = "color-eyre" name = "color-eyre"
@ -333,6 +333,7 @@ dependencies = [
"edlang_ir", "edlang_ir",
"edlang_parser", "edlang_parser",
"edlang_session", "edlang_session",
"edlang_span",
"inkwell", "inkwell",
"llvm-sys", "llvm-sys",
"tracing", "tracing",
@ -379,7 +380,7 @@ version = "0.1.0"
dependencies = [ dependencies = [
"ariadne", "ariadne",
"edlang_ast", "edlang_ast",
"itertools 0.12.0", "itertools 0.12.1",
"lalrpop", "lalrpop",
"lalrpop-util", "lalrpop-util",
"logos", "logos",
@ -418,21 +419,11 @@ version = "1.0.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5" checksum = "5443807d6dff69373d433ab9ef5378ad8df50ca6298caf15de6e52e24aaf54d5"
[[package]]
name = "errno"
version = "0.3.8"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "a258e46cdc063eb8519c00b9fc845fc47bcfca4130e2f08e88665ceda8474245"
dependencies = [
"libc",
"windows-sys 0.52.0",
]
[[package]] [[package]]
name = "eyre" name = "eyre"
version = "0.6.11" version = "0.6.12"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "b6267a1fa6f59179ea4afc8e50fd8612a3cc60bc858f786ff877a4a8cb042799" checksum = "7cd915d99f24784cdc19fd37ef22b97e3ff0ae756c7e492e9fbfe897d61e2aec"
dependencies = [ dependencies = [
"indenter", "indenter",
"once_cell", "once_cell",
@ -481,9 +472,9 @@ checksum = "95505c38b4572b2d910cecb0281560f54b440a19336cbbcb27bf6ce6adc6f5a8"
[[package]] [[package]]
name = "hermit-abi" name = "hermit-abi"
version = "0.3.4" version = "0.3.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5d3d0e0f38255e7fa3cf31335b3a56f05febd18025f4db5ef7a0cfb4f8da651f" checksum = "d0c62115964e08cb8039170eb33c1d0e2388a256930279edca206fff675f82c3"
[[package]] [[package]]
name = "indenter" name = "indenter"
@ -493,9 +484,9 @@ checksum = "ce23b50ad8242c51a442f3ff322d56b02f08852c77e4c0b4d3fd684abc89c683"
[[package]] [[package]]
name = "indexmap" name = "indexmap"
version = "2.1.0" version = "2.2.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d530e1a18b1cb4c484e6e34556a0d948706958449fca0cab753d649f2bce3d1f" checksum = "824b2ae422412366ba479e8111fd301f7b5faece8149317bb81925979a53f520"
dependencies = [ dependencies = [
"equivalent", "equivalent",
"hashbrown", "hashbrown",
@ -503,8 +494,8 @@ dependencies = [
[[package]] [[package]]
name = "inkwell" name = "inkwell"
version = "0.2.0" version = "0.4.0"
source = "git+https://github.com/TheDan64/inkwell?rev=0cdaa34bd612464f310b3fdefa00a75d1324687d#0cdaa34bd612464f310b3fdefa00a75d1324687d" source = "git+https://github.com/TheDan64/inkwell?rev=e0cc92dc28eb684684e450ca28daedc52e613962#e0cc92dc28eb684684e450ca28daedc52e613962"
dependencies = [ dependencies = [
"either", "either",
"inkwell_internals", "inkwell_internals",
@ -516,8 +507,8 @@ dependencies = [
[[package]] [[package]]
name = "inkwell_internals" name = "inkwell_internals"
version = "0.8.0" version = "0.9.0"
source = "git+https://github.com/TheDan64/inkwell?rev=0cdaa34bd612464f310b3fdefa00a75d1324687d#0cdaa34bd612464f310b3fdefa00a75d1324687d" source = "git+https://github.com/TheDan64/inkwell?rev=e0cc92dc28eb684684e450ca28daedc52e613962#e0cc92dc28eb684684e450ca28daedc52e613962"
dependencies = [ dependencies = [
"proc-macro2", "proc-macro2",
"quote", "quote",
@ -526,12 +517,12 @@ dependencies = [
[[package]] [[package]]
name = "is-terminal" name = "is-terminal"
version = "0.4.10" version = "0.4.11"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0bad00257d07be169d870ab665980b06cdb366d792ad690bf2e76876dc503455" checksum = "fe8f25ce1159c7740ff0b9b2f5cdf4a8428742ba7c112b9f20f22cd5219c7dab"
dependencies = [ dependencies = [
"hermit-abi", "hermit-abi",
"rustix", "libc",
"windows-sys 0.52.0", "windows-sys 0.52.0",
] ]
@ -546,9 +537,9 @@ dependencies = [
[[package]] [[package]]
name = "itertools" name = "itertools"
version = "0.12.0" version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "25db6b064527c5d482d0423354fcd07a89a2dfe07b67892e62411946db7f07b0" checksum = "ba291022dbbd398a455acf126c1e341954079855bc60dfdda641363bd6922569"
dependencies = [ dependencies = [
"either", "either",
] ]
@ -593,9 +584,9 @@ checksum = "e2abad23fbc42b3700f2f279844dc832adb2b2eb069b2df918f455c4e18cc646"
[[package]] [[package]]
name = "libc" name = "libc"
version = "0.2.152" version = "0.2.153"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "13e3bf6590cbc649f4d1a3eefc9d5d6eb746f5200ffb04e5e142700b8faa56e7" checksum = "9c198f91728a82281a64e1f4f9eeb25d82cb32a5de251c6bd1b5154d63a8e7bd"
[[package]] [[package]]
name = "libredox" name = "libredox"
@ -608,12 +599,6 @@ dependencies = [
"redox_syscall", "redox_syscall",
] ]
[[package]]
name = "linux-raw-sys"
version = "0.4.13"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "01cda141df6706de531b6c46c3a33ecca755538219bd484262fa09410c13539c"
[[package]] [[package]]
name = "llvm-sys" name = "llvm-sys"
version = "170.0.1" version = "170.0.1"
@ -693,9 +678,9 @@ checksum = "523dc4f511e55ab87b694dc30d0f820d60906ef06413f93d4d7a1385599cc149"
[[package]] [[package]]
name = "miniz_oxide" name = "miniz_oxide"
version = "0.7.1" version = "0.7.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "e7810e0be55b428ada41041c41f32c9f1a42817901b4ccf45fa3d4b6561e74c7" checksum = "9d811f3e15f28568be3407c8e7fdb6514c1cda3cb30683f15b6a1a1dc4ea14a7"
dependencies = [ dependencies = [
"adler", "adler",
] ]
@ -805,9 +790,9 @@ checksum = "925383efa346730478fb4838dbe9137d2a47675ad789c546d150a6e1dd4ab31c"
[[package]] [[package]]
name = "proc-macro2" name = "proc-macro2"
version = "1.0.76" version = "1.0.78"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "95fc56cda0b5c3325f5fbbd7ff9fda9e02bb00bb3dac51252d2f1bfa1cb8cc8c" checksum = "e2422ad645d89c99f8f3e6b88a9fdeca7fabeac836b1002371c4367c8f984aae"
dependencies = [ dependencies = [
"unicode-ident", "unicode-ident",
] ]
@ -843,13 +828,13 @@ dependencies = [
[[package]] [[package]]
name = "regex" name = "regex"
version = "1.10.2" version = "1.10.3"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "380b951a9c5e80ddfd6136919eef32310721aa4aacd4889a8d39124b026ab343" checksum = "b62dbe01f0b06f9d8dc7d49e05a0785f153b00b2c227856282f671e0318c9b15"
dependencies = [ dependencies = [
"aho-corasick", "aho-corasick",
"memchr", "memchr",
"regex-automata 0.4.3", "regex-automata 0.4.5",
"regex-syntax 0.8.2", "regex-syntax 0.8.2",
] ]
@ -864,9 +849,9 @@ dependencies = [
[[package]] [[package]]
name = "regex-automata" name = "regex-automata"
version = "0.4.3" version = "0.4.5"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "5f804c7828047e88b2d32e2d7fe5a105da8ee3264f01902f796c8e067dc2483f" checksum = "5bb987efffd3c6d0d8f5f89510bb458559eab11e4f869acb20bf845e016259cd"
dependencies = [ dependencies = [
"aho-corasick", "aho-corasick",
"memchr", "memchr",
@ -903,19 +888,6 @@ version = "0.1.23"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76" checksum = "d626bb9dae77e28219937af045c257c28bfd3f69333c512553507f5f9798cb76"
[[package]]
name = "rustix"
version = "0.38.30"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "322394588aaf33c24007e8bb3238ee3e4c5c09c084ab32bc73890b99ff326bca"
dependencies = [
"bitflags 2.4.2",
"errno",
"libc",
"linux-raw-sys",
"windows-sys 0.52.0",
]
[[package]] [[package]]
name = "rustversion" name = "rustversion"
version = "1.0.14" version = "1.0.14"
@ -970,9 +942,9 @@ dependencies = [
[[package]] [[package]]
name = "strsim" name = "strsim"
version = "0.10.0" version = "0.11.0"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "73473c0e59e6d5812c5dfe2a064a6444949f089e20eec9a2e5506596494e4623" checksum = "5ee073c9e4cd00e28217186dbe12796d692868f432bf2e97ee73bed0c56dfa01"
[[package]] [[package]]
name = "syn" name = "syn"

View file

@ -16,8 +16,9 @@ edlang_ir = { version = "0.1.0", path = "../edlang_ir" }
edlang_parser = { version = "0.1.0", path = "../edlang_parser" } edlang_parser = { version = "0.1.0", path = "../edlang_parser" }
edlang_session = { version = "0.1.0", path = "../edlang_session" } edlang_session = { version = "0.1.0", path = "../edlang_session" }
llvm-sys = "170.0.1" llvm-sys = "170.0.1"
inkwell = { git = "https://github.com/TheDan64/inkwell", rev = "0cdaa34bd612464f310b3fdefa00a75d1324687d", features = ["llvm17-0"] } inkwell = { git = "https://github.com/TheDan64/inkwell", rev = "e0cc92dc28eb684684e450ca28daedc52e613962", features = ["llvm17-0"] }
tracing = { workspace = true } tracing = { workspace = true }
edlang_span = { version = "0.1.0", path = "../edlang_span" }
[build-dependencies] [build-dependencies]
cc = "1.0.83" cc = "1.0.83"

View file

@ -3,12 +3,13 @@ use std::{collections::HashMap, error::Error, path::PathBuf};
use edlang_ir as ir; use edlang_ir as ir;
use edlang_ir::DefId; use edlang_ir::DefId;
use edlang_session::Session; use edlang_session::Session;
use edlang_span::Span;
use inkwell::{ use inkwell::{
builder::{Builder, BuilderError}, builder::{Builder, BuilderError},
context::Context, context::Context,
debug_info::{ debug_info::{
AsDIScope, DICompileUnit, DIFile, DIFlagsConstants, DIScope, DISubprogram, DIType, AsDIScope, DICompileUnit, DIFile, DIFlagsConstants, DILexicalBlock, DILocation, DIScope,
DebugInfoBuilder, DISubprogram, DIType, DebugInfoBuilder,
}, },
module::Module, module::Module,
targets::{InitializationConfig, Target, TargetData, TargetMachine}, targets::{InitializationConfig, Target, TargetData, TargetMachine},
@ -41,6 +42,19 @@ impl<'ctx, 'm> ModuleCompileCtx<'ctx, 'm> {
pub fn get_module_body(&self) -> &ModuleBody { pub fn get_module_body(&self) -> &ModuleBody {
self.ctx.program.modules.get(&self.module_id).unwrap() self.ctx.program.modules.get(&self.module_id).unwrap()
} }
pub fn set_debug_loc(&self, scope: DIScope<'ctx>, span: Span) -> DILocation<'ctx> {
let (_, line, column) = self.ctx.session.source.get_offset_line(span.lo).unwrap();
let debug_loc = self.di_builder.create_debug_location(
self.ctx.context,
line as u32 + 1,
column as u32 + 1,
scope,
None,
);
self.builder.set_current_debug_location(debug_loc);
debug_loc
}
} }
pub fn compile(session: &Session, program: &ProgramBody) -> Result<PathBuf, Box<dyn Error>> { pub fn compile(session: &Session, program: &ProgramBody) -> Result<PathBuf, Box<dyn Error>> {
@ -194,7 +208,7 @@ fn compile_fn_signature(ctx: &ModuleCompileCtx<'_, '_>, fn_id: DefId) {
inkwell::attributes::AttributeLoc::Function, inkwell::attributes::AttributeLoc::Function,
ctx.ctx.context.create_enum_attribute(37, 0), ctx.ctx.context.create_enum_attribute(37, 0),
); );
let (_, line, col) = ctx let (_, line, _col) = ctx
.ctx .ctx
.session .session
.source .source
@ -234,56 +248,71 @@ fn compile_fn(ctx: &ModuleCompileCtx, fn_id: DefId) -> Result<(), BuilderError>
let fn_value = ctx.module.get_function(&body.name).unwrap(); let fn_value = ctx.module.get_function(&body.name).unwrap();
let di_program = fn_value.get_subprogram().unwrap(); let di_program = fn_value.get_subprogram().unwrap();
let (_, line, column) = ctx let mut debug_loc = ctx.set_debug_loc(di_program.as_debug_info_scope(), body.fn_span);
.ctx
.session
.source
.get_offset_line(body.fn_span.lo)
.unwrap();
let mut lexical_block = ctx.di_builder.create_lexical_block( let mut lexical_block = ctx.di_builder.create_lexical_block(
di_program.as_debug_info_scope(), debug_loc.get_scope(),
ctx.di_unit.get_file(), ctx.di_unit.get_file(),
line as u32 + 1, debug_loc.get_line(),
column as u32 + 1, debug_loc.get_column(),
); );
let debug_loc = ctx.di_builder.create_debug_location( debug_loc = ctx.set_debug_loc(lexical_block.as_debug_info_scope(), body.fn_span);
ctx.ctx.context,
line as u32 + 1,
column as u32 + 1,
lexical_block.as_debug_info_scope(),
None,
);
ctx.builder.set_current_debug_location(debug_loc);
let block = ctx.ctx.context.append_basic_block(fn_value, "entry"); let block = ctx.ctx.context.append_basic_block(fn_value, "entry");
ctx.builder.position_at_end(block); ctx.builder.position_at_end(block);
let mut locals = HashMap::new(); let mut locals = HashMap::new();
let mut di_locals = HashMap::new();
let mut ret_local = None; let mut ret_local = None;
let mut arg_counter = 0; let mut arg_counter = 0;
for (index, local) in body.locals.iter().enumerate() { for (index, local) in body.locals.iter().enumerate() {
if let Some(span) = local.span {
debug_loc = ctx.set_debug_loc(debug_loc.get_scope(), span);
}
match local.kind { match local.kind {
ir::LocalKind::Temp => { ir::LocalKind::Temp => {
if let ir::TypeKind::Unit = &local.ty.kind { if let ir::TypeKind::Unit = &local.ty.kind {
} else { } else {
let ptr = ctx let ptr = ctx.builder.build_alloca(
.builder compile_basic_type(ctx, &local.ty),
.build_alloca(compile_basic_type(ctx, &local.ty), &index.to_string())?; local.debug_name.as_deref().unwrap_or(&index.to_string()),
)?;
locals.insert(index, ptr); locals.insert(index, ptr);
} }
} }
ir::LocalKind::Arg => { ir::LocalKind::Arg => {
if let ir::TypeKind::Unit = &local.ty.kind { if let ir::TypeKind::Unit = &local.ty.kind {
} else { } else {
let ptr = ctx let ty = compile_basic_type(ctx, &local.ty);
.builder let debug_ty = compile_debug_type(ctx, &local.ty);
.build_alloca(compile_basic_type(ctx, &local.ty), &index.to_string())?; let name = local.debug_name.as_ref().unwrap();
ctx.builder let ptr = ctx.builder.build_alloca(ty, name)?;
.build_store(ptr, fn_value.get_nth_param(arg_counter).unwrap())?; let value = fn_value.get_nth_param(arg_counter).unwrap();
ctx.builder.build_store(ptr, value)?;
let di_local = ctx.di_builder.create_parameter_variable(
debug_loc.get_scope(),
local.debug_name.as_ref().unwrap(),
arg_counter,
ctx.di_unit.get_file(),
debug_loc.get_line(),
debug_ty,
true,
0,
);
ctx.di_builder.insert_dbg_value_before(
value,
di_local,
None,
debug_loc,
block.get_first_instruction().unwrap(),
);
arg_counter += 1; arg_counter += 1;
locals.insert(index, ptr); locals.insert(index, ptr);
di_locals.insert(index, di_local);
} }
} }
ir::LocalKind::ReturnPointer => { ir::LocalKind::ReturnPointer => {
@ -292,7 +321,7 @@ fn compile_fn(ctx: &ModuleCompileCtx, fn_id: DefId) -> Result<(), BuilderError>
ret_local = Some(index); ret_local = Some(index);
let ptr = ctx let ptr = ctx
.builder .builder
.build_alloca(compile_basic_type(ctx, &local.ty), &index.to_string())?; .build_alloca(compile_basic_type(ctx, &local.ty), "return_ptr")?;
locals.insert(index, ptr); locals.insert(index, ptr);
} }
} }
@ -300,7 +329,6 @@ fn compile_fn(ctx: &ModuleCompileCtx, fn_id: DefId) -> Result<(), BuilderError>
} }
let mut blocks = Vec::with_capacity(body.blocks.len()); let mut blocks = Vec::with_capacity(body.blocks.len());
let mut di_locals = HashMap::new();
for (index, _block) in body.blocks.iter().enumerate() { for (index, _block) in body.blocks.iter().enumerate() {
let llvm_block = ctx let llvm_block = ctx
@ -315,24 +343,9 @@ fn compile_fn(ctx: &ModuleCompileCtx, fn_id: DefId) -> Result<(), BuilderError>
for (block, llvm_block) in body.blocks.iter().zip(&blocks) { for (block, llvm_block) in body.blocks.iter().zip(&blocks) {
info!("compiling block"); info!("compiling block");
ctx.builder.position_at_end(*llvm_block); ctx.builder.position_at_end(*llvm_block);
let mut arg_no = 0;
for stmt in &block.statements { for stmt in &block.statements {
if let Some(span) = stmt.span { if let Some(span) = stmt.span {
let (_, line, column) = ctx.ctx.session.source.get_offset_line(span.lo).unwrap(); debug_loc = ctx.set_debug_loc(debug_loc.get_scope(), span);
lexical_block = ctx.di_builder.create_lexical_block(
di_program.as_debug_info_scope(),
ctx.di_unit.get_file(),
line as u32 + 1,
column as u32 + 1,
);
let debug_loc = ctx.di_builder.create_debug_location(
ctx.ctx.context,
line as u32 + 1,
column as u32 + 1,
lexical_block.as_debug_info_scope(),
None,
);
ctx.builder.set_current_debug_location(debug_loc);
} }
info!("compiling stmt"); info!("compiling stmt");
@ -345,21 +358,7 @@ fn compile_fn(ctx: &ModuleCompileCtx, fn_id: DefId) -> Result<(), BuilderError>
.builder .builder
.build_store(*locals.get(&place.local).unwrap(), value)?; .build_store(*locals.get(&place.local).unwrap(), value)?;
if let Some(debug_name) = &local.debug_name { if let Some(_debug_name) = &local.debug_name {
let (_, line, column) = ctx
.ctx
.session
.source
.get_offset_line(local.span.unwrap().lo)
.unwrap();
let debug_loc = ctx.di_builder.create_debug_location(
ctx.ctx.context,
line as u32,
column as u32,
lexical_block.as_debug_info_scope(), // todo correct scope
None,
);
ctx.builder.set_current_debug_location(debug_loc);
let di_local = di_locals.get(&place.local).unwrap(); let di_local = di_locals.get(&place.local).unwrap();
ctx.di_builder.insert_dbg_value_before( ctx.di_builder.insert_dbg_value_before(
value, value,
@ -374,47 +373,23 @@ fn compile_fn(ctx: &ModuleCompileCtx, fn_id: DefId) -> Result<(), BuilderError>
let local = &body.locals[*local_idx]; let local = &body.locals[*local_idx];
if local.debug_name.is_some() { if local.debug_name.is_some() {
let (_, line, column) = ctx
.ctx
.session
.source
.get_offset_line(local.span.unwrap().lo)
.unwrap();
let debug_loc = ctx.di_builder.create_debug_location(
ctx.ctx.context,
line as u32 + 1,
column as u32 + 1,
lexical_block.as_debug_info_scope(),
None,
);
ctx.builder.set_current_debug_location(debug_loc); ctx.builder.set_current_debug_location(debug_loc);
let ty = compile_debug_type(ctx, &local.ty); let ty = compile_debug_type(ctx, &local.ty);
let var = match local.kind { let var = match local.kind {
LocalKind::Temp => ctx.di_builder.create_auto_variable( LocalKind::Temp => ctx.di_builder.create_auto_variable(
lexical_block.as_debug_info_scope(), debug_loc.get_scope(),
local.debug_name.as_ref().unwrap(), local.debug_name.as_ref().unwrap(),
ctx.di_unit.get_file(), ctx.di_unit.get_file(),
line as u32, debug_loc.get_line(),
ty, ty,
true, true,
0, 0,
ty.get_align_in_bits(), ty.get_align_in_bits(),
), ),
LocalKind::Arg => { LocalKind::Arg => {
let cur_arg_no = arg_no; unreachable!()
arg_no += 1;
ctx.di_builder.create_parameter_variable(
lexical_block.as_debug_info_scope(),
local.debug_name.as_ref().unwrap(),
cur_arg_no,
ctx.di_unit.get_file(),
line as u32 + 1,
ty,
true,
0,
)
} }
LocalKind::ReturnPointer => todo!(), LocalKind::ReturnPointer => unreachable!(),
}; };
di_locals.insert(*local_idx, var); di_locals.insert(*local_idx, var);
ctx.di_builder.insert_declare_at_end( ctx.di_builder.insert_declare_at_end(