rizin/librz/include/rz_bin_source_line.h
pelijah f2d8e0db3d
Add HtSP, HtSS, HtSU, SetS (#4415)
- All `ht_*_new0()` are removed
- `freefn` field of HT options was renamed to `finiKV`
- `finiKV_user` fields was added to HT options
- Added `ht_*_new_opt_size` API
- `HtSP` and `HtUP` are created with `ValueFree` callback  that allows to reduce extra LOC and prevent bugs
- `SetP` replaced with `SetS` (based on `HtSP`)
- `rz_th_ht_*_new0()` and `rz_th_ht_*_new_opt()` are replaced with `rz_th_ht_*_new(HtXX *)`
2024-04-16 20:27:48 +08:00

128 lines
4.6 KiB
C

// SPDX-FileCopyrightText: 2009-2020 nibble <nibble.ds@gmail.com>
// SPDX-FileCopyrightText: 2009-2020 pancake <pancake@nopcode.org>
// SPDX-FileCopyrightText: 2021 thestr4ng3r <info@florianmaerkl.de>
// SPDX-FileCopyrightText: 2024 billow <billow.fun@gmail.com>
// SPDX-License-Identifier: LGPL-3.0-only
#ifndef RIZIN_RZ_BIN_SOURCE_LINE_H
#define RIZIN_RZ_BIN_SOURCE_LINE_H
#include <rz_vector.h>
#include <rz_util.h>
typedef struct rz_bin_source_line_info_t RzBinSourceLineInfo;
#ifdef __cplusplus
extern "C" {
#endif
/**
* \brief A single sample of source line info for a specific address
*
* If at least one of the line, column and file members is not 0/NULL, such a sample specifies the line info
* for all addresses greater or equal to address until the next address that has another sample.
*
* If all the members line, column and file are 0/NULL, then this is a closing sample, indicating that the
* previous entry stops here. The address is the first address **not contained** by the previous record.
* Such a case corresponds for example to what DW_LNE_end_sequence emits in Dwarf.
* Use rz_bin_source_line_sample_is_closing() for checking if a sample is closing.
*/
typedef struct rz_bin_source_line_sample_t {
/**
* The first address that is covered by the given line and column,
* or, if all other members are 0/NULL, this is the first.
*/
ut64 address;
/**
* If > 0, then indicates the line for the given address and the following.
* If == 0, then indicates that no line information is known.
*
* 32bit for this value is an intentional decision to lower memory consumption.
*/
ut32 line;
/**
* If > 0, then indicates the column.
* If == 0, then no column information is known.
*
* 32bit for this value is an intentional decision to lower memory consumption.
*/
ut32 column;
/**
* Filename, which must come out of the const pool of the owning
* RzBinSourceLineInfo or RzBinSourceLineInfoBuilder.
*/
const char *file;
} RzBinSourceLineSample;
/*
* see documentation of RzBinSourceLineSample about what closing exactly means.
*/
static inline bool rz_bin_source_line_sample_is_closing(const RzBinSourceLineSample *s) {
return !s->line && !s->column && !s->file;
}
struct rz_bin_source_line_info_t {
/**
* \brief All source line references for given adresses
*
* These elements must be sorted by address and addresses must be unique, so binary search can be applied.
* Source file information is not contained within this array because source file changes
* are generally much sparser than line changes.
*/
RzBinSourceLineSample *samples;
size_t samples_count;
RzStrConstPool filename_pool;
}; // RzBinSourceLineInfo
/**
* Temporary data structure for building an RzBinSourceLineInfo.
*/
typedef struct rz_bin_source_line_info_builder_t {
RzVector /*<RzBinSourceLineSample>*/ samples; //< may be unsorted and will be sorted in the finalization step
RzStrConstPool filename_pool;
} RzBinSourceLineInfoBuilder;
typedef struct {
char *file_content;
ut64 file_size;
RzPVector /*<const char *>*/ *line_by_ln;
} RzBinSourceLineCacheItem;
typedef struct {
HtSP /*<const char*, RzBinSourceLineCacheItem *>*/ *items;
} RzBinSourceLineCache;
typedef struct {
RzBinSourceLineCache cache;
bool enable : 1;
bool file : 1;
bool abspath : 1;
bool lines : 1;
} RzDebugInfoOption;
RZ_API void rz_bin_source_line_info_builder_init(RzBinSourceLineInfoBuilder *builder);
RZ_API void rz_bin_source_line_info_builder_fini(RzBinSourceLineInfoBuilder *builder);
RZ_API void rz_bin_source_line_info_builder_push_sample(RzBinSourceLineInfoBuilder *builder, ut64 address, ut32 line, ut32 column, const char *file);
RZ_API RzBinSourceLineInfo *rz_bin_source_line_info_builder_build_and_fini(RzBinSourceLineInfoBuilder *builder);
RZ_API bool rz_bin_source_line_info_merge(RZ_BORROW RZ_NONNULL RzBinSourceLineInfo *dst, RZ_BORROW RZ_NONNULL RzBinSourceLineInfo *src);
RZ_API void rz_bin_source_line_info_free(RzBinSourceLineInfo *sli);
RZ_API const RzBinSourceLineSample *rz_bin_source_line_info_get_first_at(const RzBinSourceLineInfo *sli, ut64 addr);
RZ_API const RzBinSourceLineSample *rz_bin_source_line_info_get_next(const RzBinSourceLineInfo *sli, RZ_NONNULL const RzBinSourceLineSample *cur);
RZ_API bool rz_bin_source_line_addr2line(
RZ_BORROW RZ_IN RZ_NONNULL const RzBinSourceLineInfo *sl,
ut64 addr,
RZ_BORROW RZ_OUT RZ_NULLABLE char *file,
int len,
RZ_BORROW RZ_OUT RZ_NULLABLE int *line);
RZ_API RZ_OWN char *rz_bin_source_line_addr2text(
RZ_BORROW RZ_IN RZ_NONNULL const RzBinSourceLineInfo *sl, ut64 addr, RzDebugInfoOption opt);
#ifdef __cplusplus
}
#endif
#endif // RIZIN_RZ_BIN_SOURCE_LINE_H