Commit b03bc685 authored by Andrii Nakryiko's avatar Andrii Nakryiko Committed by Alexei Starovoitov

libbpf: convert libbpf code to use new btf helpers

Simplify code by relying on newly added BTF helper functions.
Signed-off-by: default avatarAndrii Nakryiko <andriin@fb.com>
Signed-off-by: default avatarAlexei Starovoitov <ast@kernel.org>
parent ef20a9b2
This diff is collapsed.
This diff is collapsed.
...@@ -1049,9 +1049,9 @@ static bool get_map_field_int(const char *map_name, const struct btf *btf, ...@@ -1049,9 +1049,9 @@ static bool get_map_field_int(const char *map_name, const struct btf *btf,
const struct btf_array *arr_info; const struct btf_array *arr_info;
const struct btf_type *arr_t; const struct btf_type *arr_t;
if (BTF_INFO_KIND(t->info) != BTF_KIND_PTR) { if (!btf_is_ptr(t)) {
pr_warning("map '%s': attr '%s': expected PTR, got %u.\n", pr_warning("map '%s': attr '%s': expected PTR, got %u.\n",
map_name, name, BTF_INFO_KIND(t->info)); map_name, name, btf_kind(t));
return false; return false;
} }
...@@ -1061,12 +1061,12 @@ static bool get_map_field_int(const char *map_name, const struct btf *btf, ...@@ -1061,12 +1061,12 @@ static bool get_map_field_int(const char *map_name, const struct btf *btf,
map_name, name, t->type); map_name, name, t->type);
return false; return false;
} }
if (BTF_INFO_KIND(arr_t->info) != BTF_KIND_ARRAY) { if (!btf_is_array(arr_t)) {
pr_warning("map '%s': attr '%s': expected ARRAY, got %u.\n", pr_warning("map '%s': attr '%s': expected ARRAY, got %u.\n",
map_name, name, BTF_INFO_KIND(arr_t->info)); map_name, name, btf_kind(arr_t));
return false; return false;
} }
arr_info = (const void *)(arr_t + 1); arr_info = btf_array(arr_t);
*res = arr_info->nelems; *res = arr_info->nelems;
return true; return true;
} }
...@@ -1084,11 +1084,11 @@ static int bpf_object__init_user_btf_map(struct bpf_object *obj, ...@@ -1084,11 +1084,11 @@ static int bpf_object__init_user_btf_map(struct bpf_object *obj,
struct bpf_map *map; struct bpf_map *map;
int vlen, i; int vlen, i;
vi = (const struct btf_var_secinfo *)(const void *)(sec + 1) + var_idx; vi = btf_var_secinfos(sec) + var_idx;
var = btf__type_by_id(obj->btf, vi->type); var = btf__type_by_id(obj->btf, vi->type);
var_extra = (const void *)(var + 1); var_extra = btf_var(var);
map_name = btf__name_by_offset(obj->btf, var->name_off); map_name = btf__name_by_offset(obj->btf, var->name_off);
vlen = BTF_INFO_VLEN(var->info); vlen = btf_vlen(var);
if (map_name == NULL || map_name[0] == '\0') { if (map_name == NULL || map_name[0] == '\0') {
pr_warning("map #%d: empty name.\n", var_idx); pr_warning("map #%d: empty name.\n", var_idx);
...@@ -1098,9 +1098,9 @@ static int bpf_object__init_user_btf_map(struct bpf_object *obj, ...@@ -1098,9 +1098,9 @@ static int bpf_object__init_user_btf_map(struct bpf_object *obj,
pr_warning("map '%s' BTF data is corrupted.\n", map_name); pr_warning("map '%s' BTF data is corrupted.\n", map_name);
return -EINVAL; return -EINVAL;
} }
if (BTF_INFO_KIND(var->info) != BTF_KIND_VAR) { if (!btf_is_var(var)) {
pr_warning("map '%s': unexpected var kind %u.\n", pr_warning("map '%s': unexpected var kind %u.\n",
map_name, BTF_INFO_KIND(var->info)); map_name, btf_kind(var));
return -EINVAL; return -EINVAL;
} }
if (var_extra->linkage != BTF_VAR_GLOBAL_ALLOCATED && if (var_extra->linkage != BTF_VAR_GLOBAL_ALLOCATED &&
...@@ -1111,9 +1111,9 @@ static int bpf_object__init_user_btf_map(struct bpf_object *obj, ...@@ -1111,9 +1111,9 @@ static int bpf_object__init_user_btf_map(struct bpf_object *obj,
} }
def = skip_mods_and_typedefs(obj->btf, var->type); def = skip_mods_and_typedefs(obj->btf, var->type);
if (BTF_INFO_KIND(def->info) != BTF_KIND_STRUCT) { if (!btf_is_struct(def)) {
pr_warning("map '%s': unexpected def kind %u.\n", pr_warning("map '%s': unexpected def kind %u.\n",
map_name, BTF_INFO_KIND(var->info)); map_name, btf_kind(var));
return -EINVAL; return -EINVAL;
} }
if (def->size > vi->size) { if (def->size > vi->size) {
...@@ -1136,8 +1136,8 @@ static int bpf_object__init_user_btf_map(struct bpf_object *obj, ...@@ -1136,8 +1136,8 @@ static int bpf_object__init_user_btf_map(struct bpf_object *obj,
pr_debug("map '%s': at sec_idx %d, offset %zu.\n", pr_debug("map '%s': at sec_idx %d, offset %zu.\n",
map_name, map->sec_idx, map->sec_offset); map_name, map->sec_idx, map->sec_offset);
vlen = BTF_INFO_VLEN(def->info); vlen = btf_vlen(def);
m = (const void *)(def + 1); m = btf_members(def);
for (i = 0; i < vlen; i++, m++) { for (i = 0; i < vlen; i++, m++) {
const char *name = btf__name_by_offset(obj->btf, m->name_off); const char *name = btf__name_by_offset(obj->btf, m->name_off);
...@@ -1187,9 +1187,9 @@ static int bpf_object__init_user_btf_map(struct bpf_object *obj, ...@@ -1187,9 +1187,9 @@ static int bpf_object__init_user_btf_map(struct bpf_object *obj,
map_name, m->type); map_name, m->type);
return -EINVAL; return -EINVAL;
} }
if (BTF_INFO_KIND(t->info) != BTF_KIND_PTR) { if (!btf_is_ptr(t)) {
pr_warning("map '%s': key spec is not PTR: %u.\n", pr_warning("map '%s': key spec is not PTR: %u.\n",
map_name, BTF_INFO_KIND(t->info)); map_name, btf_kind(t));
return -EINVAL; return -EINVAL;
} }
sz = btf__resolve_size(obj->btf, t->type); sz = btf__resolve_size(obj->btf, t->type);
...@@ -1230,9 +1230,9 @@ static int bpf_object__init_user_btf_map(struct bpf_object *obj, ...@@ -1230,9 +1230,9 @@ static int bpf_object__init_user_btf_map(struct bpf_object *obj,
map_name, m->type); map_name, m->type);
return -EINVAL; return -EINVAL;
} }
if (BTF_INFO_KIND(t->info) != BTF_KIND_PTR) { if (!btf_is_ptr(t)) {
pr_warning("map '%s': value spec is not PTR: %u.\n", pr_warning("map '%s': value spec is not PTR: %u.\n",
map_name, BTF_INFO_KIND(t->info)); map_name, btf_kind(t));
return -EINVAL; return -EINVAL;
} }
sz = btf__resolve_size(obj->btf, t->type); sz = btf__resolve_size(obj->btf, t->type);
...@@ -1293,7 +1293,7 @@ static int bpf_object__init_user_btf_maps(struct bpf_object *obj, bool strict) ...@@ -1293,7 +1293,7 @@ static int bpf_object__init_user_btf_maps(struct bpf_object *obj, bool strict)
nr_types = btf__get_nr_types(obj->btf); nr_types = btf__get_nr_types(obj->btf);
for (i = 1; i <= nr_types; i++) { for (i = 1; i <= nr_types; i++) {
t = btf__type_by_id(obj->btf, i); t = btf__type_by_id(obj->btf, i);
if (BTF_INFO_KIND(t->info) != BTF_KIND_DATASEC) if (!btf_is_datasec(t))
continue; continue;
name = btf__name_by_offset(obj->btf, t->name_off); name = btf__name_by_offset(obj->btf, t->name_off);
if (strcmp(name, MAPS_ELF_SEC) == 0) { if (strcmp(name, MAPS_ELF_SEC) == 0) {
...@@ -1307,7 +1307,7 @@ static int bpf_object__init_user_btf_maps(struct bpf_object *obj, bool strict) ...@@ -1307,7 +1307,7 @@ static int bpf_object__init_user_btf_maps(struct bpf_object *obj, bool strict)
return -ENOENT; return -ENOENT;
} }
vlen = BTF_INFO_VLEN(sec->info); vlen = btf_vlen(sec);
for (i = 0; i < vlen; i++) { for (i = 0; i < vlen; i++) {
err = bpf_object__init_user_btf_map(obj, sec, i, err = bpf_object__init_user_btf_map(obj, sec, i,
obj->efile.btf_maps_shndx, obj->efile.btf_maps_shndx,
...@@ -1368,24 +1368,22 @@ static void bpf_object__sanitize_btf(struct bpf_object *obj) ...@@ -1368,24 +1368,22 @@ static void bpf_object__sanitize_btf(struct bpf_object *obj)
struct btf *btf = obj->btf; struct btf *btf = obj->btf;
struct btf_type *t; struct btf_type *t;
int i, j, vlen; int i, j, vlen;
__u16 kind;
if (!obj->btf || (has_func && has_datasec)) if (!obj->btf || (has_func && has_datasec))
return; return;
for (i = 1; i <= btf__get_nr_types(btf); i++) { for (i = 1; i <= btf__get_nr_types(btf); i++) {
t = (struct btf_type *)btf__type_by_id(btf, i); t = (struct btf_type *)btf__type_by_id(btf, i);
kind = BTF_INFO_KIND(t->info);
if (!has_datasec && kind == BTF_KIND_VAR) { if (!has_datasec && btf_is_var(t)) {
/* replace VAR with INT */ /* replace VAR with INT */
t->info = BTF_INFO_ENC(BTF_KIND_INT, 0, 0); t->info = BTF_INFO_ENC(BTF_KIND_INT, 0, 0);
t->size = sizeof(int); t->size = sizeof(int);
*(int *)(t+1) = BTF_INT_ENC(0, 0, 32); *(int *)(t + 1) = BTF_INT_ENC(0, 0, 32);
} else if (!has_datasec && kind == BTF_KIND_DATASEC) { } else if (!has_datasec && btf_is_datasec(t)) {
/* replace DATASEC with STRUCT */ /* replace DATASEC with STRUCT */
struct btf_var_secinfo *v = (void *)(t + 1); const struct btf_var_secinfo *v = btf_var_secinfos(t);
struct btf_member *m = (void *)(t + 1); struct btf_member *m = btf_members(t);
struct btf_type *vt; struct btf_type *vt;
char *name; char *name;
...@@ -1396,7 +1394,7 @@ static void bpf_object__sanitize_btf(struct bpf_object *obj) ...@@ -1396,7 +1394,7 @@ static void bpf_object__sanitize_btf(struct bpf_object *obj)
name++; name++;
} }
vlen = BTF_INFO_VLEN(t->info); vlen = btf_vlen(t);
t->info = BTF_INFO_ENC(BTF_KIND_STRUCT, 0, vlen); t->info = BTF_INFO_ENC(BTF_KIND_STRUCT, 0, vlen);
for (j = 0; j < vlen; j++, v++, m++) { for (j = 0; j < vlen; j++, v++, m++) {
/* order of field assignments is important */ /* order of field assignments is important */
...@@ -1406,12 +1404,12 @@ static void bpf_object__sanitize_btf(struct bpf_object *obj) ...@@ -1406,12 +1404,12 @@ static void bpf_object__sanitize_btf(struct bpf_object *obj)
vt = (void *)btf__type_by_id(btf, v->type); vt = (void *)btf__type_by_id(btf, v->type);
m->name_off = vt->name_off; m->name_off = vt->name_off;
} }
} else if (!has_func && kind == BTF_KIND_FUNC_PROTO) { } else if (!has_func && btf_is_func_proto(t)) {
/* replace FUNC_PROTO with ENUM */ /* replace FUNC_PROTO with ENUM */
vlen = BTF_INFO_VLEN(t->info); vlen = btf_vlen(t);
t->info = BTF_INFO_ENC(BTF_KIND_ENUM, 0, vlen); t->info = BTF_INFO_ENC(BTF_KIND_ENUM, 0, vlen);
t->size = sizeof(__u32); /* kernel enforced */ t->size = sizeof(__u32); /* kernel enforced */
} else if (!has_func && kind == BTF_KIND_FUNC) { } else if (!has_func && btf_is_func(t)) {
/* replace FUNC with TYPEDEF */ /* replace FUNC with TYPEDEF */
t->info = BTF_INFO_ENC(BTF_KIND_TYPEDEF, 0, 0); t->info = BTF_INFO_ENC(BTF_KIND_TYPEDEF, 0, 0);
} }
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment