Implement lexical scopes
This commit is contained in:
		
							parent
							
								
									726251e39c
								
							
						
					
					
						commit
						1b1a5934f5
					
				| @ -399,12 +399,12 @@ impl DebugScopeHolder { | ||||
|         unsafe { | ||||
|             let scope = match &self.data.kind { | ||||
|                 DebugScopeKind::CodegenContext => panic!(), | ||||
|                 DebugScopeKind::LexicalScope => LLVMDIBuilderCreateLexicalBlock( | ||||
|                 DebugScopeKind::LexicalScope(data) => LLVMDIBuilderCreateLexicalBlock( | ||||
|                     di_builder, | ||||
|                     parent, | ||||
|                     file, | ||||
|                     self.data.location.as_ref().unwrap().pos.line, | ||||
|                     self.data.location.as_ref().unwrap().pos.column, | ||||
|                     data.location.pos.line, | ||||
|                     data.location.pos.column, | ||||
|                 ), | ||||
|                 DebugScopeKind::Subprogram(_) => panic!(), | ||||
|             }; | ||||
| @ -607,7 +607,7 @@ impl FunctionHolder { | ||||
| 
 | ||||
|                     let subprogram = match scope_data.kind { | ||||
|                         DebugScopeKind::CodegenContext => panic!(), | ||||
|                         DebugScopeKind::LexicalScope => panic!(), | ||||
|                         DebugScopeKind::LexicalScope(_) => panic!(), | ||||
|                         DebugScopeKind::Subprogram(subprogram) => LLVMDIBuilderCreateFunction( | ||||
|                             debug.builder, | ||||
|                             *debug.scopes.get(&scope_data.parent.unwrap()).unwrap(), | ||||
|  | ||||
| @ -71,10 +71,6 @@ impl DebugInformation { | ||||
|                     inner_scopes: Vec::new(), | ||||
|                     data: DebugScopeData { | ||||
|                         parent: None, | ||||
|                         location: Some(DebugLocation { | ||||
|                             scope: DebugScopeValue(Vec::new()), | ||||
|                             pos: DebugPosition { line: 0, column: 0 }, | ||||
|                         }), | ||||
|                         kind: DebugScopeKind::CodegenContext, | ||||
|                     }, | ||||
|                 })), | ||||
| @ -86,32 +82,6 @@ impl DebugInformation { | ||||
|         ) | ||||
|     } | ||||
| 
 | ||||
|     pub fn inner_scope(&self, parent: &DebugScopeValue, location: DebugLocation) -> DebugScopeValue { | ||||
|         unsafe { | ||||
|             let mut outer_scope = RefMut::map(self.scope.borrow_mut(), |mut v| { | ||||
|                 for i in &parent.0 { | ||||
|                     v = v.inner_scopes.get_unchecked_mut(*i); | ||||
|                 } | ||||
|                 v | ||||
|             }); | ||||
| 
 | ||||
|             let mut arr = parent.0.clone(); | ||||
|             arr.push(parent.0.len()); | ||||
|             let value = DebugScopeValue(arr); | ||||
| 
 | ||||
|             outer_scope.inner_scopes.push(DebugScopeHolder { | ||||
|                 value: value.clone(), | ||||
|                 inner_scopes: Vec::new(), | ||||
|                 data: DebugScopeData { | ||||
|                     parent: Some(parent.clone()), | ||||
|                     location: Some(location), | ||||
|                     kind: DebugScopeKind::LexicalScope, | ||||
|                 }, | ||||
|             }); | ||||
|             value | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     pub fn location(&self, scope_value: &DebugScopeValue, location: DebugLocation) -> DebugLocationValue { | ||||
|         let value = DebugLocationValue(scope_value.clone(), self.locations.borrow().len()); | ||||
|         let location = DebugLocationHolder { | ||||
| @ -162,13 +132,36 @@ impl DebugInformation { | ||||
|                 inner_scopes: Vec::new(), | ||||
|                 data: DebugScopeData { | ||||
|                     parent: Some(parent.clone()), | ||||
|                     location: None, | ||||
|                     kind: DebugScopeKind::Subprogram(kind), | ||||
|                 }, | ||||
|             }); | ||||
|             value | ||||
|         } | ||||
|     } | ||||
|     pub fn lexical_scope(&self, parent: &DebugScopeValue, data: DebugLexicalScope) -> DebugScopeValue { | ||||
|         unsafe { | ||||
|             let mut outer_scope = RefMut::map(self.scope.borrow_mut(), |mut v| { | ||||
|                 for i in &parent.0 { | ||||
|                     v = v.inner_scopes.get_unchecked_mut(*i); | ||||
|                 } | ||||
|                 v | ||||
|             }); | ||||
| 
 | ||||
|             let mut arr = parent.0.clone(); | ||||
|             arr.push(outer_scope.inner_scopes.len()); | ||||
|             let value = DebugScopeValue(arr); | ||||
| 
 | ||||
|             outer_scope.inner_scopes.push(DebugScopeHolder { | ||||
|                 value: value.clone(), | ||||
|                 inner_scopes: Vec::new(), | ||||
|                 data: DebugScopeData { | ||||
|                     parent: Some(parent.clone()), | ||||
|                     kind: DebugScopeKind::LexicalScope(data), | ||||
|                 }, | ||||
|             }); | ||||
|             value | ||||
|         } | ||||
|     } | ||||
| 
 | ||||
|     pub fn get_metadata(&self, value: DebugMetadataValue) -> DebugMetadata { | ||||
|         unsafe { self.metadata.borrow().get_unchecked(value.0).data.clone() } | ||||
| @ -352,17 +345,21 @@ pub enum DwarfEncoding { | ||||
| #[derive(Debug, Clone)] | ||||
| pub struct DebugScopeData { | ||||
|     pub parent: Option<DebugScopeValue>, | ||||
|     pub location: Option<DebugLocation>, | ||||
|     pub kind: DebugScopeKind, | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug, Clone)] | ||||
| pub enum DebugScopeKind { | ||||
|     CodegenContext, | ||||
|     LexicalScope, | ||||
|     LexicalScope(DebugLexicalScope), | ||||
|     Subprogram(DebugSubprogramData), | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug, Clone)] | ||||
| pub struct DebugLexicalScope { | ||||
|     pub location: DebugLocation, | ||||
| } | ||||
| 
 | ||||
| #[derive(Debug, Clone)] | ||||
| pub struct DebugSubprogramData { | ||||
|     /// Function name.
 | ||||
|  | ||||
| @ -5,8 +5,9 @@ use intrinsics::*; | ||||
| use reid_lib::{ | ||||
|     compile::CompiledModule, | ||||
|     debug_information::{ | ||||
|         DebugFileData, DebugLocalVariable, DebugLocation, DebugMetadata, DebugRecordKind, DebugSubprogramData, | ||||
|         DebugSubprogramOptionals, DebugSubprogramType, DebugTypeData, DwarfFlags, InstructionDebugRecordData, | ||||
|         DebugFileData, DebugLexicalScope, DebugLocalVariable, DebugLocation, DebugMetadata, DebugRecordKind, | ||||
|         DebugSubprogramData, DebugSubprogramOptionals, DebugSubprogramType, DebugTypeData, DwarfFlags, | ||||
|         InstructionDebugRecordData, | ||||
|     }, | ||||
|     CmpPredicate, ConstValue, Context, CustomTypeKind, Function, FunctionFlags, Instr, Module, NamedStruct, | ||||
|     TerminatorKind as Term, Type, | ||||
| @ -546,36 +547,10 @@ impl FunctionDefinitionKind { | ||||
|                             TypeKind::CodegenPtr(Box::new(p_ty.clone())), | ||||
|                         ), | ||||
|                     ); | ||||
| 
 | ||||
|                     // Generate debug info
 | ||||
|                     // if let (Some(debug_scope), Some(location)) = (
 | ||||
|                     //     &debug_scope,
 | ||||
|                     //     mir_function.signature().into_debug(tokens, compile_unit),
 | ||||
|                     // ) {
 | ||||
|                     //     debug.metadata(
 | ||||
|                     //         &location,
 | ||||
|                     //         DebugMetadata::ParamVar(DebugParamVariable {
 | ||||
|                     //             name: p_name.clone(),
 | ||||
|                     //             arg_idx: i as u32,
 | ||||
|                     //             ty: p_ty.get_debug_type_hard(
 | ||||
|                     //                 *debug_scope,
 | ||||
|                     //                 &debug,
 | ||||
|                     //                 &debug_types,
 | ||||
|                     //                 &type_values,
 | ||||
|                     //                 &types,
 | ||||
|                     //                 self.module_id,
 | ||||
|                     //                 &self.tokens,
 | ||||
|                     //                 &modules,
 | ||||
|                     //             ),
 | ||||
|                     //             always_preserve: true,
 | ||||
|                     //             flags: DwarfFlags,
 | ||||
|                     //         }),
 | ||||
|                     //     );
 | ||||
|                     // }
 | ||||
|                 } | ||||
| 
 | ||||
|                 let state = State::default(); | ||||
|                 if let Some(ret) = block.codegen(scope, &state)? { | ||||
|                 if let Some(ret) = block.codegen(scope, &state, false)? { | ||||
|                     scope.block.terminate(Term::Ret(ret.instr())).unwrap(); | ||||
|                 } else { | ||||
|                     if !scope.block.delete_if_unused().unwrap() { | ||||
| @ -604,7 +579,20 @@ impl mir::Block { | ||||
|         &self, | ||||
|         mut scope: &mut Scope<'ctx, 'a>, | ||||
|         state: &State, | ||||
|         create_debug_scope: bool, | ||||
|     ) -> Result<Option<StackValue>, ErrorKind> { | ||||
|         let parent_scope = if let Some(debug) = &mut scope.debug { | ||||
|             let parent_scope = debug.scope.clone(); | ||||
|             if create_debug_scope { | ||||
|                 let location = self.meta.into_debug(scope.tokens, &debug.scope).unwrap(); | ||||
|                 let scope = debug.info.lexical_scope(&debug.scope, DebugLexicalScope { location }); | ||||
|                 debug.scope = scope; | ||||
|             } | ||||
|             Some(parent_scope) | ||||
|         } else { | ||||
|             None | ||||
|         }; | ||||
| 
 | ||||
|         for stmt in &self.statements { | ||||
|             stmt.codegen(&mut scope, state)?.map(|s| { | ||||
|                 if let Some(debug) = &scope.debug { | ||||
| @ -615,7 +603,7 @@ impl mir::Block { | ||||
|             }); | ||||
|         } | ||||
| 
 | ||||
|         if let Some((kind, expr)) = &self.return_expression { | ||||
|         let return_value = if let Some((kind, expr)) = &self.return_expression { | ||||
|             if let Some(expr) = expr { | ||||
|                 let ret = expr.codegen(&mut scope, &mut state.load(true))?; | ||||
|                 match kind { | ||||
| @ -638,7 +626,13 @@ impl mir::Block { | ||||
|             } | ||||
|         } else { | ||||
|             Ok(None) | ||||
|         }; | ||||
| 
 | ||||
|         if let Some(parent_scope) = parent_scope { | ||||
|             scope.debug.as_mut().unwrap().scope = parent_scope; | ||||
|         } | ||||
| 
 | ||||
|         return_value | ||||
|     } | ||||
| } | ||||
| 
 | ||||
| @ -759,7 +753,7 @@ impl mir::Statement { | ||||
|                     .unwrap(); | ||||
| 
 | ||||
|                 let mut condition_true_scope = scope.with_block(condition_true_block); | ||||
|                 block.codegen(&mut condition_true_scope, state)?; | ||||
|                 block.codegen(&mut condition_true_scope, state, true)?; | ||||
| 
 | ||||
|                 condition_true_scope | ||||
|                     .block | ||||
| @ -933,7 +927,7 @@ impl mir::Expression { | ||||
|                 scope.block.terminate(Term::Br(inner.value())).unwrap(); | ||||
| 
 | ||||
|                 let mut inner_scope = scope.with_block(inner); | ||||
|                 let ret = if let Some(ret) = block.codegen(&mut inner_scope, state)? { | ||||
|                 let ret = if let Some(ret) = block.codegen(&mut inner_scope, state, true)? { | ||||
|                     Some(ret) | ||||
|                 } else { | ||||
|                     None | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user