11#if defined(V8_OS_WIN64)
22#if defined(_MSC_VER) && !defined(__clang__)
23#define V8_COMPILER_IS_MSVC
26#if defined(V8_COMPILER_IS_MSVC)
45#if !defined(V8_TARGET_ARCH_X64) && !defined(V8_TARGET_ARCH_ARM64)
46#define SYMBOL_PREFIX "_"
48#define SYMBOL_PREFIX ""
62#if defined(V8_OS_WIN_X64)
64void WriteUnwindInfoEntry(PlatformEmbeddedFileWriterWin* w,
65 const char* unwind_info_symbol,
66 const char* embedded_blob_data_symbol,
67 uint64_t rva_start, uint64_t rva_end) {
68 w->DeclareRvaToSymbol(embedded_blob_data_symbol, rva_start);
69 w->DeclareRvaToSymbol(embedded_blob_data_symbol, rva_end);
70 w->DeclareRvaToSymbol(unwind_info_symbol);
73void EmitUnwindData(PlatformEmbeddedFileWriterWin* w,
74 const char* unwind_info_symbol,
75 const char* embedded_blob_data_symbol,
76 const EmbeddedData* blob,
77 const win64_unwindinfo::BuiltinUnwindInfo* unwind_infos) {
81 w->Comment(
"xdata for all the code in the embedded blob.");
82 w->DeclareExternalFunction(CRASH_HANDLER_FUNCTION_NAME_STRING);
84 w->StartXdataSection();
86 w->DeclareLabel(unwind_info_symbol);
88 std::vector<uint8_t> xdata =
89 win64_unwindinfo::GetUnwindInfoForBuiltinFunctions();
92 w->IndentedDataDirective(
kByte);
93 for (
size_t i = 0;
i < xdata.size();
i++) {
94 if (
i > 0) fprintf(w->fp(),
",");
95 w->HexLiteral(xdata[
i]);
99 w->Comment(
" ExceptionHandler");
100 w->DeclareRvaToSymbol(CRASH_HANDLER_FUNCTION_NAME_STRING);
102 w->EndXdataSection();
109 "pdata for all the code in the embedded blob (structs of type "
110 "RUNTIME_FUNCTION).");
111 w->Comment(
" BeginAddress");
112 w->Comment(
" EndAddress");
113 w->Comment(
" UnwindInfoAddress");
114 w->StartPdataSection();
117 Address prev_builtin_end_offset = 0;
120 const int builtin_index =
static_cast<int>(
builtin);
124 if (unwind_infos[builtin_index].is_leaf_function())
continue;
126 uint64_t builtin_start_offset = blob->InstructionStartOf(builtin) -
127 reinterpret_cast<Address>(blob->code());
128 uint32_t builtin_size = blob->InstructionSizeOf(builtin);
130 const std::vector<int>& xdata_desc =
131 unwind_infos[builtin_index].fp_offsets();
132 if (xdata_desc.empty()) {
140 WriteUnwindInfoEntry(
141 w, unwind_info_symbol, embedded_blob_data_symbol,
142 std::max(prev_builtin_end_offset,
143 builtin_start_offset - win64_unwindinfo::kRbpPrefixLength),
144 builtin_start_offset + builtin_size);
152 if (xdata_desc[0] > 0) {
153 WriteUnwindInfoEntry(w, unwind_info_symbol, embedded_blob_data_symbol,
154 std::max(prev_builtin_end_offset,
155 builtin_start_offset -
156 win64_unwindinfo::kRbpPrefixLength),
157 builtin_start_offset + xdata_desc[0]);
160 for (
size_t j = 0; j < xdata_desc.size(); j++) {
161 int chunk_start = xdata_desc[j];
163 (j < xdata_desc.size() - 1) ? xdata_desc[j + 1] : builtin_size;
164 WriteUnwindInfoEntry(w, unwind_info_symbol, embedded_blob_data_symbol,
165 builtin_start_offset + chunk_start,
166 builtin_start_offset + chunk_end);
170 prev_builtin_end_offset = builtin_start_offset + builtin_size;
174 w->EndPdataSection();
178#elif defined(V8_OS_WIN_ARM64)
180void EmitUnwindData(PlatformEmbeddedFileWriterWin* w,
181 const char* unwind_info_symbol,
182 const char* embedded_blob_data_symbol,
183 const EmbeddedData* blob,
184 const win64_unwindinfo::BuiltinUnwindInfo* unwind_infos) {
188 static constexpr int kTemporaryStringLength = 256;
189 base::EmbeddedVector<char, kTemporaryStringLength> unwind_info_full_symbol;
195 "pdata for all the code in the embedded blob (structs of type "
196 "RUNTIME_FUNCTION).");
197 w->Comment(
" BeginAddress");
198 w->Comment(
" UnwindInfoAddress");
199 w->StartPdataSection();
200 std::vector<int> code_chunks;
201 std::vector<win64_unwindinfo::FrameOffsets> fp_adjustments;
206 const int builtin_index =
static_cast<int>(
builtin);
207 if (unwind_infos[builtin_index].is_leaf_function())
continue;
209 uint64_t builtin_start_offset = blob->InstructionStartOf(builtin) -
210 reinterpret_cast<Address>(blob->code());
211 uint32_t builtin_size = blob->InstructionSizeOf(builtin);
213 const std::vector<int>& xdata_desc =
214 unwind_infos[builtin_index].fp_offsets();
215 const std::vector<win64_unwindinfo::FrameOffsets>& xdata_fp_adjustments =
216 unwind_infos[builtin_index].fp_adjustments();
217 DCHECK_EQ(xdata_desc.size(), xdata_fp_adjustments.size());
219 for (
size_t j = 0; j < xdata_desc.size(); j++) {
220 int chunk_start = xdata_desc[j];
222 (j < xdata_desc.size() - 1) ? xdata_desc[j + 1] : builtin_size;
225 while (chunk_len > 0) {
226 int allowed_chunk_len =
227 std::min(chunk_len, win64_unwindinfo::kMaxFunctionLength);
228 chunk_len -= win64_unwindinfo::kMaxFunctionLength;
232 code_chunks.push_back(allowed_chunk_len);
233 fp_adjustments.push_back(xdata_fp_adjustments[j]);
234 base::SNPrintF(unwind_info_full_symbol,
"%s_%u", unwind_info_symbol,
236 w->DeclareRvaToSymbol(embedded_blob_data_symbol,
237 builtin_start_offset + chunk_start);
238 w->DeclareRvaToSymbol(unwind_info_full_symbol.begin());
242 w->EndPdataSection();
247 w->DeclareExternalFunction(CRASH_HANDLER_FUNCTION_NAME_STRING);
248 w->StartXdataSection();
250 for (
size_t i = 0;
i < code_chunks.size();
i++) {
251 base::SNPrintF(unwind_info_full_symbol,
"%s_%u", unwind_info_symbol,
253 w->DeclareLabel(unwind_info_full_symbol.begin());
254 std::vector<uint8_t> xdata =
255 win64_unwindinfo::GetUnwindInfoForBuiltinFunction(code_chunks[
i],
258 w->IndentedDataDirective(
kByte);
259 for (
size_t j = 0; j < xdata.size(); j++) {
260 if (j > 0) fprintf(w->fp(),
",");
261 w->HexLiteral(xdata[j]);
264 w->DeclareRvaToSymbol(CRASH_HANDLER_FUNCTION_NAME_STRING);
267 w->EndXdataSection();
277#if defined(V8_COMPILER_IS_MSVC)
317 const char* unwind_info_symbol,
const char* embedded_blob_data_symbol,
321#if defined(V8_OS_WIN_ARM64)
327#if defined(V8_OS_WIN64)
329 EmitUnwindData(
this, unwind_info_symbol, embedded_blob_data_symbol, blob,
330 reinterpret_cast<const win64_unwindinfo::BuiltinUnwindInfo*
>(
339#if defined(V8_COMPILER_IS_MSVC)
357#define ARM64_DATA_ALIGNMENT_POWER (3)
358#define ARM64_DATA_ALIGNMENT (1 << ARM64_DATA_ALIGNMENT_POWER)
359#define ARM64_CODE_ALIGNMENT_POWER (2)
360#define ARM64_CODE_ALIGNMENT (1 << ARM64_CODE_ALIGNMENT_POWER)
364 fprintf(
fp_,
" AREA |.text|, CODE, ALIGN=%d, READONLY\n",
365 ARM64_CODE_ALIGNMENT_POWER);
367 fprintf(
fp_,
".CODE\n");
373 fprintf(
fp_,
" AREA |.rodata|, DATA, ALIGN=%d, READONLY\n",
374 ARM64_DATA_ALIGNMENT_POWER);
376 fprintf(
fp_,
".CONST\n");
389 fprintf(
fp_,
" AREA |.pdata|, DATA, ALIGN=%d, READONLY\n",
390 ARM64_DATA_ALIGNMENT_POWER);
392 fprintf(
fp_,
"OPTION DOTNAME\n");
393 fprintf(
fp_,
".pdata SEGMENT DWORD READ ''\n");
399 fprintf(
fp_,
".pdata ENDS\n");
405 fprintf(
fp_,
" AREA |.xdata|, DATA, ALIGN=%d, READONLY\n",
406 ARM64_DATA_ALIGNMENT_POWER);
408 fprintf(
fp_,
"OPTION DOTNAME\n");
409 fprintf(
fp_,
".xdata SEGMENT DWORD READ ''\n");
415 fprintf(
fp_,
".xdata ENDS\n");
421 fprintf(
fp_,
" EXTERN %s \n", name);
423 fprintf(
fp_,
"EXTERN %s : PROC\n", name);
431 fprintf(
fp_,
" DCD %s + %llu\n", name,
offset);
433 fprintf(
fp_,
" DCD %s\n", name);
440 fprintf(
fp_,
" RELOC 2\n");
443 fprintf(
fp_,
"DD IMAGEREL %s+%llu\n", name,
offset);
445 fprintf(
fp_,
"DD IMAGEREL %s\n", name);
460 fprintf(
fp_,
" ALIGN %d\n", ARM64_CODE_ALIGNMENT);
464 fprintf(
fp_,
"ALIGN 4\n");
470 fprintf(
fp_,
" ALIGN %d\n", ARM64_DATA_ALIGNMENT);
473 fprintf(
fp_,
"ALIGN 4\n");
478 fprintf(
fp_,
"; %s\n",
string);
510 fprintf(
fp_,
" ENDFUNC\n");
519 return fprintf(
fp_,
"0x%" PRIx64, value);
522 return fprintf(
fp_,
"0%" PRIx64
"h", value);
530 fprintf(
fp_,
".MODEL FLAT\n");
535 int fileid,
const char*
filename) {}
539 fprintf(
fp_,
" END\n");
541 fprintf(
fp_,
"END\n");
550#undef ARM64_DATA_ALIGNMENT_POWER
551#undef ARM64_DATA_ALIGNMENT
552#undef ARM64_CODE_ALIGNMENT_POWER
553#undef ARM64_CODE_ALIGNMENT
568 fprintf(
fp_,
".section .text$hot,\"xr\"\n");
572 fprintf(
fp_,
".section .rdata\n");
580 fprintf(
fp_,
"%d", value);
585 fprintf(
fp_,
".section .pdata\n");
591 fprintf(
fp_,
".section .xdata\n");
601 fprintf(
fp_,
".rva %s + %" PRIu64
"\n", name,
offset);
603 fprintf(
fp_,
".rva %s\n", name);
612#if V8_TARGET_ARCH_X64
615 fprintf(
fp_,
".balign 64\n");
616#elif V8_TARGET_ARCH_PPC64
620 fprintf(
fp_,
".balign 64\n");
623 fprintf(
fp_,
".balign 32\n");
632 fprintf(
fp_,
".balign 8\n");
636 fprintf(
fp_,
"// %s\n",
string);
655#
if V8_ENABLE_DRUMBRAKE
656 || IsDrumBrakeInstructionHandler(name)
670 fprintf(
fp_,
".def %s%s; .scl 2; .type 32; .endef;\n",
SYMBOL_PREFIX, name);
677 return fprintf(
fp_,
"0x%" PRIx64, value);
698#if defined(V8_COMPILER_IS_MSVC)
712#if defined(V8_COMPILER_IS_MSVC)
714 const uint64_t* quad_ptr =
reinterpret_cast<const uint64_t*
>(
data);
722#undef V8_ASSEMBLER_IS_MASM
723#undef V8_ASSEMBLER_IS_MARMASM
724#undef V8_COMPILER_IS_MSVC
union v8::internal::@341::BuiltinMetadata::KindSpecificData data
static constexpr Builtin kFirst
static constexpr bool kAllBuiltinsAreIsolateIndependent
static constexpr Builtin kLast
int SNPrintF(Vector< char > str, const char *format,...)
bool CanEmitUnwindInfoForBuiltins()
constexpr intptr_t kCodeAlignment
constexpr uint8_t kInstrSize
#define DCHECK(condition)
#define DCHECK_EQ(v1, v2)
constexpr T RoundUp(T x, intptr_t m)