diff options
Diffstat (limited to 'deps/v8/src/compiler/code-generator.cc')
-rw-r--r-- | deps/v8/src/compiler/code-generator.cc | 123 |
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, |