Browse Source

Add `byval`

gingerBill 5 years ago
parent
commit
da283d5a7f
3 changed files with 36 additions and 6 deletions
  1. 7 0
      src/check_type.cpp
  2. 7 6
      src/entity.cpp
  3. 22 0
      src/ir_print.cpp

+ 7 - 0
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;
+				}
+			}
 		}
 	}
 

+ 7 - 6
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
 

+ 22 - 0
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);
 					}