Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(129)

Unified Diff: src/compiler/pipeline.cc

Issue 2229243003: [turbofan] Split CodeGenerator::GenerateCode into AssembleCode and FinishCodeObject. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 4 years, 4 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« src/compiler/code-generator.cc ('K') | « src/compiler/code-generator.cc ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/pipeline.cc
diff --git a/src/compiler/pipeline.cc b/src/compiler/pipeline.cc
index 86d36a6420b35ca74fb4a73e36d658d6f678e997..0e47213b6f2ceb925bcab59b0d95fe8611387961 100644
--- a/src/compiler/pipeline.cc
+++ b/src/compiler/pipeline.cc
@@ -93,6 +93,9 @@ class PipelineData {
graph_zone_(graph_zone_scope_.zone()),
instruction_zone_scope_(zone_pool_),
instruction_zone_(instruction_zone_scope_.zone()),
+ sequence_(nullptr),
+ frame_(nullptr),
+ code_generator_(instruction_zone_, info),
Michael Starzinger 2016/08/11 14:16:26 As discussed offline: Lets put this into the outer
ahaas 2016/08/11 14:54:19 Done.
register_allocation_zone_scope_(zone_pool_),
register_allocation_zone_(register_allocation_zone_scope_.zone()) {
PhaseScope scope(pipeline_statistics, "init pipeline data");
@@ -121,6 +124,9 @@ class PipelineData {
source_positions_(source_positions),
instruction_zone_scope_(zone_pool_),
instruction_zone_(instruction_zone_scope_.zone()),
+ sequence_(nullptr),
+ frame_(nullptr),
+ code_generator_(instruction_zone_, info),
register_allocation_zone_scope_(zone_pool_),
register_allocation_zone_(register_allocation_zone_scope_.zone()) {}
@@ -137,6 +143,9 @@ class PipelineData {
schedule_(schedule),
instruction_zone_scope_(zone_pool_),
instruction_zone_(instruction_zone_scope_.zone()),
+ sequence_(nullptr),
+ frame_(nullptr),
+ code_generator_(instruction_zone_, info),
register_allocation_zone_scope_(zone_pool_),
register_allocation_zone_(register_allocation_zone_scope_.zone()) {}
@@ -151,6 +160,8 @@ class PipelineData {
instruction_zone_scope_(zone_pool_),
instruction_zone_(sequence->zone()),
sequence_(sequence),
+ frame_(nullptr),
+ code_generator_(instruction_zone_, info),
register_allocation_zone_scope_(zone_pool_),
register_allocation_zone_(register_allocation_zone_scope_.zone()) {}
@@ -211,6 +222,10 @@ class PipelineData {
Zone* instruction_zone() const { return instruction_zone_; }
InstructionSequence* sequence() const { return sequence_; }
Frame* frame() const { return frame_; }
+ CodeGenerator* code_generator() { return &code_generator_; }
+ bool assemble_code_successful() {
+ return code_generator_.assemble_code_successful();
+ }
Zone* register_allocation_zone() const { return register_allocation_zone_; }
RegisterAllocationData* register_allocation_data() const {
@@ -331,12 +346,14 @@ class PipelineData {
// All objects in the following group of fields are allocated in
// instruction_zone_. They are all set to nullptr when the instruction_zone_
- // is
- // destroyed.
+ // is destroyed.
ZonePool::Scope instruction_zone_scope_;
Zone* instruction_zone_;
- InstructionSequence* sequence_ = nullptr;
- Frame* frame_ = nullptr;
+ InstructionSequence* sequence_;
+ Frame* frame_;
+
+ // The code generator uses the instruction_zone_.
+ CodeGenerator code_generator_;
Michael Starzinger 2016/08/11 14:16:26 nit: Can be move up to the other fields not living
ahaas 2016/08/11 14:54:19 Done.
// All objects in the following group of fields are allocated in
// register_allocation_zone_. They are all set to nullptr when the zone is
@@ -383,7 +400,8 @@ class PipelineImpl final {
bool OptimizeGraph(Linkage* linkage);
// Perform the actual code generation and return handle to a code object.
- Handle<Code> GenerateCode(Linkage* linkage);
+ bool AssembleCode(Linkage* linkage);
+ Handle<Code> FinishCodeObject();
bool ScheduleAndSelectInstructions(Linkage* linkage);
void RunPrintAndVerify(const char* phase, bool untyped = false);
@@ -639,7 +657,10 @@ PipelineCompilationJob::Status PipelineCompilationJob::OptimizeGraphImpl() {
}
PipelineCompilationJob::Status PipelineCompilationJob::GenerateCodeImpl() {
- Handle<Code> code = pipeline_.GenerateCode(linkage_);
+ if (!pipeline_.AssembleCode(linkage_)) {
+ return FAILED;
Michael Starzinger 2016/08/11 14:16:26 Can we unconditionally run both, "AssembleCode" an
ahaas 2016/08/11 14:54:19 Done.
+ }
+ Handle<Code> code = pipeline_.FinishCodeObject();
if (code.is_null()) {
if (info()->bailout_reason() == kNoReason) {
return AbortOptimization(kCodeGenerationFailed);
@@ -664,7 +685,7 @@ class PipelineWasmCompilationJob final : public CompilationJob {
zone_pool_(info->isolate()->allocator()),
data_(&zone_pool_, info, graph, source_positions),
pipeline_(&data_),
- linkage_(descriptor) {}
+ descriptor_(descriptor) {}
protected:
Status CreateGraphImpl() final;
@@ -675,7 +696,7 @@ class PipelineWasmCompilationJob final : public CompilationJob {
ZonePool zone_pool_;
PipelineData data_;
PipelineImpl pipeline_;
- Linkage linkage_;
+ CallDescriptor* descriptor_;
};
PipelineWasmCompilationJob::Status
@@ -693,13 +714,15 @@ PipelineWasmCompilationJob::OptimizeGraphImpl() {
pipeline_.RunPrintAndVerify("Machine", true);
- if (!pipeline_.ScheduleAndSelectInstructions(&linkage_)) return FAILED;
+ Linkage linkage(descriptor_);
+ if (!pipeline_.ScheduleAndSelectInstructions(&linkage)) return FAILED;
+ if (!pipeline_.AssembleCode(&linkage)) return FAILED;
return SUCCEEDED;
}
PipelineWasmCompilationJob::Status
PipelineWasmCompilationJob::GenerateCodeImpl() {
- pipeline_.GenerateCode(&linkage_);
+ pipeline_.FinishCodeObject();
return SUCCEEDED;
}
@@ -1392,17 +1415,23 @@ struct JumpThreadingPhase {
}
};
-
-struct GenerateCodePhase {
+struct AssembleCodePhase {
static const char* phase_name() { return "generate code"; }
void Run(PipelineData* data, Zone* temp_zone, Linkage* linkage) {
- CodeGenerator generator(data->frame(), linkage, data->sequence(),
- data->info());
- data->set_code(generator.GenerateCode());
+ data->code_generator()->Initialize(data->frame(), linkage,
+ data->sequence());
+ data->code_generator()->AssembleCode();
}
};
+struct FinishCodeObjectPhase {
+ static const char* phase_name() { return "generate code"; }
+
+ void Run(PipelineData* data, Zone* temp_zone) {
+ data->set_code(data->code_generator()->FinishCodeObject());
+ }
+};
struct PrintGraphPhase {
static const char* phase_name() { return nullptr; }
@@ -1655,7 +1684,8 @@ Handle<Code> Pipeline::GenerateCodeForTesting(CompilationInfo* info) {
if (!pipeline.CreateGraph()) return Handle<Code>::null();
if (!pipeline.OptimizeGraph(&linkage)) return Handle<Code>::null();
- return pipeline.GenerateCode(&linkage);
+ pipeline.AssembleCode(&linkage);
+ return pipeline.FinishCodeObject();
}
// static
@@ -1783,13 +1813,22 @@ bool PipelineImpl::ScheduleAndSelectInstructions(Linkage* linkage) {
return true;
}
-Handle<Code> PipelineImpl::GenerateCode(Linkage* linkage) {
+bool PipelineImpl::AssembleCode(Linkage* linkage) {
+ PipelineData* data = this->data_;
+
+ data->BeginPhaseKind("assemble code");
+
+ // Assemble machine code.
+ Run<AssembleCodePhase>(linkage);
+ return data->assemble_code_successful();
+}
+Handle<Code> PipelineImpl::FinishCodeObject() {
Michael Starzinger 2016/08/11 14:16:26 nit: Empty newline between functions.
ahaas 2016/08/11 14:54:19 Done.
PipelineData* data = this->data_;
- data->BeginPhaseKind("code generation");
+ data->BeginPhaseKind("finish code generation");
- // Generate final machine code.
- Run<GenerateCodePhase>(linkage);
+ // Generate final code object.
+ Run<FinishCodeObjectPhase>();
Handle<Code> code = data->code();
if (data->profiler_data()) {
@@ -1836,7 +1875,8 @@ Handle<Code> PipelineImpl::ScheduleAndGenerateCode(
if (!ScheduleAndSelectInstructions(&linkage)) return Handle<Code>();
// Generate the final machine code.
- return GenerateCode(&linkage);
+ AssembleCode(&linkage);
+ return FinishCodeObject();
}
void PipelineImpl::AllocateRegisters(const RegisterConfiguration* config,
« src/compiler/code-generator.cc ('K') | « src/compiler/code-generator.cc ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698