Disable an always_inline with GCC in debug mode.

Most compilers are happy if you say always-inline but they can't.  GCC
will complain.  Here, we have two mutually recursive functions that are
marked as always inline.  In an optimised build, one is inlined into the
other and then becomes a tail-recursive function that should inline the
tail call.  Inlining the tail call can be done by simply jumping to the
start of the function and so everything is fine.  In a debug build, the
second transform doesn't happen and so we're left with a call to an
always-inline function.
This commit is contained in:
David Chisnall
2019-07-05 11:39:14 +01:00
parent eefc9e49c5
commit 50695d07f8

View File

@@ -1366,8 +1366,15 @@ namespace snmalloc
large_allocator.dealloc(slab, large_class);
}
SNMALLOC_FAST_PATH void
remote_dealloc(RemoteAllocator* target, void* p, sizeclass_t sizeclass)
#if defined(__GNUC__) && !defined(__clang__) && !defined(__OPTIMIZE__)
// Don't force this to be always inlined in debug builds with GCC, because
// it will fail and then raise an error.
inline
#else
SNMALLOC_FAST_PATH
#endif
void
remote_dealloc(RemoteAllocator* target, void* p, sizeclass_t sizeclass)
{
MEASURE_TIME(remote_dealloc, 4, 16);
assert(target->id() != id());