zig icon indicating copy to clipboard operation
zig copied to clipboard

stage2: compiler crash when emitting debug info for COFF

Open davidgmbb opened this issue 3 years ago • 3 comments

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;

davidgmbb avatar Oct 19 '22 23:10 davidgmbb

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.

davidgmbb avatar Oct 19 '22 23:10 davidgmbb

Similar crash happening in CI failure for https://github.com/ziglang/zig/pull/13173 https://ci.ziglang.org/ziglang/zig/8602/1/3

davidgmbb avatar Oct 19 '22 23:10 davidgmbb

Missing compile error and corrupt memory suggests that this might be fixed by #13017

Vexu avatar Oct 20 '22 07:10 Vexu

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.

davidgmbb avatar Feb 27 '23 20:02 davidgmbb