root/tools/perf/util/dlfilter.h
/* SPDX-License-Identifier: GPL-2.0 */
/*
 * dlfilter.h: Interface to perf script --dlfilter shared object
 * Copyright (c) 2021, Intel Corporation.
 */

#ifndef PERF_UTIL_DLFILTER_H
#define PERF_UTIL_DLFILTER_H

struct perf_session;
union  perf_event;
struct perf_sample;
struct evsel;
struct machine;
struct addr_location;
struct perf_dlfilter_fns;
struct perf_dlfilter_sample;
struct perf_dlfilter_al;

struct dlfilter {
        char                            *file;
        void                            *handle;
        void                            *data;
        struct perf_session             *session;
        bool                            ctx_valid;
        bool                            in_start;
        bool                            in_stop;
        int                             dlargc;
        char                            **dlargv;

        union perf_event                *event;
        struct perf_sample              *sample;
        struct evsel                    *evsel;
        struct machine                  *machine;
        struct addr_location            *al;
        struct addr_location            *addr_al;
        struct perf_dlfilter_sample     *d_sample;
        struct perf_dlfilter_al         *d_ip_al;
        struct perf_dlfilter_al         *d_addr_al;

        int (*start)(void **data, void *ctx);
        int (*stop)(void *data, void *ctx);

        int (*filter_event)(void *data,
                            const struct perf_dlfilter_sample *sample,
                            void *ctx);
        int (*filter_event_early)(void *data,
                                  const struct perf_dlfilter_sample *sample,
                                  void *ctx);

        struct perf_dlfilter_fns *fns;
};

struct dlfilter *dlfilter__new(const char *file, int dlargc, char **dlargv);

int dlfilter__start(struct dlfilter *d, struct perf_session *session);

int dlfilter__do_filter_event(struct dlfilter *d,
                              union perf_event *event,
                              struct perf_sample *sample,
                              struct evsel *evsel,
                              struct machine *machine,
                              struct addr_location *al,
                              struct addr_location *addr_al,
                              bool early);

void dlfilter__cleanup(struct dlfilter *d);

static inline int dlfilter__filter_event(struct dlfilter *d,
                                         union perf_event *event,
                                         struct perf_sample *sample,
                                         struct evsel *evsel,
                                         struct machine *machine,
                                         struct addr_location *al,
                                         struct addr_location *addr_al)
{
        if (!d || !d->filter_event)
                return 0;
        return dlfilter__do_filter_event(d, event, sample, evsel, machine, al, addr_al, false);
}

static inline int dlfilter__filter_event_early(struct dlfilter *d,
                                               union perf_event *event,
                                               struct perf_sample *sample,
                                               struct evsel *evsel,
                                               struct machine *machine,
                                               struct addr_location *al,
                                               struct addr_location *addr_al)
{
        if (!d || !d->filter_event_early)
                return 0;
        return dlfilter__do_filter_event(d, event, sample, evsel, machine, al, addr_al, true);
}

int list_available_dlfilters(const struct option *opt, const char *s, int unset);
bool get_filter_desc(const char *dirname, const char *name, char **desc,
                     char **long_desc);

#endif