Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

build: add V8 embedder version string #15785

Closed
wants to merge 3 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 4 additions & 0 deletions common.gypi
Original file line number Diff line number Diff line change
Expand Up @@ -25,6 +25,10 @@
# Default to -O0 for debug builds.
'v8_optimized_debug%': 0,

# Reset this number to 0 on major V8 upgrades.
# Increment by one for each non-official patch applied to deps/v8.
'v8_embedder_string': '-node.0',

# Enable disassembler for `--print-code` v8 options
'v8_enable_disassembler': 1,

Expand Down
6 changes: 6 additions & 0 deletions deps/v8/BUILD.gn
Original file line number Diff line number Diff line change
Expand Up @@ -39,6 +39,9 @@ declare_args() {
# Embeds the given script into the snapshot.
v8_embed_script = ""

# Allows the embedder to add a custom suffix to the version string.
v8_embedder_string = ""

# Sets -dENABLE_DISASSEMBLER.
v8_enable_disassembler = ""

Expand Down Expand Up @@ -217,6 +220,9 @@ config("features") {

defines = []

if (v8_embedder_string != "") {
defines += [ "V8_EMBEDDER_STRING=\"$v8_embedder_string\"" ]
}
if (v8_enable_disassembler) {
defines += [ "ENABLE_DISASSEMBLER" ]
}
Expand Down
6 changes: 6 additions & 0 deletions deps/v8/gypfiles/features.gypi
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,9 @@

{
'variables': {
# Allows the embedder to add a custom suffix to the version string.
'v8_embedder_string%': '',

'v8_enable_disassembler%': 0,

'v8_promise_internal_field_count%': 0,
Expand Down Expand Up @@ -79,6 +82,9 @@
},
'target_defaults': {
'conditions': [
['v8_embedder_string!=""', {
'defines': ['V8_EMBEDDER_STRING="<(v8_embedder_string)"',],
}],
['v8_enable_disassembler==1', {
'defines': ['ENABLE_DISASSEMBLER',],
}],
Expand Down
6 changes: 5 additions & 1 deletion deps/v8/include/v8-version-string.h
Original file line number Diff line number Diff line change
Expand Up @@ -16,14 +16,18 @@
#define V8_CANDIDATE_STRING ""
#endif

#ifndef V8_EMBEDDER_STRING
#define V8_EMBEDDER_STRING ""
#endif

#define V8_SX(x) #x
#define V8_S(x) V8_SX(x)

#if V8_PATCH_LEVEL > 0
#define V8_VERSION_STRING \
V8_S(V8_MAJOR_VERSION) \
"." V8_S(V8_MINOR_VERSION) "." V8_S(V8_BUILD_NUMBER) "." V8_S( \
V8_PATCH_LEVEL) V8_CANDIDATE_STRING
V8_PATCH_LEVEL) V8_EMBEDDER_STRING V8_CANDIDATE_STRING
#else
#define V8_VERSION_STRING \
V8_S(V8_MAJOR_VERSION) \
Expand Down
13 changes: 10 additions & 3 deletions deps/v8/src/log-utils.cc
Original file line number Diff line number Diff line change
Expand Up @@ -55,9 +55,16 @@ void Log::Initialize(const char* log_file_name) {

if (output_handle_ != nullptr) {
Log::MessageBuilder msg(this);
msg.Append("v8-version,%d,%d,%d,%d,%d", Version::GetMajor(),
Version::GetMinor(), Version::GetBuild(), Version::GetPatch(),
Version::IsCandidate());
if (strlen(Version::GetEmbedder()) == 0) {
msg.Append("v8-version,%d,%d,%d,%d,%d", Version::GetMajor(),
Version::GetMinor(), Version::GetBuild(),
Version::GetPatch(), Version::IsCandidate());
} else {
msg.Append("v8-version,%d,%d,%d,%d,%s,%d", Version::GetMajor(),
Version::GetMinor(), Version::GetBuild(),
Version::GetPatch(), Version::GetEmbedder(),
Version::IsCandidate());
}
msg.WriteToLogFile();
}
}
Expand Down
19 changes: 10 additions & 9 deletions deps/v8/src/version.cc
Original file line number Diff line number Diff line change
Expand Up @@ -20,6 +20,7 @@ int Version::major_ = V8_MAJOR_VERSION;
int Version::minor_ = V8_MINOR_VERSION;
int Version::build_ = V8_BUILD_NUMBER;
int Version::patch_ = V8_PATCH_LEVEL;
const char* Version::embedder_ = V8_EMBEDDER_STRING;
bool Version::candidate_ = (V8_IS_CANDIDATE_VERSION != 0);
const char* Version::soname_ = SONAME;
const char* Version::version_string_ = V8_VERSION_STRING;
Expand All @@ -33,12 +34,12 @@ void Version::GetString(Vector<char> str) {
const char* is_simulator = "";
#endif // USE_SIMULATOR
if (GetPatch() > 0) {
SNPrintF(str, "%d.%d.%d.%d%s%s",
GetMajor(), GetMinor(), GetBuild(), GetPatch(), candidate,
is_simulator);
SNPrintF(str, "%d.%d.%d.%d%s%s%s",
GetMajor(), GetMinor(), GetBuild(), GetPatch(), GetEmbedder(),
candidate, is_simulator);
} else {
SNPrintF(str, "%d.%d.%d%s%s",
GetMajor(), GetMinor(), GetBuild(), candidate,
SNPrintF(str, "%d.%d.%d%s%s%s",
GetMajor(), GetMinor(), GetBuild(), GetEmbedder(), candidate,
is_simulator);
}
}
Expand All @@ -50,11 +51,11 @@ void Version::GetSONAME(Vector<char> str) {
// Generate generic SONAME if no specific SONAME is defined.
const char* candidate = IsCandidate() ? "-candidate" : "";
if (GetPatch() > 0) {
SNPrintF(str, "libv8-%d.%d.%d.%d%s.so",
GetMajor(), GetMinor(), GetBuild(), GetPatch(), candidate);
SNPrintF(str, "libv8-%d.%d.%d.%d%s%s.so", GetMajor(), GetMinor(),
GetBuild(), GetPatch(), GetEmbedder(), candidate);
} else {
SNPrintF(str, "libv8-%d.%d.%d%s.so",
GetMajor(), GetMinor(), GetBuild(), candidate);
SNPrintF(str, "libv8-%d.%d.%d%s%s.so", GetMajor(), GetMinor(), GetBuild(),
GetEmbedder(), candidate);
}
} else {
// Use specific SONAME.
Expand Down
5 changes: 4 additions & 1 deletion deps/v8/src/version.h
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ class Version {
static int GetMinor() { return minor_; }
static int GetBuild() { return build_; }
static int GetPatch() { return patch_; }
static const char* GetEmbedder() { return embedder_; }
static bool IsCandidate() { return candidate_; }
static uint32_t Hash() {
return static_cast<uint32_t>(
Expand All @@ -38,13 +39,15 @@ class Version {
static int minor_;
static int build_;
static int patch_;
static const char* embedder_;
static bool candidate_;
static const char* soname_;
static const char* version_string_;

// In test-version.cc.
friend void SetVersion(int major, int minor, int build, int patch,
bool candidate, const char* soname);
const char* embedder, bool candidate,
const char* soname);
};

} // namespace internal
Expand Down
51 changes: 34 additions & 17 deletions deps/v8/test/cctest/test-version.cc
Original file line number Diff line number Diff line change
Expand Up @@ -37,11 +37,12 @@ namespace v8 {
namespace internal {

void SetVersion(int major, int minor, int build, int patch,
bool candidate, const char* soname) {
const char* embedder, bool candidate, const char* soname) {
Version::major_ = major;
Version::minor_ = minor;
Version::build_ = build;
Version::patch_ = patch;
Version::embedder_ = embedder;
Version::candidate_ = candidate;
Version::soname_ = soname;
}
Expand All @@ -50,23 +51,23 @@ void SetVersion(int major, int minor, int build, int patch,
} // namespace v8


static void CheckVersion(int major, int minor, int build,
int patch, bool candidate,
static void CheckVersion(int major, int minor, int build, int patch,
const char* embedder, bool candidate,
const char* expected_version_string,
const char* expected_generic_soname) {
static v8::internal::EmbeddedVector<char, 128> version_str;
static v8::internal::EmbeddedVector<char, 128> soname_str;

// Test version without specific SONAME.
SetVersion(major, minor, build, patch, candidate, "");
SetVersion(major, minor, build, patch, embedder, candidate, "");
Version::GetString(version_str);
CHECK_EQ(0, strcmp(expected_version_string, version_str.start()));
Version::GetSONAME(soname_str);
CHECK_EQ(0, strcmp(expected_generic_soname, soname_str.start()));

// Test version with specific SONAME.
const char* soname = "libv8.so.1";
SetVersion(major, minor, build, patch, candidate, soname);
SetVersion(major, minor, build, patch, embedder, candidate, soname);
Version::GetString(version_str);
CHECK_EQ(0, strcmp(expected_version_string, version_str.start()));
Version::GetSONAME(soname_str);
Expand All @@ -88,18 +89,34 @@ TEST(VersionString) {
CheckVersion(2, 5, 10, 7, false, "2.5.10.7 SIMULATOR", "libv8-2.5.10.7.so");
CheckVersion(2, 5, 10, 7, true,
"2.5.10.7 (candidate) SIMULATOR", "libv8-2.5.10.7-candidate.so");
CheckVersion(6, 0, 287, 0, "-emb.1", false, "6.0.287-emb.1 SIMULATOR",
"libv8-6.0.287-emb.1.so");
CheckVersion(6, 0, 287, 0, "-emb.1", true, "6.0.287-emb.1 (candidate) SIMULATOR",
"libv8-6.0.287-emb.1-candidate.so");
CheckVersion(6, 0, 287, 53, "-emb.1", false, "6.0.287.53-emb.1 SIMULATOR",
"libv8-6.0.287.53-emb.1.so");
CheckVersion(6, 0, 287, 53, "-emb.1", true, "6.0.287.53-emb.1 (candidate) SIMULATOR",
"libv8-6.0.287.53-emb.1-candidate.so");
#else
CheckVersion(0, 0, 0, 0, false, "0.0.0", "libv8-0.0.0.so");
CheckVersion(0, 0, 0, 0, true,
"0.0.0 (candidate)", "libv8-0.0.0-candidate.so");
CheckVersion(1, 0, 0, 0, false, "1.0.0", "libv8-1.0.0.so");
CheckVersion(1, 0, 0, 0, true,
"1.0.0 (candidate)", "libv8-1.0.0-candidate.so");
CheckVersion(1, 0, 0, 1, false, "1.0.0.1", "libv8-1.0.0.1.so");
CheckVersion(1, 0, 0, 1, true,
"1.0.0.1 (candidate)", "libv8-1.0.0.1-candidate.so");
CheckVersion(2, 5, 10, 7, false, "2.5.10.7", "libv8-2.5.10.7.so");
CheckVersion(2, 5, 10, 7, true,
"2.5.10.7 (candidate)", "libv8-2.5.10.7-candidate.so");
CheckVersion(0, 0, 0, 0, "", false, "0.0.0", "libv8-0.0.0.so");
CheckVersion(0, 0, 0, 0, "", true, "0.0.0 (candidate)",
"libv8-0.0.0-candidate.so");
CheckVersion(1, 0, 0, 0, "", false, "1.0.0", "libv8-1.0.0.so");
CheckVersion(1, 0, 0, 0, "", true, "1.0.0 (candidate)",
"libv8-1.0.0-candidate.so");
CheckVersion(1, 0, 0, 1, "", false, "1.0.0.1", "libv8-1.0.0.1.so");
CheckVersion(1, 0, 0, 1, "", true, "1.0.0.1 (candidate)",
"libv8-1.0.0.1-candidate.so");
CheckVersion(2, 5, 10, 7, "", false, "2.5.10.7", "libv8-2.5.10.7.so");
CheckVersion(2, 5, 10, 7, "", true, "2.5.10.7 (candidate)",
"libv8-2.5.10.7-candidate.so");
CheckVersion(6, 0, 287, 0, "-emb.1", false, "6.0.287-emb.1",
"libv8-6.0.287-emb.1.so");
CheckVersion(6, 0, 287, 0, "-emb.1", true, "6.0.287-emb.1 (candidate)",
"libv8-6.0.287-emb.1-candidate.so");
CheckVersion(6, 0, 287, 53, "-emb.1", false, "6.0.287.53-emb.1",
"libv8-6.0.287.53-emb.1.so");
CheckVersion(6, 0, 287, 53, "-emb.1", true, "6.0.287.53-emb.1 (candidate)",
"libv8-6.0.287.53-emb.1-candidate.so");
#endif
}
5 changes: 4 additions & 1 deletion doc/api/process.md
Original file line number Diff line number Diff line change
Expand Up @@ -1790,6 +1790,9 @@ changes:
- version: v4.2.0
pr-url: https://github.com/nodejs/node/pull/3102
description: The `icu` property is now supported.
- version: REPLACEME
pr-url: https://github.com/nodejs/node/pull/15785
description: The `v8` property now includes a Node.js specific suffix.
-->

* {Object}
Expand All @@ -1810,7 +1813,7 @@ Will generate an object similar to:
{
http_parser: '2.3.0',
node: '1.1.1',
v8: '4.1.0.14',
v8: '6.1.534.42-node.0',
uv: '1.3.0',
zlib: '1.2.8',
ares: '1.10.0-DEV',
Expand Down
4 changes: 3 additions & 1 deletion doc/guides/maintaining-V8.md
Original file line number Diff line number Diff line change
Expand Up @@ -167,7 +167,8 @@ to be cherry-picked in the Node.js repository and V8-CI must test the change.

* For each abandoned V8 branch corresponding to an LTS branch that is affected by the bug:
* Open a cherry-pick PR on nodejs/node targeting the appropriate *vY.x-staging* branch (e.g. *v6.x-staging* to fix an issue in V8-5.1).
* Increase the patch level version in v8-version.h. This will not cause any problems with versioning because V8 will not publish other patches for this branch, so Node.js can effectively bump the patch version.
* On Node.js < 9.0.0: Increase the patch level version in v8-version.h. This will not cause any problems with versioning because V8 will not publish other patches for this branch, so Node.js can effectively bump the patch version.
* On Node.js >= 9.0.0: Increase the `v8_embedder_string` number in `common.gypi`.
* In some cases the patch may require extra effort to merge in case V8 has changed substantially. For important issues we may be able to lean on the V8 team to get help with reimplementing the patch.
* Run the Node.js [V8-CI](https://ci.nodejs.org/job/node-test-commit-v8-linux/) in addition to the [Node.js CI](https://ci.nodejs.org/job/node-test-pull-request/).

Expand Down Expand Up @@ -264,6 +265,7 @@ above. A better strategy is to

1. Audit the current master branch and look at the patches that have been floated since the last major V8 update.
1. Replace the copy of V8 in Node.js with a fresh checkout of the latest stable V8 branch. Special care must be taken to recursively update the DEPS that V8 has a compile time dependency on (at the moment of this writing, these are only trace_event and gtest_prod.h)
1. Reset the `v8_embedder_string` variable to "-node.0" in `common.gypi`.
1. Refloat (cherry-pick) all the patches from list computed in 1) as necessary. Some of the patches may no longer be necessary.

To audit for floating patches:
Expand Down
12 changes: 7 additions & 5 deletions lib/internal/v8_prof_polyfill.js
Original file line number Diff line number Diff line change
Expand Up @@ -82,14 +82,16 @@ function readline() {
}

function versionCheck() {
// v8-version looks like "v8-version,$major,$minor,$build,$patch,$candidate"
// whereas process.versions.v8 is either "$major.$minor.$build" or
// "$major.$minor.$build.$patch".
// v8-version looks like
// "v8-version,$major,$minor,$build,$patch[,$embedder],$candidate"
// whereas process.versions.v8 is either "$major.$minor.$build-$embedder" or
// "$major.$minor.$build.$patch-$embedder".
var firstLine = readline();
line = firstLine + '\n' + line;
firstLine = firstLine.split(',');
const curVer = process.versions.v8.split('.');
if (firstLine.length !== 6 && firstLine[0] !== 'v8-version') {
const curVer = process.versions.v8.split(/\.-/);
if (firstLine.length !== 6 && firstLine.length !== 7 ||
firstLine[0] !== 'v8-version') {
console.log('Unable to read v8-version from log file.');
return;
}
Expand Down
2 changes: 1 addition & 1 deletion test/parallel/test-process-versions.js
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ assert(commonTemplate.test(process.versions.node));
assert(commonTemplate.test(process.versions.uv));
assert(commonTemplate.test(process.versions.zlib));

assert(/^\d+\.\d+\.\d+(?:\.\d+)?(?: \(candidate\))?$/
assert(/^\d+\.\d+\.\d+(?:\.\d+)?-node\.\d+(?: \(candidate\))?$/
.test(process.versions.v8));
assert(/^\d+$/.test(process.versions.modules));

Expand Down