Browse Source

Fix `ptr != ptr` type cast problem in LLVM 17

gingerBill 1 year ago
parent
commit
94d68c1f22
1 changed files with 15 additions and 2 deletions
  1. 15 2
      src/llvm_backend_proc.cpp

+ 15 - 2
src/llvm_backend_proc.cpp

@@ -864,8 +864,21 @@ gb_internal lbValue lb_emit_call_internal(lbProcedure *p, lbValue value, lbValue
 			for (unsigned i = 0; i < param_count; i++) {
 				LLVMTypeRef param_type = param_types[i];
 				LLVMTypeRef arg_type = LLVMTypeOf(args[i]);
-				// LLVMTypeKind param_kind = LLVMGetTypeKind(param_type);
-				// LLVMTypeKind arg_kind = LLVMGetTypeKind(arg_type);
+				if (LB_USE_NEW_PASS_SYSTEM &&
+				    arg_type != param_type) {
+					LLVMTypeKind arg_kind = LLVMGetTypeKind(arg_type);
+					LLVMTypeKind param_kind = LLVMGetTypeKind(param_type);
+					if (arg_kind == param_kind &&
+					    arg_kind == LLVMPointerTypeKind) {
+						// NOTE(bill): LLVM's newer `ptr` only type system seems to fail at times
+						// I don't know why...
+						args[i] = LLVMBuildPointerCast(p->builder, args[i], param_type, "");
+						gb_printf_err("%s\n", LLVMPrintValueToString(args[i]));
+						arg_type = param_type;
+						continue;
+					}
+				}
+
 				GB_ASSERT_MSG(
 					arg_type == param_type,
 					"Parameter types do not match: %s != %s, argument: %s\n\t%s",