mirror of
https://github.com/Ed94/Odin.git
synced 2026-08-01 12:18:15 +00:00
Call convention, pass by pointer: pointers are 16 byte aligned
This commit is contained in:
@@ -147,10 +147,11 @@ struct irProcedure {
|
|||||||
#define IR_INSTR_KINDS \
|
#define IR_INSTR_KINDS \
|
||||||
IR_INSTR_KIND(Comment, struct { String text; }) \
|
IR_INSTR_KIND(Comment, struct { String text; }) \
|
||||||
IR_INSTR_KIND(Local, struct { \
|
IR_INSTR_KIND(Local, struct { \
|
||||||
Entity * entity; \
|
Entity * entity; \
|
||||||
Type * type; \
|
Type * type; \
|
||||||
bool zero_initialized; \
|
bool zero_initialized; \
|
||||||
irValueArray referrers; \
|
irValueArray referrers; \
|
||||||
|
i64 alignment; \
|
||||||
}) \
|
}) \
|
||||||
IR_INSTR_KIND(ZeroInit, struct { irValue *address; }) \
|
IR_INSTR_KIND(ZeroInit, struct { irValue *address; }) \
|
||||||
IR_INSTR_KIND(Store, struct { irValue *address, *value; }) \
|
IR_INSTR_KIND(Store, struct { irValue *address, *value; }) \
|
||||||
@@ -812,6 +813,7 @@ irValue *ir_instr_local(irProcedure *p, Entity *e, bool zero_initialized) {
|
|||||||
i->Local.entity = e;
|
i->Local.entity = e;
|
||||||
i->Local.type = make_type_pointer(p->module->allocator, e->type);
|
i->Local.type = make_type_pointer(p->module->allocator, e->type);
|
||||||
i->Local.zero_initialized = zero_initialized;
|
i->Local.zero_initialized = zero_initialized;
|
||||||
|
i->Local.alignment = type_align_of(p->module->allocator, e->type);
|
||||||
array_init(&i->Local.referrers, heap_allocator()); // TODO(bill): Replace heap allocator here
|
array_init(&i->Local.referrers, heap_allocator()); // TODO(bill): Replace heap allocator here
|
||||||
ir_module_add_value(p->module, e, v);
|
ir_module_add_value(p->module, e, v);
|
||||||
return v;
|
return v;
|
||||||
@@ -1418,9 +1420,14 @@ irValue *ir_emit_comment(irProcedure *p, String text) {
|
|||||||
return ir_emit(p, ir_instr_comment(p, text));
|
return ir_emit(p, ir_instr_comment(p, text));
|
||||||
}
|
}
|
||||||
|
|
||||||
irValue *ir_copy_value_to_ptr(irProcedure *proc, irValue *val) {
|
irValue *ir_copy_value_to_ptr(irProcedure *proc, irValue *val, i64 alignment) {
|
||||||
Type *t = ir_type(val);
|
Type *t = ir_type(val);
|
||||||
|
i64 type_alignment = type_align_of(proc->module->allocator, t);
|
||||||
|
if (alignment < type_alignment) {
|
||||||
|
alignment = type_alignment;
|
||||||
|
}
|
||||||
irValue *ptr = ir_add_local_generated(proc, t);
|
irValue *ptr = ir_add_local_generated(proc, t);
|
||||||
|
ptr->Instr.Local.alignment = alignment;
|
||||||
ir_emit_store(proc, ptr, val);
|
ir_emit_store(proc, ptr, val);
|
||||||
return ptr;
|
return ptr;
|
||||||
}
|
}
|
||||||
@@ -1441,7 +1448,7 @@ irValue *ir_emit_call(irProcedure *p, irValue *value, irValue **args, isize arg_
|
|||||||
Type *new_type = pt->Proc.abi_compat_params[i];
|
Type *new_type = pt->Proc.abi_compat_params[i];
|
||||||
if (original_type != new_type) {
|
if (original_type != new_type) {
|
||||||
if (is_type_pointer(new_type)) {
|
if (is_type_pointer(new_type)) {
|
||||||
args[i] = ir_copy_value_to_ptr(p, args[i]);
|
args[i] = ir_copy_value_to_ptr(p, args[i], 16);
|
||||||
} else if (is_type_integer(new_type)) {
|
} else if (is_type_integer(new_type)) {
|
||||||
args[i] = ir_emit_bitcast(p, args[i], new_type);
|
args[i] = ir_emit_bitcast(p, args[i], new_type);
|
||||||
}
|
}
|
||||||
|
|||||||
+5
-1
@@ -728,9 +728,13 @@ void ir_print_instr(irFileBuffer *f, irModule *m, irValue *value) {
|
|||||||
|
|
||||||
case irInstr_Local: {
|
case irInstr_Local: {
|
||||||
Type *type = instr->Local.entity->type;
|
Type *type = instr->Local.entity->type;
|
||||||
|
i64 align = instr->Local.alignment;
|
||||||
|
if (align <= 0) {
|
||||||
|
align = type_align_of(m->allocator, type);
|
||||||
|
}
|
||||||
ir_fprintf(f, "%%%d = alloca ", value->index);
|
ir_fprintf(f, "%%%d = alloca ", value->index);
|
||||||
ir_print_type(f, m, type);
|
ir_print_type(f, m, type);
|
||||||
ir_fprintf(f, ", align %lld\n", type_align_of(m->allocator, type));
|
ir_fprintf(f, ", align %lld\n", align);
|
||||||
} break;
|
} break;
|
||||||
|
|
||||||
case irInstr_ZeroInit: {
|
case irInstr_ZeroInit: {
|
||||||
|
|||||||
Reference in New Issue
Block a user