summaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler/code-generator.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/compiler/code-generator.cc')
-rw-r--r--deps/v8/src/compiler/code-generator.cc123
1 files changed, 83 insertions, 40 deletions
diff --git a/deps/v8/src/compiler/code-generator.cc b/deps/v8/src/compiler/code-generator.cc
index e8aa1a4796..3d43ab4765 100644
--- a/deps/v8/src/compiler/code-generator.cc
+++ b/deps/v8/src/compiler/code-generator.cc
@@ -11,8 +11,10 @@
#include "src/compiler/code-generator-impl.h"
#include "src/compiler/linkage.h"
#include "src/compiler/pipeline.h"
+#include "src/eh-frame.h"
#include "src/frames.h"
#include "src/macro-assembler-inl.h"
+#include "src/trap-handler/trap-handler.h"
namespace v8 {
namespace internal {
@@ -35,12 +37,14 @@ class CodeGenerator::JumpTable final : public ZoneObject {
size_t const target_count_;
};
-CodeGenerator::CodeGenerator(Zone* codegen_zone, Frame* frame, Linkage* linkage,
- InstructionSequence* code, CompilationInfo* info,
- base::Optional<OsrHelper> osr_helper,
- int start_source_position,
- JumpOptimizationInfo* jump_opt)
+CodeGenerator::CodeGenerator(
+ Zone* codegen_zone, Frame* frame, Linkage* linkage,
+ InstructionSequence* code, CompilationInfo* info, Isolate* isolate,
+ base::Optional<OsrHelper> osr_helper, int start_source_position,
+ JumpOptimizationInfo* jump_opt,
+ std::vector<trap_handler::ProtectedInstructionData>* protected_instructions)
: zone_(codegen_zone),
+ isolate_(isolate),
frame_access_state_(nullptr),
linkage_(linkage),
code_(code),
@@ -50,7 +54,7 @@ CodeGenerator::CodeGenerator(Zone* codegen_zone, Frame* frame, Linkage* linkage,
current_block_(RpoNumber::Invalid()),
start_source_position_(start_source_position),
current_source_position_(SourcePosition::Unknown()),
- tasm_(info->isolate(), nullptr, 0, CodeObjectRequired::kNo),
+ tasm_(isolate, nullptr, 0, CodeObjectRequired::kNo),
resolver_(this),
safepoints_(zone()),
handlers_(zone()),
@@ -66,8 +70,8 @@ CodeGenerator::CodeGenerator(Zone* codegen_zone, Frame* frame, Linkage* linkage,
osr_helper_(osr_helper),
osr_pc_offset_(-1),
optimized_out_literal_id_(-1),
- source_position_table_builder_(zone(),
- info->SourcePositionRecordingMode()),
+ source_position_table_builder_(info->SourcePositionRecordingMode()),
+ protected_instructions_(protected_instructions),
result_(kSuccess) {
for (int i = 0; i < code->InstructionBlockCount(); ++i) {
new (&labels_[i]) Label;
@@ -75,9 +79,21 @@ CodeGenerator::CodeGenerator(Zone* codegen_zone, Frame* frame, Linkage* linkage,
CreateFrameAccessState(frame);
CHECK_EQ(info->is_osr(), osr_helper_.has_value());
tasm_.set_jump_optimization_info(jump_opt);
+ Code::Kind code_kind = info_->code_kind();
+ if (code_kind == Code::JS_TO_WASM_FUNCTION ||
+ code_kind == Code::WASM_FUNCTION) {
+ tasm_.enable_serializer();
+ }
}
-Isolate* CodeGenerator::isolate() const { return info_->isolate(); }
+void CodeGenerator::AddProtectedInstructionLanding(uint32_t instr_offset,
+ uint32_t landing_offset) {
+ if (protected_instructions_ != nullptr) {
+ trap_handler::ProtectedInstructionData data = {instr_offset,
+ landing_offset};
+ protected_instructions_->emplace_back(data);
+ }
+}
void CodeGenerator::CreateFrameAccessState(Frame* frame) {
FinishFrame(frame);
@@ -274,21 +290,11 @@ void CodeGenerator::AssembleCode() {
result_ = kSuccess;
}
-Handle<Code> CodeGenerator::FinalizeCode() {
- if (result_ != kSuccess) return Handle<Code>();
-
- Handle<Code> result = v8::internal::CodeGenerator::MakeCodeEpilogue(
- tasm(), unwinding_info_writer_.eh_frame_writer(), info(),
- Handle<Object>());
- result->set_is_turbofanned(true);
- result->set_stack_slots(frame()->GetTotalFrameSlotCount());
- result->set_safepoint_table_offset(safepoints()->GetCodeOffset());
- Handle<ByteArray> source_positions =
- source_position_table_builder_.ToSourcePositionTable(
- isolate(), Handle<AbstractCode>::cast(result));
- result->set_source_position_table(*source_positions);
+Handle<ByteArray> CodeGenerator::GetSourcePositionTable() {
+ return source_position_table_builder_.ToSourcePositionTable(isolate());
+}
- // Emit exception handler table.
+MaybeHandle<HandlerTable> CodeGenerator::GetHandlerTable() const {
if (!handlers_.empty()) {
Handle<HandlerTable> table =
Handle<HandlerTable>::cast(isolate()->factory()->NewFixedArray(
@@ -298,10 +304,50 @@ Handle<Code> CodeGenerator::FinalizeCode() {
table->SetReturnOffset(static_cast<int>(i), handlers_[i].pc_offset);
table->SetReturnHandler(static_cast<int>(i), handlers_[i].handler->pos());
}
- result->set_handler_table(*table);
+ return table;
+ }
+ return {};
+}
+
+Handle<Code> CodeGenerator::FinalizeCode() {
+ if (result_ != kSuccess) return Handle<Code>();
+
+ // Allocate exception handler table.
+ Handle<HandlerTable> table = HandlerTable::Empty(isolate());
+ if (!handlers_.empty()) {
+ table = Handle<HandlerTable>::cast(isolate()->factory()->NewFixedArray(
+ HandlerTable::LengthForReturn(static_cast<int>(handlers_.size())),
+ TENURED));
+ for (size_t i = 0; i < handlers_.size(); ++i) {
+ table->SetReturnOffset(static_cast<int>(i), handlers_[i].pc_offset);
+ table->SetReturnHandler(static_cast<int>(i), handlers_[i].handler->pos());
+ }
+ }
+
+ // Allocate the source position table.
+ Handle<ByteArray> source_positions =
+ source_position_table_builder_.ToSourcePositionTable(isolate());
+
+ // Allocate deoptimization data.
+ Handle<DeoptimizationData> deopt_data = GenerateDeoptimizationData();
+
+ // Allocate and install the code.
+ CodeDesc desc;
+ tasm()->GetCode(isolate(), &desc);
+ if (unwinding_info_writer_.eh_frame_writer()) {
+ unwinding_info_writer_.eh_frame_writer()->GetEhFrame(&desc);
}
- PopulateDeoptimizationData(result);
+ Handle<Code> result = isolate()->factory()->NewCode(
+ desc, info()->code_kind(), Handle<Object>(), info()->builtin_index(),
+ table, source_positions, deopt_data, kMovable, info()->stub_key(), true,
+ frame()->GetTotalFrameSlotCount(), safepoints()->GetCodeOffset());
+ isolate()->counters()->total_compiled_code_size()->Increment(
+ result->instruction_size());
+
+ LOG_CODE_EVENT(isolate(),
+ CodeLinePosInfoRecordEvent(result->instruction_start(),
+ *source_positions));
return result;
}
@@ -580,16 +626,16 @@ void CodeGenerator::AssembleGaps(Instruction* instr) {
namespace {
Handle<PodArray<InliningPosition>> CreateInliningPositions(
- CompilationInfo* info) {
+ CompilationInfo* info, Isolate* isolate) {
const CompilationInfo::InlinedFunctionList& inlined_functions =
info->inlined_functions();
if (inlined_functions.size() == 0) {
return Handle<PodArray<InliningPosition>>::cast(
- info->isolate()->factory()->empty_byte_array());
+ isolate->factory()->empty_byte_array());
}
Handle<PodArray<InliningPosition>> inl_positions =
PodArray<InliningPosition>::New(
- info->isolate(), static_cast<int>(inlined_functions.size()), TENURED);
+ isolate, static_cast<int>(inlined_functions.size()), TENURED);
for (size_t i = 0; i < inlined_functions.size(); ++i) {
inl_positions->set(static_cast<int>(i), inlined_functions[i].position);
}
@@ -598,12 +644,14 @@ Handle<PodArray<InliningPosition>> CreateInliningPositions(
} // namespace
-void CodeGenerator::PopulateDeoptimizationData(Handle<Code> code_object) {
+Handle<DeoptimizationData> CodeGenerator::GenerateDeoptimizationData() {
CompilationInfo* info = this->info();
int deopt_count = static_cast<int>(deoptimization_states_.size());
- if (deopt_count == 0 && !info->is_osr()) return;
- Handle<DeoptimizationInputData> data =
- DeoptimizationInputData::New(isolate(), deopt_count, TENURED);
+ if (deopt_count == 0 && !info->is_osr()) {
+ return DeoptimizationData::Empty(isolate());
+ }
+ Handle<DeoptimizationData> data =
+ DeoptimizationData::New(isolate(), deopt_count, TENURED);
Handle<ByteArray> translation_array =
translations_.CreateByteArray(isolate()->factory());
@@ -627,7 +675,8 @@ void CodeGenerator::PopulateDeoptimizationData(Handle<Code> code_object) {
}
data->SetLiteralArray(*literals);
- Handle<PodArray<InliningPosition>> inl_pos = CreateInliningPositions(info);
+ Handle<PodArray<InliningPosition>> inl_pos =
+ CreateInliningPositions(info, isolate());
data->SetInliningPositions(*inl_pos);
if (info->is_osr()) {
@@ -650,7 +699,7 @@ void CodeGenerator::PopulateDeoptimizationData(Handle<Code> code_object) {
data->SetPc(i, Smi::FromInt(deoptimization_state->pc_offset()));
}
- code_object->set_deoptimization_data(*data);
+ return data;
}
@@ -851,12 +900,6 @@ void CodeGenerator::BuildTranslationForFrameStateDescriptor(
bailout_id, shared_info_id, parameter_count);
break;
}
- case FrameStateType::kGetterStub:
- translation->BeginGetterStubFrame(shared_info_id);
- break;
- case FrameStateType::kSetterStub:
- translation->BeginSetterStubFrame(shared_info_id);
- break;
}
TranslateFrameStateDescriptorOperands(descriptor, iter, state_combine,