mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-04 14:48:47 +00:00
Nested Procedures
This commit is contained in:
+3
-3
@@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
declare void @llvm.memmove.p0i8.p0i8.i64(i8*, i8*, i64, i32, i1)
|
declare void @llvm.memmove.p0i8.p0i8.i64(i8*, i8*, i64, i32, i1)
|
||||||
|
|
||||||
define void @thing(i64 ()* %p) {
|
define void @exec(i64 ()* %p) {
|
||||||
"entry - 0":
|
"entry - 0":
|
||||||
%0 = alloca i64 ()*, align 8 ; p
|
%0 = alloca i64 ()*, align 8 ; p
|
||||||
store i64 ()* zeroinitializer, i64 ()** %0
|
store i64 ()* zeroinitializer, i64 ()** %0
|
||||||
@@ -26,11 +26,11 @@ define void @main() {
|
|||||||
call void @print_int(i64 %2)
|
call void @print_int(i64 %2)
|
||||||
call void @print_rune(i32 128149)
|
call void @print_rune(i32 128149)
|
||||||
call void @print_rune(i32 10)
|
call void @print_rune(i32 10)
|
||||||
call void @thing(i64 ()* @main$0)
|
call void @exec(i64 ()* @main$cool_beans)
|
||||||
ret void
|
ret void
|
||||||
}
|
}
|
||||||
|
|
||||||
define i64 @main$0() {
|
define i64 @main$cool_beans() {
|
||||||
"entry - 0":
|
"entry - 0":
|
||||||
%0 = alloca i64, align 8 ; a
|
%0 = alloca i64, align 8 ; a
|
||||||
store i64 zeroinitializer, i64* %0
|
store i64 zeroinitializer, i64* %0
|
||||||
|
|||||||
+6
-4
@@ -2,7 +2,7 @@ import "basic"
|
|||||||
|
|
||||||
TWO_HEARTS :: '💕';
|
TWO_HEARTS :: '💕';
|
||||||
|
|
||||||
thing :: proc(p : proc() -> int) {
|
exec :: proc(p : proc() -> int) {
|
||||||
print_int(p());
|
print_int(p());
|
||||||
print_rune('\n');
|
print_rune('\n');
|
||||||
}
|
}
|
||||||
@@ -12,12 +12,14 @@ main :: proc() {
|
|||||||
print_int(cast(int)a);
|
print_int(cast(int)a);
|
||||||
print_rune(TWO_HEARTS);
|
print_rune(TWO_HEARTS);
|
||||||
print_rune('\n');
|
print_rune('\n');
|
||||||
thing(proc() -> int {
|
|
||||||
|
cool_beans :: proc() -> int {
|
||||||
a : int = 1337;
|
a : int = 1337;
|
||||||
print_rune(TWO_HEARTS);
|
print_rune('💕');
|
||||||
print_rune('\n');
|
print_rune('\n');
|
||||||
return a;
|
return a;
|
||||||
});
|
}
|
||||||
|
exec(cool_beans);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -595,6 +595,9 @@ void ssa_print_proc(gbFile *f, ssaModule *m, ssaProcedure *proc) {
|
|||||||
gb_for_array(i, proc->anon_procs) {
|
gb_for_array(i, proc->anon_procs) {
|
||||||
ssa_print_proc(f, m, proc->anon_procs[i]);
|
ssa_print_proc(f, m, proc->anon_procs[i]);
|
||||||
}
|
}
|
||||||
|
gb_for_array(i, proc->nested_procs) {
|
||||||
|
ssa_print_proc(f, m, proc->nested_procs[i]);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void ssa_print_llvm_ir(gbFile *f, ssaModule *m) {
|
void ssa_print_llvm_ir(gbFile *f, ssaModule *m) {
|
||||||
|
|||||||
+23
-2
@@ -40,7 +40,6 @@ struct ssaProcedure {
|
|||||||
ssaProcedure *parent;
|
ssaProcedure *parent;
|
||||||
ssaModule * module;
|
ssaModule * module;
|
||||||
String name;
|
String name;
|
||||||
Entity * entity;
|
|
||||||
Type * type;
|
Type * type;
|
||||||
AstNode * type_expr;
|
AstNode * type_expr;
|
||||||
AstNode * body;
|
AstNode * body;
|
||||||
@@ -50,6 +49,7 @@ struct ssaProcedure {
|
|||||||
ssaTargetList * target_list;
|
ssaTargetList * target_list;
|
||||||
|
|
||||||
gbArray(ssaProcedure *) anon_procs;
|
gbArray(ssaProcedure *) anon_procs;
|
||||||
|
gbArray(ssaProcedure *) nested_procs;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@@ -1256,6 +1256,7 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue
|
|||||||
return v;
|
return v;
|
||||||
return ssa_emit_load(proc, v);
|
return ssa_emit_load(proc, v);
|
||||||
}
|
}
|
||||||
|
return NULL;
|
||||||
case_end;
|
case_end;
|
||||||
|
|
||||||
case_ast_node(pe, ParenExpr, expr);
|
case_ast_node(pe, ParenExpr, expr);
|
||||||
@@ -1481,7 +1482,7 @@ ssaValue *ssa_build_single_expr(ssaProcedure *proc, AstNode *expr, TypeAndValue
|
|||||||
case_end;
|
case_end;
|
||||||
}
|
}
|
||||||
|
|
||||||
GB_PANIC("Unexpected expression");
|
GB_PANIC("Unexpected expression: %.*s", LIT(ast_node_strings[expr->kind]));
|
||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1767,6 +1768,26 @@ void ssa_build_stmt(ssaProcedure *proc, AstNode *node) {
|
|||||||
case_end;
|
case_end;
|
||||||
|
|
||||||
case_ast_node(pd, ProcDecl, node);
|
case_ast_node(pd, ProcDecl, node);
|
||||||
|
if (proc->nested_procs == NULL) {
|
||||||
|
// TODO(bill): Cleanup
|
||||||
|
gb_array_init(proc->nested_procs, gb_heap_allocator());
|
||||||
|
}
|
||||||
|
// NOTE(bill): Generate a new name
|
||||||
|
// parent$name
|
||||||
|
String pd_name = pd->name->Ident.token.string;
|
||||||
|
isize name_len = proc->name.len + 1 + pd_name.len + 1;
|
||||||
|
u8 *name_text = gb_alloc_array(proc->module->allocator, u8, name_len);
|
||||||
|
name_len = gb_snprintf(cast(char *)name_text, name_len, "%.*s$%.*s", LIT(proc->name), LIT(pd_name));
|
||||||
|
String name = make_string(name_text, name_len-1);
|
||||||
|
|
||||||
|
Entity *e = *map_get(&proc->module->info->definitions, hash_pointer(pd->name));
|
||||||
|
ssaValue *value = ssa_make_value_procedure(proc->module->allocator,
|
||||||
|
proc->module, e->type, pd->type, pd->body, name);
|
||||||
|
ssaProcedure *np = &value->proc;
|
||||||
|
gb_array_append(proc->nested_procs, np);
|
||||||
|
ssa_build_proc(value, proc);
|
||||||
|
|
||||||
|
map_set(&proc->module->values, hash_pointer(e), value);
|
||||||
|
|
||||||
case_end;
|
case_end;
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user