1b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Copyright 2014 the V8 project authors. All rights reserved. 2b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// Use of this source code is governed by a BSD-style license that can be 3b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch// found in the LICENSE file. 4b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 5b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#ifndef V8_COMPILER_PIPELINE_H_ 6b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#define V8_COMPILER_PIPELINE_H_ 7b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 8014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Clients of this interface shouldn't depend on lots of compiler internals. 9014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch// Do not include anything from src/compiler here! 10c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch#include "src/globals.h" 11109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch#include "src/objects.h" 1262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch#include "src/zone/zone-containers.h" 13b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 14b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace v8 { 15b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace internal { 16014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 17109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdochclass CompilationInfo; 18bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochclass CompilationJob; 19014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdochclass RegisterConfiguration; 20014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch 2162ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochnamespace trap_handler { 2262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochstruct ProtectedInstructionData; 2362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch} // namespace trap_handler 2462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch 25b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochnamespace compiler { 26b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 27958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass CallDescriptor; 2862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdochclass JSGraph; 29b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdochclass Graph; 30958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass InstructionSequence; 31958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernierclass Schedule; 32bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochclass SourcePositionTable; 33b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 34bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdochclass Pipeline : public AllStatic { 35b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch public: 36bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Returns a new compilation job for the given function. 3762ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static CompilationJob* NewCompilationJob(Handle<JSFunction> function, 3862ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool has_script); 39b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 40bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Returns a new compilation job for the WebAssembly compilation info. 41bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static CompilationJob* NewWasmCompilationJob( 4262ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch CompilationInfo* info, JSGraph* jsgraph, CallDescriptor* descriptor, 4362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch SourcePositionTable* source_positions, 4462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch ZoneVector<trap_handler::ProtectedInstructionData>* 4562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch protected_instructions, 4662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch bool wasm_origin); 47b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 48014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Run the pipeline on a machine graph and generate code. The {schedule} must 49014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // be valid, hence the given {graph} does not need to be schedulable. 50014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<Code> GenerateCodeForCodeStub(Isolate* isolate, 51014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch CallDescriptor* call_descriptor, 52014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch Graph* graph, Schedule* schedule, 53109988c7ccb6f3fd1a58574fa3dfb88beaef6632Ben Murdoch Code::Flags flags, 54014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch const char* debug_name); 55958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 56bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // Run the entire pipeline and generate a handle to a code object suitable for 57bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch // testing. 58bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch static Handle<Code> GenerateCodeForTesting(CompilationInfo* info); 59bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch 60958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Run the pipeline on a machine graph and generate code. If {schedule} is 61958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // {nullptr}, then compute a new schedule for code generation. 62014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch static Handle<Code> GenerateCodeForTesting(CompilationInfo* info, 63958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Graph* graph, 64958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier Schedule* schedule = nullptr); 65958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 66958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier // Run just the register allocator phases. 67c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch V8_EXPORT_PRIVATE static bool AllocateRegistersForTesting( 68c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch const RegisterConfiguration* config, InstructionSequence* sequence, 69c8c1d9e03f4babd16833b0f8ccf6aab5fa6e8c7aBen Murdoch bool run_verifier); 70b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 71014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // Run the pipeline on a machine graph and generate code. If {schedule} is 72014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch // {nullptr}, then compute a new schedule for code generation. 7362ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch static Handle<Code> GenerateCodeForTesting( 7462ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch CompilationInfo* info, CallDescriptor* call_descriptor, Graph* graph, 7562ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch Schedule* schedule = nullptr, 7662ed631aa0ff23db68a47fd423efa9c019ff2c9eBen Murdoch SourcePositionTable* source_positions = nullptr); 77958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 78014dc512cdd3e367bee49a713fdc5ed92584a3e5Ben Murdoch private: 79bcf72ee8e3b26f1d0726869c7ddb3921c68b09a8Ben Murdoch DISALLOW_IMPLICIT_CONSTRUCTORS(Pipeline); 80b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch}; 81958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier 82958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} // namespace compiler 83958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} // namespace internal 84958fae7ec3f466955f8e5b50fa5b8d38b9e91675Emily Bernier} // namespace v8 85b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch 86b8a8cc1952d61a2f3a2568848933943a543b5d3eBen Murdoch#endif // V8_COMPILER_PIPELINE_H_ 87