Index: src/compiler/code-generator.cc |
diff --git a/src/compiler/code-generator.cc b/src/compiler/code-generator.cc |
index 1a4566d60994dbba96e72fcde285c215d5f2120e..f0dd6f8d46cf0b41c3663b8fb6441f339f20a692 100644 |
--- a/src/compiler/code-generator.cc |
+++ b/src/compiler/code-generator.cc |
@@ -42,6 +42,7 @@ CodeGenerator::CodeGenerator(Frame* frame, Linkage* linkage, |
masm_(info->isolate(), NULL, 0), |
resolver_(this), |
safepoints_(code->zone()), |
+ handlers_(code->zone()), |
deoptimization_states_(code->zone()), |
deoptimization_literals_(code->zone()), |
translations_(code->zone()), |
@@ -131,6 +132,18 @@ Handle<Code> CodeGenerator::GenerateCode() { |
result->set_stack_slots(frame()->GetSpillSlotCount()); |
result->set_safepoint_table_offset(safepoints()->GetCodeOffset()); |
+ // Emit exception handler table. |
+ if (!handlers_.empty()) { |
+ Handle<FixedArray> table = isolate()->factory()->NewFixedArray( |
+ static_cast<int>(handlers_.size()) * 2, TENURED); |
+ for (size_t i = 0; i < handlers_.size(); ++i) { |
+ int table_index = static_cast<int>(i * 2); |
+ table->set(table_index + 0, Smi::FromInt(handlers_[i].pc_offset)); |
+ table->set(table_index + 1, Smi::FromInt(handlers_[i].handler->pos())); |
+ } |
+ result->set_handler_table(*table); |
+ } |
+ |
PopulateDeoptimizationData(result); |
// Ensure there is space for lazy deoptimization in the relocation info. |
@@ -321,7 +334,7 @@ Label* CodeGenerator::AddJumpTable(Label** targets, size_t target_count) { |
} |
-void CodeGenerator::AddSafepointAndDeopt(Instruction* instr) { |
+void CodeGenerator::RecordCallPosition(Instruction* instr) { |
CallDescriptor::Flags flags(MiscField::decode(instr->opcode())); |
bool needs_frame_state = (flags & CallDescriptor::kNeedsFrameState); |
@@ -330,16 +343,21 @@ void CodeGenerator::AddSafepointAndDeopt(Instruction* instr) { |
instr->pointer_map(), Safepoint::kSimple, 0, |
needs_frame_state ? Safepoint::kLazyDeopt : Safepoint::kNoLazyDeopt); |
+ if (flags & CallDescriptor::kHasExceptionHandler) { |
+ InstructionOperandConverter i(this, instr); |
+ BasicBlock::RpoNumber handler_rpo = |
+ i.InputRpo(static_cast<int>(instr->InputCount()) - 1); |
+ handlers_.push_back({GetLabel(handler_rpo), masm()->pc_offset()}); |
+ } |
+ |
if (flags & CallDescriptor::kNeedsNopAfterCall) { |
AddNopForSmiCodeInlining(); |
} |
if (needs_frame_state) { |
MarkLazyDeoptSite(); |
- // If the frame state is present, it starts at argument 1 |
- // (just after the code address). |
- InstructionOperandConverter converter(this, instr); |
- // Deoptimization info starts at argument 1 |
+ // If the frame state is present, it starts at argument 1 (just after the |
+ // code address). |
size_t frame_state_offset = 1; |
FrameStateDescriptor* descriptor = |
GetFrameStateDescriptor(instr, frame_state_offset); |