diff mbox series

[dwarves,03/11] dwarves: expose and maintain active debug info loader operations

Message ID 20200930042742.2525310-4-andriin@fb.com (mailing list archive)
State Not Applicable
Headers show
Series Switch BTF loading and encoding to libbpf APIs | expand

Commit Message

Andrii Nakryiko Sept. 30, 2020, 4:27 a.m. UTC
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@fb.com>
---
 dwarves.c | 8 ++++++++
 1 file changed, 8 insertions(+)
diff mbox series

Patch

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);