Browse Source

Merge pull request #3855 from laytan/master

Fix two LLVM assertion failures
gingerBill 1 year ago
parent
commit
7e6acdf800
2 changed files with 8 additions and 6 deletions
  1. 1 3
      src/llvm_backend_const.cpp
  2. 7 3
      src/llvm_backend_general.cpp

+ 1 - 3
src/llvm_backend_const.cpp

@@ -94,9 +94,6 @@ gb_internal LLVMValueRef llvm_const_cast(LLVMValueRef val, LLVMTypeRef dst) {
 	LLVMTypeKind kind = LLVMGetTypeKind(dst);
 	LLVMTypeKind kind = LLVMGetTypeKind(dst);
 	switch (kind) {
 	switch (kind) {
 	case LLVMPointerTypeKind:
 	case LLVMPointerTypeKind:
-		if (LB_USE_NEW_PASS_SYSTEM) {
-			return val;
-		}
 		return LLVMConstPointerCast(val, dst);
 		return LLVMConstPointerCast(val, dst);
 	case LLVMStructTypeKind:
 	case LLVMStructTypeKind:
 		// GB_PANIC("%s -> %s", LLVMPrintValueToString(val), LLVMPrintTypeToString(dst));
 		// GB_PANIC("%s -> %s", LLVMPrintValueToString(val), LLVMPrintTypeToString(dst));
@@ -179,6 +176,7 @@ gb_internal LLVMValueRef llvm_const_named_struct_internal(LLVMTypeRef t, LLVMVal
 	for (unsigned i = 0; i < elem_count; i++) {
 	for (unsigned i = 0; i < elem_count; i++) {
 		LLVMTypeRef elem_type = LLVMStructGetTypeAtIndex(t, i);
 		LLVMTypeRef elem_type = LLVMStructGetTypeAtIndex(t, i);
 		values[i] = llvm_const_cast(values[i], elem_type);
 		values[i] = llvm_const_cast(values[i], elem_type);
+		GB_ASSERT_MSG(elem_type == LLVMTypeOf(values[i]), "%s != %s", LLVMPrintTypeToString(LLVMTypeOf(values[i])), LLVMPrintTypeToString(elem_type));
 	}
 	}
 	return LLVMConstNamedStruct(t, values, value_count);
 	return LLVMConstNamedStruct(t, values, value_count);
 }
 }

+ 7 - 3
src/llvm_backend_general.cpp

@@ -1109,9 +1109,13 @@ gb_internal lbValue lb_emit_load(lbProcedure *p, lbValue value) {
 	Type *t = type_deref(value.type);
 	Type *t = type_deref(value.type);
 	LLVMValueRef v = LLVMBuildLoad2(p->builder, lb_type(p->module, t), value.value, "");
 	LLVMValueRef v = LLVMBuildLoad2(p->builder, lb_type(p->module, t), value.value, "");
 
 
-	u64 is_packed = lb_get_metadata_custom_u64(p->module, value.value, ODIN_METADATA_IS_PACKED);
-	if (is_packed != 0) {
-		LLVMSetAlignment(v, 1);
+	// If it is not an instruction it isn't a GEP, so we don't need to track alignment in the metadata,
+	// which is not possible anyway (only LLVM instructions can have metadata).
+	if (LLVMIsAInstruction(value.value)) {
+		u64 is_packed = lb_get_metadata_custom_u64(p->module, value.value, ODIN_METADATA_IS_PACKED);
+		if (is_packed != 0) {
+			LLVMSetAlignment(v, 1);
+		}
 	}
 	}
 
 
 	return lbValue{v, t};
 	return lbValue{v, t};