From 495c70ae144691d419b354efca1bf975df6be20e Mon Sep 17 00:00:00 2001 From: Arnaldo Carvalho de Melo Date: Thu, 2 Apr 2009 12:41:01 -0300 Subject: [PATCH] ctf_encoder: Add void entries for variables not found on DWARF Temporary hack till I figure out how to do more filtering on the variables on the symtab that aren't in the DWARF info. Problem is that if we don't put something on the table at encode time, we won't find it at decode time, when we don't have DWARF to notice that its not there because its not in DWARF. We then discard it at load time, as "void foo;" doesn't make sense. Signed-off-by: Arnaldo Carvalho de Melo --- ctf_encoder.c | 38 ++++++++++++++++++++------------------ ctf_loader.c | 7 ++++++- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/ctf_encoder.c b/ctf_encoder.c index ac9a0c3..c02701f 100644 --- a/ctf_encoder.c +++ b/ctf_encoder.c @@ -270,17 +270,19 @@ int cu__encode_ctf(struct cu *self) cu__cache_symtab(self); + uint64_t addr; GElf_Sym sym; const char *sym_name; cu__for_each_cached_symtab_entry(self, id, sym, sym_name) { if (ctf__ignore_symtab_function(&sym, sym_name)) continue; - uint64_t addr = elf_sym__value(&sym); + addr = elf_sym__value(&sym); int64_t position; function = hashaddr__find_function(hash_addr, addr); if (function == NULL) { - fprintf(stderr, "%4d: %-20s %#llx %5u NOT FOUND!\n", + fprintf(stderr, + "function %4d: %-20s %#llx %5u NOT FOUND!\n", id, sym_name, (unsigned long long)addr, elf_sym__size(&sym)); err = ctf__add_function(ctf, 0, 0, 0, &position); @@ -294,14 +296,8 @@ int cu__encode_ctf(struct cu *self) ftype->nr_parms, ftype->unspec_parms, &position); - if (err != 0) { -out_err_ctf: - fprintf(stderr, - "%4d: %-20s %#llx %5u failed encoding, " - "ABORTING!\n", id, sym_name, - (unsigned long long)addr, elf_sym__size(&sym)); - goto out_delete; - } + if (err != 0) + goto out_err_ctf; struct parameter *pos; ftype__for_each_parameter(ftype, pos) @@ -323,23 +319,23 @@ out_err_ctf: cu__for_each_cached_symtab_entry(self, id, sym, sym_name) { if (ctf__ignore_symtab_object(&sym, sym_name)) continue; - uint64_t addr = elf_sym__value(&sym); + addr = elf_sym__value(&sym); var = hashaddr__find_variable(hash_addr, addr); if (var == NULL) { - fprintf(stderr, "%4d: %-20s %#llx %5u NOT FOUND!\n", + fprintf(stderr, + "variable %4d: %-20s %#llx %5u NOT FOUND!\n", id, sym_name, (unsigned long long)addr, elf_sym__size(&sym)); + err = ctf__add_object(ctf, 0); + if (err != 0) + goto out_err_ctf; continue; } err = ctf__add_object(ctf, var->tag.type); - if (err != 0) { - fprintf(stderr, "%4d: %-20s %#llx %5u failed encoding, " - "aborting!\n", id, sym_name, - (unsigned long long)addr, elf_sym__size(&sym)); - goto out_delete; - } + if (err != 0) + goto out_err_ctf; } ctf__encode(ctf, CTF_FLAGS_COMPR); @@ -349,4 +345,10 @@ out_delete: ctf__delete(ctf); out: return err; +out_err_ctf: + fprintf(stderr, + "%4d: %-20s %#llx %5u failed encoding, " + "ABORTING!\n", id, sym_name, + (unsigned long long)addr, elf_sym__size(&sym)); + goto out_delete; } diff --git a/ctf_loader.c b/ctf_loader.c index 6a754ed..d094645 100644 --- a/ctf_loader.c +++ b/ctf_loader.c @@ -589,7 +589,12 @@ static int ctf__load_objects(struct ctf *self) GElf_Sym sym; uint32_t idx; ctf__for_each_symtab_object(self, idx, sym) { - if (variable__new(*objp, &sym, self) == NULL) + const uint16_t type = *objp; + /* + * Discard void objects, probably was an object + * we didn't found DWARF info for when encoding. + */ + if (type && variable__new(type, &sym, self) == NULL) return -ENOMEM; ++objp; }