mirror of
https://github.com/RGBCube/serenity
synced 2025-07-26 11:07:35 +00:00
LibJS: Align Instructions as void* and roundup variably sized ones sizes
Both is indeed needed, the standard alignment would have been 4, but some Instructions, like Jumps need an alignment of 8 Fixes #12127.
This commit is contained in:
parent
89408d5f64
commit
911506af9f
3 changed files with 9 additions and 5 deletions
|
@ -65,12 +65,15 @@ public:
|
||||||
OpType& emit_with_extra_register_slots(size_t extra_register_slots, Args&&... args)
|
OpType& emit_with_extra_register_slots(size_t extra_register_slots, Args&&... args)
|
||||||
{
|
{
|
||||||
VERIFY(!is_current_block_terminated());
|
VERIFY(!is_current_block_terminated());
|
||||||
|
|
||||||
|
size_t size_to_allocate = round_up_to_power_of_two(sizeof(OpType) + extra_register_slots * sizeof(Register), alignof(void*));
|
||||||
|
|
||||||
// If the block doesn't have enough space, switch to another block
|
// If the block doesn't have enough space, switch to another block
|
||||||
if constexpr (!OpType::IsTerminator)
|
if constexpr (!OpType::IsTerminator)
|
||||||
ensure_enough_space(sizeof(OpType) + extra_register_slots * sizeof(Register));
|
ensure_enough_space(size_to_allocate);
|
||||||
|
|
||||||
void* slot = next_slot();
|
void* slot = next_slot();
|
||||||
grow(sizeof(OpType) + extra_register_slots * sizeof(Register));
|
grow(size_to_allocate);
|
||||||
new (slot) OpType(forward<Args>(args)...);
|
new (slot) OpType(forward<Args>(args)...);
|
||||||
if constexpr (OpType::IsTerminator)
|
if constexpr (OpType::IsTerminator)
|
||||||
m_current_basic_block->terminate({});
|
m_current_basic_block->terminate({});
|
||||||
|
|
|
@ -92,7 +92,7 @@
|
||||||
|
|
||||||
namespace JS::Bytecode {
|
namespace JS::Bytecode {
|
||||||
|
|
||||||
class Instruction {
|
class alignas(void*) Instruction {
|
||||||
public:
|
public:
|
||||||
constexpr static bool IsTerminator = false;
|
constexpr static bool IsTerminator = false;
|
||||||
|
|
||||||
|
|
|
@ -8,6 +8,7 @@
|
||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <AK/StdLibExtras.h>
|
||||||
#include <LibCrypto/BigInt/SignedBigInteger.h>
|
#include <LibCrypto/BigInt/SignedBigInteger.h>
|
||||||
#include <LibJS/Bytecode/IdentifierTable.h>
|
#include <LibJS/Bytecode/IdentifierTable.h>
|
||||||
#include <LibJS/Bytecode/Instruction.h>
|
#include <LibJS/Bytecode/Instruction.h>
|
||||||
|
@ -990,9 +991,9 @@ ALWAYS_INLINE void Instruction::replace_references(BasicBlock const& from, Basic
|
||||||
ALWAYS_INLINE size_t Instruction::length() const
|
ALWAYS_INLINE size_t Instruction::length() const
|
||||||
{
|
{
|
||||||
if (type() == Type::NewArray)
|
if (type() == Type::NewArray)
|
||||||
return static_cast<Op::NewArray const&>(*this).length_impl();
|
return round_up_to_power_of_two(static_cast<Op::NewArray const&>(*this).length_impl(), alignof(void*));
|
||||||
if (type() == Type::CopyObjectExcludingProperties)
|
if (type() == Type::CopyObjectExcludingProperties)
|
||||||
return static_cast<Op::CopyObjectExcludingProperties const&>(*this).length_impl();
|
return round_up_to_power_of_two(static_cast<Op::CopyObjectExcludingProperties const&>(*this).length_impl(), alignof(void*));
|
||||||
|
|
||||||
#define __BYTECODE_OP(op) \
|
#define __BYTECODE_OP(op) \
|
||||||
case Type::op: \
|
case Type::op: \
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue