Skip to content
DwarfLineEntry

DwarfLineEntry

Description

One row of the line-number matrix. address is the file-relative virtual address (the same address-space as ElfSymbol.value), so a caller who already did runtime_addr - module_base (e.g. via SymbolResolver) can feed the result directly to DwarfLinesResolve.

Fields

Name Description
address Code address this row applies to.
file Source filename (borrowed from internal string pool).
dir Compilation directory hint, may be NULL.
line Source line number (1-based, 0 means “no line”).
column Source column (1-based, 0 means “no column”).
is_stmt True at statement boundaries — preferred breakpoints.
end_sequence True for the synthetic row that closes a contiguous range. Lookups never return such a row.

Usage example (Cross-references)

Usage examples (Cross-references)
        bool       ok    = false;
        if (built) {
            const DwarfLineEntry *e = DwarfLinesResolve(&lines, file_relative);
            if (e && e->file && ZstrFindSubstring(e->file, "Dwarf.c") != NULL && e->line > 0) {
                ok = true;
        }
        if (cache_entry->dwarf_ok) {
            const DwarfLineEntry *de = DwarfLinesResolve(&cache_entry->dwarf, file_relative);
            if (de) {
                out->source_file   = de->file;
        U64Vec          *pending_dir_offsets
    ) {
        DwarfLineEntry e;
        MemSet(&e, 0, sizeof(e));
        e.address      = st->address;
    // ---------------------------------------------------------------------------
    
    const DwarfLineEntry *DwarfLinesResolve(const DwarfLines *self, u64 vaddr) {
        if (!self || self->entries.length == 0)
            return NULL;
        // by end_sequence rows; vaddr must not exceed the sequence's
        // closing row.
        const DwarfLineEntry *best     = NULL;
        const DwarfLineEntry *seq_open = NULL;
        for (u64 i = 0; i < self->entries.length; ++i) {
        // closing row.
        const DwarfLineEntry *best     = NULL;
        const DwarfLineEntry *seq_open = NULL;
        for (u64 i = 0; i < self->entries.length; ++i) {
            const DwarfLineEntry *e = &self->entries.data[i];
        const DwarfLineEntry *seq_open = NULL;
        for (u64 i = 0; i < self->entries.length; ++i) {
            const DwarfLineEntry *e = &self->entries.data[i];
            if (e->end_sequence) {
                // Sequence ends at this row's address (exclusive upper).
        bool        is_stmt;
        bool        end_sequence;
    } DwarfLineEntry;
    
    typedef Vec(DwarfLineEntry) DwarfLineEntries;
    } DwarfLineEntry;
    
    typedef Vec(DwarfLineEntry) DwarfLineEntries;
    
    ///
    /// TAGS: Parser, DWARF, Lookup
    ///
    const DwarfLineEntry *DwarfLinesResolve(const DwarfLines *self, u64 vaddr);
    
    ///
Last updated on