zig
zig copied to clipboard
stage2: compiler crash when emitting debug info for COFF
Zig Version
0.10.0-dev.4472+a4eb221b9
Steps to Reproduce
I thought I saw this somewhere before, but I have not been able to find it. Sorry if this bug is already reported.
git clone https://github.com/davidgm94/RNU.git
cd RNU
git checkout -b zig-coff-crash
zig build
This happened when creating an EFI executable with MSVC ABI
Expected Behavior
Not a crash
Actual Behavior
thread 260106 panic: integer cast truncated bits
/home/david/dev/official-zig/src/value.zig:1183:32: 0x560926ce93fe in value.Value.toSignedInt (zig2)
.int_u64 => return @intCast(i64, self.castTag(.int_u64).?.data),
^
/home/david/dev/official-zig/src/codegen/llvm.zig:1485:64: 0x560926ce01f5 in codegen.llvm.Object.lowerDebugTypeImpl (zig2)
const field_int = field_int_val.toSignedInt();
^
/home/david/dev/official-zig/src/codegen/llvm.zig:1421:36: 0x560926cea466 in codegen.llvm.Object.lowerDebugType (zig2)
return o.lowerDebugTypeImpl(entry, resolve, null);
^
/home/david/dev/official-zig/src/codegen/llvm.zig:2283:71: 0x560926cdfdd9 in codegen.llvm.Object.lowerDebugTypeImpl (zig2)
try param_di_types.append(try o.lowerDebugType(param_ty, .full));
^
/home/david/dev/official-zig/src/codegen/llvm.zig:1421:36: 0x560926cea466 in codegen.llvm.Object.lowerDebugType (zig2)
return o.lowerDebugTypeImpl(entry, resolve, null);
^
/home/david/dev/official-zig/src/codegen/llvm.zig:1163:37: 0x5609273a949c in codegen.llvm.Object.updateFunc (zig2)
try o.lowerDebugType(decl.ty, .full),
^
/home/david/dev/official-zig/src/link/Coff.zig:973:42: 0x560927130cf9 in link.Coff.updateFunc (zig2)
return llvm_object.updateFunc(module, func, air, liveness);
^
/home/david/dev/official-zig/src/link.zig:521:77: 0x560926f333c5 in link.File.updateFunc (zig2)
.coff => return @fieldParentPtr(Coff, "base", base).updateFunc(module, func, air, liveness),
^
/home/david/dev/official-zig/src/Module.zig:4341:37: 0x560926f10ff6 in Module.ensureFuncBodyAnalyzed (zig2)
comp.bin_file.updateFunc(mod, func, air, liveness) catch |err| switch (err) {
^
/home/david/dev/official-zig/src/Compilation.zig:3062:42: 0x560926bfd42f in Compilation.processOneJob (zig2)
module.ensureFuncBodyAnalyzed(func) catch |err| switch (err) {
^
/home/david/dev/official-zig/src/Compilation.zig:3000:30: 0x560926beb15f in Compilation.performAllTheWork (zig2)
try processOneJob(comp, work_item);
^
/home/david/dev/official-zig/src/Compilation.zig:2328:31: 0x560926be380d in Compilation.update (zig2)
try comp.performAllTheWork(main_progress_node);
^
/home/david/dev/official-zig/src/main.zig:3323:20: 0x560926b6ed3f in main.updateModule (zig2)
try comp.update();
^
/home/david/dev/official-zig/src/main.zig:3008:17: 0x560926ab8d59 in main.buildOutputType (zig2)
updateModule(gpa, comp, hook) catch |err| switch (err) {
^
/home/david/dev/official-zig/src/main.zig:230:31: 0x560926a5169b in main.mainArgs (zig2)
return buildOutputType(gpa, arena, args, .{ .build = .Exe });
^
/home/david/dev/official-zig/src/stage1.zig:56:24: 0x560926a51055 in main (zig2)
stage2.mainArgs(gpa, arena, args) catch unreachable;
Doing more digging, when I strip the symbols and set build mode to release fast, I get this:
thread 261997 panic: reached unreachable code
/home/david/dev/official-zig/src/type.zig:4216:21: 0x55a5644d6368 in type.Type.elemType2 (zig2)
else => unreachable,
^
/home/david/dev/official-zig/src/Sema.zig:18328:37: 0x55a564792e14 in Sema.zirIntToPtr (zig2)
const elem_ty = ptr_ty.elemType2();
^
/home/david/dev/official-zig/src/Sema.zig:849:66: 0x55a5645a7fb3 in Sema.analyzeBodyInner (zig2)
.int_to_ptr => try sema.zirIntToPtr(block, inst),
^
/home/david/dev/official-zig/src/Sema.zig:629:30: 0x55a5645967ba in Sema.analyzeBody (zig2)
_ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
^
/home/david/dev/official-zig/src/Module.zig:5602:21: 0x55a56439832d in Module.analyzeFnBody (zig2)
sema.analyzeBody(&inner_block, fn_info.body) catch |err| switch (err) {
^
/home/david/dev/official-zig/src/Module.zig:4300:40: 0x55a564378a4a in Module.ensureFuncBodyAnalyzed (zig2)
var air = mod.analyzeFnBody(func, sema_arena) catch |err| switch (err) {
^
/home/david/dev/official-zig/src/Compilation.zig:3062:42: 0x55a56406542f in Compilation.processOneJob (zig2)
module.ensureFuncBodyAnalyzed(func) catch |err| switch (err) {
^
/home/david/dev/official-zig/src/Compilation.zig:3000:30: 0x55a56405315f in Compilation.performAllTheWork (zig2)
try processOneJob(comp, work_item);
^
/home/david/dev/official-zig/src/Compilation.zig:2328:31: 0x55a56404b80d in Compilation.update (zig2)
try comp.performAllTheWork(main_progress_node);
^
/home/david/dev/official-zig/src/main.zig:3323:20: 0x55a563fd6d3f in main.updateModule (zig2)
try comp.update();
^
/home/david/dev/official-zig/src/main.zig:3008:17: 0x55a563f20d59 in main.buildOutputType (zig2)
updateModule(gpa, comp, hook) catch |err| switch (err) {
^
/home/david/dev/official-zig/src/main.zig:230:31: 0x55a563eb969b in main.mainArgs (zig2)
return buildOutputType(gpa, arena, args, .{ .build = .Exe });
^
/home/david/dev/official-zig/src/stage1.zig:56:24: 0x55a563eb9055 in main (zig2)
stage2.mainArgs(gpa, arena, args) catch unreachable;
If I dig more with --debug-compile-errors, I get this:
compile error during Sema: slice of non-array type 'kernel.arch.x86_64.vas.PML4Entry', src: kernel/arch/x86_64/vas.zig:Module.LazySrcLoc{ .node_offset = Module.TracedOffset{ .x = 44, .trace =
} }
thread 262058 panic: unexpected compile error occurred
Analyzing /home/david/dev/RNU/src/kernel/arch/x86_64/vas.zig: kernel/arch/x86_64/vas.zig:init_kernel_bsp
%1391 = dbg_block_begin())
%1392 = dbg_stmt(2, 5)
%1394 = ref(%1388)
%1395 = field_call_bind(%1394, "take_slice")
%1396 = dbg_stmt(2, 62)
%1397 = call(.auto, %1395, [
{
%1398 = decl_val("PML4Table")
%1399 = size_of(%1398)
%1400 = break_inline(%1397, %1399)
},
])
%1424 = ref(%1397)
%1402 = dbg_var_val(%1397, "pml4_physical_region")
%1403 = dbg_stmt(3, 5)
%1405 = ref(%1388)
%1406 = field_call_bind(%1405, "offset")
%1407 = dbg_stmt(3, 57)
%1408 = call(.auto, %1406, [
{
%1409 = decl_val("PML4Table")
%1410 = size_of(%1409)
%1411 = break_inline(%1408, %1410)
},
])
%1528 = ref(%1408)
%1413 = dbg_var_val(%1408, "pdp_physical_region")
%1414 = dbg_stmt(4, 5)
%1416 = decl_val("common")
%1417 = field_val(%1416, "os")
%1418 = switch_cond(%1417)
%1419 = typeof(%1418)
%1421 = enum_literal("freestanding")
%1422 = as_node(%1419, %1421)
%1437 = enum_literal("uefi")
%1438 = as_node(%1419, %1437)
%1420 = switch_block(%1418,
else => {
%1456 = dbg_block_begin())
%1457 = dbg_stmt(7, 17)
%1459 = dbg_block_end())
%1458 = unreachable()
},
%1422 => {
%1423 = dbg_block_begin())
%1425 = field_call_bind(%1424, "to_higher_half_virtual_address")
%1426 = dbg_stmt(5, 77)
%1427 = call(.auto, %1425, [])
%1428 = ref(%1427)
%1429 = field_call_bind(%1428, "access")
%1430 = dbg_stmt(5, 86)
%1431 = call(.auto, %1429, [
{
%1432 = decl_val("PML4Entry")
%1433 = break_inline(%1431, %1432)
},
])
%1435 = dbg_block_end())
%1436 = break(%1420, %1431)
},
%1438 => {
%1439 = dbg_block_begin())
%1440 = decl_ref("VirtualAddress")
%1441 = field_call_bind(%1440, "new")
%1442 = dbg_stmt(6, 36)
%1443 = call(.auto, %1441, [
{
%1444 = field_val(%1397, "address")
%1445 = field_val(%1444, "value")
%1446 = break_inline(%1443, %1445)
},
])
%1447 = ref(%1443)
%1448 = field_call_bind(%1447, "access")
%1449 = dbg_stmt(6, 79)
%1450 = call(.auto, %1448, [
{
%1451 = decl_val("PML4Entry")
%1452 = break_inline(%1450, %1451)
},
])
%1454 = dbg_block_end())
%1455 = break(%1420, %1450)
})
%1463 = ref(%1420)
%1461 = dbg_var_val(%1420, "pml4_entries")
%1462 = dbg_stmt(10, 10)
%1464 = decl_val("half_entry_count")
> %1465 = slice_end(%1463, @Zir.Inst.Ref.zero, %1464)
%1466 = ref(%1465)
%1467 = indexable_ptr_len(%1466)
%1468 = alloc(@Zir.Inst.Ref.usize_type)
%1469 = store(%1468, @Zir.Inst.Ref.zero_usize)
%1470 = loop({
%1474 = block({
%1471 = load(%1468)
%1472 = cmp_lt(%1471, %1467)
%1473 = condbr(%1472, {
%1479 = dbg_block_begin())
%1480 = elem_ptr(%1466, %1471)
%1481 = dbg_var_val(%1480, "entry")
%1482 = dbg_block_begin())
%1483 = dbg_stmt(11, 9)
%1484 = validate_deref(%1480)
%1485 = decl_val("PML4Entry")
%1486 = as_node(@Zir.Inst.Ref.u64_type, @Zir.Inst.Ref.zero)
%1487 = bitcast(%1485, %1486)
%1489 = dbg_block_end())
%1490 = dbg_block_end())
%1488 = store_node(%1480, %1487)
%1491 = break(%1474, @Zir.Inst.Ref.void_value)
}, {
%1492 = break(%1470, @Zir.Inst.Ref.void_value)
})
})
%1475 = load(%1468)
%1476 = add(%1475, @Zir.Inst.Ref.one_usize)
%1477 = store(%1468, %1476)
%1478 = repeat()
})
%1493 = ensure_result_used(%1470)
%1494 = dbg_stmt(14, 10)
%1495 = decl_val("half_entry_count")
%1496 = slice_start(%1463, %1495)
%1497 = ref(%1496)
%1498 = indexable_ptr_len(%1497)
%1499 = alloc(@Zir.Inst.Ref.usize_type)
%1500 = store(%1499, @Zir.Inst.Ref.zero_usize)
%1501 = loop({
%1505 = block({
%1502 = load(%1499)
%1503 = cmp_lt(%1502, %1498)
%1504 = condbr(%1503, {
%1510 = dbg_block_begin())
%1511 = elem_ptr(%1497, %1502)
%1512 = dbg_var_val(%1511, "entry")
%1513 = dbg_var_val(%1499, "i")
%1514 = dbg_block_begin())
%1515 = dbg_stmt(15, 9)
%1516 = validate_deref(%1511)
%1517 = decl_val("PML4Entry")
%1518 = validate_struct_init_ty(%1517)
%1519 = coerce_result_ptr(%1517, %1511)
%1520 = field_ptr_init(%1519, "present")
%1521 = store_node(%1520, @Zir.Inst.Ref.bool_true)
%1522 = field_ptr_init(%1519, "read_write")
%1523 = store_node(%1522, @Zir.Inst.Ref.bool_true)
%1524 = field_ptr_init(%1519, "address")
%1525 = decl_val("pack_address")
%1526 = dbg_stmt(18, 36)
%1527 = call(.auto, %1525, [
{
%1529 = field_call_bind(%1528, "offset")
%1530 = dbg_stmt(18, 63)
%1531 = call(.auto, %1529, [
{
%1532 = load(%1499)
%1533 = decl_val("PDPTable")
%1534 = size_of(%1533)
%1535 = mul(%1532, %1534)
%1536 = break_inline(%1531, %1535)
},
])
%1537 = field_val(%1531, "address")
%1538 = break_inline(%1527, %1537)
},
])
%1539 = store_node(%1524, %1527)
%1541 = dbg_block_end())
%1542 = dbg_block_end())
%1540 = validate_struct_init({
%1520 = field_ptr_init(%1519, "present")
%1522 = field_ptr_init(%1519, "read_write")
%1524 = field_ptr_init(%1519, "address")
})
%1543 = break(%1505, @Zir.Inst.Ref.void_value)
}, {
%1544 = break(%1501, @Zir.Inst.Ref.void_value)
})
})
%1506 = load(%1499)
%1507 = add(%1506, @Zir.Inst.Ref.one_usize)
%1508 = store(%1499, %1507)
%1509 = repeat()
})
%1545 = ensure_result_used(%1501)
%1546 = dbg_stmt(22, 5)
%1547 = ret_ptr()
%1548 = decl_val("VirtualAddressSpace")
%1549 = validate_struct_init_ty(%1548)
%1550 = coerce_result_ptr(%1548, %1547)
%1551 = field_ptr_init(%1550, "id")
%1552 = store_node(%1551, @Zir.Inst.Ref.zero)
%1553 = field_ptr_init(%1550, "arch")
%1554 = field_base_ptr(%1553)
%1555 = field_ptr_init(%1554, "cr3")
%1556 = decl_ref("cr3")
%1557 = field_call_bind(%1556, "from_address")
%1558 = dbg_stmt(25, 36)
%1559 = call(.auto, %1557, [
{
%1560 = field_val(%1397, "address")
%1561 = break_inline(%1559, %1560)
},
])
%1562 = store_node(%1555, %1559)
%1563 = validate_struct_init({
%1555 = field_ptr_init(%1554, "cr3")
})
%1564 = field_ptr_init(%1550, "privilege_level")
%1565 = enum_literal("kernel")
%1566 = store_node(%1564, %1565)
%1567 = field_ptr_init(%1550, "heap")
%1568 = decl_val("Heap")
%1569 = struct_init_empty(%1568)
%1570 = store_node(%1567, %1569)
%1571 = validate_struct_init({
%1551 = field_ptr_init(%1550, "id")
%1553 = field_ptr_init(%1550, "arch")
%1564 = field_ptr_init(%1550, "privilege_level")
%1567 = field_ptr_init(%1550, "heap")
})
%1572 = dbg_stmt(22, 5)
%1574 = dbg_block_end())
%1573 = ret_load(%1547)
For full context, use the command
zig ast-check -t /home/david/dev/RNU/src/kernel/arch/x86_64/vas.zig
/home/david/dev/official-zig/src/Sema.zig:1994:35: 0x561871edfa2e in Sema.failWithOwnedErrorMsg (zig2)
crash_report.compilerPanic("unexpected compile error occurred", null, null);
^
/home/david/dev/official-zig/src/Sema.zig:1982:38: 0x56187253874d in Sema.fail (zig2)
return sema.failWithOwnedErrorMsg(err_msg);
^
/home/david/dev/official-zig/src/Sema.zig:27311:33: 0x56187232f045 in Sema.analyzeSlice (zig2)
else => return sema.fail(block, src, "slice of non-array type '{}'", .{ptr_ptr_child_ty.fmt(mod)}),
^
/home/david/dev/official-zig/src/Sema.zig:9066:29: 0x56187208636b in Sema.zirSliceEnd (zig2)
return sema.analyzeSlice(block, src, array_ptr, start, end, .none, .unneeded);
^
/home/david/dev/official-zig/src/Sema.zig:806:66: 0x561871eccd98 in Sema.analyzeBodyInner (zig2)
.slice_end => try sema.zirSliceEnd(block, inst),
^
/home/david/dev/official-zig/src/Sema.zig:629:30: 0x561871ebd7ba in Sema.analyzeBody (zig2)
_ = sema.analyzeBodyInner(block, body) catch |err| switch (err) {
^
/home/david/dev/official-zig/src/Module.zig:5602:21: 0x561871cbf32d in Module.analyzeFnBody (zig2)
sema.analyzeBody(&inner_block, fn_info.body) catch |err| switch (err) {
^
/home/david/dev/official-zig/src/Module.zig:4300:40: 0x561871c9fa4a in Module.ensureFuncBodyAnalyzed (zig2)
var air = mod.analyzeFnBody(func, sema_arena) catch |err| switch (err) {
^
/home/david/dev/official-zig/src/Compilation.zig:3062:42: 0x56187198c42f in Compilation.processOneJob (zig2)
module.ensureFuncBodyAnalyzed(func) catch |err| switch (err) {
^
/home/david/dev/official-zig/src/Compilation.zig:3000:30: 0x56187197a15f in Compilation.performAllTheWork (zig2)
try processOneJob(comp, work_item);
^
/home/david/dev/official-zig/src/Compilation.zig:2328:31: 0x56187197280d in Compilation.update (zig2)
try comp.performAllTheWork(main_progress_node);
^
/home/david/dev/official-zig/src/main.zig:3323:20: 0x5618718fdd3f in main.updateModule (zig2)
try comp.update();
^
/home/david/dev/official-zig/src/main.zig:3008:17: 0x561871847d59 in main.buildOutputType (zig2)
updateModule(gpa, comp, hook) catch |err| switch (err) {
^
/home/david/dev/official-zig/src/main.zig:230:31: 0x5618717e069b in main.mainArgs (zig2)
return buildOutputType(gpa, arena, args, .{ .build = .Exe });
^
/home/david/dev/official-zig/src/stage1.zig:56:24: 0x5618717e0055 in main (zig2)
stage2.mainArgs(gpa, arena, args) catch unreachable;
^
zsh: IOT instruction (core dumped) /home/david/dev/official-zig/build/zig2 build-exe -fstrip -OReleaseFast
This helped me fix the issue, since the crash was triggered by a compile error. Hopefully this info serves you enough to fix the bug.
Similar crash happening in CI failure for https://github.com/ziglang/zig/pull/13173 https://ci.ziglang.org/ziglang/zig/8602/1/3
Missing compile error and corrupt memory suggests that this might be fixed by #13017
As this seems unrelated with the title, the crash doesn't happen anymore and several bugfixes have been done to address the real issue, I am closing this one.