Namespace all functions, except those that are explicitly extern
This commit is contained in:
		
							parent
							
								
									5026013df3
								
							
						
					
					
						commit
						13be3e9c02
					
				| @ -8,23 +8,16 @@ fn main() { | |||||||
| 
 | 
 | ||||||
|     let module = context.module("test", true); |     let module = context.module("test", true); | ||||||
| 
 | 
 | ||||||
|     let main = module.function("main", Type::I32, Vec::new(), FunctionFlags::default()); |     let main = module.function("main", None, Type::I32, Vec::new(), FunctionFlags::default()); | ||||||
|     let mut m_entry = main.block("entry"); |     let mut m_entry = main.block("entry"); | ||||||
| 
 | 
 | ||||||
|     let fibonacci = module.function( |     let fibonacci = module.function("fibonacci", None, Type::I32, vec![Type::I32], FunctionFlags::default()); | ||||||
|         "fibonacci", |  | ||||||
|         Type::I32, |  | ||||||
|         vec![Type::I32], |  | ||||||
|         FunctionFlags::default(), |  | ||||||
|     ); |  | ||||||
| 
 | 
 | ||||||
|     let arg = m_entry.build_named("const", Constant(I32(5))).unwrap(); |     let arg = m_entry.build_named("const", Constant(I32(5))).unwrap(); | ||||||
|     let fibonacci_call = m_entry |     let fibonacci_call = m_entry | ||||||
|         .build_named("const", FunctionCall(fibonacci.value(), vec![arg])) |         .build_named("const", FunctionCall(fibonacci.value(), vec![arg])) | ||||||
|         .unwrap(); |         .unwrap(); | ||||||
|     m_entry |     m_entry.terminate(TerminatorKind::Ret(fibonacci_call)).unwrap(); | ||||||
|         .terminate(TerminatorKind::Ret(fibonacci_call)) |  | ||||||
|         .unwrap(); |  | ||||||
| 
 | 
 | ||||||
|     let mut f_entry = fibonacci.block("entry"); |     let mut f_entry = fibonacci.block("entry"); | ||||||
| 
 | 
 | ||||||
|  | |||||||
| @ -590,7 +590,7 @@ impl FunctionHolder { | |||||||
|             let name = if self.data.flags.is_main { |             let name = if self.data.flags.is_main { | ||||||
|                 c"main" |                 c"main" | ||||||
|             } else { |             } else { | ||||||
|                 &into_cstring(&self.data.name) |                 &into_cstring(&self.data.linkage_name.clone().unwrap_or(self.data.name.clone())) | ||||||
|             }; |             }; | ||||||
| 
 | 
 | ||||||
|             let fn_type = LLVMFunctionType(ret_type, param_ptr, param_len as u32, 0); |             let fn_type = LLVMFunctionType(ret_type, param_ptr, param_len as u32, 0); | ||||||
| @ -605,7 +605,6 @@ impl FunctionHolder { | |||||||
|             let metadata = if let Some(debug) = debug { |             let metadata = if let Some(debug) = debug { | ||||||
|                 if let Some(scope_value) = &self.debug_info { |                 if let Some(scope_value) = &self.debug_info { | ||||||
|                     let scope_data = debug.info.get_scope_data(scope_value).unwrap(); |                     let scope_data = debug.info.get_scope_data(scope_value).unwrap(); | ||||||
|                     dbg!(&debug.info.get_scope()); |  | ||||||
| 
 | 
 | ||||||
|                     let mangled_length_ptr = &mut 0; |                     let mangled_length_ptr = &mut 0; | ||||||
|                     let mangled_name = LLVMGetValueName2(function_ref, mangled_length_ptr); |                     let mangled_name = LLVMGetValueName2(function_ref, mangled_length_ptr); | ||||||
|  | |||||||
| @ -66,7 +66,14 @@ pub struct Module<'ctx> { | |||||||
| } | } | ||||||
| 
 | 
 | ||||||
| impl<'ctx> Module<'ctx> { | impl<'ctx> Module<'ctx> { | ||||||
|     pub fn function(&self, name: &str, ret: Type, params: Vec<Type>, flags: FunctionFlags) -> Function<'ctx> { |     pub fn function( | ||||||
|  |         &self, | ||||||
|  |         name: &str, | ||||||
|  |         linkage: Option<String>, | ||||||
|  |         ret: Type, | ||||||
|  |         params: Vec<Type>, | ||||||
|  |         flags: FunctionFlags, | ||||||
|  |     ) -> Function<'ctx> { | ||||||
|         unsafe { |         unsafe { | ||||||
|             Function { |             Function { | ||||||
|                 phantom: PhantomData, |                 phantom: PhantomData, | ||||||
| @ -75,6 +82,7 @@ impl<'ctx> Module<'ctx> { | |||||||
|                     &self.value, |                     &self.value, | ||||||
|                     FunctionData { |                     FunctionData { | ||||||
|                         name: name.to_owned(), |                         name: name.to_owned(), | ||||||
|  |                         linkage_name: linkage, | ||||||
|                         ret, |                         ret, | ||||||
|                         params, |                         params, | ||||||
|                         flags, |                         flags, | ||||||
| @ -126,6 +134,7 @@ impl<'ctx> Drop for Module<'ctx> { | |||||||
| #[derive(Debug, Clone, Hash)] | #[derive(Debug, Clone, Hash)] | ||||||
| pub struct FunctionData { | pub struct FunctionData { | ||||||
|     name: String, |     name: String, | ||||||
|  |     linkage_name: Option<String>, | ||||||
|     ret: Type, |     ret: Type, | ||||||
|     params: Vec<Type>, |     params: Vec<Type>, | ||||||
|     flags: FunctionFlags, |     flags: FunctionFlags, | ||||||
|  | |||||||
| @ -374,7 +374,7 @@ pub struct IntrinsicMalloc(TypeKind); | |||||||
| impl IntrinsicFunction for IntrinsicMalloc { | impl IntrinsicFunction for IntrinsicMalloc { | ||||||
|     fn codegen<'ctx, 'a>(&self, scope: &mut Scope<'ctx, 'a>, params: &[StackValue]) -> Result<StackValue, ErrorKind> { |     fn codegen<'ctx, 'a>(&self, scope: &mut Scope<'ctx, 'a>, params: &[StackValue]) -> Result<StackValue, ErrorKind> { | ||||||
|         let amount = params.get(0).unwrap(); |         let amount = params.get(0).unwrap(); | ||||||
|         let function = scope.block.find_function(&"malloc".to_owned()).unwrap(); |         let function = scope.block.find_function(&MALLOC_IDENT.to_owned()).unwrap(); | ||||||
|         let instr = scope |         let instr = scope | ||||||
|             .block |             .block | ||||||
|             .build(Instr::FunctionCall(function, vec![amount.instr()])) |             .build(Instr::FunctionCall(function, vec![amount.instr()])) | ||||||
|  | |||||||
| @ -192,9 +192,7 @@ impl mir::Module { | |||||||
|                 FunctionDefinitionKind::Extern(i) => !i, |                 FunctionDefinitionKind::Extern(i) => !i, | ||||||
|                 _ => false, |                 _ => false, | ||||||
|             }; |             }; | ||||||
|             let module_prefix = if is_true_extern { |             let module_prefix = if let Some(module) = function.source { | ||||||
|                 String::new() |  | ||||||
|             } else if let Some(module) = function.source { |  | ||||||
|                 if module == self.module_id { |                 if module == self.module_id { | ||||||
|                     format!("reid.{}.", self.name) |                     format!("reid.{}.", self.name) | ||||||
|                 } else { |                 } else { | ||||||
| @ -203,14 +201,17 @@ impl mir::Module { | |||||||
|             } else { |             } else { | ||||||
|                 format!("reid.intrinsic.") |                 format!("reid.intrinsic.") | ||||||
|             }; |             }; | ||||||
|             let linkage_name = format!( |             let linkage_name = function.linkage_name.clone().unwrap_or(function.name.clone()); | ||||||
|  |             let full_name = format!( | ||||||
|                 "{}{}", |                 "{}{}", | ||||||
|                 module_prefix, |                 module_prefix, | ||||||
|                 function.linkage_name.clone().unwrap_or(function.name.clone()) |                 function.linkage_name.clone().unwrap_or(function.name.clone()) | ||||||
|             ); |             ); | ||||||
|  | 
 | ||||||
|             let func = match &function.kind { |             let func = match &function.kind { | ||||||
|                 mir::FunctionDefinitionKind::Local(_, _) => Some(module.function( |                 mir::FunctionDefinitionKind::Local(_, _) => Some(module.function( | ||||||
|                     &linkage_name, |                     &full_name, | ||||||
|  |                     None, | ||||||
|                     function.return_type.get_type(&type_values), |                     function.return_type.get_type(&type_values), | ||||||
|                     param_types, |                     param_types, | ||||||
|                     FunctionFlags { |                     FunctionFlags { | ||||||
| @ -221,7 +222,20 @@ impl mir::Module { | |||||||
|                     }, |                     }, | ||||||
|                 )), |                 )), | ||||||
|                 mir::FunctionDefinitionKind::Extern(imported) => Some(module.function( |                 mir::FunctionDefinitionKind::Extern(imported) => Some(module.function( | ||||||
|                     &linkage_name, |                     if function.source == None { | ||||||
|  |                         &function.name | ||||||
|  |                     } else { | ||||||
|  |                         &full_name | ||||||
|  |                     }, | ||||||
|  |                     if function.source == None { | ||||||
|  |                         Some(function.linkage_name.clone().unwrap()) | ||||||
|  |                     } else { | ||||||
|  |                         if !*imported { | ||||||
|  |                             Some(linkage_name.clone()) | ||||||
|  |                         } else { | ||||||
|  |                             None | ||||||
|  |                         } | ||||||
|  |                     }, | ||||||
|                     function.return_type.get_type(&type_values), |                     function.return_type.get_type(&type_values), | ||||||
|                     param_types, |                     param_types, | ||||||
|                     FunctionFlags { |                     FunctionFlags { | ||||||
| @ -260,6 +274,7 @@ impl mir::Module { | |||||||
|             let func = match &function.kind { |             let func = match &function.kind { | ||||||
|                 mir::FunctionDefinitionKind::Local(_, _) => Some(module.function( |                 mir::FunctionDefinitionKind::Local(_, _) => Some(module.function( | ||||||
|                     &format!("{}.{}.{}", module_name, ty, function.name), |                     &format!("{}.{}.{}", module_name, ty, function.name), | ||||||
|  |                     None, | ||||||
|                     function.return_type.get_type(&type_values), |                     function.return_type.get_type(&type_values), | ||||||
|                     param_types, |                     param_types, | ||||||
|                     FunctionFlags { |                     FunctionFlags { | ||||||
| @ -271,6 +286,7 @@ impl mir::Module { | |||||||
|                 )), |                 )), | ||||||
|                 mir::FunctionDefinitionKind::Extern(imported) => Some(module.function( |                 mir::FunctionDefinitionKind::Extern(imported) => Some(module.function( | ||||||
|                     &function.linkage_name.clone().unwrap_or(function.name.clone()), |                     &function.linkage_name.clone().unwrap_or(function.name.clone()), | ||||||
|  |                     None, | ||||||
|                     function.return_type.get_type(&type_values), |                     function.return_type.get_type(&type_values), | ||||||
|                     param_types, |                     param_types, | ||||||
|                     FunctionFlags { |                     FunctionFlags { | ||||||
| @ -308,6 +324,7 @@ impl mir::Module { | |||||||
|                         FunctionDefinitionKind::Local(..) => { |                         FunctionDefinitionKind::Local(..) => { | ||||||
|                             let ir_function = module.function( |                             let ir_function = module.function( | ||||||
|                                 &binop_fn_name, |                                 &binop_fn_name, | ||||||
|  |                                 None, | ||||||
|                                 binop.return_type.get_type(&type_values), |                                 binop.return_type.get_type(&type_values), | ||||||
|                                 vec![binop.lhs.ty.get_type(&type_values), binop.rhs.ty.get_type(&type_values)], |                                 vec![binop.lhs.ty.get_type(&type_values), binop.rhs.ty.get_type(&type_values)], | ||||||
|                                 FunctionFlags { |                                 FunctionFlags { | ||||||
| @ -373,6 +390,7 @@ impl mir::Module { | |||||||
|                         } |                         } | ||||||
|                         FunctionDefinitionKind::Extern(imported) => ScopeFunctionKind::UserGenerated(module.function( |                         FunctionDefinitionKind::Extern(imported) => ScopeFunctionKind::UserGenerated(module.function( | ||||||
|                             &binop_fn_name, |                             &binop_fn_name, | ||||||
|  |                             None, | ||||||
|                             binop.return_type.get_type(&type_values), |                             binop.return_type.get_type(&type_values), | ||||||
|                             vec![binop.lhs.ty.get_type(&type_values), binop.rhs.ty.get_type(&type_values)], |                             vec![binop.lhs.ty.get_type(&type_values), binop.rhs.ty.get_type(&type_values)], | ||||||
|                             FunctionFlags { |                             FunctionFlags { | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user