Mangle function names, except for user defined externs
This commit is contained in:
parent
e14efa2ea7
commit
beaba4e7de
@ -1,9 +1,7 @@
|
|||||||
// Arithmetic, function calls and imports!
|
// Arithmetic, function calls and imports!
|
||||||
|
|
||||||
import std::allocate;
|
|
||||||
|
|
||||||
fn main() -> u8 {
|
fn main() -> u8 {
|
||||||
let mut ptr = allocate(4);
|
let mut ptr = u8::alloca(4);
|
||||||
|
|
||||||
ptr[0] = 5;
|
ptr[0] = 5;
|
||||||
|
|
||||||
|
@ -587,9 +587,15 @@ impl FunctionHolder {
|
|||||||
let param_ptr = param_types.as_mut_ptr();
|
let param_ptr = param_types.as_mut_ptr();
|
||||||
let param_len = param_types.len();
|
let param_len = param_types.len();
|
||||||
|
|
||||||
|
let name = if self.data.flags.is_main {
|
||||||
|
c"main"
|
||||||
|
} else {
|
||||||
|
&into_cstring(&self.data.name)
|
||||||
|
};
|
||||||
|
|
||||||
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);
|
||||||
|
|
||||||
let function_ref = LLVMAddFunction(module_ref, into_cstring(&self.data.name).as_ptr(), fn_type);
|
let function_ref = LLVMAddFunction(module_ref, name.as_ptr(), fn_type);
|
||||||
|
|
||||||
if self.data.flags.inline {
|
if self.data.flags.inline {
|
||||||
let attribute = LLVMCreateEnumAttribute(context.context_ref, LLVMEnumAttribute::AlwaysInline as u32, 0);
|
let attribute = LLVMCreateEnumAttribute(context.context_ref, LLVMEnumAttribute::AlwaysInline as u32, 0);
|
||||||
|
@ -55,6 +55,7 @@ impl ast::Module {
|
|||||||
})
|
})
|
||||||
.collect(),
|
.collect(),
|
||||||
kind: mir::FunctionDefinitionKind::Extern(false),
|
kind: mir::FunctionDefinitionKind::Extern(false),
|
||||||
|
source: Some(module_id),
|
||||||
};
|
};
|
||||||
functions.push(def);
|
functions.push(def);
|
||||||
}
|
}
|
||||||
@ -176,6 +177,7 @@ impl ast::FunctionDefinition {
|
|||||||
.unwrap_or(mir::TypeKind::Void),
|
.unwrap_or(mir::TypeKind::Void),
|
||||||
parameters: params,
|
parameters: params,
|
||||||
kind: mir::FunctionDefinitionKind::Local(block.into_mir(module_id), (range).as_meta(module_id)),
|
kind: mir::FunctionDefinitionKind::Local(block.into_mir(module_id), (range).as_meta(module_id)),
|
||||||
|
source: Some(module_id),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -49,6 +49,7 @@ pub fn get_intrinsic_assoc_func(ty: &TypeKind, name: &str) -> Option<FunctionDef
|
|||||||
return_type: TypeKind::U64,
|
return_type: TypeKind::U64,
|
||||||
parameters: Vec::new(),
|
parameters: Vec::new(),
|
||||||
kind: FunctionDefinitionKind::Intrinsic(Box::new(IntrinsicSizeOf(ty.clone()))),
|
kind: FunctionDefinitionKind::Intrinsic(Box::new(IntrinsicSizeOf(ty.clone()))),
|
||||||
|
source: None,
|
||||||
}),
|
}),
|
||||||
"alloca" => Some(FunctionDefinition {
|
"alloca" => Some(FunctionDefinition {
|
||||||
name: "alloca".to_owned(),
|
name: "alloca".to_owned(),
|
||||||
@ -62,6 +63,7 @@ pub fn get_intrinsic_assoc_func(ty: &TypeKind, name: &str) -> Option<FunctionDef
|
|||||||
meta: Default::default(),
|
meta: Default::default(),
|
||||||
}],
|
}],
|
||||||
kind: FunctionDefinitionKind::Intrinsic(Box::new(IntrinsicAlloca(ty.clone()))),
|
kind: FunctionDefinitionKind::Intrinsic(Box::new(IntrinsicAlloca(ty.clone()))),
|
||||||
|
source: None,
|
||||||
}),
|
}),
|
||||||
"null" => Some(FunctionDefinition {
|
"null" => Some(FunctionDefinition {
|
||||||
name: "null".to_owned(),
|
name: "null".to_owned(),
|
||||||
@ -71,6 +73,7 @@ pub fn get_intrinsic_assoc_func(ty: &TypeKind, name: &str) -> Option<FunctionDef
|
|||||||
return_type: TypeKind::UserPtr(Box::new(ty.clone())),
|
return_type: TypeKind::UserPtr(Box::new(ty.clone())),
|
||||||
parameters: Vec::new(),
|
parameters: Vec::new(),
|
||||||
kind: FunctionDefinitionKind::Intrinsic(Box::new(IntrinsicNullPtr(ty.clone()))),
|
kind: FunctionDefinitionKind::Intrinsic(Box::new(IntrinsicNullPtr(ty.clone()))),
|
||||||
|
source: None,
|
||||||
}),
|
}),
|
||||||
_ => None,
|
_ => None,
|
||||||
}
|
}
|
||||||
|
@ -68,6 +68,7 @@ impl mir::Context {
|
|||||||
|
|
||||||
#[derive(Clone)]
|
#[derive(Clone)]
|
||||||
struct ModuleCodegen<'ctx> {
|
struct ModuleCodegen<'ctx> {
|
||||||
|
name: String,
|
||||||
module: Module<'ctx>,
|
module: Module<'ctx>,
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -186,9 +187,30 @@ impl mir::Module {
|
|||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
let is_main = self.is_main && function.name == "main";
|
let is_main = self.is_main && function.name == "main";
|
||||||
|
|
||||||
|
let is_true_extern = match function.kind {
|
||||||
|
FunctionDefinitionKind::Extern(i) => !i,
|
||||||
|
_ => false,
|
||||||
|
};
|
||||||
|
let module_prefix = if is_true_extern {
|
||||||
|
String::new()
|
||||||
|
} else if let Some(module) = function.source {
|
||||||
|
if module == self.module_id {
|
||||||
|
format!("reid.{}.", self.name)
|
||||||
|
} else {
|
||||||
|
format!("reid.{}.", modules.get(&module).unwrap().name)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
format!("reid.intrinsic.")
|
||||||
|
};
|
||||||
|
let linkage_name = format!(
|
||||||
|
"{}{}",
|
||||||
|
module_prefix,
|
||||||
|
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(
|
||||||
&function.linkage_name.clone().unwrap_or(function.name.clone()),
|
&linkage_name,
|
||||||
function.return_type.get_type(&type_values),
|
function.return_type.get_type(&type_values),
|
||||||
param_types,
|
param_types,
|
||||||
FunctionFlags {
|
FunctionFlags {
|
||||||
@ -199,7 +221,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()),
|
&linkage_name,
|
||||||
function.return_type.get_type(&type_values),
|
function.return_type.get_type(&type_values),
|
||||||
param_types,
|
param_types,
|
||||||
FunctionFlags {
|
FunctionFlags {
|
||||||
@ -226,9 +248,18 @@ impl mir::Module {
|
|||||||
.collect();
|
.collect();
|
||||||
|
|
||||||
let is_main = self.is_main && function.name == "main";
|
let is_main = self.is_main && function.name == "main";
|
||||||
|
let module_name = if let Some(module) = function.source {
|
||||||
|
if module == self.module_id {
|
||||||
|
format!("reid.{}", self.name)
|
||||||
|
} else {
|
||||||
|
format!("reid.{}", modules.get(&module).unwrap().name)
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
format!("reid.intrinsic")
|
||||||
|
};
|
||||||
let func = match &function.kind {
|
let func = match &function.kind {
|
||||||
mir::FunctionDefinitionKind::Local(_, _) => Some(module.function(
|
mir::FunctionDefinitionKind::Local(_, _) => Some(module.function(
|
||||||
&format!("{}::{}", ty, function.name),
|
&format!("{}.{}.{}", module_name, ty, function.name),
|
||||||
function.return_type.get_type(&type_values),
|
function.return_type.get_type(&type_values),
|
||||||
param_types,
|
param_types,
|
||||||
FunctionFlags {
|
FunctionFlags {
|
||||||
@ -475,7 +506,10 @@ impl mir::Module {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Ok(ModuleCodegen { module })
|
Ok(ModuleCodegen {
|
||||||
|
name: self.name.clone(),
|
||||||
|
module,
|
||||||
|
})
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -186,6 +186,7 @@ impl<'map> Pass for LinkerPass<'map> {
|
|||||||
.borrow_mut();
|
.borrow_mut();
|
||||||
|
|
||||||
let import_name = unsafe { path.get_unchecked(1) };
|
let import_name = unsafe { path.get_unchecked(1) };
|
||||||
|
let import_id = imported.module_id;
|
||||||
|
|
||||||
let mut imported_types = Vec::new();
|
let mut imported_types = Vec::new();
|
||||||
|
|
||||||
@ -234,6 +235,7 @@ impl<'map> Pass for LinkerPass<'map> {
|
|||||||
return_type,
|
return_type,
|
||||||
parameters: param_tys,
|
parameters: param_tys,
|
||||||
kind: super::FunctionDefinitionKind::Extern(true),
|
kind: super::FunctionDefinitionKind::Extern(true),
|
||||||
|
source: Some(imported.module_id),
|
||||||
});
|
});
|
||||||
} else if let Some(ty) = imported.typedefs.iter_mut().find(|f| f.name == *import_name) {
|
} else if let Some(ty) = imported.typedefs.iter_mut().find(|f| f.name == *import_name) {
|
||||||
let external_key = CustomTypeKey(ty.name.clone(), ty.source_module);
|
let external_key = CustomTypeKey(ty.name.clone(), ty.source_module);
|
||||||
@ -319,12 +321,13 @@ impl<'map> Pass for LinkerPass<'map> {
|
|||||||
ty.clone(),
|
ty.clone(),
|
||||||
FunctionDefinition {
|
FunctionDefinition {
|
||||||
name: func_name.clone(),
|
name: func_name.clone(),
|
||||||
linkage_name: Some(format!("{}::{}", ty, func_name)),
|
linkage_name: Some(format!("{}.{}", ty, func_name)),
|
||||||
is_pub: false,
|
is_pub: false,
|
||||||
is_imported: false,
|
is_imported: false,
|
||||||
return_type,
|
return_type,
|
||||||
parameters: param_tys,
|
parameters: param_tys,
|
||||||
kind: super::FunctionDefinitionKind::Extern(true),
|
kind: super::FunctionDefinitionKind::Extern(true),
|
||||||
|
source: Some(import_id),
|
||||||
},
|
},
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
@ -298,6 +298,7 @@ pub struct FunctionDefinition {
|
|||||||
pub return_type: TypeKind,
|
pub return_type: TypeKind,
|
||||||
pub parameters: Vec<FunctionParam>,
|
pub parameters: Vec<FunctionParam>,
|
||||||
pub kind: FunctionDefinitionKind,
|
pub kind: FunctionDefinitionKind,
|
||||||
|
pub source: Option<SourceModuleId>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Debug, Clone, PartialEq, PartialOrd)]
|
#[derive(Debug, Clone, PartialEq, PartialOrd)]
|
||||||
|
Loading…
Reference in New Issue
Block a user