Fix around in debug information generation, fix subprogram not being set
This commit is contained in:
		
							parent
							
								
									0c6d9885ec
								
							
						
					
					
						commit
						990d8cb448
					
				| @ -8,7 +8,7 @@ use crate::{ | |||||||
|     TerminatorKind, Type, TypeData, |     TerminatorKind, Type, TypeData, | ||||||
|     debug_information::{ |     debug_information::{ | ||||||
|         DebugFileData, DebugInformation, DebugLocation, DebugLocationValue, DebugMetadataValue, |         DebugFileData, DebugInformation, DebugLocation, DebugLocationValue, DebugMetadataValue, | ||||||
|         DebugSubprogramValue, |         DebugProgramValue, | ||||||
|     }, |     }, | ||||||
|     util::match_types, |     util::match_types, | ||||||
| }; | }; | ||||||
| @ -199,7 +199,7 @@ impl Builder { | |||||||
|     pub(crate) unsafe fn set_debug_subprogram( |     pub(crate) unsafe fn set_debug_subprogram( | ||||||
|         &self, |         &self, | ||||||
|         value: &FunctionValue, |         value: &FunctionValue, | ||||||
|         subprogram: DebugSubprogramValue, |         subprogram: DebugProgramValue, | ||||||
|     ) { |     ) { | ||||||
|         unsafe { |         unsafe { | ||||||
|             let mut modules = self.modules.borrow_mut(); |             let mut modules = self.modules.borrow_mut(); | ||||||
|  | |||||||
| @ -199,9 +199,9 @@ pub struct LLVMDebugInformation<'a> { | |||||||
|     debug: &'a DebugInformation, |     debug: &'a DebugInformation, | ||||||
|     builder: LLVMDIBuilderRef, |     builder: LLVMDIBuilderRef, | ||||||
|     file_ref: LLVMMetadataRef, |     file_ref: LLVMMetadataRef, | ||||||
|     scopes: &'a HashMap<DebugScopeValue, LLVMMetadataRef>, |     // scopes: &'a HashMap<DebugScopeValue, LLVMMetadataRef>,
 | ||||||
|     types: &'a mut HashMap<DebugTypeValue, LLVMMetadataRef>, |     types: &'a mut HashMap<DebugTypeValue, LLVMMetadataRef>, | ||||||
|     subprograms: &'a mut HashMap<DebugSubprogramValue, LLVMMetadataRef>, |     programs: &'a mut HashMap<DebugProgramValue, LLVMMetadataRef>, | ||||||
|     metadata: &'a mut HashMap<DebugMetadataValue, LLVMMetadataRef>, |     metadata: &'a mut HashMap<DebugMetadataValue, LLVMMetadataRef>, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -227,10 +227,9 @@ impl ModuleHolder { | |||||||
| 
 | 
 | ||||||
|             // Compile the contents
 |             // Compile the contents
 | ||||||
| 
 | 
 | ||||||
|             let mut scopes = HashMap::new(); |  | ||||||
|             let mut types = HashMap::new(); |             let mut types = HashMap::new(); | ||||||
|             let mut metadata = HashMap::new(); |             let mut metadata = HashMap::new(); | ||||||
|             let mut subprograms = HashMap::new(); |             let mut programs = HashMap::new(); | ||||||
| 
 | 
 | ||||||
|             let mut debug = if let Some(debug) = &self.debug_information { |             let mut debug = if let Some(debug) = &self.debug_information { | ||||||
|                 let di_builder = LLVMCreateDIBuilder(module_ref); |                 let di_builder = LLVMCreateDIBuilder(module_ref); | ||||||
| @ -277,10 +276,15 @@ impl ModuleHolder { | |||||||
|                     0, |                     0, | ||||||
|                 ); |                 ); | ||||||
| 
 | 
 | ||||||
|                 let scope = debug.get_scopes(); |                 // let scope = debug.get_scopes();
 | ||||||
|                 scope |                 // scopes.insert(scope.borrow().value.clone(), compile_unit);
 | ||||||
|                     .borrow() |                 // for scope in &scope.borrow().inner_scopes {
 | ||||||
|                     .compile_scope(compile_unit, file_ref, &mut scopes, di_builder); |                 //     dbg!("hello");
 | ||||||
|  |                 //     scope.compile_scope(compile_unit, file_ref, &mut scopes, di_builder);
 | ||||||
|  |                 // }
 | ||||||
|  |                 // dbg!("after!");
 | ||||||
|  | 
 | ||||||
|  |                 programs.insert(DebugProgramValue(0), compile_unit); | ||||||
| 
 | 
 | ||||||
|                 let debug = LLVMDebugInformation { |                 let debug = LLVMDebugInformation { | ||||||
|                     builder: di_builder, |                     builder: di_builder, | ||||||
| @ -288,8 +292,7 @@ impl ModuleHolder { | |||||||
|                     file_ref, |                     file_ref, | ||||||
|                     types: &mut types, |                     types: &mut types, | ||||||
|                     metadata: &mut metadata, |                     metadata: &mut metadata, | ||||||
|                     subprograms: &mut subprograms, |                     programs: &mut programs, | ||||||
|                     scopes: &scopes, |  | ||||||
|                 }; |                 }; | ||||||
| 
 | 
 | ||||||
|                 for ty in debug.debug.get_types().borrow().iter() { |                 for ty in debug.debug.get_types().borrow().iter() { | ||||||
| @ -308,18 +311,22 @@ impl ModuleHolder { | |||||||
| 
 | 
 | ||||||
|             let mut functions = HashMap::new(); |             let mut functions = HashMap::new(); | ||||||
|             for function in &self.functions { |             for function in &self.functions { | ||||||
|                 functions.insert( |                 let func = function.compile_signature(context, module_ref, &types, &debug); | ||||||
|                     function.value, |                 functions.insert(function.value, func); | ||||||
|                     function.compile_signature(context, module_ref, &types, &debug), | 
 | ||||||
|                 ); |                 if let Some(debug) = &mut debug { | ||||||
|  |                     if let Some(program_value) = function.data.debug { | ||||||
|  |                         debug.programs.insert(program_value, func.metadata.unwrap()); | ||||||
|  |                     } | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             // if let Some(debug) = &mut debug {
 |             if let Some(debug) = &mut debug { | ||||||
|             //     for subprogram in debug.debug.get_subprograms().borrow().iter() {
 |                 for meta in debug.debug.get_metadata().borrow().iter() { | ||||||
|             //         let meta_ref = subprogram.compile_debug(&functions, &debug);
 |                     let meta_ref = meta.compile(&debug); | ||||||
|             //         debug.subprograms.insert(subprogram.value.clone(), meta_ref);
 |                     debug.metadata.insert(meta.value.clone(), meta_ref); | ||||||
|             //     }
 |                 } | ||||||
|             // }
 |             } | ||||||
| 
 | 
 | ||||||
|             let mut module = LLVMModule { |             let mut module = LLVMModule { | ||||||
|                 builder, |                 builder, | ||||||
| @ -377,15 +384,16 @@ impl DebugScopeHolder { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl DebugMetadataHolder { | impl DebugMetadataHolder { | ||||||
|     unsafe fn compile_meta(&self, debug: &LLVMDebugInformation) -> LLVMMetadataRef { |     unsafe fn compile(&self, debug: &LLVMDebugInformation) -> LLVMMetadataRef { | ||||||
|  |         dbg!(&self.program); | ||||||
|         unsafe { |         unsafe { | ||||||
|             match &self.data { |             match &self.data { | ||||||
|                 DebugMetadata::ParamVar(param) => LLVMDIBuilderCreateParameterVariable( |                 DebugMetadata::ParamVar(param) => LLVMDIBuilderCreateParameterVariable( | ||||||
|                     debug.builder, |                     debug.builder, | ||||||
|                     *debug.scopes.get(&self.scope).unwrap(), |                     *debug.programs.get(&self.program).unwrap(), | ||||||
|                     into_cstring(param.name.clone()).as_ptr(), |                     into_cstring(param.name.clone()).as_ptr(), | ||||||
|                     param.name.len(), |                     param.name.len(), | ||||||
|                     param.arg_idx, |                     param.arg_idx + 1, | ||||||
|                     debug.file_ref, |                     debug.file_ref, | ||||||
|                     param.location.line, |                     param.location.line, | ||||||
|                     *debug.types.get(¶m.ty).unwrap(), |                     *debug.types.get(¶m.ty).unwrap(), | ||||||
| @ -493,9 +501,9 @@ impl FunctionHolder { | |||||||
|                     let mangled_name = LLVMGetValueName2(function_ref, mangled_length_ptr); |                     let mangled_name = LLVMGetValueName2(function_ref, mangled_length_ptr); | ||||||
|                     let mangled_length = *mangled_length_ptr; |                     let mangled_length = *mangled_length_ptr; | ||||||
| 
 | 
 | ||||||
|                     Some(LLVMDIBuilderCreateFunction( |                     let subprogram = LLVMDIBuilderCreateFunction( | ||||||
|                         debug.builder, |                         debug.builder, | ||||||
|                         *debug.scopes.get(&subprogram.scope).unwrap(), |                         *debug.programs.get(&subprogram.outer_scope).unwrap(), | ||||||
|                         into_cstring(subprogram.name.clone()).as_ptr(), |                         into_cstring(subprogram.name.clone()).as_ptr(), | ||||||
|                         subprogram.name.clone().len(), |                         subprogram.name.clone().len(), | ||||||
|                         mangled_name, |                         mangled_name, | ||||||
| @ -508,7 +516,9 @@ impl FunctionHolder { | |||||||
|                         subprogram.opts.scope_line, |                         subprogram.opts.scope_line, | ||||||
|                         subprogram.opts.flags.as_llvm(), |                         subprogram.opts.flags.as_llvm(), | ||||||
|                         subprogram.opts.is_optimized as i32, |                         subprogram.opts.is_optimized as i32, | ||||||
|                     )) |                     ); | ||||||
|  |                     LLVMSetSubprogram(function_ref, subprogram); | ||||||
|  |                     Some(subprogram) | ||||||
|                 } else { |                 } else { | ||||||
|                     None |                     None | ||||||
|                 } |                 } | ||||||
|  | |||||||
| @ -7,7 +7,7 @@ use std::{ | |||||||
| pub struct DebugScopeValue(pub Vec<usize>); | pub struct DebugScopeValue(pub Vec<usize>); | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, Clone, Hash, PartialEq, Eq)] | #[derive(Debug, Clone, Hash, PartialEq, Eq)] | ||||||
| pub struct DebugLocationValue(pub DebugScopeValue, pub usize); | pub struct DebugLocationValue(pub DebugProgramValue, pub usize); | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)] | #[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)] | ||||||
| pub struct DebugTypeValue(pub usize); | pub struct DebugTypeValue(pub usize); | ||||||
| @ -15,8 +15,9 @@ pub struct DebugTypeValue(pub usize); | |||||||
| #[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)] | #[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)] | ||||||
| pub struct DebugMetadataValue(pub usize); | pub struct DebugMetadataValue(pub usize); | ||||||
| 
 | 
 | ||||||
|  | /// Represents either a subprogram, or the compilation context
 | ||||||
| #[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)] | #[derive(Debug, Clone, Copy, Hash, PartialEq, Eq)] | ||||||
| pub struct DebugSubprogramValue(pub usize); | pub struct DebugProgramValue(pub usize); | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, Clone)] | #[derive(Debug, Clone)] | ||||||
| pub struct DebugFileData { | pub struct DebugFileData { | ||||||
| @ -34,7 +35,7 @@ pub(crate) struct DebugScopeHolder { | |||||||
| 
 | 
 | ||||||
| #[derive(Debug, Clone)] | #[derive(Debug, Clone)] | ||||||
| pub struct DebugMetadataHolder { | pub struct DebugMetadataHolder { | ||||||
|     pub(crate) scope: DebugScopeValue, |     pub(crate) program: DebugProgramValue, | ||||||
|     pub(crate) value: DebugMetadataValue, |     pub(crate) value: DebugMetadataValue, | ||||||
|     pub(crate) data: DebugMetadata, |     pub(crate) data: DebugMetadata, | ||||||
| } | } | ||||||
| @ -47,7 +48,7 @@ pub struct DebugTypeHolder { | |||||||
| 
 | 
 | ||||||
| #[derive(Debug, Clone)] | #[derive(Debug, Clone)] | ||||||
| pub struct DebugSubprogramHolder { | pub struct DebugSubprogramHolder { | ||||||
|     pub(crate) value: DebugSubprogramValue, |     pub(crate) value: DebugProgramValue, | ||||||
|     pub(crate) data: DebugSubprogramData, |     pub(crate) data: DebugSubprogramData, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -60,80 +61,73 @@ pub(crate) struct DebugLocationHolder { | |||||||
| #[derive(Debug, Clone)] | #[derive(Debug, Clone)] | ||||||
| pub struct DebugInformation { | pub struct DebugInformation { | ||||||
|     pub file: DebugFileData, |     pub file: DebugFileData, | ||||||
|     scope: Rc<RefCell<DebugScopeHolder>>, |     // scope: Rc<RefCell<DebugScopeHolder>>,
 | ||||||
|     subprograms: Rc<RefCell<Vec<DebugSubprogramHolder>>>, |     locations: Rc<RefCell<Vec<DebugLocationHolder>>>, | ||||||
|  |     programs: Rc<RefCell<Vec<DebugSubprogramHolder>>>, | ||||||
|     metadata: Rc<RefCell<Vec<DebugMetadataHolder>>>, |     metadata: Rc<RefCell<Vec<DebugMetadataHolder>>>, | ||||||
|     types: Rc<RefCell<Vec<DebugTypeHolder>>>, |     types: Rc<RefCell<Vec<DebugTypeHolder>>>, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl DebugInformation { | impl DebugInformation { | ||||||
|     pub fn from_file(file: DebugFileData) -> (DebugInformation, DebugScopeValue) { |     pub fn from_file(file: DebugFileData) -> (DebugInformation, DebugProgramValue) { | ||||||
|         let scope_value = DebugScopeValue(Vec::new()); |  | ||||||
|         ( |         ( | ||||||
|             DebugInformation { |             DebugInformation { | ||||||
|                 file, |                 file, | ||||||
|                 scope: Rc::new(RefCell::new(DebugScopeHolder { |                 // scope: Rc::new(RefCell::new(DebugScopeHolder {
 | ||||||
|                     value: scope_value.clone(), |                 //     value: scope_value.clone(),
 | ||||||
|                     inner_scopes: Vec::new(), |                 //     inner_scopes: Vec::new(),
 | ||||||
|                     locations: Vec::new(), |                 //     locations: Vec::new(),
 | ||||||
|                     location: None, |                 //     location: None,
 | ||||||
|                 })), |                 // })),
 | ||||||
|  |                 locations: Rc::new(RefCell::new(Vec::new())), | ||||||
|                 metadata: Rc::new(RefCell::new(Vec::new())), |                 metadata: Rc::new(RefCell::new(Vec::new())), | ||||||
|                 subprograms: Rc::new(RefCell::new(Vec::new())), |                 programs: Rc::new(RefCell::new(Vec::new())), | ||||||
|                 types: Rc::new(RefCell::new(Vec::new())), |                 types: Rc::new(RefCell::new(Vec::new())), | ||||||
|             }, |             }, | ||||||
|             scope_value, |             DebugProgramValue(0), | ||||||
|         ) |         ) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn inner_scope( |     // pub fn inner_scope(
 | ||||||
|         &self, |     //     &self,
 | ||||||
|         parent: &DebugScopeValue, |     //     parent: &DebugScopeValue,
 | ||||||
|         location: DebugLocation, |     //     location: DebugLocation,
 | ||||||
|     ) -> DebugScopeValue { |     // ) -> DebugScopeValue {
 | ||||||
|         unsafe { |     //     unsafe {
 | ||||||
|             let mut outer_scope = RefMut::map(self.scope.borrow_mut(), |mut v| { |     //         let mut outer_scope = RefMut::map(self.scope.borrow_mut(), |mut v| {
 | ||||||
|                 for i in &parent.0 { |     //             for i in &parent.0 {
 | ||||||
|                     v = v.inner_scopes.get_unchecked_mut(*i); |     //                 v = v.inner_scopes.get_unchecked_mut(*i);
 | ||||||
|                 } |     //             }
 | ||||||
|                 v |     //             v
 | ||||||
|             }); |     //         });
 | ||||||
| 
 | 
 | ||||||
|             let mut arr = parent.0.clone(); |     //         let mut arr = parent.0.clone();
 | ||||||
|             arr.push(parent.0.len()); |     //         arr.push(parent.0.len());
 | ||||||
|             let value = DebugScopeValue(arr); |     //         let value = DebugScopeValue(arr);
 | ||||||
| 
 | 
 | ||||||
|             outer_scope.inner_scopes.push(DebugScopeHolder { |     //         outer_scope.inner_scopes.push(DebugScopeHolder {
 | ||||||
|                 value: value.clone(), |     //             value: value.clone(),
 | ||||||
|                 inner_scopes: Vec::new(), |     //             inner_scopes: Vec::new(),
 | ||||||
|                 locations: Vec::new(), |     //             locations: Vec::new(),
 | ||||||
|                 location: Some(location), |     //             location: Some(location),
 | ||||||
|             }); |     //         });
 | ||||||
|             value |     //         value
 | ||||||
|         } |     //     }
 | ||||||
|     } |     // }
 | ||||||
| 
 | 
 | ||||||
|     pub fn location( |     pub fn location( | ||||||
|         &self, |         &self, | ||||||
|         scope_value: &DebugScopeValue, |         program_value: &DebugProgramValue, | ||||||
|         line: u32, |         line: u32, | ||||||
|         column: u32, |         column: u32, | ||||||
|     ) -> DebugLocationValue { |     ) -> DebugLocationValue { | ||||||
|         unsafe { |         let value = DebugLocationValue(program_value.clone(), self.locations.borrow().len()); | ||||||
|             let mut scope = RefMut::map(self.scope.borrow_mut(), |mut v| { |         let location = DebugLocationHolder { | ||||||
|                 for i in &scope_value.0 { |             value: value.clone(), | ||||||
|                     v = v.inner_scopes.get_unchecked_mut(*i); |             location: DebugLocation { line, column }, | ||||||
|                 } |         }; | ||||||
|                 v |         self.locations.borrow_mut().push(location); | ||||||
|             }); |         value | ||||||
|             let value = DebugLocationValue(scope_value.clone(), scope.locations.len()); |  | ||||||
|             let location = DebugLocationHolder { |  | ||||||
|                 value: value.clone(), |  | ||||||
|                 location: DebugLocation { line, column }, |  | ||||||
|             }; |  | ||||||
|             scope.locations.push(location); |  | ||||||
|             value |  | ||||||
|         } |  | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn debug_type(&self, kind: DebugTypeData) -> DebugTypeValue { |     pub fn debug_type(&self, kind: DebugTypeData) -> DebugTypeValue { | ||||||
| @ -146,11 +140,11 @@ impl DebugInformation { | |||||||
|         value |         value | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn metadata(&self, scope: &DebugScopeValue, kind: DebugMetadata) -> DebugMetadataValue { |     pub fn metadata(&self, program: &DebugProgramValue, kind: DebugMetadata) -> DebugMetadataValue { | ||||||
|         let mut metadata = self.metadata.borrow_mut(); |         let mut metadata = self.metadata.borrow_mut(); | ||||||
|         let value = DebugMetadataValue(metadata.len()); |         let value = DebugMetadataValue(metadata.len()); | ||||||
|         metadata.push(DebugMetadataHolder { |         metadata.push(DebugMetadataHolder { | ||||||
|             scope: scope.clone(), |             program: *program, | ||||||
|             value: value.clone(), |             value: value.clone(), | ||||||
|             data: kind, |             data: kind, | ||||||
|         }); |         }); | ||||||
| @ -164,9 +158,9 @@ impl DebugInformation { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn subprogram(&self, kind: DebugSubprogramData) -> DebugSubprogramValue { |     pub fn subprogram(&self, kind: DebugSubprogramData) -> DebugProgramValue { | ||||||
|         let mut subprogram = self.subprograms.borrow_mut(); |         let mut subprogram = self.programs.borrow_mut(); | ||||||
|         let value = DebugSubprogramValue(subprogram.len()); |         let value = DebugProgramValue(subprogram.len() + 1); | ||||||
|         subprogram.push(DebugSubprogramHolder { |         subprogram.push(DebugSubprogramHolder { | ||||||
|             value: value.clone(), |             value: value.clone(), | ||||||
|             data: kind, |             data: kind, | ||||||
| @ -178,23 +172,23 @@ impl DebugInformation { | |||||||
|         self.metadata.clone() |         self.metadata.clone() | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn get_scopes(&self) -> Rc<RefCell<DebugScopeHolder>> { |     // pub fn get_scopes(&self) -> Rc<RefCell<DebugScopeHolder>> {
 | ||||||
|         self.scope.clone() |     //     self.scope.clone()
 | ||||||
|     } |     // }
 | ||||||
| 
 | 
 | ||||||
|     pub fn get_subprograms(&self) -> Rc<RefCell<Vec<DebugSubprogramHolder>>> { |     pub fn get_subprograms(&self) -> Rc<RefCell<Vec<DebugSubprogramHolder>>> { | ||||||
|         self.subprograms.clone() |         self.programs.clone() | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn get_types(&self) -> Rc<RefCell<Vec<DebugTypeHolder>>> { |     pub fn get_types(&self) -> Rc<RefCell<Vec<DebugTypeHolder>>> { | ||||||
|         self.types.clone() |         self.types.clone() | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn get_subprogram_data(&self, value: &DebugSubprogramValue) -> DebugSubprogramData { |     pub fn get_subprogram_data(&self, value: &DebugProgramValue) -> DebugSubprogramData { | ||||||
|         unsafe { |         unsafe { | ||||||
|             self.subprograms |             self.programs | ||||||
|                 .borrow() |                 .borrow() | ||||||
|                 .get_unchecked(value.0) |                 .get_unchecked(value.0 - 1) | ||||||
|                 .data |                 .data | ||||||
|                 .clone() |                 .clone() | ||||||
|         } |         } | ||||||
| @ -277,7 +271,7 @@ pub struct DebugSubprogramTypeData { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| pub struct DebugSubprogramType { | pub struct DebugSubprogramType { | ||||||
|     pub params: Vec<DebugSubprogramValue>, |     pub params: Vec<DebugProgramValue>, | ||||||
|     pub flags: DwarfFlags, |     pub flags: DwarfFlags, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| @ -296,7 +290,7 @@ pub enum DwarfEncoding { | |||||||
| pub struct DebugSubprogramData { | pub struct DebugSubprogramData { | ||||||
|     /// Function name.
 |     /// Function name.
 | ||||||
|     pub name: String, |     pub name: String, | ||||||
|     pub scope: DebugScopeValue, |     pub outer_scope: DebugProgramValue, | ||||||
|     /// Used for line number.
 |     /// Used for line number.
 | ||||||
|     pub location: DebugLocation, |     pub location: DebugLocation, | ||||||
|     /// Function type.
 |     /// Function type.
 | ||||||
|  | |||||||
| @ -8,7 +8,7 @@ use builder::{BlockValue, Builder, FunctionValue, InstructionValue, ModuleValue, | |||||||
| use debug::PrintableModule; | use debug::PrintableModule; | ||||||
| use debug_information::{ | use debug_information::{ | ||||||
|     DebugFileData, DebugInformation, DebugLocation, DebugLocationValue, DebugMetadataValue, |     DebugFileData, DebugInformation, DebugLocation, DebugLocationValue, DebugMetadataValue, | ||||||
|     DebugScopeValue, DebugSubprogramValue, |     DebugProgramValue, DebugScopeValue, | ||||||
| }; | }; | ||||||
| use util::match_types; | use util::match_types; | ||||||
| 
 | 
 | ||||||
| @ -106,10 +106,10 @@ impl<'ctx> Module<'ctx> { | |||||||
|     pub fn create_debug_info( |     pub fn create_debug_info( | ||||||
|         &mut self, |         &mut self, | ||||||
|         file: DebugFileData, |         file: DebugFileData, | ||||||
|     ) -> (DebugInformation, DebugScopeValue) { |     ) -> (DebugInformation, DebugProgramValue) { | ||||||
|         let (debug_info, scope) = DebugInformation::from_file(file); |         let (debug_info, program_value) = DebugInformation::from_file(file); | ||||||
|         self.debug_info = Some(debug_info.clone()); |         self.debug_info = Some(debug_info.clone()); | ||||||
|         (debug_info, scope) |         (debug_info, program_value) | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn get_debug_info(&self) -> &Option<DebugInformation> { |     pub fn get_debug_info(&self) -> &Option<DebugInformation> { | ||||||
| @ -131,7 +131,7 @@ pub struct FunctionData { | |||||||
|     ret: Type, |     ret: Type, | ||||||
|     params: Vec<Type>, |     params: Vec<Type>, | ||||||
|     flags: FunctionFlags, |     flags: FunctionFlags, | ||||||
|     debug: Option<DebugSubprogramValue>, |     debug: Option<DebugProgramValue>, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, Clone, Copy, Hash)] | #[derive(Debug, Clone, Copy, Hash)] | ||||||
| @ -177,7 +177,7 @@ impl<'ctx> Function<'ctx> { | |||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     pub fn set_debug(&self, subprogram: DebugSubprogramValue) { |     pub fn set_debug(&self, subprogram: DebugProgramValue) { | ||||||
|         unsafe { |         unsafe { | ||||||
|             self.builder.set_debug_subprogram(&self.value, subprogram); |             self.builder.set_debug_subprogram(&self.value, subprogram); | ||||||
|         } |         } | ||||||
|  | |||||||
| @ -5,8 +5,8 @@ use reid_lib::{ | |||||||
|     compile::CompiledModule, |     compile::CompiledModule, | ||||||
|     debug_information::{ |     debug_information::{ | ||||||
|         DebugBasicType, DebugFileData, DebugInformation, DebugLocation, DebugMetadata, |         DebugBasicType, DebugFileData, DebugInformation, DebugLocation, DebugMetadata, | ||||||
|         DebugMetadataValue, DebugParamVariable, DebugScopeValue, DebugSubprogramData, |         DebugMetadataValue, DebugParamVariable, DebugProgramValue, DebugScopeValue, | ||||||
|         DebugSubprogramOptionals, DebugSubprogramTypeData, DebugSubprogramValue, DebugTypeData, |         DebugSubprogramData, DebugSubprogramOptionals, DebugSubprogramTypeData, DebugTypeData, | ||||||
|         DebugTypeValue, DwarfEncoding, DwarfFlags, |         DebugTypeValue, DwarfEncoding, DwarfFlags, | ||||||
|     }, |     }, | ||||||
|     Block, CmpPredicate, ConstValue, Context, CustomTypeKind, Function, FunctionFlags, Instr, |     Block, CmpPredicate, ConstValue, Context, CustomTypeKind, Function, FunctionFlags, Instr, | ||||||
| @ -82,14 +82,18 @@ pub struct Scope<'ctx, 'a> { | |||||||
|     type_values: &'a HashMap<String, TypeValue>, |     type_values: &'a HashMap<String, TypeValue>, | ||||||
|     functions: &'a HashMap<String, StackFunction<'ctx>>, |     functions: &'a HashMap<String, StackFunction<'ctx>>, | ||||||
|     stack_values: HashMap<String, StackValue>, |     stack_values: HashMap<String, StackValue>, | ||||||
|     debug: &'ctx DebugInformation, |     debug: Option<Debug<'ctx>>, | ||||||
|     debug_scope: DebugScopeValue, |  | ||||||
|     debug_const_tys: &'a HashMap<TypeKind, DebugTypeValue>, |     debug_const_tys: &'a HashMap<TypeKind, DebugTypeValue>, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | #[derive(Debug, Clone)] | ||||||
|  | pub struct Debug<'ctx> { | ||||||
|  |     info: &'ctx DebugInformation, | ||||||
|  |     scope: Option<DebugProgramValue>, | ||||||
|  | } | ||||||
|  | 
 | ||||||
| pub struct StackFunction<'ctx> { | pub struct StackFunction<'ctx> { | ||||||
|     ir: Function<'ctx>, |     ir: Function<'ctx>, | ||||||
|     debug: DebugSubprogramValue, |  | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| #[derive(Debug, Clone, PartialEq, Eq)] | #[derive(Debug, Clone, PartialEq, Eq)] | ||||||
| @ -114,8 +118,7 @@ impl<'ctx, 'a> Scope<'ctx, 'a> { | |||||||
|             types: self.types, |             types: self.types, | ||||||
|             type_values: self.type_values, |             type_values: self.type_values, | ||||||
|             stack_values: self.stack_values.clone(), |             stack_values: self.stack_values.clone(), | ||||||
|             debug: self.debug, |             debug: self.debug.clone(), | ||||||
|             debug_scope: self.debug_scope.clone(), |  | ||||||
|             debug_const_tys: self.debug_const_tys, |             debug_const_tys: self.debug_const_tys, | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| @ -161,7 +164,7 @@ impl mir::Module { | |||||||
|     ) -> ModuleCodegen<'ctx> { |     ) -> ModuleCodegen<'ctx> { | ||||||
|         let mut module = context.module(&self.name, self.is_main); |         let mut module = context.module(&self.name, self.is_main); | ||||||
| 
 | 
 | ||||||
|         let (debug, debug_scope) = if let Some(path) = &self.path { |         let (debug, compile_unit) = if let Some(path) = &self.path { | ||||||
|             module.create_debug_info(DebugFileData { |             module.create_debug_info(DebugFileData { | ||||||
|                 name: path.file_name().unwrap().to_str().unwrap().to_owned(), |                 name: path.file_name().unwrap().to_str().unwrap().to_owned(), | ||||||
|                 directory: path.parent().unwrap().to_str().unwrap().to_owned(), |                 directory: path.parent().unwrap().to_str().unwrap().to_owned(), | ||||||
| @ -240,68 +243,48 @@ impl mir::Module { | |||||||
|                 ), |                 ), | ||||||
|             }; |             }; | ||||||
| 
 | 
 | ||||||
|             let fn_return_ty = debug_const_types.get(&TypeKind::U32).unwrap(); |             functions.insert(function.name.clone(), StackFunction { ir: func }); | ||||||
| 
 |  | ||||||
|             let debug_ty = debug.debug_type(DebugTypeData::Subprogram(DebugSubprogramTypeData { |  | ||||||
|                 parameters: vec![*fn_return_ty], |  | ||||||
|                 flags: DwarfFlags, |  | ||||||
|             })); |  | ||||||
| 
 |  | ||||||
|             let subprogram = debug.subprogram(DebugSubprogramData { |  | ||||||
|                 name: function.name.clone(), |  | ||||||
|                 scope: debug_scope.clone(), |  | ||||||
|                 location: DebugLocation { line: 0, column: 0 }, |  | ||||||
|                 ty: debug_ty, |  | ||||||
|                 opts: DebugSubprogramOptionals { |  | ||||||
|                     is_local: !function.is_pub, |  | ||||||
|                     is_definition: true, |  | ||||||
|                     ..DebugSubprogramOptionals::default() |  | ||||||
|                 }, |  | ||||||
|             }); |  | ||||||
| 
 |  | ||||||
|             func.set_debug(subprogram); |  | ||||||
| 
 |  | ||||||
|             functions.insert( |  | ||||||
|                 function.name.clone(), |  | ||||||
|                 StackFunction { |  | ||||||
|                     ir: func, |  | ||||||
|                     debug: subprogram, |  | ||||||
|                 }, |  | ||||||
|             ); |  | ||||||
|         } |         } | ||||||
| 
 | 
 | ||||||
|         for mir_function in &self.functions { |         for mir_function in &self.functions { | ||||||
|             let function = functions.get(&mir_function.name).unwrap(); |             let function = functions.get(&mir_function.name).unwrap(); | ||||||
|             let mut entry = function.ir.block("entry"); |             let mut entry = function.ir.block("entry"); | ||||||
| 
 | 
 | ||||||
|             let location = match &mir_function.kind { |             // Insert debug information
 | ||||||
|                 mir::FunctionDefinitionKind::Local(_, metadata) => { |             let debug_scope = if let Some(location) = mir_function.signature().into_debug(tokens) { | ||||||
|                     metadata.into_debug(tokens).unwrap() |                 // let debug_scope = debug.inner_scope(&outer_scope, location);
 | ||||||
|                 } | 
 | ||||||
|                 mir::FunctionDefinitionKind::Extern(_) => { |                 let fn_param_ty = debug_const_types.get(&TypeKind::U32).unwrap(); | ||||||
|                     // TODO extern should probably still have a meta
 | 
 | ||||||
|                     DebugLocation { |                 let debug_ty = | ||||||
|                         ..Default::default() |                     debug.debug_type(DebugTypeData::Subprogram(DebugSubprogramTypeData { | ||||||
|                     } |                         parameters: vec![*fn_param_ty], | ||||||
|                 } |                         flags: DwarfFlags, | ||||||
|  |                     })); | ||||||
|  | 
 | ||||||
|  |                 let subprogram = debug.subprogram(DebugSubprogramData { | ||||||
|  |                     name: mir_function.name.clone(), | ||||||
|  |                     outer_scope: compile_unit.clone(), | ||||||
|  |                     location, | ||||||
|  |                     ty: debug_ty, | ||||||
|  |                     opts: DebugSubprogramOptionals { | ||||||
|  |                         is_local: !mir_function.is_pub, | ||||||
|  |                         is_definition: true, | ||||||
|  |                         ..DebugSubprogramOptionals::default() | ||||||
|  |                     }, | ||||||
|  |                 }); | ||||||
|  | 
 | ||||||
|  |                 function.ir.set_debug(subprogram); | ||||||
|  | 
 | ||||||
|  |                 Some(subprogram) | ||||||
|  |             } else { | ||||||
|  |                 None | ||||||
|             }; |             }; | ||||||
| 
 | 
 | ||||||
|             let debug_scope = debug.inner_scope(&debug_scope, location); |             // Compile actual IR part
 | ||||||
| 
 |  | ||||||
|             let mut stack_values = HashMap::new(); |             let mut stack_values = HashMap::new(); | ||||||
|             for (i, (p_name, p_ty)) in mir_function.parameters.iter().enumerate() { |             for (i, (p_name, p_ty)) in mir_function.parameters.iter().enumerate() { | ||||||
|                 debug.metadata( |                 // Codegen actual parameters
 | ||||||
|                     &debug_scope, |  | ||||||
|                     DebugMetadata::ParamVar(DebugParamVariable { |  | ||||||
|                         name: p_name.clone(), |  | ||||||
|                         arg_idx: i as u32, |  | ||||||
|                         location, |  | ||||||
|                         ty: *debug_const_types.get(&TypeKind::U32).unwrap(), |  | ||||||
|                         always_preserve: true, |  | ||||||
|                         flags: DwarfFlags, |  | ||||||
|                     }), |  | ||||||
|                 ); |  | ||||||
| 
 |  | ||||||
|                 stack_values.insert( |                 stack_values.insert( | ||||||
|                     p_name.clone(), |                     p_name.clone(), | ||||||
|                     StackValue( |                     StackValue( | ||||||
| @ -309,6 +292,23 @@ impl mir::Module { | |||||||
|                         p_ty.get_type(&type_values, &types), |                         p_ty.get_type(&type_values, &types), | ||||||
|                     ), |                     ), | ||||||
|                 ); |                 ); | ||||||
|  | 
 | ||||||
|  |                 // Generate debug info
 | ||||||
|  |                 if let (Some(debug_scope), Some(location)) = | ||||||
|  |                     (&debug_scope, mir_function.signature().into_debug(tokens)) | ||||||
|  |                 { | ||||||
|  |                     debug.metadata( | ||||||
|  |                         &debug_scope, | ||||||
|  |                         DebugMetadata::ParamVar(DebugParamVariable { | ||||||
|  |                             name: p_name.clone(), | ||||||
|  |                             arg_idx: i as u32, | ||||||
|  |                             location, | ||||||
|  |                             ty: *debug_const_types.get(&TypeKind::U32).unwrap(), | ||||||
|  |                             always_preserve: true, | ||||||
|  |                             flags: DwarfFlags, | ||||||
|  |                         }), | ||||||
|  |                     ); | ||||||
|  |                 } | ||||||
|             } |             } | ||||||
| 
 | 
 | ||||||
|             let mut scope = Scope { |             let mut scope = Scope { | ||||||
| @ -321,8 +321,7 @@ impl mir::Module { | |||||||
|                 types: &types, |                 types: &types, | ||||||
|                 type_values: &type_values, |                 type_values: &type_values, | ||||||
|                 stack_values, |                 stack_values, | ||||||
|                 debug: &debug, |                 debug: None, | ||||||
|                 debug_scope: debug_scope, |  | ||||||
|                 debug_const_tys: &debug_const_types, |                 debug_const_tys: &debug_const_types, | ||||||
|             }; |             }; | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -282,14 +282,14 @@ pub enum FunctionDefinitionKind { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl FunctionDefinition { | impl FunctionDefinition { | ||||||
|     fn block_meta(&self) -> Metadata { |     pub fn block_meta(&self) -> Metadata { | ||||||
|         match &self.kind { |         match &self.kind { | ||||||
|             FunctionDefinitionKind::Local(block, _) => block.meta.clone(), |             FunctionDefinitionKind::Local(block, _) => block.meta.clone(), | ||||||
|             FunctionDefinitionKind::Extern(_) => Metadata::default(), |             FunctionDefinitionKind::Extern(_) => Metadata::default(), | ||||||
|         } |         } | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|     fn signature(&self) -> Metadata { |     pub fn signature(&self) -> Metadata { | ||||||
|         match &self.kind { |         match &self.kind { | ||||||
|             FunctionDefinitionKind::Local(_, metadata) => metadata.clone(), |             FunctionDefinitionKind::Local(_, metadata) => metadata.clone(), | ||||||
|             FunctionDefinitionKind::Extern(_) => Metadata::default(), |             FunctionDefinitionKind::Extern(_) => Metadata::default(), | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user