9d7b0f1c5f
Switch all uses of NewCode and TryNewCode to CodeBuilder and remove these methods. NewCode and TryNewCode use a large number of default parameters, which makes it difficult to use and add any new ones. Large chunks of code were also duplicated across TryNewCode and NewCode. The previous CL (https://chromium-review.googlesource.com/c/v8/v8/+/1585736) added a new CodeBuilder class which allows much simpler building of Code objects. Bug: v8:9183 Change-Id: I9f6884f35a3284cbd40746376f0f27e36f9051b5 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1585737 Commit-Queue: Maciej Goszczycki <goszczycki@google.com> Reviewed-by: Jakob Gruber <jgruber@chromium.org> Reviewed-by: Hannes Payer <hpayer@chromium.org> Reviewed-by: Michael Starzinger <mstarzinger@chromium.org> Reviewed-by: Dan Elphick <delphick@chromium.org> Cr-Commit-Position: refs/heads/master@{#61096}
108 lines
3.8 KiB
C++
108 lines
3.8 KiB
C++
// Copyright 2016 the V8 project authors. All rights reserved.
|
|
// Use of this source code is governed by a BSD-style license that can be
|
|
// found in the LICENSE file.
|
|
|
|
#include "src/heap/factory.h"
|
|
#include "src/isolate.h"
|
|
#include "src/objects-inl.h"
|
|
#include "test/cctest/cctest.h"
|
|
|
|
namespace v8 {
|
|
namespace internal {
|
|
|
|
TEST(CodeLayoutWithoutUnwindingInfo) {
|
|
CcTest::InitializeVM();
|
|
HandleScope handle_scope(CcTest::i_isolate());
|
|
|
|
// "Hello, World!" in ASCII.
|
|
byte buffer_array[13] = {0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x20,
|
|
0x57, 0x6F, 0x72, 0x6C, 0x64, 0x21};
|
|
|
|
byte* buffer = &buffer_array[0];
|
|
int buffer_size = sizeof(buffer_array);
|
|
|
|
CodeDesc code_desc;
|
|
code_desc.buffer = buffer;
|
|
code_desc.buffer_size = buffer_size;
|
|
code_desc.instr_size = buffer_size;
|
|
code_desc.safepoint_table_offset = buffer_size;
|
|
code_desc.safepoint_table_size = 0;
|
|
code_desc.handler_table_offset = buffer_size;
|
|
code_desc.handler_table_size = 0;
|
|
code_desc.constant_pool_offset = buffer_size;
|
|
code_desc.constant_pool_size = 0;
|
|
code_desc.code_comments_offset = buffer_size;
|
|
code_desc.code_comments_size = 0;
|
|
code_desc.reloc_offset = buffer_size;
|
|
code_desc.reloc_size = 0;
|
|
code_desc.unwinding_info = nullptr;
|
|
code_desc.unwinding_info_size = 0;
|
|
code_desc.origin = nullptr;
|
|
|
|
Handle<Code> code =
|
|
Factory::CodeBuilder(CcTest::i_isolate(), code_desc, Code::STUB).Build();
|
|
|
|
CHECK(!code->has_unwinding_info());
|
|
CHECK_EQ(code->raw_instruction_size(), buffer_size);
|
|
CHECK_EQ(0, memcmp(reinterpret_cast<void*>(code->raw_instruction_start()),
|
|
buffer, buffer_size));
|
|
CHECK_EQ(code->raw_instruction_end() - code->address(),
|
|
Code::kHeaderSize + buffer_size);
|
|
}
|
|
|
|
TEST(CodeLayoutWithUnwindingInfo) {
|
|
CcTest::InitializeVM();
|
|
HandleScope handle_scope(CcTest::i_isolate());
|
|
|
|
// "Hello, World!" in ASCII.
|
|
byte buffer_array[13] = {0x48, 0x65, 0x6C, 0x6C, 0x6F, 0x2C, 0x20,
|
|
0x57, 0x6F, 0x72, 0x6C, 0x64, 0x21};
|
|
|
|
// "JavaScript" in ASCII.
|
|
byte unwinding_info_array[10] = {0x4A, 0x61, 0x76, 0x61, 0x53,
|
|
0x63, 0x72, 0x69, 0x70, 0x74};
|
|
|
|
byte* buffer = &buffer_array[0];
|
|
int buffer_size = sizeof(buffer_array);
|
|
byte* unwinding_info = &unwinding_info_array[0];
|
|
int unwinding_info_size = sizeof(unwinding_info_array);
|
|
|
|
CodeDesc code_desc;
|
|
code_desc.buffer = buffer;
|
|
code_desc.buffer_size = buffer_size;
|
|
code_desc.instr_size = buffer_size;
|
|
code_desc.safepoint_table_offset = buffer_size;
|
|
code_desc.safepoint_table_size = 0;
|
|
code_desc.handler_table_offset = buffer_size;
|
|
code_desc.handler_table_size = 0;
|
|
code_desc.constant_pool_offset = buffer_size;
|
|
code_desc.constant_pool_size = 0;
|
|
code_desc.code_comments_offset = buffer_size;
|
|
code_desc.code_comments_size = 0;
|
|
code_desc.reloc_offset = buffer_size;
|
|
code_desc.reloc_size = 0;
|
|
code_desc.unwinding_info = unwinding_info;
|
|
code_desc.unwinding_info_size = unwinding_info_size;
|
|
code_desc.origin = nullptr;
|
|
|
|
Handle<Code> code =
|
|
Factory::CodeBuilder(CcTest::i_isolate(), code_desc, Code::STUB).Build();
|
|
|
|
CHECK(code->has_unwinding_info());
|
|
CHECK_EQ(code->raw_instruction_size(), buffer_size);
|
|
CHECK_EQ(0, memcmp(reinterpret_cast<void*>(code->raw_instruction_start()),
|
|
buffer, buffer_size));
|
|
CHECK(IsAligned(code->GetUnwindingInfoSizeOffset(), 8));
|
|
CHECK_EQ(code->unwinding_info_size(), unwinding_info_size);
|
|
CHECK(IsAligned(code->unwinding_info_start(), 8));
|
|
CHECK_EQ(memcmp(reinterpret_cast<void*>(code->unwinding_info_start()),
|
|
unwinding_info, unwinding_info_size),
|
|
0);
|
|
CHECK_EQ(code->unwinding_info_end() - code->address(),
|
|
Code::kHeaderSize + RoundUp(buffer_size, kInt64Size) + kInt64Size +
|
|
unwinding_info_size);
|
|
}
|
|
|
|
} // namespace internal
|
|
} // namespace v8
|