From da283d5a7fb531427e74cb6003f451cb9b15f0ca Mon Sep 17 00:00:00 2001 From: gingerBill Date: Thu, 12 Mar 2020 22:33:49 +0000 Subject: [PATCH] Add `byval` --- src/check_type.cpp | 7 +++++++ src/entity.cpp | 13 +++++++------ src/ir_print.cpp | 22 ++++++++++++++++++++++ 3 files changed, 36 insertions(+), 6 deletions(-) diff --git a/src/check_type.cpp b/src/check_type.cpp index 010b31f03..089e66c4d 100644 --- a/src/check_type.cpp +++ b/src/check_type.cpp @@ -2434,6 +2434,13 @@ void set_procedure_abi_types(gbAllocator allocator, Type *type) { } break; } + + if (build_context.ODIN_OS == "linux" || + build_context.ODIN_OS == "darwin") { + if (is_type_pointer(new_type) & !is_type_pointer(e->type)) { + e->flags |= EntityFlag_ByVal; + } + } } } diff --git a/src/entity.cpp b/src/entity.cpp index b89522b07..9cc77360e 100644 --- a/src/entity.cpp +++ b/src/entity.cpp @@ -43,14 +43,15 @@ enum EntityFlag { EntityFlag_TypeField = 1<<9, EntityFlag_Value = 1<<10, EntityFlag_Sret = 1<<11, - EntityFlag_BitFieldValue = 1<<12, - EntityFlag_PolyConst = 1<<13, - EntityFlag_NotExported = 1<<14, - EntityFlag_ConstInput = 1<<15, + EntityFlag_ByVal = 1<<12, + EntityFlag_BitFieldValue = 1<<13, + EntityFlag_PolyConst = 1<<14, + EntityFlag_NotExported = 1<<15, + EntityFlag_ConstInput = 1<<16, - EntityFlag_Static = 1<<16, + EntityFlag_Static = 1<<17, - EntityFlag_ImplicitReference = 1<<17, // NOTE(bill): equivalent to `const &` in C++ + EntityFlag_ImplicitReference = 1<<18, // NOTE(bill): equivalent to `const &` in C++ EntityFlag_SoaPtrField = 1<<19, // to allow s.x[0] where `s.x` is a pointer rather than a slice diff --git a/src/ir_print.cpp b/src/ir_print.cpp index bcbdca615..d5271444d 100644 --- a/src/ir_print.cpp +++ b/src/ir_print.cpp @@ -363,6 +363,9 @@ void ir_print_proc_type_without_pointer(irFileBuffer *f, irModule *m, Type *t) { if (e->flags&EntityFlag_NoAlias) { ir_write_str_lit(f, " noalias"); } + if (e->flags&EntityFlag_ByVal) { + ir_write_str_lit(f, " byval"); + } ir_write_byte(f, ' '); param_index++; } @@ -2184,6 +2187,9 @@ void ir_print_instr(irFileBuffer *f, irModule *m, irValue *value) { if (e->flags&EntityFlag_NoAlias) { ir_write_str_lit(f, " noalias"); } + if (e->flags&EntityFlag_ByVal) { + ir_write_str_lit(f, " byval"); + } ir_write_byte(f, ' '); ir_print_value(f, m, arg, t); param_index++; @@ -2196,6 +2202,9 @@ void ir_print_instr(irFileBuffer *f, irModule *m, irValue *value) { if (e->flags&EntityFlag_ImplicitReference) { ir_write_str_lit(f, " nonnull dereferenceable"); } + if (e->flags&EntityFlag_ByVal) { + ir_write_str_lit(f, " byval"); + } ir_write_byte(f, ' '); irValue *arg = call->args[arg_index++]; ir_print_value(f, m, arg, t); @@ -2236,6 +2245,9 @@ void ir_print_instr(irFileBuffer *f, irModule *m, irValue *value) { if (e->flags&EntityFlag_NoAlias) { ir_write_str_lit(f, " noalias"); } + if (e->flags&EntityFlag_ByVal) { + ir_write_str_lit(f, " byval"); + } ir_write_byte(f, ' '); ir_print_value(f, m, arg, t); param_index++; @@ -2246,6 +2258,9 @@ void ir_print_instr(irFileBuffer *f, irModule *m, irValue *value) { if (e->flags&EntityFlag_NoAlias) { ir_write_str_lit(f, " noalias"); } + if (e->flags&EntityFlag_ByVal) { + ir_write_str_lit(f, " byval"); + } ir_write_byte(f, ' '); ir_print_value(f, m, arg, t); param_index++; @@ -2390,6 +2405,10 @@ void ir_print_proc(irFileBuffer *f, irModule *m, irProcedure *proc) { if (e->flags&EntityFlag_NoAlias) { ir_write_str_lit(f, " noalias"); } + if (e->flags&EntityFlag_ByVal) { + ir_write_str_lit(f, " byval"); + } + if (proc->body != nullptr) { ir_fprintf(f, " %%_.%td", parameter_index+j); @@ -2402,6 +2421,9 @@ void ir_print_proc(irFileBuffer *f, irModule *m, irProcedure *proc) { if (e->flags&EntityFlag_NoAlias) { ir_write_str_lit(f, " noalias"); } + if (e->flags&EntityFlag_ByVal) { + ir_write_str_lit(f, " byval"); + } if (proc->body != nullptr) { ir_fprintf(f, " %%_.%td", parameter_index); }