Change intrinsic alloca to malloc and actually use libc malloc
This commit is contained in:
parent
13be3e9c02
commit
89850d7b4f
@ -13,7 +13,7 @@ struct String {
|
||||
impl String {
|
||||
pub fn new() -> String {
|
||||
String {
|
||||
inner: char::alloca(0),
|
||||
inner: char::malloc(0),
|
||||
length: 0,
|
||||
max_length: 0,
|
||||
must_be_freed: true,
|
||||
@ -41,7 +41,7 @@ impl String {
|
||||
|
||||
pub fn add_char(&mut self, c: char) {
|
||||
if ((*self).length + 1) >= (*self).max_length {
|
||||
let new = char::alloca((*self).max_length + 4);
|
||||
let new = char::malloc((*self).max_length + 4);
|
||||
copy_bits((*self).inner, new, (*self).max_length);
|
||||
|
||||
if (*self).must_be_freed == true {
|
||||
@ -121,7 +121,7 @@ pub fn int_div(numerator: i32, denominator: i32) -> div_t {
|
||||
|
||||
pub fn new_string() -> String {
|
||||
String {
|
||||
inner: char::alloca(0),
|
||||
inner: char::malloc(0),
|
||||
length: 0,
|
||||
max_length: 0,
|
||||
must_be_freed: true,
|
||||
@ -143,7 +143,7 @@ pub fn from_str(str: *char) -> String {
|
||||
|
||||
pub fn add_char(string: &mut String, c: char) {
|
||||
if ((*string).length + 1) >= (*string).max_length {
|
||||
let new = char::alloca((*string).max_length + 4);
|
||||
let new = char::malloc((*string).max_length + 4);
|
||||
copy_bits((*string).inner, new, (*string).max_length);
|
||||
|
||||
if (*string).must_be_freed == true {
|
||||
|
@ -33,7 +33,8 @@ const FLOATS: [TypeKind; 7] = [
|
||||
TypeKind::F128PPC,
|
||||
];
|
||||
|
||||
const MALLOC_IDENT: &str = "reid.malloc";
|
||||
const INTRINSIC_IDENT: &str = "reid.intrinsic";
|
||||
const MALLOC_IDENT: &str = "malloc";
|
||||
|
||||
pub fn form_intrinsics() -> Vec<FunctionDefinition> {
|
||||
let mut intrinsics = Vec::new();
|
||||
@ -68,8 +69,8 @@ pub fn get_intrinsic_assoc_func(ty: &TypeKind, name: &str) -> Option<FunctionDef
|
||||
kind: FunctionDefinitionKind::Intrinsic(Box::new(IntrinsicSizeOf(ty.clone()))),
|
||||
source: None,
|
||||
}),
|
||||
"alloca" => Some(FunctionDefinition {
|
||||
name: "alloca".to_owned(),
|
||||
"malloc" => Some(FunctionDefinition {
|
||||
name: "malloc".to_owned(),
|
||||
linkage_name: None,
|
||||
is_pub: true,
|
||||
is_imported: false,
|
||||
@ -363,7 +364,7 @@ impl IntrinsicFunction for IntrinsicSizeOf {
|
||||
fn codegen<'ctx, 'a>(&self, scope: &mut Scope<'ctx, 'a>, _: &[StackValue]) -> Result<StackValue, ErrorKind> {
|
||||
let instr = scope
|
||||
.block
|
||||
.build(Instr::Constant(reid_lib::ConstValue::U64(self.0.size_of())))
|
||||
.build(Instr::Constant(reid_lib::ConstValue::U64(self.0.size_of() / 8)))
|
||||
.unwrap();
|
||||
Ok(StackValue(StackValueKind::Literal(instr), self.0.clone()))
|
||||
}
|
||||
@ -374,11 +375,17 @@ 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_IDENT.to_owned()).unwrap();
|
||||
let instr = scope
|
||||
let function = scope
|
||||
.block
|
||||
.build(Instr::FunctionCall(function, vec![amount.instr()]))
|
||||
.find_function(&format!("{}.{}", INTRINSIC_IDENT, MALLOC_IDENT))
|
||||
.unwrap();
|
||||
|
||||
let sizeof = scope
|
||||
.block
|
||||
.build(Instr::Constant(ConstValue::U64(self.0.size_of() / 8)))
|
||||
.unwrap();
|
||||
let bytes = scope.block.build(Instr::Mul(sizeof, amount.instr())).unwrap();
|
||||
let instr = scope.block.build(Instr::FunctionCall(function, vec![bytes])).unwrap();
|
||||
Ok(StackValue(StackValueKind::Literal(instr), self.0.clone()))
|
||||
}
|
||||
}
|
||||
|
@ -188,10 +188,6 @@ impl mir::Module {
|
||||
|
||||
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 let Some(module) = function.source {
|
||||
if module == self.module_id {
|
||||
format!("reid.{}.", self.name)
|
||||
@ -222,11 +218,7 @@ impl mir::Module {
|
||||
},
|
||||
)),
|
||||
mir::FunctionDefinitionKind::Extern(imported) => Some(module.function(
|
||||
if function.source == None {
|
||||
&function.name
|
||||
} else {
|
||||
&full_name
|
||||
},
|
||||
&full_name,
|
||||
if function.source == None {
|
||||
Some(function.linkage_name.clone().unwrap())
|
||||
} else {
|
||||
|
Loading…
Reference in New Issue
Block a user