Change intrinsic alloca to malloc and actually use libc malloc

This commit is contained in:
Sofia 2025-07-28 21:22:15 +03:00
parent 13be3e9c02
commit 89850d7b4f
3 changed files with 19 additions and 20 deletions

View File

@ -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 {

View File

@ -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()))
}
}

View File

@ -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 {