[<prev] [next>] [<thread-prev] [thread-next>] [day] [month] [year] [list]
Message-ID: <CAEf4BzbJMtqxkaJNAvv_M1OoxN6TKZgniLbJD1u5nxj1H32wKw@mail.gmail.com>
Date: Wed, 21 Apr 2021 20:59:50 -0700
From: Andrii Nakryiko <andrii.nakryiko@...il.com>
To: Yonghong Song <yhs@...com>
Cc: Andrii Nakryiko <andrii@...nel.org>, bpf <bpf@...r.kernel.org>,
Networking <netdev@...r.kernel.org>,
Alexei Starovoitov <ast@...com>,
Daniel Borkmann <daniel@...earbox.net>,
Kernel Team <kernel-team@...com>
Subject: Re: [PATCH v2 bpf-next 03/17] libbpf: suppress compiler warning when
using SEC() macro with externs
On Wed, Apr 21, 2021 at 8:48 PM Yonghong Song <yhs@...com> wrote:
>
>
>
> On 4/16/21 1:23 PM, Andrii Nakryiko wrote:
> > When used on externs SEC() macro will trigger compilation warning about
> > inapplicable `__attribute__((used))`. That's expected for extern declarations,
> > so suppress it with the corresponding _Pragma.
> >
> > Signed-off-by: Andrii Nakryiko <andrii@...nel.org>
>
> Ack with some comments below.
> Acked-by: Yonghong Song <yhs@...com>
>
> > ---
> > tools/lib/bpf/bpf_helpers.h | 11 +++++++++--
> > 1 file changed, 9 insertions(+), 2 deletions(-)
> >
> > diff --git a/tools/lib/bpf/bpf_helpers.h b/tools/lib/bpf/bpf_helpers.h
> > index b904128626c2..75c7581b304c 100644
> > --- a/tools/lib/bpf/bpf_helpers.h
> > +++ b/tools/lib/bpf/bpf_helpers.h
> > @@ -25,9 +25,16 @@
> > /*
> > * Helper macro to place programs, maps, license in
> > * different sections in elf_bpf file. Section names
> > - * are interpreted by elf_bpf loader
> > + * are interpreted by libbpf depending on the context (BPF programs, BPF maps,
> > + * extern variables, etc).
> > + * To allow use of SEC() with externs (e.g., for extern .maps declarations),
> > + * make sure __attribute__((unused)) doesn't trigger compilation warning.
> > */
> > -#define SEC(NAME) __attribute__((section(NAME), used))
> > +#define SEC(name) \
> > + _Pragma("GCC diagnostic push") \
> > + _Pragma("GCC diagnostic ignored \"-Wignored-attributes\"") \
> > + __attribute__((section(name), used)) \
> > + _Pragma("GCC diagnostic pop") \
>
> The 'used' attribute is mostly useful for static variable/functions
> since otherwise if not really used, the compiler could delete them
> freely. The 'used' attribute does not really have an impact on
> global variables regardless whether they are used or not in a particular
> compilation unit. We could drop 'used' here and selftests should still
> work. The only worry is that if people define something like
> static int _version SEC("version") = 1;
> static char _license[] SEC("license") = "GPL";
> Removing 'used' may cause failure.
>
> Since we don't want to remove 'used', then adding _Pragma to silence
> the warning is a right thing to do here.
Right, SEC() has become a universal macro used for functions,
variables, and externs. I didn't want to introduce multiple variants,
but also we can't break existing use cases. So pragma, luckily,
allowed to support all cases.
>
> >
> > /* Avoid 'linux/stddef.h' definition of '__always_inline'. */
> > #undef __always_inline
> >
Powered by blists - more mailing lists