nodejs/deps/v8/include/v8-profiler.h

1352 lines
43 KiB
C
Raw Permalink Normal View History

2010-04-14 10:34:17 -07:00
// Copyright 2010 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.
2010-04-14 10:34:17 -07:00
#ifndef V8_V8_PROFILER_H_
#define V8_V8_PROFILER_H_
#include <limits.h>
#include <memory>
#include <unordered_set>
#include <vector>
#include "cppgc/common.h" // NOLINT(build/include_directory)
#include "v8-local-handle.h" // NOLINT(build/include_directory)
#include "v8-message.h" // NOLINT(build/include_directory)
#include "v8-persistent-handle.h" // NOLINT(build/include_directory)
2010-04-14 10:34:17 -07:00
/**
* Profiler support for the V8 JavaScript engine.
*/
namespace v8 {
enum class EmbedderStateTag : uint8_t;
2014-03-31 14:38:28 +02:00
class HeapGraphNode;
struct HeapStatsUpdate;
class Object;
enum StateTag : uint16_t;
2014-03-31 14:38:28 +02:00
using NativeObject = void*;
using SnapshotObjectId = uint32_t;
deps: V8: cherry-pick semver-major commits from 10.2 Includes the following commits: commit b2978927d8a96ebc814cccbc5a9f1c35910ee621 Remove dynamic map checks and custom deoptimization kinds This CL removes: - Dynamic map checks aka minimorphic property loads (TF support, builtins). - "Bailout" deopts (= drop to the interpreter once, but don't throw out optimized code). - "EagerWithResume" deopts (= part of dynamic map check functionality, we call a builtin for the deopt check and deopt or resume based on the result). Fixed: v8:12552 Change-Id: I492cf1667e0f54586690b2f72a65ea804224b840 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3401585 commit f52f934119635058b179c2359fe070b8ee0f9233 PPC/s390: Remove dynamic map checks and custom deoptimization kinds Port b2978927d8a96ebc814cccbc5a9f1c35910ee621 Original Commit Message: This CL removes: - Dynamic map checks aka minimorphic property loads (TF support, builtins). - "Bailout" deopts (= drop to the interpreter once, but don't throw out optimized code). - "EagerWithResume" deopts (= part of dynamic map check functionality, we call a builtin for the deopt check and deopt or resume based on the result). R=jgruber@chromium.org, joransiu@ca.ibm.com, junyan@redhat.com, midawson@redhat.com BUG= LOG=N Change-Id: I64476f73810774c2c592231d82c4a2cbfa2bf94e Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3537881 commit 38940b70986da6b43d18cb8cf8f0a3be36ca9010 [loong64][mips] Remove dynamic map checks and custom deoptimization kinds Port commit b2978927d8a96ebc814cccbc5a9f1c35910ee621 Fixed: v8:12552 Change-Id: Ic2fbded9a662ed840a0350e3ce049e147fbf03a0 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3541527 commit da5b5f66a6bd27df6249602378300c6961bc62b4 [riscv64] Remove dynamic map checks and custom deoptimization kinds Port b2978927d8a96ebc814cccbc5a9f1c35910ee621 Bug: v8:12552 Change-Id: I73e76fc5cc8905a0fbfc801b2f794735866d19e8 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3544725 commit ffae028b37991566c080c5528463f7d16017668c Forward deprecation for resurrecting finalizer Bug: v8:12672 Change-Id: Ib4f53086436e028b4ea32fbc960f57e91709d184 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3532256 commit f6386018d472665e36d662c8b159d95325999d69 [api] Remove TracedGlobal<> Remove deprecated TracedGlobal<>, greatly simplifying handling of traced references in general. Also saves a word per v8::TracedReference as there's no need to keep a possible callback around. Bug: v8:12603 Change-Id: Ice35d7906775b912d02e97a27a722b3e1cec28d9 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3532251 commit a8beac553b0a1639bc9790c2d6f82caf6b2e150f Deprecate some signature checks Deprecate signature checks in * Template::SetNativeDataProperty * ObjectTemplate::SetAccessor These are not used in Chrome and require some complicated check in the IC code, which we want to remove. Change-Id: I413fafc8658e922fd590e7fe200600a624f019a6 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3557253 commit cff2b5000a1aa417a9c4499bcfa3ffda4542f4f1 Deprecate signature checks in Set{Accessor,NativeDataProperty} Change from V8_DEPRECATE_SOON to V8_DEPRECATED. It turned out that we don't have to make changes in chrome code, so we can go to deprecated right away. Bug: chromium:1310790 Change-Id: I1bd529536d3a0098f11f13b3e44fe3dbc80eed04 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3571897 commit 9238afb0c0ee52c9111a7e9f2f055137628771ad Allow embedder to set global OOM handler Embedders can currently specify a callback for OOM errors during Isolate initialization. However, there are cases where an OOM error can be thrown in a context where we don't have access to an Isolate, for example on a task posted to a worker thread. This CL introduces an initialization API to allow the embedder to specify a process-wide OOM callback. Bug: chromium:614440 Change-Id: I326753d80767679f677e85104d9edeef92e19086 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3561916 commit ca51ae3ac8b468509603633adb6ee3b3be9306ec [api][profiler] Get StartProfiling, StopProfiling to accept integer ID rather than string This CL adds support for interacting with CpuProfile with their integer id. A String ID is problematic because it forces an allocation when stopping or cancelling a Profiler which can happen during a GC when this is not allowed. Change-Id: I9a8e754bd67214be0bbc5ca051bcadf52bf71a68 Bug: chromium:1297283 Co-Authored-By: Nicolas Dubus <nicodubus@fb.com> Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3522896 Refs: https://github.com/v8/v8/commit/b2978927d8a96ebc814cccbc5a9f1c35910ee621 Refs: https://github.com/v8/v8/commit/f52f934119635058b179c2359fe070b8ee0f9233 Refs: https://github.com/v8/v8/commit/38940b70986da6b43d18cb8cf8f0a3be36ca9010 Refs: https://github.com/v8/v8/commit/da5b5f66a6bd27df6249602378300c6961bc62b4 Refs: https://github.com/v8/v8/commit/ffae028b37991566c080c5528463f7d16017668c Refs: https://github.com/v8/v8/commit/f6386018d472665e36d662c8b159d95325999d69 Refs: https://github.com/v8/v8/commit/a8beac553b0a1639bc9790c2d6f82caf6b2e150f Refs: https://github.com/v8/v8/commit/cff2b5000a1aa417a9c4499bcfa3ffda4542f4f1 Refs: https://github.com/v8/v8/commit/9238afb0c0ee52c9111a7e9f2f055137628771ad Refs: https://github.com/v8/v8/commit/ca51ae3ac8b468509603633adb6ee3b3be9306ec PR-URL: https://github.com/nodejs/node/pull/42657 Reviewed-By: Darshan Sen <raisinten@gmail.com> Reviewed-By: Richard Lau <rlau@redhat.com> Reviewed-By: Jiawen Geng <technicalcute@gmail.com> Reviewed-By: Michael Dawson <midawson@redhat.com>
2022-04-12 11:44:13 +02:00
using ProfilerId = uint32_t;
struct CpuProfileDeoptFrame {
int script_id;
size_t position;
};
namespace internal {
class CpuProfile;
} // namespace internal
} // namespace v8
#ifdef V8_OS_WIN
template class V8_EXPORT std::vector<v8::CpuProfileDeoptFrame>;
#endif
namespace v8 {
struct V8_EXPORT CpuProfileDeoptInfo {
/** A pointer to a static string owned by v8. */
const char* deopt_reason;
std::vector<CpuProfileDeoptFrame> stack;
};
} // namespace v8
#ifdef V8_OS_WIN
template class V8_EXPORT std::vector<v8::CpuProfileDeoptInfo>;
#endif
namespace v8 {
2010-04-14 10:34:17 -07:00
/**
* CpuProfileNode represents a node in a call graph.
*/
2013-08-10 16:27:43 +02:00
class V8_EXPORT CpuProfileNode {
2010-04-14 10:34:17 -07:00
public:
2014-11-14 00:52:27 +01:00
struct LineTick {
/** The 1-based number of the source line where the function originates. */
int line;
/** The count of samples associated with the source line. */
unsigned int hit_count;
};
// An annotation hinting at the source of a CpuProfileNode.
enum SourceType {
// User-supplied script with associated resource information.
kScript = 0,
// Native scripts and provided builtins.
kBuiltin = 1,
// Callbacks into native code.
kCallback = 2,
// VM-internal functions or state.
kInternal = 3,
// A node that failed to symbolize.
kUnresolved = 4,
};
2010-04-14 10:34:17 -07:00
/** Returns function name (empty string for anonymous functions.) */
Local<String> GetFunctionName() const;
2010-04-14 10:34:17 -07:00
/**
* Returns function name (empty string for anonymous functions.)
* The string ownership is *not* passed to the caller. It stays valid until
* profile is deleted. The function is thread safe.
*/
const char* GetFunctionNameStr() const;
2013-07-02 17:11:31 +02:00
/** Returns id of the script where function is located. */
int GetScriptId() const;
2010-04-14 10:34:17 -07:00
/** Returns resource name for script from where the function originates. */
Local<String> GetScriptResourceName() const;
2010-04-14 10:34:17 -07:00
/**
* Returns resource name for script from where the function originates.
* The string ownership is *not* passed to the caller. It stays valid until
* profile is deleted. The function is thread safe.
*/
const char* GetScriptResourceNameStr() const;
/**
* Return true if the script from where the function originates is flagged as
* being shared cross-origin.
*/
bool IsScriptSharedCrossOrigin() const;
2010-04-14 10:34:17 -07:00
/**
* Returns the number, 1-based, of the line where the function originates.
* kNoLineNumberInfo if no line number information is available.
*/
int GetLineNumber() const;
/**
* Returns 1-based number of the column where the function originates.
* kNoColumnNumberInfo if no column number information is available.
*/
int GetColumnNumber() const;
2014-11-14 00:52:27 +01:00
/**
* Returns the number of the function's source lines that collect the samples.
*/
unsigned int GetHitLineCount() const;
/** Returns the set of source lines that collect the samples.
* The caller allocates buffer and responsible for releasing it.
* True if all available entries are copied, otherwise false.
* The function copies nothing if buffer is not large enough.
*/
bool GetLineTicks(LineTick* entries, unsigned int length) const;
2013-10-22 15:14:25 -07:00
/** Returns bailout reason for the function
* if the optimization was disabled for it.
*/
const char* GetBailoutReason() const;
2010-04-14 10:34:17 -07:00
2013-08-27 15:18:12 -07:00
/**
* Returns the count of samples where the function was currently executing.
*/
unsigned GetHitCount() const;
2013-03-18 13:49:34 -07:00
/** Returns id of the node. The id is unique within the tree */
unsigned GetNodeId() const;
/**
* Gets the type of the source which the node was captured from.
*/
SourceType GetSourceType() const;
2010-04-14 10:34:17 -07:00
/** Returns child nodes count of the node. */
int GetChildrenCount() const;
/** Retrieves a child node by index. */
const CpuProfileNode* GetChild(int index) const;
/** Retrieves the ancestor node, or null if the root. */
const CpuProfileNode* GetParent() const;
/** Retrieves deopt infos for the node. */
const std::vector<CpuProfileDeoptInfo>& GetDeoptInfos() const;
2010-05-10 09:58:20 -07:00
static const int kNoLineNumberInfo = Message::kNoLineNumberInfo;
static const int kNoColumnNumberInfo = Message::kNoColumnInfo;
2010-04-14 10:34:17 -07:00
};
/**
* An interface for exporting data from V8, using "push" model.
*/
class V8_EXPORT OutputStream {
public:
enum WriteResult { kContinue = 0, kAbort = 1 };
virtual ~OutputStream() = default;
/** Notify about the end of stream. */
virtual void EndOfStream() = 0;
/** Get preferred output chunk size. Called only once. */
virtual int GetChunkSize() { return 1024; }
/**
* Writes the next chunk of snapshot data into the stream. Writing
* can be stopped by returning kAbort as function result. EndOfStream
* will not be called in case writing was aborted.
*/
virtual WriteResult WriteAsciiChunk(char* data, int size) = 0;
/**
* Writes the next chunk of heap stats data into the stream. Writing
* can be stopped by returning kAbort as function result. EndOfStream
* will not be called in case writing was aborted.
*/
virtual WriteResult WriteHeapStatsChunk(HeapStatsUpdate* data, int count) {
return kAbort;
}
};
2010-04-14 10:34:17 -07:00
/**
2013-03-18 13:49:34 -07:00
* CpuProfile contains a CPU profile in a form of top-down call tree
* (from main() down to functions that do all the work).
2010-04-14 10:34:17 -07:00
*/
2013-08-10 16:27:43 +02:00
class V8_EXPORT CpuProfile {
2010-04-14 10:34:17 -07:00
public:
enum SerializationFormat {
kJSON = 0 // See format description near 'Serialize' method.
};
2010-04-14 10:34:17 -07:00
/** Returns CPU profile title. */
Local<String> GetTitle() const;
2010-04-14 10:34:17 -07:00
/** Returns the root node of the top down call tree. */
const CpuProfileNode* GetTopDownRoot() const;
2011-07-08 16:40:11 -07:00
2013-03-18 13:49:34 -07:00
/**
* Returns number of samples recorded. The samples are not recorded unless
* |record_samples| parameter of CpuProfiler::StartCpuProfiling is true.
*/
2013-03-18 13:49:34 -07:00
int GetSamplesCount() const;
/**
* Returns profile node corresponding to the top frame the sample at
* the given index.
*/
2013-03-18 13:49:34 -07:00
const CpuProfileNode* GetSample(int index) const;
2013-08-10 16:27:43 +02:00
/**
* Returns the timestamp of the sample. The timestamp is the number of
* microseconds since some unspecified starting point.
* The point is equal to the starting point used by GetStartTime.
*/
int64_t GetSampleTimestamp(int index) const;
/**
* Returns time when the profile recording was started (in microseconds)
* since some unspecified starting point.
*/
2013-08-10 16:27:43 +02:00
int64_t GetStartTime() const;
/**
* Returns state of the vm when sample was captured.
*/
StateTag GetSampleState(int index) const;
/**
* Returns state of the embedder when sample was captured.
*/
EmbedderStateTag GetSampleEmbedderState(int index) const;
2013-08-10 16:27:43 +02:00
/**
* Returns time when the profile recording was stopped (in microseconds)
* since some unspecified starting point.
* The point is equal to the starting point used by GetStartTime.
*/
2013-08-10 16:27:43 +02:00
int64_t GetEndTime() const;
2011-07-08 16:40:11 -07:00
/**
* Deletes the profile and removes it from CpuProfiler's list.
* All pointers to nodes previously returned become invalid.
*/
void Delete();
/**
* Prepare a serialized representation of the profile. The result
* is written into the stream provided in chunks of specified size.
*
* For the JSON format, heap contents are represented as an object
* with the following structure:
*
* {
* nodes: [nodes array],
* startTime: number,
* endTime: number
* samples: [strings array]
* timeDeltas: [numbers array]
* }
*
*/
void Serialize(OutputStream* stream,
SerializationFormat format = kJSON) const;
2010-04-14 10:34:17 -07:00
};
enum CpuProfilingMode {
// In the resulting CpuProfile tree, intermediate nodes in a stack trace
// (from the root to a leaf) will have line numbers that point to the start
// line of the function, rather than the line of the callsite of the child.
kLeafNodeLineNumbers,
// In the resulting CpuProfile tree, nodes are separated based on the line
// number of their callsite in their parent.
kCallerLineNumbers,
};
// Determines how names are derived for functions sampled.
enum CpuProfilingNamingMode {
// Use the immediate name of functions at compilation time.
kStandardNaming,
// Use more verbose naming for functions without names, inferred from scope
// where possible.
kDebugNaming,
};
enum CpuProfilingLoggingMode {
// Enables logging when a profile is active, and disables logging when all
// profiles are detached.
kLazyLogging,
// Enables logging for the lifetime of the CpuProfiler. Calls to
// StartRecording are faster, at the expense of runtime overhead.
kEagerLogging,
};
// Enum for returning profiling status. Once StartProfiling is called,
// we want to return to clients whether the profiling was able to start
// correctly, or return a descriptive error.
enum class CpuProfilingStatus {
kStarted,
kAlreadyStarted,
kErrorTooManyProfilers
};
deps: V8: cherry-pick semver-major commits from 10.2 Includes the following commits: commit b2978927d8a96ebc814cccbc5a9f1c35910ee621 Remove dynamic map checks and custom deoptimization kinds This CL removes: - Dynamic map checks aka minimorphic property loads (TF support, builtins). - "Bailout" deopts (= drop to the interpreter once, but don't throw out optimized code). - "EagerWithResume" deopts (= part of dynamic map check functionality, we call a builtin for the deopt check and deopt or resume based on the result). Fixed: v8:12552 Change-Id: I492cf1667e0f54586690b2f72a65ea804224b840 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3401585 commit f52f934119635058b179c2359fe070b8ee0f9233 PPC/s390: Remove dynamic map checks and custom deoptimization kinds Port b2978927d8a96ebc814cccbc5a9f1c35910ee621 Original Commit Message: This CL removes: - Dynamic map checks aka minimorphic property loads (TF support, builtins). - "Bailout" deopts (= drop to the interpreter once, but don't throw out optimized code). - "EagerWithResume" deopts (= part of dynamic map check functionality, we call a builtin for the deopt check and deopt or resume based on the result). R=jgruber@chromium.org, joransiu@ca.ibm.com, junyan@redhat.com, midawson@redhat.com BUG= LOG=N Change-Id: I64476f73810774c2c592231d82c4a2cbfa2bf94e Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3537881 commit 38940b70986da6b43d18cb8cf8f0a3be36ca9010 [loong64][mips] Remove dynamic map checks and custom deoptimization kinds Port commit b2978927d8a96ebc814cccbc5a9f1c35910ee621 Fixed: v8:12552 Change-Id: Ic2fbded9a662ed840a0350e3ce049e147fbf03a0 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3541527 commit da5b5f66a6bd27df6249602378300c6961bc62b4 [riscv64] Remove dynamic map checks and custom deoptimization kinds Port b2978927d8a96ebc814cccbc5a9f1c35910ee621 Bug: v8:12552 Change-Id: I73e76fc5cc8905a0fbfc801b2f794735866d19e8 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3544725 commit ffae028b37991566c080c5528463f7d16017668c Forward deprecation for resurrecting finalizer Bug: v8:12672 Change-Id: Ib4f53086436e028b4ea32fbc960f57e91709d184 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3532256 commit f6386018d472665e36d662c8b159d95325999d69 [api] Remove TracedGlobal<> Remove deprecated TracedGlobal<>, greatly simplifying handling of traced references in general. Also saves a word per v8::TracedReference as there's no need to keep a possible callback around. Bug: v8:12603 Change-Id: Ice35d7906775b912d02e97a27a722b3e1cec28d9 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3532251 commit a8beac553b0a1639bc9790c2d6f82caf6b2e150f Deprecate some signature checks Deprecate signature checks in * Template::SetNativeDataProperty * ObjectTemplate::SetAccessor These are not used in Chrome and require some complicated check in the IC code, which we want to remove. Change-Id: I413fafc8658e922fd590e7fe200600a624f019a6 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3557253 commit cff2b5000a1aa417a9c4499bcfa3ffda4542f4f1 Deprecate signature checks in Set{Accessor,NativeDataProperty} Change from V8_DEPRECATE_SOON to V8_DEPRECATED. It turned out that we don't have to make changes in chrome code, so we can go to deprecated right away. Bug: chromium:1310790 Change-Id: I1bd529536d3a0098f11f13b3e44fe3dbc80eed04 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3571897 commit 9238afb0c0ee52c9111a7e9f2f055137628771ad Allow embedder to set global OOM handler Embedders can currently specify a callback for OOM errors during Isolate initialization. However, there are cases where an OOM error can be thrown in a context where we don't have access to an Isolate, for example on a task posted to a worker thread. This CL introduces an initialization API to allow the embedder to specify a process-wide OOM callback. Bug: chromium:614440 Change-Id: I326753d80767679f677e85104d9edeef92e19086 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3561916 commit ca51ae3ac8b468509603633adb6ee3b3be9306ec [api][profiler] Get StartProfiling, StopProfiling to accept integer ID rather than string This CL adds support for interacting with CpuProfile with their integer id. A String ID is problematic because it forces an allocation when stopping or cancelling a Profiler which can happen during a GC when this is not allowed. Change-Id: I9a8e754bd67214be0bbc5ca051bcadf52bf71a68 Bug: chromium:1297283 Co-Authored-By: Nicolas Dubus <nicodubus@fb.com> Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3522896 Refs: https://github.com/v8/v8/commit/b2978927d8a96ebc814cccbc5a9f1c35910ee621 Refs: https://github.com/v8/v8/commit/f52f934119635058b179c2359fe070b8ee0f9233 Refs: https://github.com/v8/v8/commit/38940b70986da6b43d18cb8cf8f0a3be36ca9010 Refs: https://github.com/v8/v8/commit/da5b5f66a6bd27df6249602378300c6961bc62b4 Refs: https://github.com/v8/v8/commit/ffae028b37991566c080c5528463f7d16017668c Refs: https://github.com/v8/v8/commit/f6386018d472665e36d662c8b159d95325999d69 Refs: https://github.com/v8/v8/commit/a8beac553b0a1639bc9790c2d6f82caf6b2e150f Refs: https://github.com/v8/v8/commit/cff2b5000a1aa417a9c4499bcfa3ffda4542f4f1 Refs: https://github.com/v8/v8/commit/9238afb0c0ee52c9111a7e9f2f055137628771ad Refs: https://github.com/v8/v8/commit/ca51ae3ac8b468509603633adb6ee3b3be9306ec PR-URL: https://github.com/nodejs/node/pull/42657 Reviewed-By: Darshan Sen <raisinten@gmail.com> Reviewed-By: Richard Lau <rlau@redhat.com> Reviewed-By: Jiawen Geng <technicalcute@gmail.com> Reviewed-By: Michael Dawson <midawson@redhat.com>
2022-04-12 11:44:13 +02:00
/**
* Result from StartProfiling returning the Profiling Status, and
* id of the started profiler, or 0 if profiler is not started
*/
struct CpuProfilingResult {
const ProfilerId id;
const CpuProfilingStatus status;
};
/**
* Delegate for when max samples reached and samples are discarded.
*/
class V8_EXPORT DiscardedSamplesDelegate {
public:
deps: V8: cherry-pick semver-major commits from 10.2 Includes the following commits: commit b2978927d8a96ebc814cccbc5a9f1c35910ee621 Remove dynamic map checks and custom deoptimization kinds This CL removes: - Dynamic map checks aka minimorphic property loads (TF support, builtins). - "Bailout" deopts (= drop to the interpreter once, but don't throw out optimized code). - "EagerWithResume" deopts (= part of dynamic map check functionality, we call a builtin for the deopt check and deopt or resume based on the result). Fixed: v8:12552 Change-Id: I492cf1667e0f54586690b2f72a65ea804224b840 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3401585 commit f52f934119635058b179c2359fe070b8ee0f9233 PPC/s390: Remove dynamic map checks and custom deoptimization kinds Port b2978927d8a96ebc814cccbc5a9f1c35910ee621 Original Commit Message: This CL removes: - Dynamic map checks aka minimorphic property loads (TF support, builtins). - "Bailout" deopts (= drop to the interpreter once, but don't throw out optimized code). - "EagerWithResume" deopts (= part of dynamic map check functionality, we call a builtin for the deopt check and deopt or resume based on the result). R=jgruber@chromium.org, joransiu@ca.ibm.com, junyan@redhat.com, midawson@redhat.com BUG= LOG=N Change-Id: I64476f73810774c2c592231d82c4a2cbfa2bf94e Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3537881 commit 38940b70986da6b43d18cb8cf8f0a3be36ca9010 [loong64][mips] Remove dynamic map checks and custom deoptimization kinds Port commit b2978927d8a96ebc814cccbc5a9f1c35910ee621 Fixed: v8:12552 Change-Id: Ic2fbded9a662ed840a0350e3ce049e147fbf03a0 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3541527 commit da5b5f66a6bd27df6249602378300c6961bc62b4 [riscv64] Remove dynamic map checks and custom deoptimization kinds Port b2978927d8a96ebc814cccbc5a9f1c35910ee621 Bug: v8:12552 Change-Id: I73e76fc5cc8905a0fbfc801b2f794735866d19e8 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3544725 commit ffae028b37991566c080c5528463f7d16017668c Forward deprecation for resurrecting finalizer Bug: v8:12672 Change-Id: Ib4f53086436e028b4ea32fbc960f57e91709d184 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3532256 commit f6386018d472665e36d662c8b159d95325999d69 [api] Remove TracedGlobal<> Remove deprecated TracedGlobal<>, greatly simplifying handling of traced references in general. Also saves a word per v8::TracedReference as there's no need to keep a possible callback around. Bug: v8:12603 Change-Id: Ice35d7906775b912d02e97a27a722b3e1cec28d9 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3532251 commit a8beac553b0a1639bc9790c2d6f82caf6b2e150f Deprecate some signature checks Deprecate signature checks in * Template::SetNativeDataProperty * ObjectTemplate::SetAccessor These are not used in Chrome and require some complicated check in the IC code, which we want to remove. Change-Id: I413fafc8658e922fd590e7fe200600a624f019a6 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3557253 commit cff2b5000a1aa417a9c4499bcfa3ffda4542f4f1 Deprecate signature checks in Set{Accessor,NativeDataProperty} Change from V8_DEPRECATE_SOON to V8_DEPRECATED. It turned out that we don't have to make changes in chrome code, so we can go to deprecated right away. Bug: chromium:1310790 Change-Id: I1bd529536d3a0098f11f13b3e44fe3dbc80eed04 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3571897 commit 9238afb0c0ee52c9111a7e9f2f055137628771ad Allow embedder to set global OOM handler Embedders can currently specify a callback for OOM errors during Isolate initialization. However, there are cases where an OOM error can be thrown in a context where we don't have access to an Isolate, for example on a task posted to a worker thread. This CL introduces an initialization API to allow the embedder to specify a process-wide OOM callback. Bug: chromium:614440 Change-Id: I326753d80767679f677e85104d9edeef92e19086 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3561916 commit ca51ae3ac8b468509603633adb6ee3b3be9306ec [api][profiler] Get StartProfiling, StopProfiling to accept integer ID rather than string This CL adds support for interacting with CpuProfile with their integer id. A String ID is problematic because it forces an allocation when stopping or cancelling a Profiler which can happen during a GC when this is not allowed. Change-Id: I9a8e754bd67214be0bbc5ca051bcadf52bf71a68 Bug: chromium:1297283 Co-Authored-By: Nicolas Dubus <nicodubus@fb.com> Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3522896 Refs: https://github.com/v8/v8/commit/b2978927d8a96ebc814cccbc5a9f1c35910ee621 Refs: https://github.com/v8/v8/commit/f52f934119635058b179c2359fe070b8ee0f9233 Refs: https://github.com/v8/v8/commit/38940b70986da6b43d18cb8cf8f0a3be36ca9010 Refs: https://github.com/v8/v8/commit/da5b5f66a6bd27df6249602378300c6961bc62b4 Refs: https://github.com/v8/v8/commit/ffae028b37991566c080c5528463f7d16017668c Refs: https://github.com/v8/v8/commit/f6386018d472665e36d662c8b159d95325999d69 Refs: https://github.com/v8/v8/commit/a8beac553b0a1639bc9790c2d6f82caf6b2e150f Refs: https://github.com/v8/v8/commit/cff2b5000a1aa417a9c4499bcfa3ffda4542f4f1 Refs: https://github.com/v8/v8/commit/9238afb0c0ee52c9111a7e9f2f055137628771ad Refs: https://github.com/v8/v8/commit/ca51ae3ac8b468509603633adb6ee3b3be9306ec PR-URL: https://github.com/nodejs/node/pull/42657 Reviewed-By: Darshan Sen <raisinten@gmail.com> Reviewed-By: Richard Lau <rlau@redhat.com> Reviewed-By: Jiawen Geng <technicalcute@gmail.com> Reviewed-By: Michael Dawson <midawson@redhat.com>
2022-04-12 11:44:13 +02:00
DiscardedSamplesDelegate() = default;
virtual ~DiscardedSamplesDelegate() = default;
virtual void Notify() = 0;
deps: V8: cherry-pick semver-major commits from 10.2 Includes the following commits: commit b2978927d8a96ebc814cccbc5a9f1c35910ee621 Remove dynamic map checks and custom deoptimization kinds This CL removes: - Dynamic map checks aka minimorphic property loads (TF support, builtins). - "Bailout" deopts (= drop to the interpreter once, but don't throw out optimized code). - "EagerWithResume" deopts (= part of dynamic map check functionality, we call a builtin for the deopt check and deopt or resume based on the result). Fixed: v8:12552 Change-Id: I492cf1667e0f54586690b2f72a65ea804224b840 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3401585 commit f52f934119635058b179c2359fe070b8ee0f9233 PPC/s390: Remove dynamic map checks and custom deoptimization kinds Port b2978927d8a96ebc814cccbc5a9f1c35910ee621 Original Commit Message: This CL removes: - Dynamic map checks aka minimorphic property loads (TF support, builtins). - "Bailout" deopts (= drop to the interpreter once, but don't throw out optimized code). - "EagerWithResume" deopts (= part of dynamic map check functionality, we call a builtin for the deopt check and deopt or resume based on the result). R=jgruber@chromium.org, joransiu@ca.ibm.com, junyan@redhat.com, midawson@redhat.com BUG= LOG=N Change-Id: I64476f73810774c2c592231d82c4a2cbfa2bf94e Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3537881 commit 38940b70986da6b43d18cb8cf8f0a3be36ca9010 [loong64][mips] Remove dynamic map checks and custom deoptimization kinds Port commit b2978927d8a96ebc814cccbc5a9f1c35910ee621 Fixed: v8:12552 Change-Id: Ic2fbded9a662ed840a0350e3ce049e147fbf03a0 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3541527 commit da5b5f66a6bd27df6249602378300c6961bc62b4 [riscv64] Remove dynamic map checks and custom deoptimization kinds Port b2978927d8a96ebc814cccbc5a9f1c35910ee621 Bug: v8:12552 Change-Id: I73e76fc5cc8905a0fbfc801b2f794735866d19e8 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3544725 commit ffae028b37991566c080c5528463f7d16017668c Forward deprecation for resurrecting finalizer Bug: v8:12672 Change-Id: Ib4f53086436e028b4ea32fbc960f57e91709d184 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3532256 commit f6386018d472665e36d662c8b159d95325999d69 [api] Remove TracedGlobal<> Remove deprecated TracedGlobal<>, greatly simplifying handling of traced references in general. Also saves a word per v8::TracedReference as there's no need to keep a possible callback around. Bug: v8:12603 Change-Id: Ice35d7906775b912d02e97a27a722b3e1cec28d9 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3532251 commit a8beac553b0a1639bc9790c2d6f82caf6b2e150f Deprecate some signature checks Deprecate signature checks in * Template::SetNativeDataProperty * ObjectTemplate::SetAccessor These are not used in Chrome and require some complicated check in the IC code, which we want to remove. Change-Id: I413fafc8658e922fd590e7fe200600a624f019a6 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3557253 commit cff2b5000a1aa417a9c4499bcfa3ffda4542f4f1 Deprecate signature checks in Set{Accessor,NativeDataProperty} Change from V8_DEPRECATE_SOON to V8_DEPRECATED. It turned out that we don't have to make changes in chrome code, so we can go to deprecated right away. Bug: chromium:1310790 Change-Id: I1bd529536d3a0098f11f13b3e44fe3dbc80eed04 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3571897 commit 9238afb0c0ee52c9111a7e9f2f055137628771ad Allow embedder to set global OOM handler Embedders can currently specify a callback for OOM errors during Isolate initialization. However, there are cases where an OOM error can be thrown in a context where we don't have access to an Isolate, for example on a task posted to a worker thread. This CL introduces an initialization API to allow the embedder to specify a process-wide OOM callback. Bug: chromium:614440 Change-Id: I326753d80767679f677e85104d9edeef92e19086 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3561916 commit ca51ae3ac8b468509603633adb6ee3b3be9306ec [api][profiler] Get StartProfiling, StopProfiling to accept integer ID rather than string This CL adds support for interacting with CpuProfile with their integer id. A String ID is problematic because it forces an allocation when stopping or cancelling a Profiler which can happen during a GC when this is not allowed. Change-Id: I9a8e754bd67214be0bbc5ca051bcadf52bf71a68 Bug: chromium:1297283 Co-Authored-By: Nicolas Dubus <nicodubus@fb.com> Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3522896 Refs: https://github.com/v8/v8/commit/b2978927d8a96ebc814cccbc5a9f1c35910ee621 Refs: https://github.com/v8/v8/commit/f52f934119635058b179c2359fe070b8ee0f9233 Refs: https://github.com/v8/v8/commit/38940b70986da6b43d18cb8cf8f0a3be36ca9010 Refs: https://github.com/v8/v8/commit/da5b5f66a6bd27df6249602378300c6961bc62b4 Refs: https://github.com/v8/v8/commit/ffae028b37991566c080c5528463f7d16017668c Refs: https://github.com/v8/v8/commit/f6386018d472665e36d662c8b159d95325999d69 Refs: https://github.com/v8/v8/commit/a8beac553b0a1639bc9790c2d6f82caf6b2e150f Refs: https://github.com/v8/v8/commit/cff2b5000a1aa417a9c4499bcfa3ffda4542f4f1 Refs: https://github.com/v8/v8/commit/9238afb0c0ee52c9111a7e9f2f055137628771ad Refs: https://github.com/v8/v8/commit/ca51ae3ac8b468509603633adb6ee3b3be9306ec PR-URL: https://github.com/nodejs/node/pull/42657 Reviewed-By: Darshan Sen <raisinten@gmail.com> Reviewed-By: Richard Lau <rlau@redhat.com> Reviewed-By: Jiawen Geng <technicalcute@gmail.com> Reviewed-By: Michael Dawson <midawson@redhat.com>
2022-04-12 11:44:13 +02:00
ProfilerId GetId() const { return profiler_id_; }
private:
friend internal::CpuProfile;
void SetId(ProfilerId id) { profiler_id_ = id; }
ProfilerId profiler_id_;
};
/**
* Optional profiling attributes.
*/
class V8_EXPORT CpuProfilingOptions {
public:
// Indicates that the sample buffer size should not be explicitly limited.
static const unsigned kNoSampleLimit = UINT_MAX;
/**
* \param mode Type of computation of stack frame line numbers.
* \param max_samples The maximum number of samples that should be recorded by
* the profiler. Samples obtained after this limit will be
* discarded.
* \param sampling_interval_us controls the profile-specific target
* sampling interval. The provided sampling
* interval will be snapped to the next lowest
* non-zero multiple of the profiler's sampling
* interval, set via SetSamplingInterval(). If
* zero, the sampling interval will be equal to
* the profiler's sampling interval.
* \param filter_context If specified, profiles will only contain frames
* using this context. Other frames will be elided.
*/
CpuProfilingOptions(
CpuProfilingMode mode = kLeafNodeLineNumbers,
unsigned max_samples = kNoSampleLimit, int sampling_interval_us = 0,
MaybeLocal<Context> filter_context = MaybeLocal<Context>());
CpuProfilingOptions(CpuProfilingOptions&&) = default;
CpuProfilingOptions& operator=(CpuProfilingOptions&&) = default;
CpuProfilingMode mode() const { return mode_; }
unsigned max_samples() const { return max_samples_; }
int sampling_interval_us() const { return sampling_interval_us_; }
private:
friend class internal::CpuProfile;
bool has_filter_context() const { return !filter_context_.IsEmpty(); }
void* raw_filter_context() const;
CpuProfilingMode mode_;
unsigned max_samples_;
int sampling_interval_us_;
Global<Context> filter_context_;
};
2010-04-14 10:34:17 -07:00
/**
2013-04-08 20:25:29 +02:00
* Interface for controlling CPU profiling. Instance of the
* profiler can be created using v8::CpuProfiler::New method.
2010-04-14 10:34:17 -07:00
*/
2013-08-10 16:27:43 +02:00
class V8_EXPORT CpuProfiler {
2010-04-14 10:34:17 -07:00
public:
/**
* Creates a new CPU profiler for the |isolate|. The isolate must be
* initialized. The profiler object must be disposed after use by calling
* |Dispose| method.
*/
static CpuProfiler* New(Isolate* isolate,
CpuProfilingNamingMode = kDebugNaming,
CpuProfilingLoggingMode = kLazyLogging);
/**
* Synchronously collect current stack sample in all profilers attached to
* the |isolate|. The call does not affect number of ticks recorded for
* the current top node.
* |trace_id| is an optional identifier set to the collected sample.
* this is useful to associate the sample with a trace event.
*/
static void CollectSample(
Isolate* isolate, const std::optional<uint64_t> trace_id = std::nullopt);
/**
* Disposes the CPU profiler object.
*/
void Dispose();
2010-05-21 09:41:50 -07:00
/**
2013-10-22 15:14:25 -07:00
* Changes default CPU profiler sampling interval to the specified number
* of microseconds. Default interval is 1000us. This method must be called
* when there are no profiles being recorded.
2010-05-21 09:41:50 -07:00
*/
2013-10-22 15:14:25 -07:00
void SetSamplingInterval(int us);
2010-05-21 09:41:50 -07:00
/**
* Sets whether or not the profiler should prioritize consistency of sample
* periodicity on Windows. Disabling this can greatly reduce CPU usage, but
* may result in greater variance in sample timings from the platform's
* scheduler. Defaults to enabled. This method must be called when there are
* no profiles being recorded.
*/
void SetUsePreciseSampling(bool);
deps: V8: cherry-pick semver-major commits from 10.2 Includes the following commits: commit b2978927d8a96ebc814cccbc5a9f1c35910ee621 Remove dynamic map checks and custom deoptimization kinds This CL removes: - Dynamic map checks aka minimorphic property loads (TF support, builtins). - "Bailout" deopts (= drop to the interpreter once, but don't throw out optimized code). - "EagerWithResume" deopts (= part of dynamic map check functionality, we call a builtin for the deopt check and deopt or resume based on the result). Fixed: v8:12552 Change-Id: I492cf1667e0f54586690b2f72a65ea804224b840 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3401585 commit f52f934119635058b179c2359fe070b8ee0f9233 PPC/s390: Remove dynamic map checks and custom deoptimization kinds Port b2978927d8a96ebc814cccbc5a9f1c35910ee621 Original Commit Message: This CL removes: - Dynamic map checks aka minimorphic property loads (TF support, builtins). - "Bailout" deopts (= drop to the interpreter once, but don't throw out optimized code). - "EagerWithResume" deopts (= part of dynamic map check functionality, we call a builtin for the deopt check and deopt or resume based on the result). R=jgruber@chromium.org, joransiu@ca.ibm.com, junyan@redhat.com, midawson@redhat.com BUG= LOG=N Change-Id: I64476f73810774c2c592231d82c4a2cbfa2bf94e Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3537881 commit 38940b70986da6b43d18cb8cf8f0a3be36ca9010 [loong64][mips] Remove dynamic map checks and custom deoptimization kinds Port commit b2978927d8a96ebc814cccbc5a9f1c35910ee621 Fixed: v8:12552 Change-Id: Ic2fbded9a662ed840a0350e3ce049e147fbf03a0 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3541527 commit da5b5f66a6bd27df6249602378300c6961bc62b4 [riscv64] Remove dynamic map checks and custom deoptimization kinds Port b2978927d8a96ebc814cccbc5a9f1c35910ee621 Bug: v8:12552 Change-Id: I73e76fc5cc8905a0fbfc801b2f794735866d19e8 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3544725 commit ffae028b37991566c080c5528463f7d16017668c Forward deprecation for resurrecting finalizer Bug: v8:12672 Change-Id: Ib4f53086436e028b4ea32fbc960f57e91709d184 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3532256 commit f6386018d472665e36d662c8b159d95325999d69 [api] Remove TracedGlobal<> Remove deprecated TracedGlobal<>, greatly simplifying handling of traced references in general. Also saves a word per v8::TracedReference as there's no need to keep a possible callback around. Bug: v8:12603 Change-Id: Ice35d7906775b912d02e97a27a722b3e1cec28d9 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3532251 commit a8beac553b0a1639bc9790c2d6f82caf6b2e150f Deprecate some signature checks Deprecate signature checks in * Template::SetNativeDataProperty * ObjectTemplate::SetAccessor These are not used in Chrome and require some complicated check in the IC code, which we want to remove. Change-Id: I413fafc8658e922fd590e7fe200600a624f019a6 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3557253 commit cff2b5000a1aa417a9c4499bcfa3ffda4542f4f1 Deprecate signature checks in Set{Accessor,NativeDataProperty} Change from V8_DEPRECATE_SOON to V8_DEPRECATED. It turned out that we don't have to make changes in chrome code, so we can go to deprecated right away. Bug: chromium:1310790 Change-Id: I1bd529536d3a0098f11f13b3e44fe3dbc80eed04 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3571897 commit 9238afb0c0ee52c9111a7e9f2f055137628771ad Allow embedder to set global OOM handler Embedders can currently specify a callback for OOM errors during Isolate initialization. However, there are cases where an OOM error can be thrown in a context where we don't have access to an Isolate, for example on a task posted to a worker thread. This CL introduces an initialization API to allow the embedder to specify a process-wide OOM callback. Bug: chromium:614440 Change-Id: I326753d80767679f677e85104d9edeef92e19086 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3561916 commit ca51ae3ac8b468509603633adb6ee3b3be9306ec [api][profiler] Get StartProfiling, StopProfiling to accept integer ID rather than string This CL adds support for interacting with CpuProfile with their integer id. A String ID is problematic because it forces an allocation when stopping or cancelling a Profiler which can happen during a GC when this is not allowed. Change-Id: I9a8e754bd67214be0bbc5ca051bcadf52bf71a68 Bug: chromium:1297283 Co-Authored-By: Nicolas Dubus <nicodubus@fb.com> Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3522896 Refs: https://github.com/v8/v8/commit/b2978927d8a96ebc814cccbc5a9f1c35910ee621 Refs: https://github.com/v8/v8/commit/f52f934119635058b179c2359fe070b8ee0f9233 Refs: https://github.com/v8/v8/commit/38940b70986da6b43d18cb8cf8f0a3be36ca9010 Refs: https://github.com/v8/v8/commit/da5b5f66a6bd27df6249602378300c6961bc62b4 Refs: https://github.com/v8/v8/commit/ffae028b37991566c080c5528463f7d16017668c Refs: https://github.com/v8/v8/commit/f6386018d472665e36d662c8b159d95325999d69 Refs: https://github.com/v8/v8/commit/a8beac553b0a1639bc9790c2d6f82caf6b2e150f Refs: https://github.com/v8/v8/commit/cff2b5000a1aa417a9c4499bcfa3ffda4542f4f1 Refs: https://github.com/v8/v8/commit/9238afb0c0ee52c9111a7e9f2f055137628771ad Refs: https://github.com/v8/v8/commit/ca51ae3ac8b468509603633adb6ee3b3be9306ec PR-URL: https://github.com/nodejs/node/pull/42657 Reviewed-By: Darshan Sen <raisinten@gmail.com> Reviewed-By: Richard Lau <rlau@redhat.com> Reviewed-By: Jiawen Geng <technicalcute@gmail.com> Reviewed-By: Michael Dawson <midawson@redhat.com>
2022-04-12 11:44:13 +02:00
/**
* Starts collecting a CPU profile. Several profiles may be collected at once.
* Generates an anonymous profiler, without a String identifier.
*/
CpuProfilingResult Start(
CpuProfilingOptions options,
std::unique_ptr<DiscardedSamplesDelegate> delegate = nullptr);
/**
* Starts collecting a CPU profile. Title may be an empty string. Several
* profiles may be collected at once. Attempts to start collecting several
* profiles with the same title are silently ignored.
*/
CpuProfilingResult Start(
Local<String> title, CpuProfilingOptions options,
std::unique_ptr<DiscardedSamplesDelegate> delegate = nullptr);
/**
* Starts profiling with the same semantics as above, except with expanded
* parameters.
*
* |record_samples| parameter controls whether individual samples should
* be recorded in addition to the aggregated tree.
*
* |max_samples| controls the maximum number of samples that should be
* recorded by the profiler. Samples obtained after this limit will be
* discarded.
*/
CpuProfilingResult Start(
Local<String> title, CpuProfilingMode mode, bool record_samples = false,
unsigned max_samples = CpuProfilingOptions::kNoSampleLimit);
/**
* The same as StartProfiling above, but the CpuProfilingMode defaults to
* kLeafNodeLineNumbers mode, which was the previous default behavior of the
* profiler.
*/
CpuProfilingResult Start(Local<String> title, bool record_samples = false);
2010-04-14 10:34:17 -07:00
/**
* Starts collecting a CPU profile. Title may be an empty string. Several
* profiles may be collected at once. Attempts to start collecting several
* profiles with the same title are silently ignored.
*/
CpuProfilingStatus StartProfiling(
Local<String> title, CpuProfilingOptions options,
std::unique_ptr<DiscardedSamplesDelegate> delegate = nullptr);
/**
* Starts profiling with the same semantics as above, except with expanded
* parameters.
2013-03-18 13:49:34 -07:00
*
* |record_samples| parameter controls whether individual samples should
* be recorded in addition to the aggregated tree.
*
* |max_samples| controls the maximum number of samples that should be
* recorded by the profiler. Samples obtained after this limit will be
* discarded.
2010-04-14 10:34:17 -07:00
*/
CpuProfilingStatus StartProfiling(
Local<String> title, CpuProfilingMode mode, bool record_samples = false,
unsigned max_samples = CpuProfilingOptions::kNoSampleLimit);
deps: V8: cherry-pick semver-major commits from 10.2 Includes the following commits: commit b2978927d8a96ebc814cccbc5a9f1c35910ee621 Remove dynamic map checks and custom deoptimization kinds This CL removes: - Dynamic map checks aka minimorphic property loads (TF support, builtins). - "Bailout" deopts (= drop to the interpreter once, but don't throw out optimized code). - "EagerWithResume" deopts (= part of dynamic map check functionality, we call a builtin for the deopt check and deopt or resume based on the result). Fixed: v8:12552 Change-Id: I492cf1667e0f54586690b2f72a65ea804224b840 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3401585 commit f52f934119635058b179c2359fe070b8ee0f9233 PPC/s390: Remove dynamic map checks and custom deoptimization kinds Port b2978927d8a96ebc814cccbc5a9f1c35910ee621 Original Commit Message: This CL removes: - Dynamic map checks aka minimorphic property loads (TF support, builtins). - "Bailout" deopts (= drop to the interpreter once, but don't throw out optimized code). - "EagerWithResume" deopts (= part of dynamic map check functionality, we call a builtin for the deopt check and deopt or resume based on the result). R=jgruber@chromium.org, joransiu@ca.ibm.com, junyan@redhat.com, midawson@redhat.com BUG= LOG=N Change-Id: I64476f73810774c2c592231d82c4a2cbfa2bf94e Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3537881 commit 38940b70986da6b43d18cb8cf8f0a3be36ca9010 [loong64][mips] Remove dynamic map checks and custom deoptimization kinds Port commit b2978927d8a96ebc814cccbc5a9f1c35910ee621 Fixed: v8:12552 Change-Id: Ic2fbded9a662ed840a0350e3ce049e147fbf03a0 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3541527 commit da5b5f66a6bd27df6249602378300c6961bc62b4 [riscv64] Remove dynamic map checks and custom deoptimization kinds Port b2978927d8a96ebc814cccbc5a9f1c35910ee621 Bug: v8:12552 Change-Id: I73e76fc5cc8905a0fbfc801b2f794735866d19e8 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3544725 commit ffae028b37991566c080c5528463f7d16017668c Forward deprecation for resurrecting finalizer Bug: v8:12672 Change-Id: Ib4f53086436e028b4ea32fbc960f57e91709d184 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3532256 commit f6386018d472665e36d662c8b159d95325999d69 [api] Remove TracedGlobal<> Remove deprecated TracedGlobal<>, greatly simplifying handling of traced references in general. Also saves a word per v8::TracedReference as there's no need to keep a possible callback around. Bug: v8:12603 Change-Id: Ice35d7906775b912d02e97a27a722b3e1cec28d9 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3532251 commit a8beac553b0a1639bc9790c2d6f82caf6b2e150f Deprecate some signature checks Deprecate signature checks in * Template::SetNativeDataProperty * ObjectTemplate::SetAccessor These are not used in Chrome and require some complicated check in the IC code, which we want to remove. Change-Id: I413fafc8658e922fd590e7fe200600a624f019a6 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3557253 commit cff2b5000a1aa417a9c4499bcfa3ffda4542f4f1 Deprecate signature checks in Set{Accessor,NativeDataProperty} Change from V8_DEPRECATE_SOON to V8_DEPRECATED. It turned out that we don't have to make changes in chrome code, so we can go to deprecated right away. Bug: chromium:1310790 Change-Id: I1bd529536d3a0098f11f13b3e44fe3dbc80eed04 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3571897 commit 9238afb0c0ee52c9111a7e9f2f055137628771ad Allow embedder to set global OOM handler Embedders can currently specify a callback for OOM errors during Isolate initialization. However, there are cases where an OOM error can be thrown in a context where we don't have access to an Isolate, for example on a task posted to a worker thread. This CL introduces an initialization API to allow the embedder to specify a process-wide OOM callback. Bug: chromium:614440 Change-Id: I326753d80767679f677e85104d9edeef92e19086 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3561916 commit ca51ae3ac8b468509603633adb6ee3b3be9306ec [api][profiler] Get StartProfiling, StopProfiling to accept integer ID rather than string This CL adds support for interacting with CpuProfile with their integer id. A String ID is problematic because it forces an allocation when stopping or cancelling a Profiler which can happen during a GC when this is not allowed. Change-Id: I9a8e754bd67214be0bbc5ca051bcadf52bf71a68 Bug: chromium:1297283 Co-Authored-By: Nicolas Dubus <nicodubus@fb.com> Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3522896 Refs: https://github.com/v8/v8/commit/b2978927d8a96ebc814cccbc5a9f1c35910ee621 Refs: https://github.com/v8/v8/commit/f52f934119635058b179c2359fe070b8ee0f9233 Refs: https://github.com/v8/v8/commit/38940b70986da6b43d18cb8cf8f0a3be36ca9010 Refs: https://github.com/v8/v8/commit/da5b5f66a6bd27df6249602378300c6961bc62b4 Refs: https://github.com/v8/v8/commit/ffae028b37991566c080c5528463f7d16017668c Refs: https://github.com/v8/v8/commit/f6386018d472665e36d662c8b159d95325999d69 Refs: https://github.com/v8/v8/commit/a8beac553b0a1639bc9790c2d6f82caf6b2e150f Refs: https://github.com/v8/v8/commit/cff2b5000a1aa417a9c4499bcfa3ffda4542f4f1 Refs: https://github.com/v8/v8/commit/9238afb0c0ee52c9111a7e9f2f055137628771ad Refs: https://github.com/v8/v8/commit/ca51ae3ac8b468509603633adb6ee3b3be9306ec PR-URL: https://github.com/nodejs/node/pull/42657 Reviewed-By: Darshan Sen <raisinten@gmail.com> Reviewed-By: Richard Lau <rlau@redhat.com> Reviewed-By: Jiawen Geng <technicalcute@gmail.com> Reviewed-By: Michael Dawson <midawson@redhat.com>
2022-04-12 11:44:13 +02:00
/**
* The same as StartProfiling above, but the CpuProfilingMode defaults to
* kLeafNodeLineNumbers mode, which was the previous default behavior of the
* profiler.
*/
CpuProfilingStatus StartProfiling(Local<String> title,
bool record_samples = false);
2014-03-31 14:38:28 +02:00
deps: V8: cherry-pick semver-major commits from 10.2 Includes the following commits: commit b2978927d8a96ebc814cccbc5a9f1c35910ee621 Remove dynamic map checks and custom deoptimization kinds This CL removes: - Dynamic map checks aka minimorphic property loads (TF support, builtins). - "Bailout" deopts (= drop to the interpreter once, but don't throw out optimized code). - "EagerWithResume" deopts (= part of dynamic map check functionality, we call a builtin for the deopt check and deopt or resume based on the result). Fixed: v8:12552 Change-Id: I492cf1667e0f54586690b2f72a65ea804224b840 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3401585 commit f52f934119635058b179c2359fe070b8ee0f9233 PPC/s390: Remove dynamic map checks and custom deoptimization kinds Port b2978927d8a96ebc814cccbc5a9f1c35910ee621 Original Commit Message: This CL removes: - Dynamic map checks aka minimorphic property loads (TF support, builtins). - "Bailout" deopts (= drop to the interpreter once, but don't throw out optimized code). - "EagerWithResume" deopts (= part of dynamic map check functionality, we call a builtin for the deopt check and deopt or resume based on the result). R=jgruber@chromium.org, joransiu@ca.ibm.com, junyan@redhat.com, midawson@redhat.com BUG= LOG=N Change-Id: I64476f73810774c2c592231d82c4a2cbfa2bf94e Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3537881 commit 38940b70986da6b43d18cb8cf8f0a3be36ca9010 [loong64][mips] Remove dynamic map checks and custom deoptimization kinds Port commit b2978927d8a96ebc814cccbc5a9f1c35910ee621 Fixed: v8:12552 Change-Id: Ic2fbded9a662ed840a0350e3ce049e147fbf03a0 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3541527 commit da5b5f66a6bd27df6249602378300c6961bc62b4 [riscv64] Remove dynamic map checks and custom deoptimization kinds Port b2978927d8a96ebc814cccbc5a9f1c35910ee621 Bug: v8:12552 Change-Id: I73e76fc5cc8905a0fbfc801b2f794735866d19e8 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3544725 commit ffae028b37991566c080c5528463f7d16017668c Forward deprecation for resurrecting finalizer Bug: v8:12672 Change-Id: Ib4f53086436e028b4ea32fbc960f57e91709d184 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3532256 commit f6386018d472665e36d662c8b159d95325999d69 [api] Remove TracedGlobal<> Remove deprecated TracedGlobal<>, greatly simplifying handling of traced references in general. Also saves a word per v8::TracedReference as there's no need to keep a possible callback around. Bug: v8:12603 Change-Id: Ice35d7906775b912d02e97a27a722b3e1cec28d9 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3532251 commit a8beac553b0a1639bc9790c2d6f82caf6b2e150f Deprecate some signature checks Deprecate signature checks in * Template::SetNativeDataProperty * ObjectTemplate::SetAccessor These are not used in Chrome and require some complicated check in the IC code, which we want to remove. Change-Id: I413fafc8658e922fd590e7fe200600a624f019a6 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3557253 commit cff2b5000a1aa417a9c4499bcfa3ffda4542f4f1 Deprecate signature checks in Set{Accessor,NativeDataProperty} Change from V8_DEPRECATE_SOON to V8_DEPRECATED. It turned out that we don't have to make changes in chrome code, so we can go to deprecated right away. Bug: chromium:1310790 Change-Id: I1bd529536d3a0098f11f13b3e44fe3dbc80eed04 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3571897 commit 9238afb0c0ee52c9111a7e9f2f055137628771ad Allow embedder to set global OOM handler Embedders can currently specify a callback for OOM errors during Isolate initialization. However, there are cases where an OOM error can be thrown in a context where we don't have access to an Isolate, for example on a task posted to a worker thread. This CL introduces an initialization API to allow the embedder to specify a process-wide OOM callback. Bug: chromium:614440 Change-Id: I326753d80767679f677e85104d9edeef92e19086 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3561916 commit ca51ae3ac8b468509603633adb6ee3b3be9306ec [api][profiler] Get StartProfiling, StopProfiling to accept integer ID rather than string This CL adds support for interacting with CpuProfile with their integer id. A String ID is problematic because it forces an allocation when stopping or cancelling a Profiler which can happen during a GC when this is not allowed. Change-Id: I9a8e754bd67214be0bbc5ca051bcadf52bf71a68 Bug: chromium:1297283 Co-Authored-By: Nicolas Dubus <nicodubus@fb.com> Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3522896 Refs: https://github.com/v8/v8/commit/b2978927d8a96ebc814cccbc5a9f1c35910ee621 Refs: https://github.com/v8/v8/commit/f52f934119635058b179c2359fe070b8ee0f9233 Refs: https://github.com/v8/v8/commit/38940b70986da6b43d18cb8cf8f0a3be36ca9010 Refs: https://github.com/v8/v8/commit/da5b5f66a6bd27df6249602378300c6961bc62b4 Refs: https://github.com/v8/v8/commit/ffae028b37991566c080c5528463f7d16017668c Refs: https://github.com/v8/v8/commit/f6386018d472665e36d662c8b159d95325999d69 Refs: https://github.com/v8/v8/commit/a8beac553b0a1639bc9790c2d6f82caf6b2e150f Refs: https://github.com/v8/v8/commit/cff2b5000a1aa417a9c4499bcfa3ffda4542f4f1 Refs: https://github.com/v8/v8/commit/9238afb0c0ee52c9111a7e9f2f055137628771ad Refs: https://github.com/v8/v8/commit/ca51ae3ac8b468509603633adb6ee3b3be9306ec PR-URL: https://github.com/nodejs/node/pull/42657 Reviewed-By: Darshan Sen <raisinten@gmail.com> Reviewed-By: Richard Lau <rlau@redhat.com> Reviewed-By: Jiawen Geng <technicalcute@gmail.com> Reviewed-By: Michael Dawson <midawson@redhat.com>
2022-04-12 11:44:13 +02:00
/**
* Stops collecting CPU profile with a given id and returns it.
*/
CpuProfile* Stop(ProfilerId id);
2010-04-14 10:34:17 -07:00
/**
* Stops collecting CPU profile with a given title and returns it.
* If the title given is empty, finishes the last profile started.
*/
CpuProfile* StopProfiling(Local<String> title);
2014-03-31 14:38:28 +02:00
/**
* Generate more detailed source positions to code objects. This results in
* better results when mapping profiling samples to script source.
*/
static void UseDetailedSourcePositionsForProfiling(Isolate* isolate);
2013-04-08 20:25:29 +02:00
private:
CpuProfiler();
~CpuProfiler();
CpuProfiler(const CpuProfiler&);
CpuProfiler& operator=(const CpuProfiler&);
2010-04-14 10:34:17 -07:00
};
2010-06-16 11:45:48 -07:00
/**
* HeapSnapshotEdge represents a directed connection between heap
2011-07-08 16:40:11 -07:00
* graph nodes: from retainers to retained nodes.
2010-06-16 11:45:48 -07:00
*/
2013-08-10 16:27:43 +02:00
class V8_EXPORT HeapGraphEdge {
2010-06-16 11:45:48 -07:00
public:
enum Type {
2010-08-17 08:37:25 -07:00
kContextVariable = 0, // A variable from a function context.
kElement = 1, // An element of an array.
kProperty = 2, // A named object property.
2010-11-24 01:03:06 -08:00
kInternal = 3, // A link that can't be accessed from JS,
// thus, its name isn't a real property name
// (e.g. parts of a ConsString).
kHidden = 4, // A link that is needed for proper sizes
// calculation, but may be hidden from user.
2011-12-14 15:02:32 -08:00
kShortcut = 5, // A link that must not be followed during
2010-11-24 01:03:06 -08:00
// sizes calculation.
2011-12-14 15:02:32 -08:00
kWeak = 6 // A weak reference (ignored by the GC).
2010-06-16 11:45:48 -07:00
};
/** Returns edge type (see HeapGraphEdge::Type). */
Type GetType() const;
/**
* Returns edge name. This can be a variable name, an element index, or
* a property name.
*/
Local<Value> GetName() const;
2010-06-16 11:45:48 -07:00
/** Returns origin node. */
const HeapGraphNode* GetFromNode() const;
/** Returns destination node. */
const HeapGraphNode* GetToNode() const;
};
/**
* HeapGraphNode represents a node in a heap graph.
*/
2013-08-10 16:27:43 +02:00
class V8_EXPORT HeapGraphNode {
2010-06-16 11:45:48 -07:00
public:
enum Type {
kHidden = 0, // Hidden node, may be filtered when shown to user.
kArray = 1, // An array of elements.
kString = 2, // A string.
kObject = 3, // A JS object (except for arrays and strings).
kCode = 4, // Compiled code.
kClosure = 5, // Function closure.
kRegExp = 6, // RegExp.
kHeapNumber = 7, // Number stored in the heap.
kNative = 8, // Native object (not from V8 heap).
kSynthetic = 9, // Synthetic object, usually used for grouping
// snapshot items together.
kConsString = 10, // Concatenated string. A pair of pointers to strings.
kSlicedString = 11, // Sliced string. A fragment of another string.
kSymbol = 12, // A Symbol (ES6).
kBigInt = 13, // BigInt.
kObjectShape = 14, // Internal data used for tracking the shapes (or
// "hidden classes") of JS objects.
2010-06-16 11:45:48 -07:00
};
/** Returns node type (see HeapGraphNode::Type). */
Type GetType() const;
/**
* Returns node name. Depending on node's type this can be the name
* of the constructor (for objects), the name of the function (for
* closures), string value, or an empty string (for compiled code).
*/
Local<String> GetName() const;
2010-06-16 11:45:48 -07:00
2010-07-21 12:31:43 -07:00
/**
* Returns node id. For the same heap object, the id remains the same
2011-07-08 16:40:11 -07:00
* across all snapshots.
2010-07-21 12:31:43 -07:00
*/
2012-06-13 15:34:45 +02:00
SnapshotObjectId GetId() const;
2010-07-21 12:31:43 -07:00
2014-03-31 14:38:28 +02:00
/** Returns node's own size, in bytes. */
size_t GetShallowSize() const;
2010-06-16 11:45:48 -07:00
/** Returns child nodes count of the node. */
int GetChildrenCount() const;
/** Retrieves a child by index. */
const HeapGraphEdge* GetChild(int index) const;
};
/**
* HeapSnapshots record the state of the JS heap at some moment.
*/
2013-08-10 16:27:43 +02:00
class V8_EXPORT HeapSnapshot {
2010-06-16 11:45:48 -07:00
public:
2010-09-16 21:33:32 -07:00
enum SerializationFormat {
kJSON = 0 // See format description near 'Serialize' method.
2010-09-08 17:14:42 -07:00
};
2010-06-16 11:45:48 -07:00
/** Returns the root node of the heap graph. */
2010-07-21 12:31:43 -07:00
const HeapGraphNode* GetRoot() const;
2010-12-07 13:56:11 -08:00
/** Returns a node by its id. */
2012-06-13 15:34:45 +02:00
const HeapGraphNode* GetNodeById(SnapshotObjectId id) const;
2010-12-07 13:56:11 -08:00
2011-07-08 16:40:11 -07:00
/** Returns total nodes count in the snapshot. */
int GetNodesCount() const;
/** Returns a node by index. */
const HeapGraphNode* GetNode(int index) const;
2012-06-13 15:34:45 +02:00
/** Returns a max seen JS object Id. */
SnapshotObjectId GetMaxSnapshotJSObjectId() const;
2010-09-08 17:14:42 -07:00
/**
2011-07-08 16:40:11 -07:00
* Deletes the snapshot and removes it from HeapProfiler's list.
* All pointers to nodes, edges and paths previously returned become
* invalid.
2010-09-08 17:14:42 -07:00
*/
2011-07-08 16:40:11 -07:00
void Delete();
2010-09-16 21:33:32 -07:00
/**
* Prepare a serialized representation of the snapshot. The result
* is written into the stream provided in chunks of specified size.
* The total length of the serialized snapshot is unknown in
2011-07-08 16:40:11 -07:00
* advance, it can be roughly equal to JS heap size (that means,
2010-09-16 21:33:32 -07:00
* it can be really big - tens of megabytes).
*
* For the JSON format, heap contents are represented as an object
* with the following structure:
*
* {
2012-06-13 15:34:45 +02:00
* snapshot: {
* title: "...",
* uid: nnn,
* meta: { meta-info },
* node_count: nnn,
* edge_count: nnn
* },
* nodes: [nodes array],
* edges: [edges array],
* strings: [strings array]
2010-09-16 21:33:32 -07:00
* }
*
2012-06-13 15:34:45 +02:00
* Nodes reference strings, other nodes, and edges by their indexes
* in corresponding arrays.
2010-09-16 21:33:32 -07:00
*/
void Serialize(OutputStream* stream,
SerializationFormat format = kJSON) const;
2010-06-16 11:45:48 -07:00
};
2014-03-31 14:38:28 +02:00
/**
* An interface for reporting progress and controlling long-running
* activities.
*/
class V8_EXPORT ActivityControl {
2014-03-31 14:38:28 +02:00
public:
enum ControlOption {
kContinue = 0,
kAbort = 1
};
virtual ~ActivityControl() = default;
2014-03-31 14:38:28 +02:00
/**
* Notify about current progress. The activity can be stopped by
* returning kAbort as the callback result.
*/
virtual ControlOption ReportProgressValue(uint32_t done, uint32_t total) = 0;
2014-03-31 14:38:28 +02:00
};
/**
* AllocationProfile is a sampled profile of allocations done by the program.
* This is structured as a call-graph.
*/
class V8_EXPORT AllocationProfile {
public:
struct Allocation {
/**
* Size of the sampled allocation object.
*/
size_t size;
/**
* The number of objects of such size that were sampled.
*/
unsigned int count;
};
/**
* Represents a node in the call-graph.
*/
struct Node {
/**
* Name of the function. May be empty for anonymous functions or if the
* script corresponding to this function has been unloaded.
*/
Local<String> name;
/**
* Name of the script containing the function. May be empty if the script
* name is not available, or if the script has been unloaded.
*/
Local<String> script_name;
/**
* id of the script where the function is located. May be equal to
* v8::UnboundScript::kNoScriptId in cases where the script doesn't exist.
*/
int script_id;
/**
* Start position of the function in the script.
*/
int start_position;
/**
* 1-indexed line number where the function starts. May be
* kNoLineNumberInfo if no line number information is available.
*/
int line_number;
/**
* 1-indexed column number where the function starts. May be
* kNoColumnNumberInfo if no line number information is available.
*/
int column_number;
/**
* Unique id of the node.
*/
uint32_t node_id;
/**
* List of callees called from this node for which we have sampled
* allocations. The lifetime of the children is scoped to the containing
* AllocationProfile.
*/
std::vector<Node*> children;
/**
* List of self allocations done by this node in the call-graph.
*/
std::vector<Allocation> allocations;
};
/**
* Represent a single sample recorded for an allocation.
*/
struct Sample {
/**
* id of the node in the profile tree.
*/
uint32_t node_id;
/**
* Size of the sampled allocation object.
*/
size_t size;
/**
* The number of objects of such size that were sampled.
*/
unsigned int count;
/**
* Unique time-ordered id of the allocation sample. Can be used to track
* what samples were added or removed between two snapshots.
*/
uint64_t sample_id;
};
/**
* Returns the root node of the call-graph. The root node corresponds to an
* empty JS call-stack. The lifetime of the returned Node* is scoped to the
* containing AllocationProfile.
*/
virtual Node* GetRootNode() = 0;
virtual const std::vector<Sample>& GetSamples() = 0;
virtual ~AllocationProfile() = default;
static const int kNoLineNumberInfo = Message::kNoLineNumberInfo;
static const int kNoColumnNumberInfo = Message::kNoColumnInfo;
};
/**
* An object graph consisting of embedder objects and V8 objects.
* Edges of the graph are strong references between the objects.
* The embedder can build this graph during heap snapshot generation
* to include the embedder objects in the heap snapshot.
* Usage:
* 1) Define derived class of EmbedderGraph::Node for embedder objects.
* 2) Set the build embedder graph callback on the heap profiler using
* HeapProfiler::AddBuildEmbedderGraphCallback.
* 3) In the callback use graph->AddEdge(node1, node2) to add an edge from
* node1 to node2.
* 4) To represent references from/to V8 object, construct V8 nodes using
* graph->V8Node(value).
*/
class V8_EXPORT EmbedderGraph {
public:
class Node {
public:
/**
* Detachedness specifies whether an object is attached or detached from the
* main application state. While unkown in general, there may be objects
* that specifically know their state. V8 passes this information along in
* the snapshot. Users of the snapshot may use it to annotate the object
* graph.
*/
enum class Detachedness : uint8_t {
kUnknown = 0,
kAttached = 1,
kDetached = 2,
};
Node() = default;
virtual ~Node() = default;
virtual const char* Name() = 0;
virtual size_t SizeInBytes() = 0;
/**
* The corresponding V8 wrapper node if not null.
* During heap snapshot generation the embedder node and the V8 wrapper
* node will be merged into one node to simplify retaining paths.
*/
virtual Node* WrapperNode() { return nullptr; }
virtual bool IsRootNode() { return false; }
/** Must return true for non-V8 nodes. */
virtual bool IsEmbedderNode() { return true; }
/**
* Optional name prefix. It is used in Chrome for tagging detached nodes.
*/
virtual const char* NamePrefix() { return nullptr; }
/**
* Returns the NativeObject that can be used for querying the
* |HeapSnapshot|.
*/
virtual NativeObject GetNativeObject() { return nullptr; }
/**
* Detachedness state of a given object. While unkown in general, there may
* be objects that specifically know their state. V8 passes this information
* along in the snapshot. Users of the snapshot may use it to annotate the
* object graph.
*/
virtual Detachedness GetDetachedness() { return Detachedness::kUnknown; }
/**
* Returns the address of the object in the embedder heap, or nullptr to not
* specify the address. If this address is provided, then V8 can generate
* consistent IDs for objects across subsequent heap snapshots, which allows
* devtools to determine which objects were retained from one snapshot to
* the next. This value is used only if GetNativeObject returns nullptr.
*/
virtual const void* GetAddress() { return nullptr; }
Node(const Node&) = delete;
Node& operator=(const Node&) = delete;
};
/**
* Returns a node corresponding to the given V8 value. Ownership is not
* transferred. The result pointer is valid while the graph is alive.
*
* For now the variant that takes v8::Data is not marked as abstract for
* compatibility, but embedders who subclass EmbedderGraph are expected to
* implement it. Then in the implementation of the variant that takes
* v8::Value, they can simply forward the call to the one that takes
* v8::Local<v8::Data>.
*/
virtual Node* V8Node(const v8::Local<v8::Value>& value) = 0;
/**
* Returns a node corresponding to the given V8 value. Ownership is not
* transferred. The result pointer is valid while the graph is alive.
*
* For API compatibility, this default implementation just checks that the
* data is a v8::Value and forward it to the variant that takes v8::Value,
* which is currently required to be implemented. In the future we'll remove
* the v8::Value variant, and make this variant that takes v8::Data abstract
* instead. If the embedder subclasses v8::EmbedderGraph and also use
* v8::TracedReference<v8::Data>, they must override this variant.
*/
virtual Node* V8Node(const v8::Local<v8::Data>& value);
/**
* Adds the given node to the graph and takes ownership of the node.
* Returns a raw pointer to the node that is valid while the graph is alive.
*/
virtual Node* AddNode(std::unique_ptr<Node> node) = 0;
/**
* Adds an edge that represents a strong reference from the given
* node |from| to the given node |to|. The nodes must be added to the graph
* before calling this function.
*
* If name is nullptr, the edge will have auto-increment indexes, otherwise
* it will be named accordingly.
*/
virtual void AddEdge(Node* from, Node* to, const char* name = nullptr) = 0;
/**
* Adds a count of bytes that are not associated with any particular Node.
* An embedder may use this to represent the size of nodes which were omitted
* from this EmbedderGraph despite being retained by the graph, or other
* overhead costs. This number will contribute to the total size in a heap
* snapshot, without being represented in the object graph.
*/
virtual void AddNativeSize(size_t size) {}
virtual ~EmbedderGraph() = default;
};
class QueryObjectPredicate {
public:
virtual ~QueryObjectPredicate() = default;
virtual bool Filter(v8::Local<v8::Object> object) = 0;
};
2010-06-16 11:45:48 -07:00
/**
2013-04-08 20:25:29 +02:00
* Interface for controlling heap profiling. Instance of the
* profiler can be retrieved using v8::Isolate::GetHeapProfiler.
2010-06-16 11:45:48 -07:00
*/
2013-08-10 16:27:43 +02:00
class V8_EXPORT HeapProfiler {
2010-06-16 11:45:48 -07:00
public:
void QueryObjects(v8::Local<v8::Context> context,
QueryObjectPredicate* predicate,
std::vector<v8::Global<v8::Object>>* objects);
enum SamplingFlags {
kSamplingNoFlags = 0,
kSamplingForceGC = 1 << 0,
deps: V8: cherry-pick 3d59a3c2c164 Original commit message: Add option to report discarded allocations in sampling heap profiler A couple of customers have asked about using devtools to get information about temporary allocations, with the goal of reducing GC time and/or peak memory usage. Currently, the sampling heap profiler reports only objects which are still alive at the end of the profiling session. In this change, I propose adding configuration options when starting the sampling heap profiler so that it can optionally include information about objects which were discarded by the GC before the end of the profiling session. A user could run the sampling heap profiler in several different modes depending on their goals: 1. To find memory leaks or determine which functions contribute most to steady-state memory consumption, the current default mode is best. 2. To find functions which cause large temporary memory spikes or large GC pauses, the user can request data about both live objects and those collected by major GC. 3. To tune for minimal GC activity in latency-sensitive applications like real-time audio processing, the user can request data about every allocation, including objects collected by major or minor GC. 4. I'm not sure why anybody would want data about objects collected by minor GC and not objects collected by major GC, but it's also a valid flags combination. Change-Id: If55d5965a1de04fed3ae640a02ca369723f64fdf Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3868522 Reviewed-by: Michael Lippautz <mlippautz@chromium.org> Reviewed-by: Camillo Bruni <cbruni@chromium.org> Reviewed-by: Simon Zünd <szuend@chromium.org> Commit-Queue: Seth Brenith <seth.brenith@microsoft.com> Cr-Commit-Position: refs/heads/main@{#83202} Refs: https://github.com/v8/v8/commit/3d59a3c2c16405eea59263300c5591c3283a2a0e PR-URL: https://github.com/nodejs/node/pull/44958 Reviewed-By: Jiawen Geng <technicalcute@gmail.com> Reviewed-By: Beth Griggs <bethanyngriggs@gmail.com> Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com> Reviewed-By: Richard Lau <rlau@redhat.com>
2022-10-11 09:04:31 +02:00
kSamplingIncludeObjectsCollectedByMajorGC = 1 << 1,
kSamplingIncludeObjectsCollectedByMinorGC = 1 << 2,
};
/**
* Callback function invoked during heap snapshot generation to retrieve
* the embedder object graph. The callback should use graph->AddEdge(..) to
* add references between the objects.
* The callback must not trigger garbage collection in V8.
*/
typedef void (*BuildEmbedderGraphCallback)(v8::Isolate* isolate,
v8::EmbedderGraph* graph,
void* data);
/**
* Callback function invoked during heap snapshot generation to retrieve
* the detachedness state of a JS object referenced by a TracedReference.
*
* The callback takes Local<Value> as parameter to allow the embedder to
* unpack the TracedReference into a Local and reuse that Local for different
* purposes.
*/
using GetDetachednessCallback = EmbedderGraph::Node::Detachedness (*)(
v8::Isolate* isolate, const v8::Local<v8::Value>& v8_value,
uint16_t class_id, void* data);
2013-04-08 20:25:29 +02:00
/** Returns the number of snapshots taken. */
int GetSnapshotCount();
2010-06-16 11:45:48 -07:00
2013-04-08 20:25:29 +02:00
/** Returns a snapshot by index. */
const HeapSnapshot* GetHeapSnapshot(int index);
2010-06-16 11:45:48 -07:00
2012-06-13 15:34:45 +02:00
/**
* Returns SnapshotObjectId for a heap object referenced by |value| if
* it has been seen by the heap profiler, kUnknownObjectId otherwise.
*/
SnapshotObjectId GetObjectId(Local<Value> value);
2012-06-13 15:34:45 +02:00
/**
* Returns SnapshotObjectId for a native object referenced by |value| if it
* has been seen by the heap profiler, kUnknownObjectId otherwise.
*/
SnapshotObjectId GetObjectId(NativeObject value);
2014-03-13 20:45:44 +04:00
/**
* Returns heap object with given SnapshotObjectId if the object is alive,
* otherwise empty handle is returned.
*/
Local<Value> FindObjectById(SnapshotObjectId id);
2014-03-13 20:45:44 +04:00
/**
* Clears internal map from SnapshotObjectId to heap object. The new objects
* will not be added into it unless a heap snapshot is taken or heap object
* tracking is kicked off.
*/
void ClearObjectIds();
2012-06-13 15:34:45 +02:00
/**
* A constant for invalid SnapshotObjectId. GetSnapshotObjectId will return
* it in case heap profiler cannot find id for the object passed as
* parameter. HeapSnapshot::GetNodeById will always return NULL for such id.
*/
static const SnapshotObjectId kUnknownObjectId = 0;
2013-03-18 13:49:34 -07:00
/**
* Callback interface for retrieving user friendly names of global objects.
*/
class ObjectNameResolver {
2013-04-08 20:25:29 +02:00
public:
2013-03-18 13:49:34 -07:00
/**
* Returns name to be used in the heap snapshot for given node. Returned
* string must stay alive until snapshot collection is completed.
*/
virtual const char* GetName(Local<Object> object) = 0;
2013-04-08 20:25:29 +02:00
protected:
virtual ~ObjectNameResolver() = default;
2013-03-18 13:49:34 -07:00
};
enum class HeapSnapshotMode {
/**
* Heap snapshot for regular developers.
*/
kRegular,
/**
* Heap snapshot is exposing internals that may be useful for experts.
*/
kExposeInternals,
};
enum class NumericsMode {
/**
* Numeric values are hidden as they are values of the corresponding
* objects.
*/
kHideNumericValues,
/**
* Numeric values are exposed in artificial fields.
*/
kExposeNumericValues
};
struct HeapSnapshotOptions final {
// Manually define default constructor here to be able to use it in
// `TakeSnapshot()` below.
// NOLINTNEXTLINE
HeapSnapshotOptions() {}
/**
* The control used to report intermediate progress to.
*/
ActivityControl* control = nullptr;
/**
* The resolver used by the snapshot generator to get names for V8 objects.
*/
ObjectNameResolver* global_object_name_resolver = nullptr;
/**
* Mode for taking the snapshot, see `HeapSnapshotMode`.
*/
HeapSnapshotMode snapshot_mode = HeapSnapshotMode::kRegular;
/**
* Mode for dealing with numeric values, see `NumericsMode`.
*/
NumericsMode numerics_mode = NumericsMode::kHideNumericValues;
/**
* Whether stack is considered as a root set.
*/
cppgc::EmbedderStackState stack_state =
cppgc::EmbedderStackState::kMayContainHeapPointers;
};
2010-09-08 17:14:42 -07:00
/**
* Takes a heap snapshot.
*
* \returns the snapshot.
*/
const HeapSnapshot* TakeHeapSnapshot(
const HeapSnapshotOptions& options = HeapSnapshotOptions());
/**
* Takes a heap snapshot. See `HeapSnapshotOptions` for details on the
* parameters.
*
* \returns the snapshot.
2010-09-08 17:14:42 -07:00
*/
2013-04-08 20:25:29 +02:00
const HeapSnapshot* TakeHeapSnapshot(
ActivityControl* control,
ObjectNameResolver* global_object_name_resolver = nullptr,
bool hide_internals = true, bool capture_numeric_value = false);
2011-07-08 16:40:11 -07:00
/**
* Obtains list of Detached JS Wrapper Objects. This functon calls garbage
* collection, then iterates over traced handles in the isolate
*/
std::vector<v8::Local<v8::Value>> GetDetachedJSWrapperObjects();
2012-06-13 15:34:45 +02:00
/**
* Starts tracking of heap objects population statistics. After calling
* this method, all heap objects relocations done by the garbage collector
* are being registered.
2014-03-13 20:45:44 +04:00
*
* |track_allocations| parameter controls whether stack trace of each
* allocation in the heap will be recorded and reported as part of
* HeapSnapshot.
2012-06-13 15:34:45 +02:00
*/
2014-03-13 20:45:44 +04:00
void StartTrackingHeapObjects(bool track_allocations = false);
2012-06-13 15:34:45 +02:00
/**
* Adds a new time interval entry to the aggregated statistics array. The
* time interval entry contains information on the current heap objects
* population size. The method also updates aggregated statistics and
* reports updates for all previous time intervals via the OutputStream
* object. Updates on each time interval are provided as a stream of the
* HeapStatsUpdate structure instances.
* If |timestamp_us| is supplied, timestamp of the new entry will be written
* into it. The return value of the function is the last seen heap object Id.
2012-06-13 15:34:45 +02:00
*
2013-04-08 20:25:29 +02:00
* StartTrackingHeapObjects must be called before the first call to this
2012-06-13 15:34:45 +02:00
* method.
*/
SnapshotObjectId GetHeapStats(OutputStream* stream,
int64_t* timestamp_us = nullptr);
2012-06-13 15:34:45 +02:00
/**
* Stops tracking of heap objects population statistics, cleans up all
* collected data. StartHeapObjectsTracking must be called again prior to
* calling GetHeapStats next time.
2012-06-13 15:34:45 +02:00
*/
2013-04-08 20:25:29 +02:00
void StopTrackingHeapObjects();
2012-06-13 15:34:45 +02:00
/**
* Starts gathering a sampling heap profile. A sampling heap profile is
* similar to tcmalloc's heap profiler and Go's mprof. It samples object
* allocations and builds an online 'sampling' heap profile. At any point in
* time, this profile is expected to be a representative sample of objects
* currently live in the system. Each sampled allocation includes the stack
* trace at the time of allocation, which makes this really useful for memory
* leak detection.
*
* This mechanism is intended to be cheap enough that it can be used in
* production with minimal performance overhead.
*
* Allocations are sampled using a randomized Poisson process. On average, one
* allocation will be sampled every |sample_interval| bytes allocated. The
* |stack_depth| parameter controls the maximum number of stack frames to be
* captured on each allocation.
*
deps: V8: cherry-pick 3d59a3c2c164 Original commit message: Add option to report discarded allocations in sampling heap profiler A couple of customers have asked about using devtools to get information about temporary allocations, with the goal of reducing GC time and/or peak memory usage. Currently, the sampling heap profiler reports only objects which are still alive at the end of the profiling session. In this change, I propose adding configuration options when starting the sampling heap profiler so that it can optionally include information about objects which were discarded by the GC before the end of the profiling session. A user could run the sampling heap profiler in several different modes depending on their goals: 1. To find memory leaks or determine which functions contribute most to steady-state memory consumption, the current default mode is best. 2. To find functions which cause large temporary memory spikes or large GC pauses, the user can request data about both live objects and those collected by major GC. 3. To tune for minimal GC activity in latency-sensitive applications like real-time audio processing, the user can request data about every allocation, including objects collected by major or minor GC. 4. I'm not sure why anybody would want data about objects collected by minor GC and not objects collected by major GC, but it's also a valid flags combination. Change-Id: If55d5965a1de04fed3ae640a02ca369723f64fdf Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3868522 Reviewed-by: Michael Lippautz <mlippautz@chromium.org> Reviewed-by: Camillo Bruni <cbruni@chromium.org> Reviewed-by: Simon Zünd <szuend@chromium.org> Commit-Queue: Seth Brenith <seth.brenith@microsoft.com> Cr-Commit-Position: refs/heads/main@{#83202} Refs: https://github.com/v8/v8/commit/3d59a3c2c16405eea59263300c5591c3283a2a0e PR-URL: https://github.com/nodejs/node/pull/44958 Reviewed-By: Jiawen Geng <technicalcute@gmail.com> Reviewed-By: Beth Griggs <bethanyngriggs@gmail.com> Reviewed-By: Rafael Gonzaga <rafael.nunu@hotmail.com> Reviewed-By: Richard Lau <rlau@redhat.com>
2022-10-11 09:04:31 +02:00
* NOTE: Support for native allocations doesn't exist yet, but is anticipated
* in the future.
*
* Objects allocated before the sampling is started will not be included in
* the profile.
*
* Returns false if a sampling heap profiler is already running.
*/
bool StartSamplingHeapProfiler(uint64_t sample_interval = 512 * 1024,
int stack_depth = 16,
SamplingFlags flags = kSamplingNoFlags);
/**
* Stops the sampling heap profile and discards the current profile.
*/
void StopSamplingHeapProfiler();
/**
* Returns the sampled profile of allocations allocated (and still live) since
* StartSamplingHeapProfiler was called. The ownership of the pointer is
* transferred to the caller. Returns nullptr if sampling heap profiler is not
* active.
*/
AllocationProfile* GetAllocationProfile();
2011-07-08 16:40:11 -07:00
/**
* Deletes all snapshots taken. All previously returned pointers to
* snapshots and their contents become invalid after this call.
*/
2013-04-08 20:25:29 +02:00
void DeleteAllHeapSnapshots();
2011-07-08 16:40:11 -07:00
void AddBuildEmbedderGraphCallback(BuildEmbedderGraphCallback callback,
void* data);
void RemoveBuildEmbedderGraphCallback(BuildEmbedderGraphCallback callback,
void* data);
void SetGetDetachednessCallback(GetDetachednessCallback callback, void* data);
/**
* Returns whether the heap profiler is currently taking a snapshot.
*/
bool IsTakingSnapshot();
/**
* Allocates a copy of the provided string within the heap snapshot generator
* and returns a pointer to the copy. May only be called during heap snapshot
* generation.
*/
const char* CopyNameForHeapSnapshot(const char* name);
2011-07-08 16:40:11 -07:00
/**
* Default value of persistent handle class ID. Must not be used to
* define a class. Can be used to reset a class of a persistent
* handle.
*/
static const uint16_t kPersistentHandleNoClassId = 0;
2012-03-12 21:46:36 -07:00
2013-04-08 20:25:29 +02:00
private:
HeapProfiler();
~HeapProfiler();
HeapProfiler(const HeapProfiler&);
HeapProfiler& operator=(const HeapProfiler&);
2011-07-08 16:40:11 -07:00
};
2012-06-13 15:34:45 +02:00
/**
* A struct for exporting HeapStats data from V8, using "push" model.
2013-04-08 20:25:29 +02:00
* See HeapProfiler::GetHeapStats.
2012-06-13 15:34:45 +02:00
*/
struct HeapStatsUpdate {
HeapStatsUpdate(uint32_t index, uint32_t count, uint32_t size)
: index(index), count(count), size(size) { }
uint32_t index; // Index of the time interval that was changed.
uint32_t count; // New value of count field for the interval with this index.
uint32_t size; // New value of size field for the interval with this index.
};
#define CODE_EVENTS_LIST(V) \
V(Builtin) \
V(Callback) \
V(Eval) \
V(Function) \
V(InterpretedFunction) \
V(Handler) \
V(BytecodeHandler) \
V(LazyCompile) /* Unused, use kFunction instead */ \
V(RegExp) \
V(Script) \
V(Stub) \
V(Relocation)
/**
* Note that this enum may be extended in the future. Please include a default
* case if this enum is used in a switch statement.
*/
enum CodeEventType {
kUnknownType = 0
#define V(Name) , k##Name##Type
CODE_EVENTS_LIST(V)
#undef V
};
/**
* Representation of a code creation event
*/
class V8_EXPORT CodeEvent {
public:
uintptr_t GetCodeStartAddress();
size_t GetCodeSize();
Local<String> GetFunctionName();
Local<String> GetScriptName();
int GetScriptLine();
int GetScriptColumn();
/**
* NOTE (mmarchini): We can't allocate objects in the heap when we collect
* existing code, and both the code type and the comment are not stored in the
* heap, so we return those as const char*.
*/
CodeEventType GetCodeType();
const char* GetComment();
static const char* GetCodeEventTypeName(CodeEventType code_event_type);
uintptr_t GetPreviousCodeStartAddress();
};
/**
* Interface to listen to code creation and code relocation events.
*/
class V8_EXPORT CodeEventHandler {
public:
/**
* Creates a new listener for the |isolate|. The isolate must be initialized.
* The listener object must be disposed after use by calling |Dispose| method.
* Multiple listeners can be created for the same isolate.
*/
explicit CodeEventHandler(Isolate* isolate);
virtual ~CodeEventHandler();
/**
* Handle is called every time a code object is created or moved. Information
* about each code event will be available through the `code_event`
* parameter.
*
* When the CodeEventType is kRelocationType, the code for this CodeEvent has
* moved from `GetPreviousCodeStartAddress()` to `GetCodeStartAddress()`.
*/
virtual void Handle(CodeEvent* code_event) = 0;
/**
* Call `Enable()` to starts listening to code creation and code relocation
* events. These events will be handled by `Handle()`.
*/
void Enable();
/**
* Call `Disable()` to stop listening to code creation and code relocation
* events.
*/
void Disable();
private:
CodeEventHandler();
CodeEventHandler(const CodeEventHandler&);
CodeEventHandler& operator=(const CodeEventHandler&);
void* internal_listener_;
};
2012-06-13 15:34:45 +02:00
2010-04-14 10:34:17 -07:00
} // namespace v8
#endif // V8_V8_PROFILER_H_