From 0a9b89910e711951d37a8691053e2a72272fc862 Mon Sep 17 00:00:00 2001 From: Andrii Nakryiko Date: Tue, 29 Sep 2020 21:27:34 -0700 Subject: [PATCH] dwarves: Expose and maintain active debug info loader operations 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). Committer notes: Since it is available in multiple object files, add a dwarves__ prefix namespace and add an extern for it in dwarves.h. Signed-off-by: Andrii Nakryiko Cc: bpf@vger.kernel.org Cc: dwarves@vger.kernel.org Signed-off-by: Arnaldo Carvalho de Melo --- dwarves.c | 8 ++++++++ dwarves.h | 2 ++ 2 files changed, 10 insertions(+) diff --git a/dwarves.c b/dwarves.c index 8cb359f..e8fbedc 100644 --- a/dwarves.c +++ b/dwarves.c @@ -1901,6 +1901,8 @@ static struct debug_fmt_ops *debug_fmt_table[] = { NULL, }; +struct debug_fmt_ops *dwarves__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; + dwarves__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); + dwarves__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; + dwarves__active_loader = debug_fmt_table[i]; if (debug_fmt_table[i]->load_file(cus, conf, filename) == 0) return 0; ++i; } + dwarves__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; + dwarves__active_loader = debug_fmt_table[loader]; if (debug_fmt_table[loader]->load_file(cus, conf, "/sys/kernel/btf/vmlinux") == 0) return 0; + dwarves__active_loader = NULL; } try_elf: elf_version(EV_CURRENT); diff --git a/dwarves.h b/dwarves.h index 2a77a6d..7c4254e 100644 --- a/dwarves.h +++ b/dwarves.h @@ -212,6 +212,8 @@ struct debug_fmt_ops { bool has_alignment_info; }; +extern struct debug_fmt_ops *dwarves__active_loader; + struct cu { struct list_head node; struct list_head tags;