Ver Fonte

Change map internal calls to use a pointer

gingerBill há 2 anos atrás
pai
commit
1bcec3f769
3 ficheiros alterados com 8 adições e 8 exclusões
  1. 4 4
      src/llvm_backend.cpp
  2. 2 2
      src/llvm_backend_expr.cpp
  3. 2 2
      src/llvm_backend_general.cpp

+ 4 - 4
src/llvm_backend.cpp

@@ -757,8 +757,8 @@ lbValue lb_gen_map_key_hash(lbProcedure *p, lbValue key, Type *key_type, lbValue
 	return hashed_key;
 }
 
-lbValue lb_internal_dynamic_map_get_ptr(lbProcedure *p, lbValue const &map, lbValue const &key) {
-	Type *map_type = base_type(map.type);
+lbValue lb_internal_dynamic_map_get_ptr(lbProcedure *p, lbValue const &map_ptr, lbValue const &key) {
+	Type *map_type = base_type(type_deref(map_ptr.type));
 	GB_ASSERT(map_type->kind == Type_Map);
 
 	lbValue ptr = {};
@@ -770,13 +770,13 @@ lbValue lb_internal_dynamic_map_get_ptr(lbProcedure *p, lbValue const &map, lbVa
 		lbValue map_get_proc = lb_get_map_get_proc_for_type(p->module, map_type);
 
 		auto args = array_make<lbValue>(permanent_allocator(), 2);
-		args[0] = lb_address_from_load_or_generate_local(p, map);
+		args[0] = map_ptr;
 		args[1] = key_ptr;
 
 		ptr = lb_emit_call(p, map_get_proc, args);
 	} else {
 		auto args = array_make<lbValue>(permanent_allocator(), 3);
-		args[0] = lb_emit_transmute(p, map, t_raw_map);
+		args[0] = lb_emit_transmute(p, lb_emit_load(p, map_ptr), t_raw_map);
 		args[1] = lb_gen_map_info_ptr(p->module, map_type);
 		args[2] = key_ptr;
 

+ 2 - 2
src/llvm_backend_expr.cpp

@@ -1423,9 +1423,9 @@ lbValue lb_build_binary_expr(lbProcedure *p, Ast *expr) {
 			switch (rt->kind) {
 			case Type_Map:
 				{
-					lbValue map = right;
+					lbValue map_ptr = lb_address_from_load_or_generate_local(p, right);
 					lbValue key = left;
-					lbValue ptr = lb_internal_dynamic_map_get_ptr(p, map, key);
+					lbValue ptr = lb_internal_dynamic_map_get_ptr(p, map_ptr, key);
 					if (be->op.kind == Token_in) {
 						return lb_emit_conv(p, lb_emit_comp_against_nil(p, Token_NotEq, ptr), t_bool);
 					} else {

+ 2 - 2
src/llvm_backend_general.cpp

@@ -418,7 +418,7 @@ lbValue lb_addr_get_ptr(lbProcedure *p, lbAddr const &addr) {
 
 	switch (addr.kind) {
 	case lbAddr_Map:
-		return lb_internal_dynamic_map_get_ptr(p, lb_emit_load(p, addr.addr), addr.map.key);
+		return lb_internal_dynamic_map_get_ptr(p, addr.addr, addr.map.key);
 
 	case lbAddr_RelativePointer: {
 		Type *rel_ptr = base_type(lb_addr_type(addr));
@@ -1075,7 +1075,7 @@ lbValue lb_addr_load(lbProcedure *p, lbAddr const &addr) {
 		GB_ASSERT(map_type->kind == Type_Map);
 		lbAddr v = lb_add_local_generated(p, map_type->Map.lookup_result_type, true);
 
-		lbValue ptr = lb_internal_dynamic_map_get_ptr(p, lb_emit_load(p, addr.addr), addr.map.key);
+		lbValue ptr = lb_internal_dynamic_map_get_ptr(p, addr.addr, addr.map.key);
 		lbValue ok = lb_emit_conv(p, lb_emit_comp_against_nil(p, Token_NotEq, ptr), t_bool);
 		lb_emit_store(p, lb_emit_struct_ep(p, v.addr, 1), ok);