Commit 956a81ef authored by Clemens Backes's avatar Clemens Backes Committed by Commit Bot

[codegen] Avoid dynamic allocations for ExternalAssemblerBufferImpl

Those dynamic allocations are responsible for 5-10% of execution time in
wasm code publishing, which again is the biggest contributor to
deserialization time. The allocations are used for patching the jump
table. This CL avoids dynamic memory allocation by having some
thread-local space that is re-used for allocations of
ExternalAssemblerBufferImpl. Since those objects are small, memory usage
is not a concern here.

R=jkummerow@chromium.org

Bug: v8:11164
Cq-Include-Trybots: luci.v8.try:v8_linux64_asan_rel_ng
Cq-Include-Trybots: luci.v8.try:v8_linux64_msan_rel_ng
Cq-Include-Trybots: luci.v8.try:v8_linux64_ubsan_rel_ng
Change-Id: I44aad86fa821a1ccb59b539da861a346f62a9813
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/2667859
Commit-Queue: Clemens Backes <clemensb@chromium.org>
Reviewed-by: 's avatarJakob Kummerow <jkummerow@chromium.org>
Cr-Commit-Position: refs/heads/master@{#72585}
parent 68105996
......@@ -122,11 +122,38 @@ class ExternalAssemblerBufferImpl : public AssemblerBuffer {
FATAL("Cannot grow external assembler buffer");
}
void* operator new(std::size_t count);
void operator delete(void* ptr) noexcept;
private:
byte* const start_;
const int size_;
};
static thread_local std::aligned_storage_t<sizeof(ExternalAssemblerBufferImpl),
alignof(ExternalAssemblerBufferImpl)>
tls_singleton_storage;
static thread_local bool tls_singleton_taken{false};
void* ExternalAssemblerBufferImpl::operator new(std::size_t count) {
DCHECK_EQ(count, sizeof(ExternalAssemblerBufferImpl));
if (V8_LIKELY(!tls_singleton_taken)) {
tls_singleton_taken = true;
return &tls_singleton_storage;
}
return ::operator new(count);
}
void ExternalAssemblerBufferImpl::operator delete(void* ptr) noexcept {
if (V8_LIKELY(ptr == &tls_singleton_storage)) {
DCHECK(tls_singleton_taken);
tls_singleton_taken = false;
return;
}
::operator delete(ptr);
}
} // namespace
std::unique_ptr<AssemblerBuffer> ExternalAssemblerBuffer(void* start,
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment