All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH dwarves] btf_loader: handle union forward declaration properly
@ 2020-10-09 19:26 Andrii Nakryiko
  2020-10-21 15:35 ` Andrii Nakryiko
  2020-10-21 19:25 ` Arnaldo Carvalho de Melo
  0 siblings, 2 replies; 6+ messages in thread
From: Andrii Nakryiko @ 2020-10-09 19:26 UTC (permalink / raw)
  To: dwarves, acme; +Cc: bpf, kernel-team, ast, Andrii Nakryiko

Differentiate between struct and union forwards. For BTF_KIND_FWD this is
determined by kflag. So teach btf_loader to use that bit to decide whether
forward is for union or struct.

Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
---
N.B. This patch is based on top of tmp.libbtf_encoder branch.

Also seems like non-forward declared union has a slightly different
representation from struct (class). Not sure why it is so, but this change
doesn't seem to break anything.
---

 btf_loader.c | 9 +++++----
 1 file changed, 5 insertions(+), 4 deletions(-)

diff --git a/btf_loader.c b/btf_loader.c
index 9b5da3a4997a..0cb23967fec3 100644
--- a/btf_loader.c
+++ b/btf_loader.c
@@ -134,12 +134,13 @@ static struct type *type__new(uint16_t tag, strings_t name, size_t size)
 	return type;
 }
 
-static struct class *class__new(strings_t name, size_t size)
+static struct class *class__new(strings_t name, size_t size, bool is_union)
 {
 	struct class *class = tag__alloc(sizeof(*class));
+	uint32_t tag = is_union ? DW_TAG_union_type : DW_TAG_structure_type;
 
 	if (class != NULL) {
-		type__init(&class->type, DW_TAG_structure_type, name, size);
+		type__init(&class->type, tag, name, size);
 		INIT_LIST_HEAD(&class->vtable);
 	}
 
@@ -228,7 +229,7 @@ static int create_members(struct btf_elf *btfe, const struct btf_type *tp,
 
 static int create_new_class(struct btf_elf *btfe, const struct btf_type *tp, uint32_t id)
 {
-	struct class *class = class__new(tp->name_off, tp->size);
+	struct class *class = class__new(tp->name_off, tp->size, false);
 	int member_size = create_members(btfe, tp, &class->type);
 
 	if (member_size < 0)
@@ -313,7 +314,7 @@ static int create_new_subroutine_type(struct btf_elf *btfe, const struct btf_typ
 
 static int create_new_forward_decl(struct btf_elf *btfe, const struct btf_type *tp, uint32_t id)
 {
-	struct class *fwd = class__new(tp->name_off, 0);
+	struct class *fwd = class__new(tp->name_off, 0, btf_kind(tp));
 
 	if (fwd == NULL)
 		return -ENOMEM;
-- 
2.24.1


^ permalink raw reply related	[flat|nested] 6+ messages in thread

end of thread, other threads:[~2020-10-21 20:15 UTC | newest]

Thread overview: 6+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2020-10-09 19:26 [PATCH dwarves] btf_loader: handle union forward declaration properly Andrii Nakryiko
2020-10-21 15:35 ` Andrii Nakryiko
2020-10-21 16:38   ` Arnaldo Carvalho de Melo
2020-10-21 19:25 ` Arnaldo Carvalho de Melo
2020-10-21 19:47   ` Andrii Nakryiko
2020-10-21 20:15     ` Arnaldo Carvalho de Melo

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.