5 #ifndef V8_COMPILER_BACKEND_CODE_GENERATOR_H_ 6 #define V8_COMPILER_BACKEND_CODE_GENERATOR_H_ 8 #include "src/base/optional.h" 9 #include "src/compiler/backend/gap-resolver.h" 10 #include "src/compiler/backend/instruction.h" 11 #include "src/compiler/backend/unwinding-info-writer.h" 12 #include "src/compiler/osr.h" 13 #include "src/deoptimizer.h" 14 #include "src/macro-assembler.h" 15 #include "src/safepoint-table.h" 16 #include "src/source-position-table.h" 17 #include "src/trap-handler/trap-handler.h" 22 class OptimizedCompilationInfo;
27 class DeoptimizationExit;
28 class FrameAccessState;
33 FlagsCondition condition;
42 : instr_(instr), pos_(pos) {}
52 enum class DeoptimizationLiteralKind { kObject, kNumber, kString };
59 : kind_(DeoptimizationLiteralKind::kObject), object_(
object) {
60 DCHECK(!object_.is_null());
63 : kind_(DeoptimizationLiteralKind::kNumber), number_(number) {}
65 : kind_(DeoptimizationLiteralKind::kString), string_(
string) {}
71 return kind_ == other.kind_ && object_.equals(other.object_) &&
72 bit_cast<uint64_t>(number_) == bit_cast<uint64_t>(other.number_) &&
73 bit_cast<intptr_t>(string_) == bit_cast<intptr_t>(other.string_);
78 DeoptimizationLiteralKind kind()
const {
return kind_; }
81 DeoptimizationLiteralKind kind_;
95 int start_source_position,
97 PoisoningMitigationLevel poisoning_level,
99 int32_t builtin_index);
109 GetProtectedInstructions();
112 FrameAccessState* frame_access_state()
const {
return frame_access_state_; }
113 const Frame* frame()
const {
return frame_access_state_->frame(); }
114 Isolate* isolate()
const {
return isolate_; }
115 Linkage* linkage()
const {
return linkage_; }
119 void AddProtectedInstructionLanding(
uint32_t instr_offset,
122 bool wasm_runtime_exception_support()
const;
125 return start_source_position_;
132 void RecordSafepoint(
ReferenceMap* references, Safepoint::Kind kind,
133 int arguments, Safepoint::DeoptMode deopt_mode);
135 Zone* zone()
const {
return zone_; }
137 size_t GetSafepointTableOffset()
const {
return safepoints_.GetCodeOffset(); }
138 size_t GetHandlerTableOffset()
const {
return handler_table_offset_; }
143 static constexpr
int kBinarySearchSwitchMinimalCases = 4;
149 OsrHelper* osr_helper() {
return &(*osr_helper_); }
152 void CreateFrameAccessState(
Frame* frame);
155 void FinishFrame(
Frame* frame);
159 bool IsNextInAssemblyOrder(
RpoNumber block)
const;
165 RootIndex* index_return);
167 enum CodeGenResult { kSuccess, kTooManyDeoptimizationBailouts };
177 void InitializeSpeculationPoison();
179 void ResetSpeculationPoison();
181 void GenerateSpeculationPoisonFromCodeStartRegister();
184 CodeGenResult AssembleInstruction(
Instruction* instr,
196 bool GetSlotAboveSPBeforeTailCall(
Instruction* instr,
int* slot);
199 StubCallMode DetermineStubCallMode()
const;
201 CodeGenResult AssembleDeoptimizerCall(
int deoptimization_id,
208 CodeGenResult AssembleArchInstruction(
Instruction* instr);
215 void AssembleArchBoolean(
Instruction* instr, FlagsCondition condition);
216 void AssembleArchTrap(
Instruction* instr, FlagsCondition condition);
218 std::pair<int32_t, Label*>* begin,
219 std::pair<int32_t, Label*>* end);
220 void AssembleArchBinarySearchSwitch(
Instruction* instr);
226 void AssembleCodeStartRegisterCheck();
228 void AssembleBranchPoisoning(FlagsCondition condition,
Instruction* instr);
234 void BailoutIfDeoptimized();
238 void AssembleRegisterArgumentPoisoning();
242 void AssembleConstructFrame();
248 void AssembleDeconstructFrame();
251 void AssemblePrepareTailCall();
258 kImmediatePush = 0x1,
260 kStackSlotPush = 0x4,
261 kScalarPush = kRegisterPush | kStackSlotPush
275 static void GetPushCompatibleMoves(
Instruction* instr,
303 int first_unused_stack_slot);
308 int first_unused_stack_slot);
330 Label* AddJumpTable(
Label** targets,
size_t target_count);
332 void AssembleJumpTable(
Label** targets,
size_t target_count);
342 size_t frame_state_offset);
343 DeoptimizeKind GetDeoptimizationKind(
int deoptimization_id)
const;
344 DeoptimizeReason GetDeoptimizationReason(
int deoptimization_id)
const;
345 int BuildTranslation(
Instruction* instr,
int pc_offset,
346 size_t frame_state_offset,
348 void BuildTranslationForFrameStateDescriptor(
360 void MarkLazyDeoptSite();
363 size_t frame_state_offset);
367 class DeoptimizationState final :
public ZoneObject {
369 DeoptimizationState(
BailoutId bailout_id,
int translation_id,
int pc_offset,
370 DeoptimizeKind kind, DeoptimizeReason reason)
371 : bailout_id_(bailout_id),
372 translation_id_(translation_id),
373 pc_offset_(pc_offset),
377 BailoutId bailout_id()
const {
return bailout_id_; }
378 int translation_id()
const {
return translation_id_; }
379 int pc_offset()
const {
return pc_offset_; }
380 DeoptimizeKind kind()
const {
return kind_; }
381 DeoptimizeReason reason()
const {
return reason_; }
387 DeoptimizeKind kind_;
388 DeoptimizeReason reason_;
397 friend class CodeGeneratorTester;
406 Label*
const labels_;
418 size_t inlined_function_count_;
420 int handler_table_offset_;
421 int last_lazy_deopt_pc_;
432 bool caller_registers_saved_;
433 SaveFPRegsMode fp_mode_;
439 int optimized_out_literal_id_;
442 CodeGenResult result_;
443 PoisoningMitigationLevel poisoning_level_;
452 #endif // V8_COMPILER_BACKEND_CODE_GENERATOR_H_