Merge pull request #3855 from laytan/master

Fix two LLVM assertion failures
This commit is contained in:
gingerBill
2024-07-02 22:16:49 +01:00
committed by GitHub
2 changed files with 8 additions and 6 deletions
+1 -3
View File
@@ -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
View File
@@ -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 it is not an instruction it isn't a GEP, so we don't need to track alignment in the metadata,
if (is_packed != 0) { // which is not possible anyway (only LLVM instructions can have metadata).
LLVMSetAlignment(v, 1); 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};