blob: fa62255f5c555430fc4e6cf121995a7cb289dc2d [file] [log] [blame]
// Copyright 2022 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
#ifndef V8_MAGLEV_MAGLEV_COMPILATION_UNIT_H_
#define V8_MAGLEV_MAGLEV_COMPILATION_UNIT_H_
#include "src/common/globals.h"
#include "src/compiler/bytecode-analysis.h"
#include "src/compiler/heap-refs.h"
namespace v8 {
namespace internal {
namespace maglev {
enum class ValueRepresentation : uint8_t;
class MaglevCompilationInfo;
class MaglevGraphLabeller;
class Node;
// Per-unit data, i.e. once per top-level function and once per inlined
// function.
class MaglevCompilationUnit : public ZoneObject {
public:
static MaglevCompilationUnit* New(Zone* zone, MaglevCompilationInfo* info,
Handle<JSFunction> function) {
return zone->New<MaglevCompilationUnit>(info, function);
}
static MaglevCompilationUnit* NewInner(
Zone* zone, const MaglevCompilationUnit* caller,
compiler::SharedFunctionInfoRef shared_function_info,
compiler::FeedbackVectorRef feedback_vector) {
return zone->New<MaglevCompilationUnit>(
caller->info(), caller, shared_function_info, feedback_vector);
}
static MaglevCompilationUnit* NewDummy(Zone* zone,
const MaglevCompilationUnit* caller,
int register_count,
int parameter_count) {
return zone->New<MaglevCompilationUnit>(caller->info(), caller,
register_count, parameter_count);
}
MaglevCompilationUnit(MaglevCompilationInfo* info,
Handle<JSFunction> function);
MaglevCompilationUnit(MaglevCompilationInfo* info,
const MaglevCompilationUnit* caller,
compiler::SharedFunctionInfoRef shared_function_info,
compiler::FeedbackVectorRef feedback_vector);
MaglevCompilationUnit(MaglevCompilationInfo* info,
const MaglevCompilationUnit* caller, int register_count,
int parameter_count);
MaglevCompilationInfo* info() const { return info_; }
const MaglevCompilationUnit* caller() const { return caller_; }
compiler::JSHeapBroker* broker() const;
LocalIsolate* local_isolate() const;
Zone* zone() const;
int register_count() const { return register_count_; }
int parameter_count() const { return parameter_count_; }
bool is_osr() const;
BytecodeOffset osr_offset() const;
int inlining_depth() const { return inlining_depth_; }
bool is_inline() const { return inlining_depth_ != 0; }
bool has_graph_labeller() const;
MaglevGraphLabeller* graph_labeller() const;
compiler::SharedFunctionInfoRef shared_function_info() const {
return shared_function_info_.value();
}
compiler::BytecodeArrayRef bytecode() const { return bytecode_.value(); }
compiler::FeedbackVectorRef feedback() const { return feedback_.value(); }
void RegisterNodeInGraphLabeller(const Node* node);
private:
MaglevCompilationInfo* const info_;
const MaglevCompilationUnit* const caller_;
const compiler::OptionalSharedFunctionInfoRef shared_function_info_;
const compiler::OptionalBytecodeArrayRef bytecode_;
const compiler::OptionalFeedbackVectorRef feedback_;
const int register_count_;
const int parameter_count_;
const int inlining_depth_;
};
} // namespace maglev
} // namespace internal
} // namespace v8
#endif // V8_MAGLEV_MAGLEV_COMPILATION_UNIT_H_