aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorgingerBill <bill@gingerbill.org>2020-03-12 22:33:49 +0000
committergingerBill <bill@gingerbill.org>2020-03-12 22:33:49 +0000
commitda283d5a7fb531427e74cb6003f451cb9b15f0ca (patch)
treeacfccde3afe4da22c92ea5fec43d5c866d53aea6 /src
parent2a2d3273eae791c5c21eb77374f4818c2a76ae1b (diff)
Add `byval`
Diffstat (limited to 'src')
-rw-r--r--src/check_type.cpp7
-rw-r--r--src/entity.cpp13
-rw-r--r--src/ir_print.cpp22
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);
}