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

Side by Side Diff: src/compiler/pipeline.cc

Issue 2500443004: [wasm] OOB traps: build protected instruction list during codegen (Closed)
Patch Set: Removing spurious changes Created 4 years 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 unified diff | Download patch
« no previous file with comments | « src/compiler/pipeline.h ('k') | src/compiler/wasm-compiler.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2014 the V8 project authors. All rights reserved. 1 // Copyright 2014 the V8 project authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 #include "src/compiler/pipeline.h" 5 #include "src/compiler/pipeline.h"
6 6
7 #include <fstream> // NOLINT(readability/streams) 7 #include <fstream> // NOLINT(readability/streams)
8 #include <memory> 8 #include <memory>
9 #include <sstream> 9 #include <sstream>
10 10
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
67 #include "src/compiler/tail-call-optimization.h" 67 #include "src/compiler/tail-call-optimization.h"
68 #include "src/compiler/typed-optimization.h" 68 #include "src/compiler/typed-optimization.h"
69 #include "src/compiler/typer.h" 69 #include "src/compiler/typer.h"
70 #include "src/compiler/value-numbering-reducer.h" 70 #include "src/compiler/value-numbering-reducer.h"
71 #include "src/compiler/verifier.h" 71 #include "src/compiler/verifier.h"
72 #include "src/compiler/zone-stats.h" 72 #include "src/compiler/zone-stats.h"
73 #include "src/isolate-inl.h" 73 #include "src/isolate-inl.h"
74 #include "src/ostreams.h" 74 #include "src/ostreams.h"
75 #include "src/parsing/parse-info.h" 75 #include "src/parsing/parse-info.h"
76 #include "src/register-configuration.h" 76 #include "src/register-configuration.h"
77 #include "src/trap-handler/trap-handler.h"
77 #include "src/type-info.h" 78 #include "src/type-info.h"
78 #include "src/utils.h" 79 #include "src/utils.h"
79 80
80 namespace v8 { 81 namespace v8 {
81 namespace internal { 82 namespace internal {
82 namespace compiler { 83 namespace compiler {
83 84
84 class PipelineData { 85 class PipelineData {
85 public: 86 public:
86 // For main entry point. 87 // For main entry point.
(...skipping 20 matching lines...) Expand all
107 InstructionSelector::SupportedMachineOperatorFlags(), 108 InstructionSelector::SupportedMachineOperatorFlags(),
108 InstructionSelector::AlignmentRequirements()); 109 InstructionSelector::AlignmentRequirements());
109 common_ = new (graph_zone_) CommonOperatorBuilder(graph_zone_); 110 common_ = new (graph_zone_) CommonOperatorBuilder(graph_zone_);
110 javascript_ = new (graph_zone_) JSOperatorBuilder(graph_zone_); 111 javascript_ = new (graph_zone_) JSOperatorBuilder(graph_zone_);
111 jsgraph_ = new (graph_zone_) 112 jsgraph_ = new (graph_zone_)
112 JSGraph(isolate_, graph_, common_, javascript_, simplified_, machine_); 113 JSGraph(isolate_, graph_, common_, javascript_, simplified_, machine_);
113 } 114 }
114 115
115 // For WASM compile entry point. 116 // For WASM compile entry point.
116 PipelineData(ZoneStats* zone_stats, CompilationInfo* info, JSGraph* jsgraph, 117 PipelineData(ZoneStats* zone_stats, CompilationInfo* info, JSGraph* jsgraph,
117 SourcePositionTable* source_positions) 118 SourcePositionTable* source_positions,
119 ZoneVector<trap_handler::ProtectedInstructionData>*
120 protected_instructions)
118 : isolate_(info->isolate()), 121 : isolate_(info->isolate()),
119 info_(info), 122 info_(info),
120 debug_name_(info_->GetDebugName()), 123 debug_name_(info_->GetDebugName()),
121 zone_stats_(zone_stats), 124 zone_stats_(zone_stats),
122 graph_zone_scope_(zone_stats_, ZONE_NAME), 125 graph_zone_scope_(zone_stats_, ZONE_NAME),
123 graph_(jsgraph->graph()), 126 graph_(jsgraph->graph()),
124 source_positions_(source_positions), 127 source_positions_(source_positions),
125 machine_(jsgraph->machine()), 128 machine_(jsgraph->machine()),
126 common_(jsgraph->common()), 129 common_(jsgraph->common()),
127 javascript_(jsgraph->javascript()), 130 javascript_(jsgraph->javascript()),
128 jsgraph_(jsgraph), 131 jsgraph_(jsgraph),
129 instruction_zone_scope_(zone_stats_, ZONE_NAME), 132 instruction_zone_scope_(zone_stats_, ZONE_NAME),
130 instruction_zone_(instruction_zone_scope_.zone()), 133 instruction_zone_(instruction_zone_scope_.zone()),
131 register_allocation_zone_scope_(zone_stats_, ZONE_NAME), 134 register_allocation_zone_scope_(zone_stats_, ZONE_NAME),
132 register_allocation_zone_(register_allocation_zone_scope_.zone()) {} 135 register_allocation_zone_(register_allocation_zone_scope_.zone()),
136 protected_instructions_(protected_instructions) {}
133 137
134 // For machine graph testing entry point. 138 // For machine graph testing entry point.
135 PipelineData(ZoneStats* zone_stats, CompilationInfo* info, Graph* graph, 139 PipelineData(ZoneStats* zone_stats, CompilationInfo* info, Graph* graph,
136 Schedule* schedule) 140 Schedule* schedule)
137 : isolate_(info->isolate()), 141 : isolate_(info->isolate()),
138 info_(info), 142 info_(info),
139 debug_name_(info_->GetDebugName()), 143 debug_name_(info_->GetDebugName()),
140 zone_stats_(zone_stats), 144 zone_stats_(zone_stats),
141 graph_zone_scope_(zone_stats_, ZONE_NAME), 145 graph_zone_scope_(zone_stats_, ZONE_NAME),
142 graph_(graph), 146 graph_(graph),
(...skipping 80 matching lines...) Expand 10 before | Expand all | Expand 10 after
223 profiler_data_ = profiler_data; 227 profiler_data_ = profiler_data;
224 } 228 }
225 229
226 std::string const& source_position_output() const { 230 std::string const& source_position_output() const {
227 return source_position_output_; 231 return source_position_output_;
228 } 232 }
229 void set_source_position_output(std::string const& source_position_output) { 233 void set_source_position_output(std::string const& source_position_output) {
230 source_position_output_ = source_position_output; 234 source_position_output_ = source_position_output;
231 } 235 }
232 236
237 ZoneVector<trap_handler::ProtectedInstructionData>* protected_instructions()
238 const {
239 return protected_instructions_;
240 }
241
233 void DeleteGraphZone() { 242 void DeleteGraphZone() {
234 if (graph_zone_ == nullptr) return; 243 if (graph_zone_ == nullptr) return;
235 graph_zone_scope_.Destroy(); 244 graph_zone_scope_.Destroy();
236 graph_zone_ = nullptr; 245 graph_zone_ = nullptr;
237 graph_ = nullptr; 246 graph_ = nullptr;
238 source_positions_ = nullptr; 247 source_positions_ = nullptr;
239 loop_assignment_ = nullptr; 248 loop_assignment_ = nullptr;
240 simplified_ = nullptr; 249 simplified_ = nullptr;
241 machine_ = nullptr; 250 machine_ = nullptr;
242 common_ = nullptr; 251 common_ = nullptr;
(...skipping 100 matching lines...) Expand 10 before | Expand all | Expand 10 after
343 ZoneStats::Scope register_allocation_zone_scope_; 352 ZoneStats::Scope register_allocation_zone_scope_;
344 Zone* register_allocation_zone_; 353 Zone* register_allocation_zone_;
345 RegisterAllocationData* register_allocation_data_ = nullptr; 354 RegisterAllocationData* register_allocation_data_ = nullptr;
346 355
347 // Basic block profiling support. 356 // Basic block profiling support.
348 BasicBlockProfiler::Data* profiler_data_ = nullptr; 357 BasicBlockProfiler::Data* profiler_data_ = nullptr;
349 358
350 // Source position output for --trace-turbo. 359 // Source position output for --trace-turbo.
351 std::string source_position_output_; 360 std::string source_position_output_;
352 361
362 ZoneVector<trap_handler::ProtectedInstructionData>* protected_instructions_ =
363 nullptr;
364
353 DISALLOW_COPY_AND_ASSIGN(PipelineData); 365 DISALLOW_COPY_AND_ASSIGN(PipelineData);
354 }; 366 };
355 367
356 class PipelineImpl final { 368 class PipelineImpl final {
357 public: 369 public:
358 explicit PipelineImpl(PipelineData* data) : data_(data) {} 370 explicit PipelineImpl(PipelineData* data) : data_(data) {}
359 371
360 // Helpers for executing pipeline phases. 372 // Helpers for executing pipeline phases.
361 template <typename Phase> 373 template <typename Phase>
362 void Run(); 374 void Run();
(...skipping 239 matching lines...) Expand 10 before | Expand all | Expand 10 after
602 info()->SetCode(code); 614 info()->SetCode(code);
603 if (info()->is_deoptimization_enabled()) { 615 if (info()->is_deoptimization_enabled()) {
604 info()->context()->native_context()->AddOptimizedCode(*code); 616 info()->context()->native_context()->AddOptimizedCode(*code);
605 RegisterWeakObjectsInOptimizedCode(code); 617 RegisterWeakObjectsInOptimizedCode(code);
606 } 618 }
607 return SUCCEEDED; 619 return SUCCEEDED;
608 } 620 }
609 621
610 class PipelineWasmCompilationJob final : public CompilationJob { 622 class PipelineWasmCompilationJob final : public CompilationJob {
611 public: 623 public:
612 explicit PipelineWasmCompilationJob(CompilationInfo* info, JSGraph* jsgraph, 624 explicit PipelineWasmCompilationJob(
613 CallDescriptor* descriptor, 625 CompilationInfo* info, JSGraph* jsgraph, CallDescriptor* descriptor,
614 SourcePositionTable* source_positions) 626 SourcePositionTable* source_positions,
627 ZoneVector<trap_handler::ProtectedInstructionData>* protected_insts)
615 : CompilationJob(info->isolate(), info, "TurboFan", 628 : CompilationJob(info->isolate(), info, "TurboFan",
616 State::kReadyToExecute), 629 State::kReadyToExecute),
617 zone_stats_(info->isolate()->allocator()), 630 zone_stats_(info->isolate()->allocator()),
618 data_(&zone_stats_, info, jsgraph, source_positions), 631 data_(&zone_stats_, info, jsgraph, source_positions, protected_insts),
619 pipeline_(&data_), 632 pipeline_(&data_),
620 linkage_(descriptor) {} 633 linkage_(descriptor) {}
621 634
622 protected: 635 protected:
623 Status PrepareJobImpl() final; 636 Status PrepareJobImpl() final;
624 Status ExecuteJobImpl() final; 637 Status ExecuteJobImpl() final;
625 Status FinalizeJobImpl() final; 638 Status FinalizeJobImpl() final;
626 639
627 private: 640 private:
628 ZoneStats zone_stats_; 641 ZoneStats zone_stats_;
(...skipping 767 matching lines...) Expand 10 before | Expand all | Expand 10 after
1396 } 1409 }
1397 } 1410 }
1398 }; 1411 };
1399 1412
1400 1413
1401 struct GenerateCodePhase { 1414 struct GenerateCodePhase {
1402 static const char* phase_name() { return "generate code"; } 1415 static const char* phase_name() { return "generate code"; }
1403 1416
1404 void Run(PipelineData* data, Zone* temp_zone, Linkage* linkage) { 1417 void Run(PipelineData* data, Zone* temp_zone, Linkage* linkage) {
1405 CodeGenerator generator(data->frame(), linkage, data->sequence(), 1418 CodeGenerator generator(data->frame(), linkage, data->sequence(),
1406 data->info()); 1419 data->info(), data->protected_instructions());
1407 data->set_code(generator.GenerateCode()); 1420 data->set_code(generator.GenerateCode());
1408 } 1421 }
1409 }; 1422 };
1410 1423
1411 1424
1412 struct PrintGraphPhase { 1425 struct PrintGraphPhase {
1413 static const char* phase_name() { return nullptr; } 1426 static const char* phase_name() { return nullptr; }
1414 1427
1415 void Run(PipelineData* data, Zone* temp_zone, const char* phase) { 1428 void Run(PipelineData* data, Zone* temp_zone, const char* phase) {
1416 CompilationInfo* info = data->info(); 1429 CompilationInfo* info = data->info();
(...skipping 303 matching lines...) Expand 10 before | Expand all | Expand 10 after
1720 } 1733 }
1721 1734
1722 // static 1735 // static
1723 CompilationJob* Pipeline::NewCompilationJob(Handle<JSFunction> function) { 1736 CompilationJob* Pipeline::NewCompilationJob(Handle<JSFunction> function) {
1724 return new PipelineCompilationJob(function->GetIsolate(), function); 1737 return new PipelineCompilationJob(function->GetIsolate(), function);
1725 } 1738 }
1726 1739
1727 // static 1740 // static
1728 CompilationJob* Pipeline::NewWasmCompilationJob( 1741 CompilationJob* Pipeline::NewWasmCompilationJob(
1729 CompilationInfo* info, JSGraph* jsgraph, CallDescriptor* descriptor, 1742 CompilationInfo* info, JSGraph* jsgraph, CallDescriptor* descriptor,
1730 SourcePositionTable* source_positions) { 1743 SourcePositionTable* source_positions,
1731 return new PipelineWasmCompilationJob(info, jsgraph, descriptor, 1744 ZoneVector<trap_handler::ProtectedInstructionData>*
1732 source_positions); 1745 protected_instructions) {
1746 return new PipelineWasmCompilationJob(
1747 info, jsgraph, descriptor, source_positions, protected_instructions);
1733 } 1748 }
1734 1749
1735 bool Pipeline::AllocateRegistersForTesting(const RegisterConfiguration* config, 1750 bool Pipeline::AllocateRegistersForTesting(const RegisterConfiguration* config,
1736 InstructionSequence* sequence, 1751 InstructionSequence* sequence,
1737 bool run_verifier) { 1752 bool run_verifier) {
1738 CompilationInfo info(ArrayVector("testing"), sequence->isolate(), 1753 CompilationInfo info(ArrayVector("testing"), sequence->isolate(),
1739 sequence->zone(), Code::ComputeFlags(Code::STUB)); 1754 sequence->zone(), Code::ComputeFlags(Code::STUB));
1740 ZoneStats zone_stats(sequence->isolate()->allocator()); 1755 ZoneStats zone_stats(sequence->isolate()->allocator());
1741 PipelineData data(&zone_stats, &info, sequence); 1756 PipelineData data(&zone_stats, &info, sequence);
1742 PipelineImpl pipeline(&data); 1757 PipelineImpl pipeline(&data);
(...skipping 228 matching lines...) Expand 10 before | Expand all | Expand 10 after
1971 data->DeleteRegisterAllocationZone(); 1986 data->DeleteRegisterAllocationZone();
1972 } 1987 }
1973 1988
1974 CompilationInfo* PipelineImpl::info() const { return data_->info(); } 1989 CompilationInfo* PipelineImpl::info() const { return data_->info(); }
1975 1990
1976 Isolate* PipelineImpl::isolate() const { return info()->isolate(); } 1991 Isolate* PipelineImpl::isolate() const { return info()->isolate(); }
1977 1992
1978 } // namespace compiler 1993 } // namespace compiler
1979 } // namespace internal 1994 } // namespace internal
1980 } // namespace v8 1995 } // namespace v8
OLDNEW
« no previous file with comments | « src/compiler/pipeline.h ('k') | src/compiler/wasm-compiler.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698