8b2c2a596d
Summary: Add support for C++17 over-aligned allocation: http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2016/p0035r4.html Supporting all 10 operators means we avoid thunking thru libstdc++-v3/libsupc++ and just call jemalloc directly. It's also worth noting that there is now an aligned *and sized* operator delete: ``` void operator delete(void* ptr, std::size_t size, std::align_val_t al) noexcept; ``` If JeMalloc did not provide this, the default implementation would ignore the size parameter entirely: https://github.com/gcc-mirror/gcc/blob/master/libstdc%2B%2B-v3/libsupc%2B%2B/del_opsa.cc#L30-L33 (I must also update ax_cxx_compile_stdcxx.m4 to a newer version with C++17 support.) Test Plan: Wrote a simple test that allocates and then deletes an over-aligned type: ``` struct alignas(32) Foo {}; Foo *f; int main() { f = new Foo; delete f; } ``` Before this change, both new and delete go thru PLT, and we end up calling regular old free: ``` (gdb) disassemble Dump of assembler code for function main(): ... 0x00000000004029b7 <+55>: call 0x4022d0 <_ZnwmSt11align_val_t@plt> ... 0x00000000004029d5 <+85>: call 0x4022e0 <_ZdlPvmSt11align_val_t@plt> ... (gdb) s free (ptr=0x7ffff6408020) at /home/engshare/third-party2/jemalloc/master/src/jemalloc.git-trunk/src/jemalloc.c:2842 2842 if (!free_fastpath(ptr, 0, false)) { ``` After this change, we directly call new/delete and ultimately call sdallocx: ``` (gdb) disassemble Dump of assembler code for function main(): ... 0x0000000000402b77 <+55>: call 0x496ca0 <operator new(unsigned long, std::align_val_t)> ... 0x0000000000402b95 <+85>: call 0x496e60 <operator delete(void*, unsigned long, std::align_val_t)> ... (gdb) s 116 je_sdallocx_noflags(ptr, size); ``` |
||
---|---|---|
.. | ||
arena.c | ||
background_thread.c | ||
base.c | ||
bin_info.c | ||
bin.c | ||
bitmap.c | ||
ckh.c | ||
ctl.c | ||
div.c | ||
eset.c | ||
extent_dss.c | ||
extent_mmap.c | ||
extent.c | ||
hash.c | ||
hook.c | ||
jemalloc_cpp.cpp | ||
jemalloc.c | ||
large.c | ||
log.c | ||
malloc_io.c | ||
mutex_pool.c | ||
mutex.c | ||
nstime.c | ||
pages.c | ||
prng.c | ||
prof_data.c | ||
prof_log.c | ||
prof.c | ||
rtree.c | ||
safety_check.c | ||
sc.c | ||
stats.c | ||
sz.c | ||
tcache.c | ||
test_hooks.c | ||
thread_event.c | ||
ticker.c | ||
tsd.c | ||
witness.c | ||
zone.c |