ソースを参照

LibJS: Make basic block size customizable

And keep the default 4 KiB for the code generator.
Ali Mohammad Pur 4 年 前
コミット
e73b142a97

+ 4 - 4
Userland/Libraries/LibJS/Bytecode/BasicBlock.cpp

@@ -11,18 +11,18 @@
 
 
 namespace JS::Bytecode {
 namespace JS::Bytecode {
 
 
-NonnullOwnPtr<BasicBlock> BasicBlock::create(String name)
+NonnullOwnPtr<BasicBlock> BasicBlock::create(String name, size_t size)
 {
 {
-    return adopt_own(*new BasicBlock(move(name)));
+    return adopt_own(*new BasicBlock(move(name), max(size, static_cast<size_t>(4 * KiB))));
 }
 }
 
 
-BasicBlock::BasicBlock(String name)
+BasicBlock::BasicBlock(String name, size_t size)
     : m_name(move(name))
     : m_name(move(name))
 {
 {
     // FIXME: This is not the smartest solution ever. Find something cleverer!
     // FIXME: This is not the smartest solution ever. Find something cleverer!
     // The main issue we're working around here is that we don't want pointers into the bytecode stream to become invalidated
     // The main issue we're working around here is that we don't want pointers into the bytecode stream to become invalidated
     // during code generation due to dynamic buffer resizing. Otherwise we could just use a Vector.
     // during code generation due to dynamic buffer resizing. Otherwise we could just use a Vector.
-    m_buffer_capacity = 4 * KiB;
+    m_buffer_capacity = size;
     m_buffer = (u8*)mmap(nullptr, m_buffer_capacity, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, 0, 0);
     m_buffer = (u8*)mmap(nullptr, m_buffer_capacity, PROT_READ | PROT_WRITE, MAP_ANONYMOUS | MAP_PRIVATE, 0, 0);
     VERIFY(m_buffer != MAP_FAILED);
     VERIFY(m_buffer != MAP_FAILED);
 }
 }

+ 3 - 2
Userland/Libraries/LibJS/Bytecode/BasicBlock.h

@@ -47,13 +47,14 @@ class BasicBlock {
     AK_MAKE_NONCOPYABLE(BasicBlock);
     AK_MAKE_NONCOPYABLE(BasicBlock);
 
 
 public:
 public:
-    static NonnullOwnPtr<BasicBlock> create(String name);
+    static NonnullOwnPtr<BasicBlock> create(String name, size_t size = 4 * KiB);
     ~BasicBlock();
     ~BasicBlock();
 
 
     void seal();
     void seal();
 
 
     void dump(Executable const&) const;
     void dump(Executable const&) const;
     ReadonlyBytes instruction_stream() const { return ReadonlyBytes { m_buffer, m_buffer_size }; }
     ReadonlyBytes instruction_stream() const { return ReadonlyBytes { m_buffer, m_buffer_size }; }
+    size_t size() const { return m_buffer_size; }
 
 
     void* next_slot() { return m_buffer + m_buffer_size; }
     void* next_slot() { return m_buffer + m_buffer_size; }
     bool can_grow(size_t additional_size) const { return m_buffer_size + additional_size <= m_buffer_capacity; }
     bool can_grow(size_t additional_size) const { return m_buffer_size + additional_size <= m_buffer_capacity; }
@@ -65,7 +66,7 @@ public:
     String const& name() const { return m_name; }
     String const& name() const { return m_name; }
 
 
 private:
 private:
-    BasicBlock(String name);
+    BasicBlock(String name, size_t size);
 
 
     u8* m_buffer { nullptr };
     u8* m_buffer { nullptr };
     size_t m_buffer_capacity { 0 };
     size_t m_buffer_capacity { 0 };