5#ifndef V8_TORQUE_IMPLEMENTATION_VISITOR_H_
6#define V8_TORQUE_IMPLEMENTATION_VISITOR_H_
27class ImplementationVisitor;
48 std::string description) {
51 result.temporary_description_ = std::move(description);
62 result.heap_reference_synchronization_ = synchronization;
79 result.assign_function_ = std::string{
"[]="};
84 std::string fieldname) {
87 result.assign_function_ =
"." + fieldname +
"=";
88 result.call_arguments_ = {
object};
95 result.bit_field_ = std::move(field);
138 return is_bitfield_access;
186 return is_call_access;
200 std::optional<Binding<LocalValue>*>
binding()
const {
247 std::optional<Binding<T>*>
TryLookup(
const std::string& name) {
249 Error(
"Trying to reference '", name,
"' which is marked as unused.")
254 (*binding)->SetUsed();
267 template <
class... Args>
269 : T(
std::forward<Args>(
args)...),
278 template <
class... Args>
286 "' is never used. Prefix with '_' if this is intentional.")
292 "' is never assigned to. Use 'const' instead of 'let'.")
334 std::make_unique<Binding<T>>(
manager_,
name, std::move(value));
336 if (mark_as_used) binding->
SetUsed();
344 std::make_unique<Binding<T>>(
manager_,
name, std::move(value));
346 if (mark_as_used) binding->
SetUsed();
352 std::vector<Binding<T>*>
result;
355 result.push_back(b.get());
363 if (binding->name() == name) {
365 "redeclaration of name \"", name,
366 "\" in the same block is illegal, previous declaration at: ",
367 binding->declaration_position());
379 : value(
std::move(reference)) {}
383 : lazy(
std::move(lazy)) {}
404 std::optional<LocationReference>
value;
425 auto binding = *manager_->current_bindings_[
name_];
426 if (!binding->IsAccessibleNonLazy())
return false;
442 std::vector<Binding<LocalLabel>*>
labels;
452 const std::string& output_directory);
468 template <
typename T>
470 const std::string& aggregate_name,
const std::vector<T>& aggregate_fields,
471 const std::vector<NameAndExpression>& initializers,
472 bool ignore_first_field =
false) {
473 size_t fields_offset = ignore_first_field ? 1 : 0;
474 size_t fields_size = aggregate_fields.size() - fields_offset;
475 for (
size_t i = 0;
i < std::min(fields_size, initializers.size());
i++) {
476 const std::string& field_name =
477 aggregate_fields[
i + fields_offset].name_and_type.name;
479 if (field_name != found_name->
value) {
480 Error(
"Expected field name \"", field_name,
"\" instead of \"",
481 found_name->
value,
"\"")
486 if (fields_size != initializers.size()) {
487 ReportError(
"expected ", fields_size,
" initializers for ",
488 aggregate_name,
" found ", initializers.size());
494 const std::vector<NameAndExpression>& expressions);
497 bool treat_optional_as_indexed =
false);
503 const std::map<std::string, LocalValue>& bindings);
525 bool ignore_stuct_field_constness =
false,
526 std::optional<SourcePosition>
pos = {});
540 void Visit(TypeAlias* decl);
542 std::optional<LocationReference> this_reference,
543 const std::vector<VisitResult>& arguments,
544 const std::vector<Block*> label_blocks);
640 if (!
result.IsOnStack()) {
641 if (!
visitor_->assembler().CurrentBlockIsComplete()) {
648 visitor_->assembler().CurrentStack().AboveTop());
654 result.stack_range().Size()));
660 if (!
visitor_->assembler().CurrentBlockIsComplete()) {
668 !
visitor_->assembler().CurrentBlockIsComplete(),
678 bool closed_ =
false;
695 const std::string& name);
696 std::optional<Binding<LocalLabel>*>
TryLookupLabel(
const std::string& name);
699 template <
class Container>
701 const Container& declaration_container,
705 bool silence_errors =
false);
709 template <
class Container>
711 const Container& declaration_container,
732 const Type* parameter_type,
733 std::vector<VisitResult>* converted_arguments,
735 std::vector<std::string>* constexpr_arguments,
739 std::optional<LocationReference> this_parameter,
742 bool tail_call =
false);
746 bool tail_call =
false);
749 bool tail_call =
false) {
751 std::move(parameters), specialization_types, tail_call);
754 const Arguments& parameters,
bool tail_call);
767 cpp::Class* owner,
const std::string& name,
const Signature& signature,
768 const NameVector& parameter_names,
bool pass_code_assembler_state =
true,
769 std::vector<std::string>* generated_parameter_names =
nullptr);
775 std::optional<StackRange> arguments = {});
778 const BitField& bitfield,
779 VisitResult bitfield_struct,
781 bool starts_as_zero =
false);
784 const std::vector<Identifier*>& names);
786 StackRange
LowerParameter(
const Type* type,
const std::string& parameter_name,
787 Stack<std::string>* lowered_parameters);
790 std::vector<std::string>* lowered_parameters);
798 if (
auto* streams = CurrentFileStreams::Get()) {
801 return streams->csa_ccfile;
803 return streams->class_definition_inline_headerfile_macro_definitions;
813 if (
auto* streams = CurrentFileStreams::Get()) {
816 return streams->csa_headerfile;
818 return streams->class_definition_inline_headerfile_macro_declarations;
831 std::optional<VisitResult>& current_return_value =
832 CurrentReturnValue::Get();
833 DCHECK_IMPLIES(current_return_value, *current_return_value == return_value);
834 current_return_value = std::move(return_value);
838 VisitResult return_value = *CurrentReturnValue::Get();
839 CurrentReturnValue::Get() = std::nullopt;
843 void WriteFile(
const std::string& file,
const std::string& content) {
863 class MacroInliningScope;
874 std::unordered_map<const Expression*, const Identifier*>
BindingsManager< T > * manager_
Binding(BindingsManager< T > *manager, const std::string &name, Args &&... args)
bool SkipLintCheck() const
Binding(const Binding &)=delete
uint64_t unique_index() const
std::string BindingTypeString() const
Binding(BindingsManager< T > *manager, const Identifier *name, Args &&... args)
Binding & operator=(const Binding &)=delete
const std::string & name() const
SourcePosition declaration_position_
bool CheckWritten() const
std::optional< Binding * > previous_binding_
SourcePosition declaration_position() const
std::unordered_map< std::string, std::optional< Binding< T > * > > current_bindings_
std::optional< Binding< T > * > TryLookup(const std::string &name)
Binding< T > * Add(const Identifier *name, T value, bool mark_as_used=false)
std::vector< std::unique_ptr< Binding< T > > > bindings_
std::vector< Binding< T > * > bindings() const
BindingsManager< T > * manager_
Binding< T > * Add(std::string name, T value, bool mark_as_used=false)
BlockBindings(BindingsManager< T > *manager)
void ReportErrorIfAlreadyBound(const std::string &name)
Binding< LocalLabel > break_binding_
BreakContinueActivator(Block *break_block, Block *continue_block)
Binding< LocalLabel > continue_binding_
StackScope(ImplementationVisitor *visitor)
ImplementationVisitor * visitor_
VisitResult Yield(VisitResult result)
VisitResult GenerateCopy(const VisitResult &to_copy)
void VisitMacroCommon(Macro *macro)
DECLARE_CONTEXTUAL_VARIABLE(LabelBindingsManager, BindingsManager< LocalLabel >)
void GenerateClassDebugReaders(const std::string &output_directory)
void GeneratePrintDefinitions(const std::string &output_directory)
std::unordered_set< const Macro * > inlining_macros_
void GenerateImplementation(const std::string &dir)
VisitResult GetAndClearReturnValue()
void GenerateBodyDescriptors(const std::string &output_directory)
std::ostream & csa_ccfile()
VisitResult GenerateFetchFromLocation(const LocationReference &reference)
LocationReference GenerateFieldAccess(LocationReference reference, const std::string &fieldname, bool ignore_stuct_field_constness=false, std::optional< SourcePosition > pos={})
std::vector< Binding< LocalLabel > * > LabelsFromIdentifiers(const std::vector< Identifier * > &names)
void AddCallParameter(Callable *callable, VisitResult parameter, const Type *parameter_type, std::vector< VisitResult > *converted_arguments, StackRange *argument_range, std::vector< std::string > *constexpr_arguments, bool inline_macro)
void GenerateAssignToLocation(const LocationReference &reference, const VisitResult &assignment_value)
void LowerLabelParameter(const Type *type, const std::string ¶meter_name, std::vector< std::string > *lowered_parameters)
cpp::Function GenerateFunction(cpp::Class *owner, const std::string &name, const Signature &signature, const NameVector ¶meter_names, bool pass_code_assembler_state=true, std::vector< std::string > *generated_parameter_names=nullptr)
void GenerateVisitorLists(const std::string &output_directory)
void GenerateBuiltinDefinitionsAndInterfaceDescriptors(const std::string &output_directory)
VisitResult GenerateSetBitField(const Type *bitfield_struct_type, const BitField &bitfield, VisitResult bitfield_struct, VisitResult value, bool starts_as_zero=false)
void GenerateBranch(const VisitResult &condition, Block *true_block, Block *false_block)
std::string ExternalLabelParameterName(const std::string &label_name, size_t i)
void EndDebugMacrosFile()
Binding< LocalLabel > * LookupLabel(const std::string &name)
InitializerResults VisitInitializerResults(const ClassType *class_type, const std::vector< NameAndExpression > &expressions)
LocationReference GenerateFieldReference(VisitResult object, const Field &field, const ClassType *class_type, bool treat_optional_as_indexed=false)
void GenerateCSATypes(const std::string &output_directory)
Method * LookupMethod(const std::string &name, const AggregateType *receiver_type, const Arguments &arguments, const TypeVector &specialization_types)
VisitResult GenerateCall(Callable *callable, std::optional< LocationReference > this_parameter, Arguments parameters, const TypeVector &specialization_types={}, bool tail_call=false)
VisitResult GetBuiltinCode(Builtin *builtin)
void GenerateClassVerifiers(const std::string &output_directory)
void GenerateInstanceTypes(const std::string &output_directory)
VisitResult GenerateCall(std::string callable_name, Arguments parameters, const TypeVector &specialization_types={}, bool tail_call=false)
void GenerateCatchBlock(std::optional< Block * > catch_block)
void GenerateEnumVerifiers(const std::string &output_directory)
LocationReference GenerateReferenceToItemInHeapSlice(LocationReference slice, VisitResult index)
bool TestLookupCallable(const QualifiedName &name, const TypeVector ¶meter_types)
DECLARE_CONTEXTUAL_VARIABLE(CurrentFileStreams, GlobalContext::PerFileStreams *)
void CheckInitializersWellformed(const std::string &aggregate_name, const std::vector< T > &aggregate_fields, const std::vector< NameAndExpression > &initializers, bool ignore_first_field=false)
void Visit(ExternMacro *macro)
VisitResult GenerateBoolConstant(bool constant)
std::string ExternalParameterName(const std::string &name)
std::stringstream debug_macros_cc_
const Identifier * TryGetSourceForBitfieldExpression(const Expression *expr) const
void GenerateClassDefinitions(const std::string &output_directory)
LayoutForInitialization GenerateLayoutForInitialization(const ClassType *class_type, const InitializerResults &initializer_results)
DECLARE_CONTEXTUAL_VARIABLE(ValueBindingsManager, BindingsManager< LocalValue >)
void SetReturnValue(VisitResult return_value)
std::ostream & csa_headerfile()
CfgAssembler & assembler()
std::optional< CfgAssembler > assembler_
VisitResult InlineMacro(Macro *macro, std::optional< LocationReference > this_reference, const std::vector< VisitResult > &arguments, const std::vector< Block * > label_blocks)
VisitResult Visit(Expression *expr)
void SetDryRun(bool is_dry_run)
LocationReference GetLocationReference(Expression *location)
void GenerateBitFields(const std::string &output_directory)
VisitResult GenerateArrayLength(Expression *array_length, Namespace *nspace, const std::map< std::string, LocalValue > &bindings)
std::stringstream debug_macros_h_
DECLARE_CONTEXTUAL_VARIABLE(CurrentCallable, Callable *)
TypeArgumentInference InferSpecializationTypes(GenericCallable *generic, const TypeVector &explicit_specialization_types, const TypeVector &explicit_arguments)
LocationReference LookupLocalValue(const std::string &name)
StackRange LowerParameter(const Type *type, const std::string ¶meter_name, Stack< std::string > *lowered_parameters)
StackRange GenerateLabelGoto(LocalLabel *label, std::optional< StackRange > arguments={})
DECLARE_CONTEXTUAL_VARIABLE(CurrentReturnValue, std::optional< VisitResult >)
void BeginDebugMacrosFile()
Callable * LookupCallable(const QualifiedName &name, const Container &declaration_container, const TypeVector &types, const std::vector< Binding< LocalLabel > * > &labels, const TypeVector &specialization_types, bool silence_errors=false)
VisitResult GenerateImplicitConvert(const Type *destination_type, VisitResult source)
const Type * GetCommonType(const Type *left, const Type *right)
std::string ExternalLabelName(const std::string &label_name)
void InitializeClass(const ClassType *class_type, VisitResult allocate_result, const InitializerResults &initializer_results, const LayoutForInitialization &layout)
void GenerateExpressionBranch(Expression *expression, Block *true_block, Block *false_block)
std::optional< Binding< LocalLabel > * > TryLookupLabel(const std::string &name)
void GenerateExportedMacrosAssembler(const std::string &output_directory)
VisitResult GeneratePointerCall(Expression *callee, const Arguments ¶meters, bool tail_call)
std::unordered_map< const Expression *, const Identifier * > bitfield_expressions_
void PropagateBitfieldMark(const Expression *original, const Expression *derived)
std::optional< Block * > GetCatchBlock()
void VisitAllDeclarables()
void BeginGeneratedFiles()
void WriteFile(const std::string &file, const std::string &content)
cpp::Function GenerateMacroFunctionDeclaration(Macro *macro)
std::optional< Binding< LocalValue > * > TryLookupLocalValue(const std::string &name)
Block * LookupSimpleLabel(const std::string &name)
LocationReference GenerateFieldReferenceForInit(VisitResult object, const Field &field, const LayoutForInitialization &layout)
LocalValue(std::function< LocationReference()> lazy)
LocalValue(std::string inaccessible_explanation)
LocalValue(LocationReference reference)
LocationReference GetLocationReference(Binding< LocalValue > *binding)
bool IsAccessibleNonLazy() const
std::string inaccessible_explanation
std::optional< LocationReference > value
std::optional< std::function< LocationReference()> > lazy
const BitField & bit_field() const
std::optional< std::string > temporary_description_
std::shared_ptr< const LocationReference > bit_field_struct_
static LocationReference FieldAccess(VisitResult object, std::string fieldname)
const VisitResult & heap_slice() const
const VisitResult & temporary() const
std::optional< Binding< LocalValue > * > binding_
std::optional< VisitResult > heap_reference_
FieldSynchronization heap_reference_synchronization() const
const LocationReference & bit_field_struct_location() const
VisitResultVector call_arguments_
std::optional< VisitResult > temporary_
bool IsBitFieldAccess() const
bool IsHeapReference() const
const VisitResult & GetVisitResult() const
bool IsVariableAccess() const
std::optional< BitField > bit_field_
static LocationReference HeapReference(VisitResult heap_reference, FieldSynchronization synchronization=FieldSynchronization::kNone)
static LocationReference Temporary(VisitResult temporary, std::string description)
bool IsCallAccess() const
static LocationReference HeapSlice(VisitResult heap_slice)
static LocationReference VariableAccess(VisitResult variable, std::optional< Binding< LocalValue > * > binding=std::nullopt)
const VisitResultVector & call_arguments() const
std::optional< std::string > eval_function_
std::optional< VisitResult > heap_slice_
const VisitResult & heap_reference() const
const VisitResult & variable() const
static LocationReference ArrayAccess(VisitResult base, VisitResult offset)
std::optional< std::string > assign_function_
const std::string & assign_function() const
std::optional< VisitResult > variable_
const std::string & temporary_description() const
FieldSynchronization heap_reference_synchronization_
const std::string & eval_function() const
std::optional< const Type * > ReferencedType() const
static LocationReference BitFieldAccess(const LocationReference &object, BitField field)
std::optional< Binding< LocalValue > * > binding() const
LocationReference()=default
MessageBuilder & Position(SourcePosition position)
static GenericType * GetConstSliceGeneric()
static std::optional< const Type * > MatchReferenceGeneric(const Type *reference_type, bool *is_const=nullptr)
static GenericType * GetMutableSliceGeneric()
static std::optional< const Type * > MatchUnaryGeneric(const Type *type, GenericType *generic)
base::Vector< const DirectHandle< Object > > args
ZoneVector< RpoNumber > & result
InstructionOperand source
V8_INLINE const Operation & Get(const Graph &graph, OpIndex index)
static constexpr const char * kContinueLabelName
void ReportError(Args &&... args)
void ReplaceFileContentsIfDifferent(const std::string &file_path, const std::string &contents)
uint64_t next_unique_binding_index
MessageBuilder Lint(Args &&... args)
void ReportAllUnusedMacros()
std::vector< Identifier * > NameVector
static constexpr const char * kBreakLabelName
bool StartsWithSingleUnderscore(const std::string &str)
std::vector< const Type * > TypeVector
MessageBuilder Error(Args &&... args)
bool IsCompatibleSignature(const Signature &sig, const TypeVector &types, size_t label_count)
too high values may cause the compiler to set high thresholds for inlining to as much as possible avoid inlined allocation of objects that cannot escape trace load stores from virtual maglev objects use TurboFan fast string builder analyze liveness of environment slots and zap dead values trace TurboFan load elimination emit data about basic block usage in builtins to this enable builtin reordering when run mksnapshot flag for emit warnings when applying builtin profile data verify register allocation in TurboFan randomly schedule instructions to stress dependency tracking enable store store elimination in TurboFan rewrite far to near simulate GC compiler thread race related to allow float parameters to be passed in simulator mode JS Wasm Run additional turbo_optimize_inlined_js_wasm_wrappers enable experimental feedback collection in generic lowering enable Turboshaft s WasmLoadElimination enable Turboshaft s low level load elimination for JS enable Turboshaft s escape analysis for string concatenation use enable Turbolev features that we want to ship in the not too far future trace individual Turboshaft reduction steps trace intermediate Turboshaft reduction steps invocation count threshold for early optimization Enables optimizations which favor memory size over execution speed Enables sampling allocation profiler with X as a sample interval min size of a semi the new space consists of two semi spaces max size of the Collect garbage after Collect garbage after keeps maps alive for< n > old space garbage collections print one detailed trace line in name
kWasmInternalFunctionIndirectPointerTag kProtectedInstanceDataOffset sig
#define DCHECK_LE(v1, v2)
#define DCHECK_IMPLIES(v1, v2)
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
VisitResultVector parameters
std::vector< Binding< LocalLabel > * > labels
std::vector< Identifier * > names
std::map< std::string, VisitResult > field_value_map
std::map< std::string, VisitResult > offsets
std::map< std::string, VisitResult > array_lengths
LocalLabel(Block *block, std::vector< const Type * > parameter_types={})
std::vector< const Type * > parameter_types