Browse Source

Calling convention, change from bitcast to transmute

Ginger Bill 8 years ago
parent
commit
67d8f48553
3 changed files with 6 additions and 3 deletions
  1. 2 2
      core/raw.odin
  2. 1 0
      src/check_expr.c
  3. 3 1
      src/ir.c

+ 2 - 2
core/raw.odin

@@ -4,8 +4,8 @@ Any :: struct #ordered {
 }
 
 String :: struct #ordered {
-	data:  ^byte,
-	len:   int,
+	data: ^byte,
+	len:  int,
 };
 
 Slice :: struct #ordered {

+ 1 - 0
src/check_expr.c

@@ -1018,6 +1018,7 @@ Type *type_to_abi_compat_param_type(gbAllocator a, Type *original_type) {
 	Type *new_type = original_type;
 	// NOTE(bill): Changing the passing parameter value type is to match C's ABI
 	// IMPORTANT TODO(bill): This only matches the ABI on MSVC at the moment
+	// SEE: https://msdn.microsoft.com/en-us/library/zthk2dkh.aspx
 	Type *bt = core_type(original_type);
 	switch (bt->kind) {
 	// Okay to pass by value

+ 3 - 1
src/ir.c

@@ -1436,6 +1436,8 @@ irValue *ir_emit_bitcast(irProcedure *proc, irValue *data, Type *type) {
 	return ir_emit(proc, ir_instr_conv(proc, irConv_bitcast, data, ir_type(data), type));
 }
 
+irValue *ir_emit_transmute(irProcedure *proc, irValue *value, Type *t);
+
 irValue *ir_emit_call(irProcedure *p, irValue *value, irValue **args, isize arg_count) {
 	Type *pt = base_type(ir_type(value));
 	GB_ASSERT(pt->kind == Type_Proc);
@@ -1450,7 +1452,7 @@ irValue *ir_emit_call(irProcedure *p, irValue *value, irValue **args, isize arg_
 			if (is_type_pointer(new_type)) {
 				args[i] = ir_copy_value_to_ptr(p, args[i], 16);
 			} else if (is_type_integer(new_type)) {
-				args[i] = ir_emit_bitcast(p, args[i], new_type);
+				args[i] = ir_emit_transmute(p, args[i], new_type);
 			}
 		}
 	}