v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
phase.h
Go to the documentation of this file.
1// Copyright 2023 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_COMPILER_TURBOSHAFT_PHASE_H_
6#define V8_COMPILER_TURBOSHAFT_PHASE_H_
7
8#include <optional>
9#include <type_traits>
10
11#include "src/base/contextual.h"
15#include "src/common/globals.h"
21#include "src/compiler/osr.h"
22#include "src/compiler/phase.h"
29#include "src/zone/zone.h"
30
31#define DECL_TURBOSHAFT_PHASE_CONSTANTS_IMPL(Name, CallStatsName) \
32 DECL_PIPELINE_PHASE_CONSTANTS_HELPER(CallStatsName, PhaseKind::kTurboshaft, \
33 RuntimeCallStats::kThreadSpecific) \
34 static constexpr char kPhaseName[] = "V8.TF" #CallStatsName; \
35 static void AssertTurboshaftPhase() { \
36 static_assert(TurboshaftPhase<Name##Phase>); \
37 }
38
39#define DECL_TURBOSHAFT_PHASE_CONSTANTS(Name) \
40 DECL_TURBOSHAFT_PHASE_CONSTANTS_IMPL(Name, Turboshaft##Name)
41#define DECL_TURBOSHAFT_PHASE_CONSTANTS_WITH_LEGACY_NAME(Name) \
42 DECL_TURBOSHAFT_PHASE_CONSTANTS_IMPL(Name, Name)
43
44#define DECL_TURBOSHAFT_MAIN_THREAD_PIPELINE_PHASE_CONSTANTS_WITH_LEGACY_NAME( \
45 Name) \
46 DECL_PIPELINE_PHASE_CONSTANTS_HELPER(Name, PhaseKind::kTurboshaft, \
47 RuntimeCallStats::kExact) \
48 static constexpr char kPhaseName[] = "V8.TF" #Name; \
49 static void AssertTurboshaftPhase() { \
50 static_assert(TurboshaftPhase<Name##Phase>); \
51 }
52
53namespace v8::internal::compiler {
54class RegisterAllocationData;
55class Schedule;
56class TurbofanPipelineStatistics;
57} // namespace v8::internal::compiler
58
60
61class PipelineData;
62
63template <typename Phase>
65 using parameters = base::tmp::call_parameters_t<decltype(&Phase::Run)>;
66 static_assert(
68 "Phase::Run needs at least two parameters (PipelineData* and Zone*)");
71 static constexpr bool value = std::is_same_v<parameter0, PipelineData*> &&
72 std::is_same_v<parameter1, Zone*>;
73};
74
75template <typename Phase, typename... Args>
78 requires(Phase p) { p.kKind == PhaseKind::kTurboshaft; };
79
80template <typename Phase>
81concept TurbofanPhase = requires(Phase p) { p.kKind == PhaseKind::kTurbofan; };
82
83template <typename Phase>
85
86namespace detail {
87template <typename, typename = void>
88struct produces_printable_graph_impl : std::true_type {};
89
90template <typename P>
92 P, std::void_t<decltype(P::kOutputIsTraceableGraph)>>
93 : std::bool_constant<P::kOutputIsTraceableGraph> {};
94
95#ifdef HAS_CPP_CLASS_TYPES_AS_TEMPLATE_ARGS
96template <base::tmp::StringLiteral ZoneName>
97#else
98template <auto ZoneName>
99#endif
101 template <typename T>
103
104 explicit ComponentWithZone(ZoneStats* zone_stats)
105 : zone(zone_stats,
106#ifdef HAS_CPP_CLASS_TYPES_AS_TEMPLATE_ARGS
107 ZoneName.c_str()
108#else
110#endif
111 ) {
112 }
114 : zone(std::move(existing_zone)) {}
115
117};
118
128
138
139struct CodegenComponent : public ComponentWithZone<kCodegenZoneName> {
141
143 std::unique_ptr<CodeGenerator> code_generator;
145 // TODO(nicohartmann): Make {osr_helper} an optional once TurboFan's
146 // PipelineData is gone.
147 std::shared_ptr<OsrHelper> osr_helper;
151};
152
153struct InstructionComponent : public ComponentWithZone<kInstructionZoneName> {
155
157};
158
160 : public ComponentWithZone<kRegisterAllocationZoneName> {
162
164};
165} // namespace detail
166
167template <typename P>
170
172
176
183
184 public:
185 explicit PipelineData(ZoneStats* zone_stats,
188 const AssemblerOptions& assembler_options,
189 int start_source_position = kNoSourcePosition)
190 : zone_stats_(zone_stats),
191 compilation_zone_(zone_stats, kCompilationZoneName),
192 pipeline_kind_(pipeline_kind),
193 isolate_(isolate),
194 info_(info),
195 debug_name_(info_ ? info_->GetDebugName() : std::unique_ptr<char[]>{}),
196 start_source_position_(start_source_position),
197 assembler_options_(assembler_options) {
198#if V8_ENABLE_WEBASSEMBLY
199 if (info != nullptr) {
200 DCHECK_EQ(assembler_options_.is_wasm,
201 info->IsWasm() || info->IsWasmBuiltin());
202 }
203#endif
204 }
205
206 void InitializeBrokerAndDependencies(std::shared_ptr<JSHeapBroker> broker,
207 CompilationDependencies* dependencies) {
208 DCHECK_NULL(broker_.get());
209 DCHECK_NULL(dependencies_);
211 DCHECK_NOT_NULL(dependencies);
212 broker_ = std::move(broker);
213 dependencies_ = dependencies;
214 }
215
217 const CallDescriptor* call_descriptor,
218 std::optional<BytecodeHandlerData> bytecode_handler_data = {}) {
219 DCHECK(!builtin_component_.has_value());
220 builtin_component_.emplace(call_descriptor,
221 std::move(bytecode_handler_data));
222 }
223
225 DCHECK(!graph_component_.has_value());
226 graph_component_.emplace(zone_stats_);
227 auto& zone = graph_component_->zone;
228 graph_component_->graph = zone.New<Graph>(zone);
229 graph_component_->source_positions =
231 if (info_ && info_->trace_turbo_json()) {
232 graph_component_->node_origins = zone.New<NodeOriginTable>(zone);
233 }
234 }
235
240 DCHECK(!graph_component_.has_value());
241 graph_component_.emplace(std::move(graph_zone));
242 auto& zone = graph_component_->zone;
243 graph_component_->graph = zone.New<Graph>(zone);
244 graph_component_->source_positions = source_positions;
245 graph_component_->node_origins = node_origins;
246 if (!graph_component_->node_origins && info_ && info_->trace_turbo_json()) {
247 graph_component_->node_origins = zone.New<NodeOriginTable>(zone);
248 }
249 }
250
252 DCHECK(graph_component_.has_value());
253 graph_component_.reset();
254 }
255
257 std::shared_ptr<OsrHelper> osr_helper,
258 JumpOptimizationInfo* jump_optimization_info = nullptr) {
259 DCHECK(!codegen_component_.has_value());
260 codegen_component_.emplace(zone_stats_);
261 codegen_component_->osr_helper = std::move(osr_helper);
262 codegen_component_->jump_optimization_info = jump_optimization_info;
263 }
264
266 DCHECK(codegen_component_.has_value());
267 codegen_component_.reset();
268 }
269
271 DCHECK(codegen_component_.has_value());
272 CodegenComponent& cg = *codegen_component_;
273 DCHECK_NULL(codegen_component_->code_generator);
274#if V8_ENABLE_WEBASSEMBLY
275 DCHECK_EQ(assembler_options_.is_wasm,
276 info()->IsWasm() || info()->IsWasmBuiltin());
277#endif
278 std::optional<OsrHelper> osr_helper;
279 if (cg.osr_helper) osr_helper = *cg.osr_helper;
280 cg.code_generator = std::make_unique<CodeGenerator>(
281 cg.zone, cg.frame, linkage, sequence(), info_, isolate_,
282 std::move(osr_helper), start_source_position_,
283 cg.jump_optimization_info, assembler_options_, info_->builtin(),
285 v8_flags.trace_turbo_stack_accesses ? debug_name_.get() : nullptr);
286 }
287
288 void InitializeInstructionComponent(const CallDescriptor* call_descriptor) {
289 DCHECK(!instruction_component_.has_value());
290 instruction_component_.emplace(zone_stats());
291 auto& zone = instruction_component_->zone;
292 InstructionBlocks* instruction_blocks =
293 InstructionSequence::InstructionBlocksFor(zone, graph());
294 instruction_component_->sequence =
295 zone.New<InstructionSequence>(isolate(), zone, instruction_blocks);
296 if (call_descriptor && call_descriptor->RequiresFrameAsIncoming()) {
297 instruction_component_->sequence->instruction_blocks()[0]
298 ->mark_needs_frame();
299 } else {
300 DCHECK(call_descriptor->CalleeSavedFPRegisters().is_empty());
301 }
302 }
303
305 InstructionSequence* sequence) {
306 DCHECK(!instruction_component_.has_value());
307 instruction_component_.emplace(zone_stats());
308 instruction_component_->sequence =
310 }
311
313 DCHECK(instruction_component_.has_value());
314 instruction_component_.reset();
315 }
316
317 void InitializeRegisterComponent(const RegisterConfiguration* config,
318 CallDescriptor* call_descriptor);
319
321 DCHECK(register_component_.has_value());
322 register_component_.reset();
323 }
324
325 AccountingAllocator* allocator() const;
326 ZoneStats* zone_stats() const { return zone_stats_; }
327 TurboshaftPipelineKind pipeline_kind() const { return pipeline_kind_; }
328 Isolate* isolate() const { return isolate_; }
330 const char* debug_name() const { return debug_name_.get(); }
331 JSHeapBroker* broker() const { return broker_.get(); }
332 CompilationDependencies* depedencies() const { return dependencies_; }
334 return assembler_options_;
335 }
337 if (!codegen_component_.has_value()) return nullptr;
338 return codegen_component_->jump_optimization_info;
339 }
341 DCHECK(builtin_component_.has_value());
342 return builtin_component_->call_descriptor;
343 }
344 std::optional<BytecodeHandlerData>& bytecode_handler_data() {
345 DCHECK(builtin_component_.has_value());
346 return builtin_component_->bytecode_handler_data;
347 }
348
349 bool has_graph() const {
350 DCHECK_IMPLIES(graph_component_.has_value(),
351 graph_component_->graph != nullptr);
352 return graph_component_.has_value();
353 }
354 ZoneWithName<kGraphZoneName>& graph_zone() { return graph_component_->zone; }
355 turboshaft::Graph& graph() const { return *graph_component_->graph; }
357 return graph_component_->source_positions;
358 }
360 if (!graph_component_.has_value()) return nullptr;
361 return graph_component_->node_origins;
362 }
364 return register_component_->allocation_data;
365 }
367 return register_component_->zone;
368 }
370 return codegen_component_->code_generator.get();
371 }
373 DCHECK(code_.is_null());
374 code_ = code;
375 }
378 return instruction_component_->sequence;
379 }
380 Frame* frame() const { return codegen_component_->frame; }
381 CodeTracer* GetCodeTracer() const;
383 return codegen_component_->max_unoptimized_frame_height;
384 }
386 return codegen_component_->max_pushed_argument_count;
387 }
388 RuntimeCallStats* runtime_call_stats() const { return runtime_call_stats_; }
390 runtime_call_stats_ = stats;
391 }
392
393 // The {compilation_zone} outlives the entire compilation pipeline. It is
394 // shared between all phases (including code gen where the graph zone is gone
395 // already).
397 return compilation_zone_;
398 }
399
401 return pipeline_statistics_;
402 }
404 TurbofanPipelineStatistics* pipeline_statistics) {
405 pipeline_statistics_ = pipeline_statistics;
406 }
407
408#if V8_ENABLE_WEBASSEMBLY
409 // Module-specific signature: type indices are only valid in the WasmModule*
410 // they belong to.
411 const wasm::FunctionSig* wasm_module_sig() const { return wasm_module_sig_; }
412
413 // Canonicalized (module-independent) signature.
414 const wasm::CanonicalSig* wasm_canonical_sig() const {
415 return wasm_canonical_sig_;
416 }
417
418 const wasm::WasmModule* wasm_module() const { return wasm_module_; }
419
420 bool wasm_shared() const { return wasm_shared_; }
421
422 void SetIsWasmFunction(const wasm::WasmModule* module,
423 const wasm::FunctionSig* sig, bool shared) {
424 wasm_module_ = module;
425 wasm_module_sig_ = sig;
426 wasm_shared_ = shared;
427 DCHECK(pipeline_kind() == TurboshaftPipelineKind::kWasm ||
428 pipeline_kind() == TurboshaftPipelineKind::kJSToWasm);
429 }
430
431 void SetIsWasmWrapper(const wasm::CanonicalSig* sig) {
432 wasm_canonical_sig_ = sig;
433 DCHECK(pipeline_kind() == TurboshaftPipelineKind::kWasm ||
434 pipeline_kind() == TurboshaftPipelineKind::kJSToWasm);
435 }
436
437#ifdef V8_ENABLE_WASM_SIMD256_REVEC
438 WasmRevecAnalyzer* wasm_revec_analyzer() const {
439 DCHECK_NOT_NULL(wasm_revec_analyzer_);
440 return wasm_revec_analyzer_;
441 }
442
443 void set_wasm_revec_analyzer(WasmRevecAnalyzer* wasm_revec_analyzer) {
444 DCHECK_NULL(wasm_revec_analyzer_);
445 wasm_revec_analyzer_ = wasm_revec_analyzer;
446 }
447
448 void clear_wasm_revec_analyzer() { wasm_revec_analyzer_ = nullptr; }
449#endif // V8_ENABLE_WASM_SIMD256_REVEC
450
451 WasmShuffleAnalyzer* wasm_shuffle_analyzer() const {
452 DCHECK_NOT_NULL(wasm_shuffle_analyzer_);
453 return wasm_shuffle_analyzer_;
454 }
455
456 void set_wasm_shuffle_analyzer(WasmShuffleAnalyzer* wasm_shuffle_analyzer) {
457 DCHECK_NULL(wasm_shuffle_analyzer_);
458 wasm_shuffle_analyzer_ = wasm_shuffle_analyzer;
459 }
460
461 void clear_wasm_shuffle_analyzer() { wasm_shuffle_analyzer_ = nullptr; }
462#endif // V8_ENABLE_WEBASSEMBLY
463
464 bool is_wasm() const {
465 return pipeline_kind() == TurboshaftPipelineKind::kWasm ||
466 pipeline_kind() == TurboshaftPipelineKind::kJSToWasm;
467 }
468 bool is_js_to_wasm() const {
469 return pipeline_kind() == TurboshaftPipelineKind::kJSToWasm;
470 }
471
472 void InitializeFrameData(CallDescriptor* call_descriptor) {
473 DCHECK(codegen_component_.has_value());
474 DCHECK_NULL(codegen_component_->frame);
475 int fixed_frame_size = 0;
476 if (call_descriptor != nullptr) {
477 fixed_frame_size =
478 call_descriptor->CalculateFixedFrameSize(info()->code_kind());
479 }
480 codegen_component_->frame = codegen_component_->zone.New<Frame>(
481 fixed_frame_size, codegen_component_->zone);
482 if (codegen_component_->osr_helper) {
483 codegen_component_->osr_helper->SetupFrame(codegen_component_->frame);
484 }
485 }
486
487 void set_source_position_output(std::string source_position_output) {
488 source_position_output_ = std::move(source_position_output);
489 }
490 std::string source_position_output() const { return source_position_output_; }
491
493 return graph_component_->graph_has_special_rpo;
494 }
496 graph_component_->graph_has_special_rpo = true;
497 }
499 return graph_component_->graph_has_lowered_fast_api_calls;
500 }
502 graph_component_->graph_has_lowered_fast_api_calls = true;
503 }
504
505 private:
507 // The {compilation_zone_} outlives the entire compilation pipeline. It is
508 // shared between all phases (including code gen where the graph zone is gone
509 // already).
512 Isolate* const isolate_ = nullptr;
514 std::unique_ptr<char[]> debug_name_;
515 // TODO(nicohartmann): Use unique_ptr once TurboFan's pipeline data is gone.
516 std::shared_ptr<JSHeapBroker> broker_;
517 TurbofanPipelineStatistics* pipeline_statistics_ = nullptr;
518 CompilationDependencies* dependencies_ = nullptr;
519 int start_source_position_ = kNoSourcePosition;
523 RuntimeCallStats* runtime_call_stats_ = nullptr;
524 // Components
525 std::optional<BuiltinComponent> builtin_component_;
526 std::optional<GraphComponent> graph_component_;
527 std::optional<CodegenComponent> codegen_component_;
528 std::optional<InstructionComponent> instruction_component_;
529 std::optional<RegisterComponent> register_component_;
530
531#if V8_ENABLE_WEBASSEMBLY
532 // TODO(14108): Consider splitting wasm members into its own WasmPipelineData
533 // if we need many of them.
534 const wasm::FunctionSig* wasm_module_sig_ = nullptr;
535 const wasm::CanonicalSig* wasm_canonical_sig_ = nullptr;
536 const wasm::WasmModule* wasm_module_ = nullptr;
537 bool wasm_shared_ = false;
538 WasmShuffleAnalyzer* wasm_shuffle_analyzer_ = nullptr;
539#ifdef V8_ENABLE_WASM_SIMD256_REVEC
540
541 WasmRevecAnalyzer* wasm_revec_analyzer_ = nullptr;
542#endif // V8_ENABLE_WASM_SIMD256_REVEC
543#endif // V8_ENABLE_WEBASSEMBLY
544};
545
546void PrintTurboshaftGraph(PipelineData* data, Zone* temp_zone,
547 CodeTracer* code_tracer, const char* phase_name);
548void PrintTurboshaftGraphForTurbolizer(std::ofstream& stream,
549 const Graph& graph,
550 const char* phase_name,
551 NodeOriginTable* node_origins,
552 Zone* temp_zone);
553
554} // namespace v8::internal::compiler::turboshaft
555
556#endif // V8_COMPILER_TURBOSHAFT_PHASE_H_
TFGraph * graph
Isolate * isolate_
constexpr bool is_empty() const
int CalculateFixedFrameSize(CodeKind code_kind) const
Definition linkage.cc:204
DoubleRegList CalleeSavedFPRegisters() const
Definition linkage.h:303
const GrowingOpIndexSidetable< SourcePosition > & source_positions() const
Definition graph.h:1003
void InitializeCodeGenerator(Linkage *linkage)
Definition phase.h:270
void set_pipeline_statistics(TurbofanPipelineStatistics *pipeline_statistics)
Definition phase.h:403
ZoneWithName< kGraphZoneName > & graph_zone()
Definition phase.h:354
void InitializeBuiltinComponent(const CallDescriptor *call_descriptor, std::optional< BytecodeHandlerData > bytecode_handler_data={})
Definition phase.h:216
void InitializeCodegenComponent(std::shared_ptr< OsrHelper > osr_helper, JumpOptimizationInfo *jump_optimization_info=nullptr)
Definition phase.h:256
TurboshaftPipelineKind pipeline_kind() const
Definition phase.h:327
RuntimeCallStats * runtime_call_stats() const
Definition phase.h:388
turboshaft::Graph & graph() const
Definition phase.h:355
void InitializeBrokerAndDependencies(std::shared_ptr< JSHeapBroker > broker, CompilationDependencies *dependencies)
Definition phase.h:206
const AssemblerOptions & assembler_options() const
Definition phase.h:333
std::optional< CodegenComponent > codegen_component_
Definition phase.h:527
void InitializeInstructionComponent(const CallDescriptor *call_descriptor)
Definition phase.h:288
RegisterAllocationData * register_allocation_data() const
Definition phase.h:363
JumpOptimizationInfo * jump_optimization_info()
Definition phase.h:336
std::shared_ptr< JSHeapBroker > broker_
Definition phase.h:516
PipelineData(ZoneStats *zone_stats, TurboshaftPipelineKind pipeline_kind, Isolate *isolate, OptimizedCompilationInfo *info, const AssemblerOptions &assembler_options, int start_source_position=kNoSourcePosition)
Definition phase.h:185
GraphComponent::Pointer< SourcePositionTable > source_positions() const
Definition phase.h:356
void set_source_position_output(std::string source_position_output)
Definition phase.h:487
InstructionSequence * sequence() const
Definition phase.h:377
TurbofanPipelineStatistics * pipeline_statistics() const
Definition phase.h:400
void InitializeGraphComponentWithGraphZone(ZoneWithName< kGraphZoneName > graph_zone, ZoneWithNamePointer< SourcePositionTable, kGraphZoneName > source_positions, ZoneWithNamePointer< NodeOriginTable, kGraphZoneName > node_origins)
Definition phase.h:236
void set_code(MaybeIndirectHandle< Code > code)
Definition phase.h:372
std::optional< BuiltinComponent > builtin_component_
Definition phase.h:525
MaybeIndirectHandle< Code > code() const
Definition phase.h:376
MaybeIndirectHandle< Code > code_
Definition phase.h:521
std::optional< RegisterComponent > register_component_
Definition phase.h:529
void InitializeInstructionComponentWithSequence(InstructionSequence *sequence)
Definition phase.h:304
void set_runtime_call_stats(RuntimeCallStats *stats)
Definition phase.h:389
std::optional< BytecodeHandlerData > & bytecode_handler_data()
Definition phase.h:344
GraphComponent::Pointer< NodeOriginTable > node_origins() const
Definition phase.h:359
OptimizedCompilationInfo * info() const
Definition phase.h:329
std::optional< GraphComponent > graph_component_
Definition phase.h:526
void InitializeGraphComponent(SourcePositionTable *source_positions)
Definition phase.h:224
void InitializeFrameData(CallDescriptor *call_descriptor)
Definition phase.h:472
std::optional< InstructionComponent > instruction_component_
Definition phase.h:528
ZoneWithName< kRegisterAllocationZoneName > & register_allocation_zone()
Definition phase.h:366
ZoneWithName< kCompilationZoneName > & compilation_zone()
Definition phase.h:396
ZoneWithName< kCompilationZoneName > compilation_zone_
Definition phase.h:510
const CallDescriptor * builtin_call_descriptor() const
Definition phase.h:340
CompilationDependencies * depedencies() const
Definition phase.h:332
Handle< Code > code
JSHeapBroker *const broker_
Handle< SharedFunctionInfo > info
ZoneList< RegExpInstruction > code_
TurboshaftPipelineKind pipeline_kind
Isolate * isolate
Zone * graph_zone
SourcePositionTable * source_positions
JSHeapBroker * broker
Linkage * linkage
SharedFunctionInfoRef shared
STL namespace.
constexpr size_t length_v
Definition list.h:163
typename element< List, Index >::type element_t
Definition list.h:173
typename call_parameters< T >::type call_parameters_t
Definition functional.h:30
void PrintTurboshaftGraph(PipelineData *data, Zone *temp_zone, CodeTracer *code_tracer, const char *phase_name)
Definition phase.cc:39
void PrintTurboshaftGraphForTurbolizer(std::ofstream &stream, const Graph &graph, const char *phase_name, NodeOriginTable *node_origins, Zone *temp_zone)
Definition phase.cc:62
constexpr char kCompilationZoneName[]
Definition operations.h:60
base::Vector< const char > GetDebugName(Zone *zone, const wasm::WasmModule *module, const wasm::WireBytesStorage *wire_bytes, int index)
constexpr int kNoSourcePosition
Definition globals.h:850
kWasmInternalFunctionIndirectPointerTag kProtectedInstanceDataOffset sig
constexpr int P
V8_EXPORT_PRIVATE FlagValues v8_flags
OptimizedCompilationInfo * info_
Definition pipeline.cc:305
#define DCHECK_NULL(val)
Definition logging.h:491
#define DCHECK_NOT_NULL(val)
Definition logging.h:492
#define DCHECK_IMPLIES(v1, v2)
Definition logging.h:493
#define DCHECK(condition)
Definition logging.h:482
#define DCHECK_EQ(v1, v2)
Definition logging.h:485
#define V8_EXPORT_PRIVATE
Definition macros.h:460
base::tmp::call_parameters_t< decltype(&Phase::Run)> parameters
Definition phase.h:65
base::tmp::element_t< parameters, 0 > parameter0
Definition phase.h:69
base::tmp::element_t< parameters, 1 > parameter1
Definition phase.h:70
std::optional< BytecodeHandlerData > bytecode_handler_data
Definition phase.h:121
BuiltinComponent(const CallDescriptor *call_descriptor, std::optional< BytecodeHandlerData > bytecode_handler_data)
Definition phase.h:123
std::unique_ptr< CodeGenerator > code_generator
Definition phase.h:143
ComponentWithZone(ZoneWithName< ZoneName > existing_zone)
Definition phase.h:113
Pointer< SourcePositionTable > source_positions
Definition phase.h:133
Pointer< RegisterAllocationData > allocation_data
Definition phase.h:163
#define ZONE_NAME
Definition zone.h:22