/* SPDX-License-Identifier: GPL-2.0-only Copyright (C) 2008 Arnaldo Carvalho de Melo */ #include "pahole_strings.h" #include "gobuffer.h" #include #include #include #include #include #include #include "dutil.h" #include "lib/bpf/src/libbpf.h" struct strings *strings__new(void) { struct strings *strs = malloc(sizeof(*strs)); if (!strs) return NULL; strs->btf = btf__new_empty(); if (libbpf_get_error(strs->btf)) { free(strs); return NULL; } return strs; } void strings__delete(struct strings *strs) { if (strs == NULL) return; btf__free(strs->btf); free(strs); } strings_t strings__add(struct strings *strs, const char *str) { strings_t index; if (str == NULL) return 0; index = btf__add_str(strs->btf, str); if (index < 0) return 0; return index; } strings_t strings__find(struct strings *strs, const char *str) { return btf__find_str(strs->btf, str); } /* a horrible and inefficient hack to get string section size out of BTF */ strings_t strings__size(const struct strings *strs) { const struct btf_header *p; uint32_t sz; p = btf__get_raw_data(strs->btf, &sz); if (!p) return -1; return p->str_len; } /* similarly horrible hack to copy out string section out of BTF */ int strings__copy(const struct strings *strs, void *dst) { const struct btf_header *p; uint32_t sz; p = btf__get_raw_data(strs->btf, &sz); if (!p) return -1; memcpy(dst, (void *)p + p->str_off, p->str_len); return 0; }