Re: [PATCH 1/1] pfunct: Print DW_AT_external=1 functions once

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Arnaldo,

On Mon, Aug 26, 2024 at 4:31 PM <arnaldo.melo@xxxxxxxxx> wrote:
>
> Namhyung mentioned that 'set_task_cpu' wasn't being printed with pfunct,
> that was because those functions (with DW_AT_external=1) were not being
> printed at all, out of some wrong expectations, this was added to avoid
> printing it multiple times to allow for things like --compile to work,
> but that was too much of a big hammer.
>
> So add fn_stats->printed and use it to determine if functions were
> already printed.
>
> Also don't print definitions for functions marked as declarations, as it
> clashes with the ones in system headers, like __builtin_memcpy, etc.
>
> This all needs a more thorough love and care, but at least for now
> --compile works with 'fullcircle tcp.o' (generating the functions and
> the types it uses and then compiling it to get the original types and
> functions and prints the external functions:
>
>   $ pfunct -F dwarf -f set_task_cpu vmlinux
>   void set_task_cpu(struct task_struct * p, unsigned int new_cpu);
>   $ pfunct -F btf -f set_task_cpu vmlinux
>   void set_task_cpu(struct task_struct * p, unsigned int new_cpu);
>   $
>
> Reported-by: Namhyung Kim <namhyung@xxxxxxxxxx>
> Cc: Alan Maguire <alan.maguire@xxxxxxxxxx>
> Cc: Jiri Olsa <jolsa@xxxxxxxxxx>
> Signed-off-by: Arnaldo Carvalho de Melo <acme@xxxxxxxxxx>

Tested-by: Namhyung Kim <namhyung@xxxxxxxxxx>

Thanks,
Namhyung

> ---
>  pfunct.c | 17 +++++++++++++++--
>  1 file changed, 15 insertions(+), 2 deletions(-)
>
> diff --git a/pfunct.c b/pfunct.c
> index 938dd724e44a9416..bc3026b384284cb4 100644
> --- a/pfunct.c
> +++ b/pfunct.c
> @@ -49,6 +49,7 @@ struct fn_stats {
>         uint32_t         nr_expansions;
>         uint32_t         size_expansions;
>         uint32_t         nr_files;
> +       bool             printed;
>  };
>
>  static struct fn_stats *fn_stats__new(struct tag *tag, const struct cu *cu)
> @@ -95,11 +96,13 @@ static void fn_stats__delete_list(void)
>         }
>  }
>
> -static void fn_stats__add(struct tag *tag, const struct cu *cu)
> +static struct fn_stats *fn_stats__add(struct tag *tag, const struct cu *cu)
>  {
>         struct fn_stats *fns = fn_stats__new(tag, cu);
>         if (fns != NULL)
>                 list_add(&fns->node, &fn_stats__list);
> +
> +       return fns;
>  }
>
>  static void fn_stats_inline_exps_fmtr(const struct fn_stats *stats)
> @@ -366,7 +369,12 @@ static void function__show(struct function *func, struct cu *cu)
>  {
>         struct tag *tag = function__tag(func);
>
> -       if (func->abstract_origin || func->external)
> +       if (func->abstract_origin || func->declaration)
> +               return;
> +
> +       struct fn_stats *fstats = fn_stats__find(func->name);
> +
> +       if (fstats && fstats->printed)
>                 return;
>
>         if (expand_types)
> @@ -393,6 +401,11 @@ static void function__show(struct function *func, struct cu *cu)
>         putchar('\n');
>         if (show_variables || show_inline_expansions)
>                 function__fprintf_stats(tag, cu, &conf, stdout);
> +
> +       if (!fstats)
> +               fstats = fn_stats__add(tag, cu);
> +       if (fstats)
> +               fstats->printed = true;
>  }
>
>  static int cu_function_iterator(struct cu *cu, void *cookie)
> --
> 2.46.0
>





[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux