Maintain a pointer to debug_fmt_ops corresponding to currently used debug info format loader (DWARF, BTF, or CTF), to allow various parts of libdwarves to do things like resolve string offset to actual string pointer in a format-agnostic format. This allows to, say, load DWARF debug info, and use it for BTF generation, without either of them making assumptions about how strings are actually stored internally. This is going to be used in the next patch to allow BTF loader and encoder to use a very different way of storing strings (not a global shared gobuffer). Signed-off-by: Andrii Nakryiko <andriin@xxxxxx> --- dwarves.c | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/dwarves.c b/dwarves.c index 8cb359fd1586..528caf23e76d 100644 --- a/dwarves.c +++ b/dwarves.c @@ -1901,6 +1901,8 @@ static struct debug_fmt_ops *debug_fmt_table[] = { NULL, }; +struct debug_fmt_ops *active_loader; + static int debugging_formats__loader(const char *name) { int i = 0; @@ -1938,6 +1940,7 @@ int cus__load_file(struct cus *cus, struct conf_load *conf, conf->conf_fprintf->has_alignment_info = debug_fmt_table[loader]->has_alignment_info; err = 0; + active_loader = debug_fmt_table[loader]; if (debug_fmt_table[loader]->load_file(cus, conf, filename) == 0) break; @@ -1949,17 +1952,20 @@ int cus__load_file(struct cus *cus, struct conf_load *conf, fp = sep + 1; } free(fpath); + active_loader = NULL; return err; } while (debug_fmt_table[i] != NULL) { if (conf && conf->conf_fprintf) conf->conf_fprintf->has_alignment_info = debug_fmt_table[i]->has_alignment_info; + active_loader = debug_fmt_table[i]; if (debug_fmt_table[i]->load_file(cus, conf, filename) == 0) return 0; ++i; } + active_loader = NULL; return -EINVAL; } @@ -2283,8 +2289,10 @@ static int cus__load_running_kernel(struct cus *cus, struct conf_load *conf) if (conf && conf->conf_fprintf) conf->conf_fprintf->has_alignment_info = debug_fmt_table[loader]->has_alignment_info; + active_loader = debug_fmt_table[loader]; if (debug_fmt_table[loader]->load_file(cus, conf, "/sys/kernel/btf/vmlinux") == 0) return 0; + active_loader = NULL; } try_elf: elf_version(EV_CURRENT); -- 2.24.1