v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
embedded-file-writer.h
Go to the documentation of this file.
1// Copyright 2018 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
5#ifndef V8_SNAPSHOT_EMBEDDED_EMBEDDED_FILE_WRITER_H_
6#define V8_SNAPSHOT_EMBEDDED_EMBEDDED_FILE_WRITER_H_
7
8#include <cinttypes>
9#include <cstdio>
10#include <cstring>
11#include <memory>
12
14#include "src/base/strings.h"
15#include "src/common/globals.h"
19
20#if defined(V8_OS_WIN64)
22#endif // V8_OS_WIN64
23
24namespace v8 {
25namespace internal {
26// Generates the embedded.S file which is later compiled into the final v8
27// binary. Its contents are exported through two symbols:
28//
29// v8_<variant>_embedded_blob_ (intptr_t):
30// a pointer to the start of the embedded blob.
31// v8_<variant>_embedded_blob_size_ (uint32_t):
32// size of the embedded blob in bytes.
33//
34// The variant is usually "Default" but can be modified in multisnapshot builds.
36 public:
37 int LookupOrAddExternallyCompiledFilename(const char* filename) override;
38 const char* GetExternallyCompiledFilename(int fileid) const override;
39 int GetExternallyCompiledFilenameCount() const override;
40
41 void PrepareBuiltinSourcePositionMap(Builtins* builtins) override;
42
43#if defined(V8_OS_WIN64)
44 void SetBuiltinUnwindData(
45 Builtin builtin,
46 const win64_unwindinfo::BuiltinUnwindInfo& unwinding_info) override {
47 DCHECK_LT(static_cast<int>(builtin), Builtins::kBuiltinCount);
48 unwind_infos_[static_cast<int>(builtin)] = unwinding_info;
49 }
50#endif // V8_OS_WIN64
51
52 void SetEmbeddedFile(const char* embedded_src_path) {
53 embedded_src_path_ = embedded_src_path;
54 }
55
56 void SetEmbeddedVariant(const char* embedded_variant) {
57 if (embedded_variant == nullptr) return;
58 embedded_variant_ = embedded_variant;
59 }
60
61 void SetTargetArch(const char* target_arch) { target_arch_ = target_arch; }
62
63 void SetTargetOs(const char* target_os) { target_os_ = target_os; }
64
65 void WriteEmbedded(const i::EmbeddedData* blob) const {
67 }
68
69 private:
70 void MaybeWriteEmbeddedFile(const i::EmbeddedData* blob) const {
71 if (embedded_src_path_ == nullptr) return;
72
74
75 std::unique_ptr<PlatformEmbeddedFileWriterBase> writer =
77 writer->SetFile(fp);
78
79 WriteFilePrologue(writer.get());
80 WriteExternalFilenames(writer.get());
81 WriteDataSection(writer.get(), blob);
82 WriteCodeSection(writer.get(), blob);
83 WriteFileEpilogue(writer.get(), blob);
84
85 base::Fclose(fp);
86 }
87
88 static FILE* GetFileDescriptorOrDie(const char* filename) {
89 FILE* fp = v8::base::OS::FOpen(filename, "w");
90
91 if (fp == nullptr) {
92 i::PrintF("Unable to open file \"%s\" for writing.\n", filename);
93 exit(1);
94 }
95 return fp;
96 }
97
99 w->Comment("Autogenerated file. Do not edit.");
100 w->Newline();
101 w->FilePrologue();
102 }
103
105#ifndef DEBUG
106 // Release builds must not contain debug infos.
108#endif
109
110 w->Comment(
111 "Source positions in the embedded blob refer to filenames by id.");
112 w->Comment("Assembly directives here map the id to a filename.");
113 w->Newline();
114
115 // Write external filenames.
116 int size = static_cast<int>(external_filenames_by_index_.size());
117 for (int i = 0; i < size; i++) {
120 }
121 }
122
123 // Fairly arbitrary but should fit all symbol names.
124 static constexpr int kTemporaryStringLength = 256;
125
126 std::string EmbeddedBlobCodeSymbol() const {
128 embedded_blob_code_symbol;
129 base::SNPrintF(embedded_blob_code_symbol, "v8_%s_embedded_blob_code_",
131 return std::string{embedded_blob_code_symbol.begin()};
132 }
133
134 std::string EmbeddedBlobDataSymbol() const {
136 embedded_blob_data_symbol;
137 base::SNPrintF(embedded_blob_data_symbol, "v8_%s_embedded_blob_data_",
139 return std::string{embedded_blob_data_symbol.begin()};
140 }
141
143 const i::EmbeddedData* blob) const {
144 w->Comment("The embedded blob data section starts here.");
145 w->SectionRoData();
150
151 WriteBinaryContentsAsInlineAssembly(w, blob->data(), blob->data_size());
153 w->Newline();
154 }
155
157 const i::EmbeddedData* blob, const Builtin builtin) const;
158
160 std::string name) const;
161
163 const i::EmbeddedData* blob) const;
164
166 const i::EmbeddedData* blob) const;
167
168#if defined(V8_OS_WIN_X64)
169 void WriteUnwindInfoEntry(PlatformEmbeddedFileWriterBase* w,
170 uint64_t rva_start, uint64_t rva_end) const;
171#endif
172
174 PlatformEmbeddedFileWriterBase* w, const uint8_t* data, uint32_t size);
175
176 // In assembly directives, filename ids need to begin with 1.
177 static constexpr int kFirstExternalFilenameId = 1;
178 static int ExternalFilenameIndexToId(int index) {
180 }
181 static int ExternalFilenameIdToIndex(int id) {
182 return id - kFirstExternalFilenameId;
183 }
184
185 private:
187 std::vector<LabelInfo> label_info_[Builtins::kBuiltinCount];
188
189#if defined(V8_OS_WIN64)
190 win64_unwindinfo::BuiltinUnwindInfo unwind_infos_[Builtins::kBuiltinCount];
191#endif // V8_OS_WIN64
192
193 std::map<const char*, int> external_filenames_;
194 std::vector<const char*> external_filenames_by_index_;
195
196 // The file to generate or nullptr.
197 const char* embedded_src_path_ = nullptr;
198
199 // The variant is only used in multi-snapshot builds and otherwise set to
200 // "Default".
202
203 // {target_arch} and {target_os} control the generated assembly format. Note
204 // these may differ from both host- and target-platforms specified through
205 // e.g. V8_OS_* and V8_TARGET_ARCH_* defines.
206 const char* target_arch_ = nullptr;
207 const char* target_os_ = nullptr;
208};
209
210} // namespace internal
211} // namespace v8
212
213#endif // V8_SNAPSHOT_EMBEDDED_EMBEDDED_FILE_WRITER_H_
static FILE * FOpen(const char *path, const char *mode)
constexpr T * begin() const
Definition vector.h:96
static constexpr int kBuiltinCount
Definition builtins.h:105
void PrepareBuiltinSourcePositionMap(Builtins *builtins) override
static FILE * GetFileDescriptorOrDie(const char *filename)
void WriteCodeSection(PlatformEmbeddedFileWriterBase *w, const i::EmbeddedData *blob) const
static constexpr int kFirstExternalFilenameId
std::vector< LabelInfo > label_info_[Builtins::kBuiltinCount]
void WriteFileEpilogue(PlatformEmbeddedFileWriterBase *w, const i::EmbeddedData *blob) const
std::vector< uint8_t > source_positions_[Builtins::kBuiltinCount]
void WriteEmbedded(const i::EmbeddedData *blob) const
void WriteDataSection(PlatformEmbeddedFileWriterBase *w, const i::EmbeddedData *blob) const
static int ExternalFilenameIndexToId(int index)
void WriteFilePrologue(PlatformEmbeddedFileWriterBase *w) const
std::vector< const char * > external_filenames_by_index_
int GetExternallyCompiledFilenameCount() const override
void SetTargetArch(const char *target_arch)
void MaybeWriteEmbeddedFile(const i::EmbeddedData *blob) const
void SetTargetOs(const char *target_os)
std::map< const char *, int > external_filenames_
static void WriteBinaryContentsAsInlineAssembly(PlatformEmbeddedFileWriterBase *w, const uint8_t *data, uint32_t size)
void WriteBuiltinLabels(PlatformEmbeddedFileWriterBase *w, std::string name) const
void SetEmbeddedVariant(const char *embedded_variant)
void SetEmbeddedFile(const char *embedded_src_path)
int LookupOrAddExternallyCompiledFilename(const char *filename) override
void WriteExternalFilenames(PlatformEmbeddedFileWriterBase *w) const
void WriteBuiltin(PlatformEmbeddedFileWriterBase *w, const i::EmbeddedData *blob, const Builtin builtin) const
const char * GetExternallyCompiledFilename(int fileid) const override
virtual void Comment(const char *string)=0
virtual void DeclareExternalFilename(int fileid, const char *filename)=0
virtual void DeclareSymbolGlobal(const char *name)=0
virtual void DeclareLabel(const char *name)=0
std::string filename
Builtin builtin
int SNPrintF(Vector< char > str, const char *format,...)
Definition strings.cc:20
int Fclose(FILE *stream)
Definition wrappers.h:22
void PrintF(const char *format,...)
Definition utils.cc:39
std::unique_ptr< PlatformEmbeddedFileWriterBase > NewPlatformEmbeddedFileWriter(const char *target_arch, const char *target_os)
static constexpr char kDefaultEmbeddedVariant[]
#define CHECK_EQ(lhs, rhs)
#define DCHECK_LT(v1, v2)
Definition logging.h:489