Skip to content
DwarfLinesDeinit

DwarfLinesDeinit

Description

Release storage owned by a DwarfLines. Safe on a zeroed struct.

Success

Returns to the caller. *self is zeroed.

Failure

Function cannot fail. NULL self is a no-op.

Usage example (Cross-references)

Usage examples (Cross-references)
    #if FEATURE_PARSER_DWARF
            if (e->dwarf_built && e->dwarf_ok) {
                DwarfLinesDeinit(&e->dwarf);
            }
            if (e->sidecar_dwarf_built && e->sidecar_dwarf_ok) {
            }
            if (e->sidecar_dwarf_built && e->sidecar_dwarf_ok) {
                DwarfLinesDeinit(&e->sidecar_dwarf);
            }
            if (e->cfi_built && e->cfi_ok) {
    
        if (!ok) {
            DwarfLinesDeinit(out);
            return false;
        }
    }
    
    void DwarfLinesDeinit(DwarfLines *self) {
        if (!self)
            return;
            // Out-of-range file -> no file string (NULL), not a bogus pointer.
            ok = ok && e && e->file == NULL;
            DwarfLinesDeinit(&lines);
            ElfDeinit(&elf);
        }
            ok = ok && e && e->file && ZstrFindSubstring(e->file, "only.c") != NULL;
            ok = ok && e && e->dir == NULL;
            DwarfLinesDeinit(&lines);
            ElfDeinit(&elf);
        }
            u64 addr = 0;
            ok       = ok && first_real_row_address(&lines, &addr) && addr == (u64)-1;
            DwarfLinesDeinit(&lines);
            ElfDeinit(&elf);
        }
            u64 addr = 0;
            ok       = ok && first_real_row_address(&lines, &addr) && addr == (u64)-1;
            DwarfLinesDeinit(&lines);
            ElfDeinit(&elf);
        }
            u64 addr = 0;
            ok       = ok && first_real_row_address(&lines, &addr) && addr == (u64)-1;
            DwarfLinesDeinit(&lines);
            ElfDeinit(&elf);
        }
            u64 addr = 0;
            ok       = ok && first_real_row_address(&lines, &addr) && addr == (u64)-1;
            DwarfLinesDeinit(&lines);
            ElfDeinit(&elf);
        }
        bool ok = !built;
        if (built) {
            DwarfLinesDeinit(&lines);
            ElfDeinit(&elf);
        } else {
        bool       built = build_from_dl(&lines, &elf, base, dl, dl_len);
        if (built)
            DwarfLinesDeinit(&lines);
        ElfDeinit(&elf);
        bool       built = build_from_dl(&lines, &elf, base, dl, dl_len);
        if (built)
            DwarfLinesDeinit(&lines);
        ElfDeinit(&elf);
    
        if (built)
            DwarfLinesDeinit(&lines);
        ElfDeinit(&elf);
        DefaultAllocatorDeinit(&alloc);
                ok = true;
            }
            DwarfLinesDeinit(&lines);
        }
            ok = ok && DwarfLinesResolve(&lines, 0x2010) == NULL;
    
            DwarfLinesDeinit(&lines);
        }
    
        if (built)
            DwarfLinesDeinit(&lines);
        ElfDeinit(&elf);
        DefaultAllocatorDeinit(&alloc);
    
    static void lines_fixture_close(LinesFixture *fx) {
        DwarfLinesDeinit(&fx->lines);
        ElfDeinit(&fx->elf);
        DefaultAllocatorDeinit(&fx->alloc);
            // row, with end correctly bounded.
            ok = (e == NULL) || (e->address == 0x17000);
            DwarfLinesDeinit(&lines);
        }
            e  = DwarfLinesResolve(&lines, 0x5123);
            ok = ok && e && e->address == 0x5123 && e->line == 42;
            DwarfLinesDeinit(&lines);
        }
        DefaultAllocatorDeinit(&alloc);
            e  = DwarfLinesResolve(&lines, 0x8000 + 0x7abc - 1);
            ok = ok && e && e->address == 0x8000;
            DwarfLinesDeinit(&lines);
        }
        DefaultAllocatorDeinit(&alloc);
            // The file string came through.
            ok = ok && e->file && ZstrFindSubstring(e->file, "source.c") != NULL;
            DwarfLinesDeinit(&lines);
        }
        DefaultAllocatorDeinit(&alloc);
            e  = DwarfLinesResolve(&lines, 0x7003);
            ok = ok && e && e->address == 0x7003 && e->line == 48;
            DwarfLinesDeinit(&lines);
        }
        DefaultAllocatorDeinit(&alloc);
            const DwarfLineEntry *e = DwarfLinesResolve(&lines, 0x9002);
            ok                      = ok && e && e->address == 0x9002;
            DwarfLinesDeinit(&lines);
        }
        DefaultAllocatorDeinit(&alloc);
            const DwarfLineEntry *e = DwarfLinesResolve(&lines, 0xA000);
            ok                      = ok && e && e->address == 0xA000 && e->line == 7;
            DwarfLinesDeinit(&lines);
        }
        DefaultAllocatorDeinit(&alloc);
            const DwarfLineEntry *e = DwarfLinesResolve(&lines, 0xB000);
            ok                      = ok && e && e->address == 0xB000 && e->line == 5;
            DwarfLinesDeinit(&lines);
        }
        DefaultAllocatorDeinit(&alloc);
            const DwarfLineEntry *e = DwarfLinesResolve(&lines, 0xC000);
            ok                      = ok && e && e->address == 0xC000 && e->line == 3;
            DwarfLinesDeinit(&lines);
        }
        DefaultAllocatorDeinit(&alloc);
            // before seq 2) does not resolve to seq 1.
            ok = ok && DwarfLinesResolve(&lines, 0xCFFF) == NULL;
            DwarfLinesDeinit(&lines);
        }
        DefaultAllocatorDeinit(&alloc);
        ok = ok && DwarfLinesResolve(&lines, 0x2010) == NULL;
    
        DwarfLinesDeinit(&lines);
        ElfDeinit(&elf);
        DefaultAllocatorDeinit(&alloc);
        ok                       = ok && e && e->dir == NULL;
    
        DwarfLinesDeinit(&lines);
        ElfDeinit(&elf);
        DefaultAllocatorDeinit(&alloc);
        ok = ok && DwarfLinesResolve(&lines, 0x5000) == NULL;
    
        DwarfLinesDeinit(&lines);
        ElfDeinit(&elf);
        DefaultAllocatorDeinit(&alloc);
        ok = ok && DwarfLinesResolve(&lines, 0x6800) == NULL;
    
        DwarfLinesDeinit(&lines);
        ElfDeinit(&elf);
        DefaultAllocatorDeinit(&alloc);
    
        if (built)
            DwarfLinesDeinit(&lines);
        // ElfOpenFromMemoryCopy may have succeeded even if the DWARF build did
        // not; close the ELF either way (lines_from_debug_line opens it before
        ok                       = ok && e && e->is_stmt == false;
    
        DwarfLinesDeinit(&lines);
        ElfDeinit(&elf);
        DefaultAllocatorDeinit(&alloc);
            ok = ok && e && e->file && ZstrCompare(e->file, "source.c") == 0 && e->line == 20;
    
            DwarfLinesDeinit(&lines);
        }
    
        if (built)
            DwarfLinesDeinit(&lines);
        ElfDeinit(&elf);
        DefaultAllocatorDeinit(&alloc);
    
        if (built)
            DwarfLinesDeinit(&lines);
        ElfDeinit(&elf);
        DefaultAllocatorDeinit(&alloc);
            ok = ok && DwarfLinesResolve(&lines, 0x3000) == NULL;
    
            DwarfLinesDeinit(&lines);
        }
            const DwarfLineEntry *e = DwarfLinesResolve(&lines, 0x2000);
            ok                      = ok && e && e->file && ZstrCompare(e->file, "source.c") == 0;
            DwarfLinesDeinit(&lines);
        }
            // After the build there must be live allocations to release.
            ok = ok && (DebugAllocatorLiveCount(&dbg) > before);
            DwarfLinesDeinit(&lines);
        }
        ok                       = ok && e && e->dir && ZstrFindSubstring(e->dir, "real_dir") != NULL;
    
        DwarfLinesDeinit(&lines);
        ElfDeinit(&elf);
        DefaultAllocatorDeinit(&alloc);
        ok = ok && e && e->file && ZstrFindSubstring(e->file, "first.c") != NULL;
    
        DwarfLinesDeinit(&lines);
        ElfDeinit(&elf);
        DefaultAllocatorDeinit(&alloc);
        ok                       = ok && e && e->file && ZstrFindSubstring(e->file, "second.c") != NULL;
    
        DwarfLinesDeinit(&lines);
        ElfDeinit(&elf);
        DefaultAllocatorDeinit(&alloc);
            // the kill condition for this test.
            ok = false;
            DwarfLinesDeinit(&lines);
            ElfDeinit(&elf);
        } else {
        ok                       = ok && e && e->address == 0x6000 && e->line == 10;
    
        DwarfLinesDeinit(&lines);
        ElfDeinit(&elf);
        DefaultAllocatorDeinit(&alloc);
Last updated on