From fa6b7bdf872379ba7e1622b8bafaaca38a40ac5e Mon Sep 17 00:00:00 2001 From: sofia Date: Tue, 22 Jul 2025 16:35:15 +0300 Subject: [PATCH] Add temporary line number for for non-local structs --- reid-llvm-lib/src/compile.rs | 12 ++-- reid-llvm-lib/src/debug_information.rs | 17 +++--- reid-llvm-lib/src/fmt.rs | 23 +++----- reid/src/codegen.rs | 77 +++++++++++++++----------- 4 files changed, 67 insertions(+), 62 deletions(-) diff --git a/reid-llvm-lib/src/compile.rs b/reid-llvm-lib/src/compile.rs index 6063cc5..0ae77c3 100644 --- a/reid-llvm-lib/src/compile.rs +++ b/reid-llvm-lib/src/compile.rs @@ -421,23 +421,23 @@ impl DebugMetadataHolder { match &self.data { DebugMetadata::ParamVar(param) => LLVMDIBuilderCreateParameterVariable( debug.builder, - *debug.programs.get(&self.program).unwrap(), + *debug.programs.get(&self.location.scope).unwrap(), into_cstring(param.name.clone()).as_ptr(), param.name.len(), param.arg_idx + 1, debug.file_ref, - param.location.line, + self.location.line, *debug.types.get(¶m.ty).unwrap(), param.always_preserve as i32, param.flags.as_llvm(), ), DebugMetadata::LocalVar(var) => LLVMDIBuilderCreateAutoVariable( debug.builder, - *debug.programs.get(&self.program).unwrap(), + *debug.programs.get(&self.location.scope).unwrap(), into_cstring(var.name.clone()).as_ptr(), var.name.len(), debug.file_ref, - var.location.line, + self.location.line, *debug.types.get(&var.ty).unwrap(), var.always_preserve as i32, var.flags.as_llvm(), @@ -504,7 +504,7 @@ impl DebugTypeHolder { .map(|field| { LLVMDIBuilderCreateMemberType( debug.builder, - *debug.programs.get(&st.scope).unwrap(), + *debug.programs.get(&st.location.scope).unwrap(), into_cstring(field.name.clone()).as_ptr(), field.name.len(), debug.file_ref, @@ -519,7 +519,7 @@ impl DebugTypeHolder { .collect::>(); LLVMDIBuilderCreateStructType( debug.builder, - *debug.programs.get(&st.scope).unwrap(), + *debug.programs.get(&st.location.scope).unwrap(), into_cstring(st.name.clone()).as_ptr(), st.name.len(), debug.file_ref, diff --git a/reid-llvm-lib/src/debug_information.rs b/reid-llvm-lib/src/debug_information.rs index d364332..a9046cf 100644 --- a/reid-llvm-lib/src/debug_information.rs +++ b/reid-llvm-lib/src/debug_information.rs @@ -34,7 +34,7 @@ pub(crate) struct DebugScopeHolder { #[derive(Debug, Clone)] pub struct DebugMetadataHolder { - pub(crate) program: DebugProgramValue, + pub(crate) location: DebugLocation, pub(crate) value: DebugMetadataValue, pub(crate) data: DebugMetadata, } @@ -140,11 +140,11 @@ impl DebugInformation { value } - pub fn metadata(&self, program: &DebugProgramValue, kind: DebugMetadata) -> DebugMetadataValue { + pub fn metadata(&self, location: &DebugLocation, kind: DebugMetadata) -> DebugMetadataValue { let mut metadata = self.metadata.borrow_mut(); let value = DebugMetadataValue(metadata.len()); metadata.push(DebugMetadataHolder { - program: *program, + location: *location, value: value.clone(), data: kind, }); @@ -165,6 +165,10 @@ impl DebugInformation { unsafe { self.metadata.borrow().get_unchecked(value.0).data.clone() } } + pub fn get_metadata_location(&self, value: DebugMetadataValue) -> DebugLocation { + unsafe { self.metadata.borrow().get_unchecked(value.0).location } + } + pub fn get_subprogram_data(&self, value: DebugProgramValue) -> Option { if value.0 == 0 { None @@ -218,8 +222,9 @@ impl DebugInformation { } } -#[derive(Clone, Copy, Default)] +#[derive(Clone, Copy)] pub struct DebugLocation { + pub scope: DebugProgramValue, pub line: u32, pub column: u32, } @@ -238,8 +243,6 @@ pub struct DebugParamVariable { /// parameters. arg_idx should not conflict with other parameters of the /// same subprogram. pub arg_idx: u32, - /// Used for line number - pub location: DebugLocation, pub ty: DebugTypeValue, /// If this variable will be referenced from its containing subprogram, and /// will survive some optimizations. @@ -250,7 +253,6 @@ pub struct DebugParamVariable { #[derive(Debug, Clone)] pub struct DebugLocalVariable { pub name: String, - pub location: DebugLocation, pub ty: DebugTypeValue, pub always_preserve: bool, pub flags: DwarfFlags, @@ -308,7 +310,6 @@ pub struct DebugPointerType { #[derive(Clone)] pub struct DebugStructType { pub name: String, - pub scope: DebugProgramValue, pub location: DebugLocation, pub size_bits: u64, pub flags: DwarfFlags, diff --git a/reid-llvm-lib/src/fmt.rs b/reid-llvm-lib/src/fmt.rs index d3ec0b9..ca9d4aa 100644 --- a/reid-llvm-lib/src/fmt.rs +++ b/reid-llvm-lib/src/fmt.rs @@ -157,22 +157,16 @@ impl InstructionHolder { impl DebugMetadataValue { fn hr(&self, debug: &DebugInformation) -> String { - match debug.get_metadata(*self) { + let kind = match debug.get_metadata(*self) { DebugMetadata::ParamVar(DebugParamVariable { - name, - arg_idx, - location, - ty, - .. - }) => format!( - "param {} (idx {}) (type {:?}) at {}", - name, arg_idx, ty, location - ), - DebugMetadata::LocalVar(DebugLocalVariable { - name, location, ty, .. - }) => format!("var {} (type {:?}) at {}", name, ty, location), + name, arg_idx, ty, .. + }) => format!("param {} (idx {}) (type {:?}) ", name, arg_idx, ty), + DebugMetadata::LocalVar(DebugLocalVariable { name, ty, .. }) => { + format!("var {} (type {:?}) ", name, ty) + } DebugMetadata::VarAssignment => todo!(), - } + }; + format!("{} at {}", kind, debug.get_metadata_location(*self)) } } @@ -490,7 +484,6 @@ impl Debug for DebugStructType { fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result { f.debug_struct("Struct") .field("name", &self.name) - .field("scope", &self.scope) .field("location", &self.location) .field("size_bit", &self.size_bits) .field("flags", &self.flags) diff --git a/reid/src/codegen.rs b/reid/src/codegen.rs index b7c9a14..15e39d0 100644 --- a/reid/src/codegen.rs +++ b/reid/src/codegen.rs @@ -314,7 +314,9 @@ impl mir::Module { let mut entry = function.ir.block("entry"); // Insert debug information - let debug_scope = if let Some(location) = mir_function.signature().into_debug(tokens) { + let debug_scope = if let Some(location) = + mir_function.signature().into_debug(tokens, compile_unit) + { // let debug_scope = debug.inner_scope(&outer_scope, location); let fn_param_ty = &mir_function.return_type.get_debug_type_hard( @@ -376,15 +378,15 @@ impl mir::Module { ); // Generate debug info - if let (Some(debug_scope), Some(location)) = - (&debug_scope, mir_function.signature().into_debug(tokens)) - { + if let (Some(debug_scope), Some(location)) = ( + &debug_scope, + mir_function.signature().into_debug(tokens, compile_unit), + ) { debug.metadata( - &debug_scope, + &location, DebugMetadata::ParamVar(DebugParamVariable { name: p_name.clone(), arg_idx: i as u32, - location, ty: p_ty.get_debug_type_hard( *debug_scope, &debug, @@ -434,7 +436,8 @@ impl mir::Module { } if let Some(debug) = scope.debug { - let location = &block.return_meta().into_debug(tokens).unwrap(); + let location = + &block.return_meta().into_debug(tokens, debug.scope).unwrap(); let location = debug.info.location(&debug.scope, *location); scope.block.set_terminator_location(location).unwrap(); } @@ -456,7 +459,7 @@ impl mir::Block { for stmt in &self.statements { stmt.codegen(&mut scope, state).map(|s| { if let Some(debug) = &scope.debug { - let location = stmt.1.into_debug(scope.tokens).unwrap(); + let location = stmt.1.into_debug(scope.tokens, debug.scope).unwrap(); let loc_val = debug.info.location(&debug.scope, location); s.instr().with_location(&mut scope.block, loc_val); } @@ -480,11 +483,10 @@ impl mir::Block { impl mir::Statement { fn codegen<'ctx, 'a>(&self, scope: &mut Scope<'ctx, 'a>, state: &State) -> Option { - let location = self.1.into_debug(scope.tokens).unwrap(); - let location = scope - .debug - .as_ref() - .map(|d| d.info.location(&d.scope, location)); + let location = scope.debug.clone().map(|d| { + let location = self.1.into_debug(scope.tokens, d.scope).unwrap(); + d.info.location(&d.scope, location) + }); match &self.0 { mir::StmtKind::Let(NamedVariableRef(ty, name, _), mutable, expression) => { @@ -518,12 +520,11 @@ impl mir::Statement { StackValue(stack_value, TypeKind::CodegenPtr(Box::new(value.clone().1))), ); if let Some(debug) = &scope.debug { - let location = self.1.into_debug(scope.tokens).unwrap(); + let location = self.1.into_debug(scope.tokens, debug.scope).unwrap(); let var = debug.info.metadata( - &debug.scope, + &location, DebugMetadata::LocalVar(DebugLocalVariable { name: name.clone(), - location, ty: ty.clone().get_debug_type(debug, scope), always_preserve: true, flags: DwarfFlags, @@ -581,11 +582,10 @@ impl mir::Statement { impl mir::Expression { fn codegen<'ctx, 'a>(&self, scope: &mut Scope<'ctx, 'a>, state: &State) -> Option { let location = if let Some(debug) = &scope.debug { - Some( - debug - .info - .location(&debug.scope, self.1.into_debug(scope.tokens).unwrap()), - ) + Some(debug.info.location( + &debug.scope, + self.1.into_debug(scope.tokens, debug.scope).unwrap(), + )) } else { None }; @@ -687,7 +687,7 @@ impl mir::Expression { .unwrap(); if let Some(debug) = &scope.debug { - let location = call.meta.into_debug(scope.tokens).unwrap(); + let location = call.meta.into_debug(scope.tokens, debug.scope).unwrap(); let location_val = debug.info.location(&debug.scope, location); val.with_location(&mut scope.block, location_val); } @@ -1078,16 +1078,23 @@ impl mir::IfExpression { let after_b = scope.function.ir.block("after"); if let Some(debug) = &scope.debug { - let before_location = self.0 .1.into_debug(scope.tokens).unwrap(); + let before_location = self.0 .1.into_debug(scope.tokens, debug.scope).unwrap(); let before_v = debug.info.location(&debug.scope, before_location); scope.block.set_terminator_location(before_v).unwrap(); - let then_location = self.1.return_meta().into_debug(scope.tokens).unwrap(); + let then_location = self + .1 + .return_meta() + .into_debug(scope.tokens, debug.scope) + .unwrap(); let then_v = debug.info.location(&debug.scope, then_location); then_b.set_terminator_location(then_v).unwrap(); let else_location = if let Some(else_block) = &self.2 { - else_block.return_meta().into_debug(scope.tokens).unwrap() + else_block + .return_meta() + .into_debug(scope.tokens, debug.scope) + .unwrap() } else { then_location }; @@ -1330,7 +1337,7 @@ impl TypeKind { for field in &struct_type.0 { fields.push(DebugFieldType { name: field.0.clone(), - location: field.2.into_debug(tokens).unwrap(), + location: field.2.into_debug(tokens, scope).unwrap(), size_bits: field.1.size_of(), offset: size_bits, flags: DwarfFlags, @@ -1348,8 +1355,7 @@ impl TypeKind { { DebugTypeData::Struct(DebugStructType { name: key.0.clone(), - scope, - location: typedef.meta.into_debug(tokens).unwrap(), + location: typedef.meta.into_debug(tokens, scope).unwrap(), size_bits, flags: DwarfFlags, fields, @@ -1392,20 +1398,25 @@ impl TypeKind { } impl Metadata { - pub fn into_debug(&self, tokens: &Vec) -> Option { + pub fn into_debug( + &self, + tokens: &Vec, + scope: DebugProgramValue, + ) -> Option { if let Some((start, _)) = self.into_positions(tokens) { - Some(start.into()) + Some(start.debug(scope)) } else { - None + Some(Position(0, 0).debug(scope)) } } } -impl Into for Position { - fn into(self) -> DebugLocation { +impl Position { + fn debug(self, scope: DebugProgramValue) -> DebugLocation { DebugLocation { line: self.1, column: self.0, + scope, } } }