1// Copyright 2021 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_BASELINE_BASELINE_BATCH_COMPILER_H_
6#define V8_BASELINE_BASELINE_BATCH_COMPILER_H_
7
8#include <atomic>
9
10#include "src/handles/global-handles.h"
11#include "src/handles/handles.h"
12
13namespace v8 {
14namespace internal {
15namespace baseline {
16
17class BaselineCompiler;
18class ConcurrentBaselineCompiler;
19
20class BaselineBatchCompiler {
21 public:
22  static const int kInitialQueueSize = 32;
23
24  explicit BaselineBatchCompiler(Isolate* isolate);
25  ~BaselineBatchCompiler();
26  // Enqueues SharedFunctionInfo of |function| for compilation.
27  void EnqueueFunction(Handle<JSFunction> function);
28
29  void set_enabled(bool enabled) { enabled_ = enabled; }
30  bool is_enabled() { return enabled_; }
31
32  void InstallBatch();
33
34 private:
35  // Ensure there is enough space in the compilation queue to enqueue another
36  // function, growing the queue if necessary.
37  void EnsureQueueCapacity();
38
39  // Enqueues SharedFunctionInfo.
40  void Enqueue(Handle<SharedFunctionInfo> shared);
41
42  // Returns true if the current batch exceeds the threshold and should be
43  // compiled.
44  bool ShouldCompileBatch() const;
45
46  // Compiles the current batch.
47  void CompileBatch(Handle<JSFunction> function);
48
49  // Resets the current batch.
50  void ClearBatch();
51
52  // Tries to compile |maybe_sfi|. Returns false if compilation was not possible
53  // (e.g. bytecode was fushed, weak handle no longer valid, ...).
54  bool MaybeCompileFunction(MaybeObject maybe_sfi);
55
56  Isolate* isolate_;
57
58  // Global handle to shared function infos enqueued for compilation in the
59  // current batch.
60  Handle<WeakFixedArray> compilation_queue_;
61
62  // Last index set in compilation_queue_;
63  int last_index_;
64
65  // Estimated insturction size of current batch.
66  int estimated_instruction_size_;
67
68  // Flag indicating whether batch compilation is enabled.
69  // Batch compilation can be dynamically disabled e.g. when creating snapshots.
70  bool enabled_;
71
72  // Handle to the background compilation jobs.
73  std::unique_ptr<ConcurrentBaselineCompiler> concurrent_compiler_;
74};
75
76}  // namespace baseline
77}  // namespace internal
78}  // namespace v8
79
80#endif  // V8_BASELINE_BASELINE_BATCH_COMPILER_H_
81