[asterisk-dev] elimination of -fnested-functions on gcc + -fblocks on clang

Jaco Kroon jaco at uls.co.za
Mon Jan 11 05:04:19 CST 2021


Hi All,

Long story short:  I'd like to potentially eliminate the use of those
options.  They're used for RAII_VAR (and only RAII_VAR assuming I'm not
missing something obvious).

Long story:

They're use is in conjuction with __attribute__((cleanup(...))) (which
is supported by both gcc and clang, and probably other compilers).

The use for -fnested-functions and -cblocks is to get a clean prototype
for the destructor functions, assuming type T:

void destructor(T v);

Compared to that which __attribute__((cleanup(...))) expects:

void destructor(T* v);

The issue came up when trying to enable use of clang as compiler for
asterisk on Gentoo Linux.  https://bugs.gentoo.org/731280 contains the
details.

There are 125 such destructor functions, and ~2250 uses of them, from
what I counted with grep and sed.

If there is appetite for this, I would like to propose that they be
updated to have the trampoline declared as static inline along with the
destructor (for above example), eg:

static inline void dtor_tramp_destructor(T* v) { destructor(*v); }

instead of as nested functions or using fblocks.

This can be done with simple(ish) RAII_DESTRUCTOR(descructor, T) macro:

#define RAII_DESTRUCTOR(n, t, vn) static inline void dtor_tramp_ ## n
(t* v) { n(*v); } void n(t vn)

To be used either as a prototype or definition (Lack of ; at end of macro):

RAII_DESTRUCTOR(T, destructor, arg);

and then later just implement void destructor(T v), or as a direct
definition:

RAII_DESTRUCTOR(T, destructor, arg)
{
   // code here to interact on arg
}

RAII_VAR then needs to just be updated to not declare and define the
trampoline functions at all, but instead use
__attribute__((cleanup(dtor_tramp_ ## dtor)))

This will eliminate the need on libBlocksRuntime (along with -fblocks)
in the case of using clang on Linux, and nested-functions for gcc.  It's
also likely to provide for support for other c compilers (don't have
examples off the top of my head, but in my years I've bumped onto
proprietary cross-compilers for various chips, and of course, intel c
compiler aka icc).

I don't object to keeping things as is, I am however wondering if there
would be appetite for such a patch that could eliminate the compiler
dependencies on gcc / clang.  I don't mind writing the patch either, and
would be happy to do so if there is interest in this (I have already
done a 10-line POC of the concept, and would probably be able to adjust
this into a autoconf test for __attribute__((cleanup(...))) if such a
test doesn't already exist in autoconf).

Kind Regards,
Jaco





More information about the asterisk-dev mailing list