summaryrefslogtreecommitdiff
path: root/deps/v8/src/compiler/serializer-for-background-compilation.h
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/compiler/serializer-for-background-compilation.h')
-rw-r--r--deps/v8/src/compiler/serializer-for-background-compilation.h183
1 files changed, 183 insertions, 0 deletions
diff --git a/deps/v8/src/compiler/serializer-for-background-compilation.h b/deps/v8/src/compiler/serializer-for-background-compilation.h
new file mode 100644
index 0000000000..76bc675e66
--- /dev/null
+++ b/deps/v8/src/compiler/serializer-for-background-compilation.h
@@ -0,0 +1,183 @@
+// Copyright 2018 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_COMPILER_SERIALIZER_FOR_BACKGROUND_COMPILATION_H_
+#define V8_COMPILER_SERIALIZER_FOR_BACKGROUND_COMPILATION_H_
+
+#include "src/handles.h"
+#include "src/zone/zone-containers.h"
+
+namespace v8 {
+namespace internal {
+
+namespace interpreter {
+class BytecodeArrayIterator;
+} // namespace interpreter
+
+class BytecodeArray;
+class FeedbackVector;
+class LookupIterator;
+class NativeContext;
+class ScriptContextTable;
+class SharedFunctionInfo;
+class SourcePositionTableIterator;
+class Zone;
+
+namespace compiler {
+
+#define CLEAR_ENVIRONMENT_LIST(V) \
+ V(Abort) \
+ V(CallRuntime) \
+ V(CallRuntimeForPair) \
+ V(CreateBlockContext) \
+ V(CreateFunctionContext) \
+ V(CreateEvalContext) \
+ V(Jump) \
+ V(JumpConstant) \
+ V(JumpIfFalse) \
+ V(JumpIfFalseConstant) \
+ V(JumpIfJSReceiver) \
+ V(JumpIfJSReceiverConstant) \
+ V(JumpIfNotNull) \
+ V(JumpIfNotNullConstant) \
+ V(JumpIfNotUndefined) \
+ V(JumpIfNotUndefinedConstant) \
+ V(JumpIfNull) \
+ V(JumpIfNullConstant) \
+ V(JumpIfToBooleanTrueConstant) \
+ V(JumpIfToBooleanFalseConstant) \
+ V(JumpIfToBooleanTrue) \
+ V(JumpIfToBooleanFalse) \
+ V(JumpIfTrue) \
+ V(JumpIfTrueConstant) \
+ V(JumpIfUndefined) \
+ V(JumpIfUndefinedConstant) \
+ V(JumpLoop) \
+ V(PushContext) \
+ V(PopContext) \
+ V(ReThrow) \
+ V(StaContextSlot) \
+ V(StaCurrentContextSlot) \
+ V(Throw)
+
+#define CLEAR_ACCUMULATOR_LIST(V) \
+ V(CallWithSpread) \
+ V(ConstructWithSpread) \
+ V(CreateEmptyObjectLiteral) \
+ V(CreateMappedArguments) \
+ V(CreateRestParameter) \
+ V(CreateUnmappedArguments) \
+ V(LdaContextSlot) \
+ V(LdaCurrentContextSlot) \
+ V(LdaGlobal) \
+ V(LdaGlobalInsideTypeof) \
+ V(LdaImmutableContextSlot) \
+ V(LdaImmutableCurrentContextSlot) \
+ V(LdaKeyedProperty) \
+ V(LdaNamedProperty) \
+ V(LdaNamedPropertyNoFeedback)
+
+#define SUPPORTED_BYTECODE_LIST(V) \
+ V(CallAnyReceiver) \
+ V(CallNoFeedback) \
+ V(CallProperty) \
+ V(CallProperty0) \
+ V(CallProperty1) \
+ V(CallProperty2) \
+ V(CallUndefinedReceiver) \
+ V(CallUndefinedReceiver0) \
+ V(CallUndefinedReceiver1) \
+ V(CallUndefinedReceiver2) \
+ V(Construct) \
+ V(CreateClosure) \
+ V(ExtraWide) \
+ V(Illegal) \
+ V(LdaConstant) \
+ V(LdaNull) \
+ V(Ldar) \
+ V(LdaSmi) \
+ V(LdaUndefined) \
+ V(LdaZero) \
+ V(Mov) \
+ V(Return) \
+ V(Star) \
+ V(Wide) \
+ CLEAR_ENVIRONMENT_LIST(V) \
+ CLEAR_ACCUMULATOR_LIST(V)
+
+class JSHeapBroker;
+
+struct FunctionBlueprint {
+ Handle<SharedFunctionInfo> shared;
+ Handle<FeedbackVector> feedback;
+};
+
+class Hints {
+ public:
+ explicit Hints(Zone* zone);
+
+ const ZoneVector<Handle<Object>>& constants() const;
+ const ZoneVector<Handle<Map>>& maps() const;
+ const ZoneVector<FunctionBlueprint>& function_blueprints() const;
+
+ void AddConstant(Handle<Object> constant);
+ void AddMap(Handle<Map> map);
+ void AddFunctionBlueprint(FunctionBlueprint function_blueprint);
+
+ void Add(const Hints& other);
+
+ void Clear();
+
+ private:
+ ZoneVector<Handle<Object>> constants_;
+ ZoneVector<Handle<Map>> maps_;
+ ZoneVector<FunctionBlueprint> function_blueprints_;
+};
+
+typedef ZoneVector<Hints> HintsVector;
+
+// The SerializerForBackgroundCompilation makes sure that the relevant function
+// data such as bytecode, SharedFunctionInfo and FeedbackVector, used by later
+// optimizations in the compiler, is copied to the heap broker.
+class SerializerForBackgroundCompilation {
+ public:
+ SerializerForBackgroundCompilation(JSHeapBroker* broker, Zone* zone,
+ Handle<JSFunction> function);
+ Hints Run(); // NOTE: Returns empty for an already-serialized function.
+
+ private:
+ SerializerForBackgroundCompilation(JSHeapBroker* broker, Zone* zone,
+ FunctionBlueprint function,
+ const HintsVector& arguments);
+
+ void TraverseBytecode();
+
+#define DECLARE_VISIT_BYTECODE(name, ...) \
+ void Visit##name(interpreter::BytecodeArrayIterator* iterator);
+ SUPPORTED_BYTECODE_LIST(DECLARE_VISIT_BYTECODE)
+#undef DECLARE_VISIT_BYTECODE
+
+ class Environment;
+
+ Zone* zone() const { return zone_; }
+ JSHeapBroker* broker() const { return broker_; }
+ Environment* environment() const { return environment_; }
+
+ void ProcessCallOrConstruct(const Hints& callee,
+ const HintsVector& arguments);
+ void ProcessCallVarArgs(interpreter::BytecodeArrayIterator* iterator,
+ ConvertReceiverMode receiver_mode);
+
+ JSHeapBroker* broker_;
+ Zone* zone_;
+ Handle<SharedFunctionInfo> shared_;
+ Handle<FeedbackVector> feedback_;
+ Environment* environment_;
+};
+
+} // namespace compiler
+} // namespace internal
+} // namespace v8
+
+#endif // V8_COMPILER_SERIALIZER_FOR_BACKGROUND_COMPILATION_H_