26class SnapshotFileWriter {
28 void SetSnapshotFile(
const char* snapshot_cpp_file) {
29 snapshot_cpp_path_ = snapshot_cpp_file;
32 void SetStartupBlobFile(
const char* snapshot_blob_file) {
33 snapshot_blob_path_ = snapshot_blob_file;
42 reinterpret_cast<const uint8_t*
>(blob.data), blob.raw_size);
43 MaybeWriteSnapshotFile(blob_vector);
44 MaybeWriteStartupBlob(blob_vector);
49 if (!snapshot_blob_path_)
return;
51 FILE* fp = GetFileDescriptorOrDie(snapshot_blob_path_);
52 size_t written = fwrite(blob.begin(), 1, blob.length(), fp);
54 if (written !=
static_cast<size_t>(blob.length())) {
55 i::PrintF(
"Writing snapshot file failed.. Aborting.\n");
56 remove(snapshot_blob_path_);
62 if (!snapshot_cpp_path_)
return;
64 FILE* fp = GetFileDescriptorOrDie(snapshot_cpp_path_);
66 WriteSnapshotFilePrefix(fp);
67 WriteSnapshotFileData(fp, blob);
68 WriteSnapshotFileSuffix(fp);
73 static void WriteSnapshotFilePrefix(FILE* fp) {
74 fprintf(fp,
"// Autogenerated snapshot file. Do not edit.\n\n");
75 fprintf(fp,
"#include \"src/init/v8.h\"\n");
76 fprintf(fp,
"#include \"src/base/platform/platform.h\"\n\n");
77 fprintf(fp,
"#include \"src/flags/flags.h\"\n");
78 fprintf(fp,
"#include \"src/snapshot/snapshot.h\"\n\n");
79 fprintf(fp,
"namespace v8 {\n");
80 fprintf(fp,
"namespace internal {\n\n");
83 static void WriteSnapshotFileSuffix(FILE* fp) {
84 fprintf(fp,
"const v8::StartupData* Snapshot::DefaultSnapshotBlob() {\n");
85 fprintf(fp,
" return &blob;\n");
90 "bool Snapshot::ShouldVerifyChecksum(const v8::StartupData* data) {\n");
91 fprintf(fp,
" return v8_flags.verify_snapshot_checksum;\n");
93 fprintf(fp,
"} // namespace internal\n");
94 fprintf(fp,
"} // namespace v8\n");
97 static void WriteSnapshotFileData(FILE* fp,
101 "alignas(kPointerAlignment) static const uint8_t blob_data[] = {\n");
102 WriteBinaryContentsAsCArray(fp, blob);
104 fprintf(fp,
"static const int blob_size = %d;\n", blob.length());
105 fprintf(fp,
"static const v8::StartupData blob =\n");
106 fprintf(fp,
"{ (const char*) blob_data, blob_size };\n");
109 static void WriteBinaryContentsAsCArray(
111 for (
int i = 0;
i < blob.
length();
i++) {
112 if ((
i & 0x1F) == 0x1F) fprintf(fp,
"\n");
113 if (
i > 0) fprintf(fp,
",");
114 fprintf(fp,
"%u",
static_cast<unsigned char>(blob.at(
i)));
119 static FILE* GetFileDescriptorOrDie(
const char*
filename) {
128 const char* snapshot_cpp_path_ =
nullptr;
129 const char* snapshot_blob_path_ =
nullptr;
132std::unique_ptr<char[]> GetExtraCode(
char*
filename,
const char* description) {
134 ::printf(
"Loading script for %s: %s\n", description,
filename);
136 if (file ==
nullptr) {
137 fprintf(stderr,
"Failed to open '%s': errno %d\n",
filename, errno);
140 fseek(file, 0, SEEK_END);
141 size_t size = ftell(file);
143 char* chars =
new char[size + 1];
145 for (
size_t i = 0;
i <
size;) {
146 size_t read = fread(&chars[
i], 1, size -
i, file);
148 fprintf(stderr,
"Failed to read '%s': errno %d\n",
filename, errno);
154 return std::unique_ptr<char[]>(chars);
158 const char* embedded_source) {
167 i::PrintF(
"[Creating snapshot took %0.3f ms]\n",
168 timer.Elapsed().InMillisecondsF());
176 const char* warmup_source) {
184 i::PrintF(
"Warming up snapshot took %0.3f ms\n",
185 timer.Elapsed().InMillisecondsF());
200void MaybeSetCounterFunction(
v8::Isolate* isolate) {
211 isolate->SetCounterFunction([](
const char* name) ->
int* {
212 auto map_entry = counter_map_->find(name);
213 if (map_entry == counter_map_->end()) {
214 counter_map_->emplace(name, 0);
216 return &counter_map_->at(name);
223int main(
int argc,
char** argv) {
236 using HelpOptions = i::FlagList::HelpOptions;
237 std::string usage =
"Usage: " + std::string(argv[0]) +
238 " [--startup-src=file]" +
" [--startup-blob=file]" +
239 " [--embedded-src=file]" +
" [--embedded-variant=label]" +
240 " [--static-roots-src=file]" +
" [--target-arch=arch]" +
241 " [--target-os=os] [extras]\n\n";
242 int result = i::FlagList::SetFlagsFromCommandLine(
243 &argc, argv,
true, HelpOptions(HelpOptions::kExit, usage.c_str()));
244 if (
result > 0 || (argc > 3)) {
249 i::CpuFeatures::Probe(
true);
256 SnapshotFileWriter snapshot_writer;
257 snapshot_writer.SetSnapshotFile(
i::v8_flags.startup_src);
258 snapshot_writer.SetStartupBlobFile(
i::v8_flags.startup_blob);
266 std::unique_ptr<char[]> embed_script =
267 GetExtraCode(argc >= 2 ? argv[1] :
nullptr,
"embedding");
268 std::unique_ptr<char[]> warmup_script =
269 GetExtraCode(argc >= 3 ? argv[2] :
nullptr,
"warm up");
275 MaybeSetCounterFunction(isolate);
282 std::unique_ptr<v8::ArrayBuffer::Allocator> array_buffer_allocator(
289 size_t code_range_size_mb =
295 code_range_size_mb * i::MB);
300 blob = CreateSnapshotDataBlob(creator, embed_script.get());
302 WriteEmbeddedFile(&embedded_writer);
304#if V8_STATIC_ROOTS_GENERATION_BOOL
306 i::StaticRootsTableGen::write(i_isolate,
316 blob = WarmUpSnapshotDataBlob(cold, warmup_script.get());
323 snapshot_writer.WriteSnapshot(blob);
static Allocator * NewDefaultAllocator()
static Isolate * Allocate()
void set_code_range_size_in_bytes(size_t limit)
static void DisposePlatform()
static void InitializePlatform(Platform *platform)
static bool InitializeICUDefaultLocation(const char *exec_path, const char *icu_data_file=nullptr)
static V8_INLINE bool Initialize()
static FILE * FOpen(const char *path, const char *mode)
void WriteEmbedded(const i::EmbeddedData *blob) const
void SetTargetArch(const char *target_arch)
void SetTargetOs(const char *target_os)
void SetEmbeddedVariant(const char *embedded_variant)
void SetEmbeddedFile(const char *embedded_src_path)
void RegisterEmbeddedFileWriter(EmbeddedFileWriterInterface *writer)
ZoneVector< RpoNumber > & result
int main(int argc, char **argv)
void EnsureConsoleOutput()
void PrintF(const char *format,...)
constexpr size_t kMaxPCRelativeCodeRangeInMB
V8_EXPORT_PRIVATE FlagValues v8_flags
v8::StartupData WarmUpSnapshotDataBlobInternal(v8::StartupData cold_snapshot_blob, const char *warmup_source)
constexpr size_t kMaximalCodeRangeSize
v8::StartupData CreateSnapshotDataBlobInternal(v8::SnapshotCreator::FunctionCodeHandling function_code_handling, const char *embedded_source, SnapshotCreator &snapshot_creator, Snapshot::SerializerFlags serializer_flags)
std::unordered_map< std::string, Counter * > CounterMap
ResourceConstraints constraints
ArrayBuffer::Allocator * array_buffer_allocator