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)