Add temporary line number for for non-local structs
This commit is contained in:
		
							parent
							
								
									e9bca63f0d
								
							
						
					
					
						commit
						fa6b7bdf87
					
				| @ -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::<Vec<_>>(); | ||||
|                     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, | ||||
|  | ||||
| @ -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<DebugSubprogramData> { | ||||
|         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, | ||||
|  | ||||
| @ -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) | ||||
|  | ||||
| @ -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<StackValue> { | ||||
|         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<StackValue> { | ||||
|         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<FullToken>) -> Option<DebugLocation> { | ||||
|     pub fn into_debug( | ||||
|         &self, | ||||
|         tokens: &Vec<FullToken>, | ||||
|         scope: DebugProgramValue, | ||||
|     ) -> Option<DebugLocation> { | ||||
|         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<DebugLocation> for Position { | ||||
|     fn into(self) -> DebugLocation { | ||||
| impl Position { | ||||
|     fn debug(self, scope: DebugProgramValue) -> DebugLocation { | ||||
|         DebugLocation { | ||||
|             line: self.1, | ||||
|             column: self.0, | ||||
|             scope, | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user