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