v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
platform-embedded-file-writer-win.cc
Go to the documentation of this file.
1// Copyright 2019 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
6
7#include <algorithm>
8
9#include "src/common/globals.h" // For V8_OS_WIN64
10
11#if defined(V8_OS_WIN64)
16#endif // V8_OS_WIN64
17
18// V8_CC_MSVC is true for both MSVC and clang on windows. clang can handle
19// __asm__-style inline assembly but MSVC cannot, and thus we need a more
20// precise compiler detection that can distinguish between the two. clang on
21// windows sets both __clang__ and _MSC_VER, MSVC sets only _MSC_VER.
22#if defined(_MSC_VER) && !defined(__clang__)
23#define V8_COMPILER_IS_MSVC
24#endif
25
26#if defined(V8_COMPILER_IS_MSVC)
27#include "src/flags/flags.h"
28#endif
29
30namespace v8 {
31namespace internal {
32
33// MSVC uses MASM for x86 and x64, while it has a ARMASM for ARM32 and
34// ARMASM64 for ARM64. Since ARMASM and ARMASM64 accept a slightly tweaked
35// version of ARM assembly language, they are referred to together in Visual
36// Studio project files as MARMASM.
37//
38// ARM assembly language docs:
39// http://infocenter.arm.com/help/topic/com.arm.doc.dui0802b/index.html
40// Microsoft ARM assembler and assembly language docs:
41// https://docs.microsoft.com/en-us/cpp/assembler/arm/arm-assembler-reference
42
43// Name mangling.
44// Symbols are prefixed with an underscore on 32-bit architectures.
45#if !defined(V8_TARGET_ARCH_X64) && !defined(V8_TARGET_ARCH_ARM64)
46#define SYMBOL_PREFIX "_"
47#else
48#define SYMBOL_PREFIX ""
49#endif
50
51// Notes:
52//
53// Cross-bitness builds are unsupported. It's thus safe to detect bitness
54// through compile-time defines.
55//
56// Cross-compiler builds (e.g. with mixed use of clang / MSVC) are likewise
57// unsupported and hence the compiler can also be detected through compile-time
58// defines.
59
60namespace {
61
62#if defined(V8_OS_WIN_X64)
63
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);
71}
72
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) {
78 // Emit an UNWIND_INFO (XDATA) struct, which contains the unwinding
79 // information that is used for all builtin functions.
81 w->Comment("xdata for all the code in the embedded blob.");
82 w->DeclareExternalFunction(CRASH_HANDLER_FUNCTION_NAME_STRING);
83
84 w->StartXdataSection();
85 {
86 w->DeclareLabel(unwind_info_symbol);
87
88 std::vector<uint8_t> xdata =
89 win64_unwindinfo::GetUnwindInfoForBuiltinFunctions();
90 DCHECK(!xdata.empty());
91
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]);
96 }
97 w->Newline();
98
99 w->Comment(" ExceptionHandler");
100 w->DeclareRvaToSymbol(CRASH_HANDLER_FUNCTION_NAME_STRING);
101 }
102 w->EndXdataSection();
103 w->Newline();
104
105 // Emit a RUNTIME_FUNCTION (PDATA) entry for each builtin function, as
106 // documented here:
107 // https://docs.microsoft.com/en-us/cpp/build/exception-handling-x64.
108 w->Comment(
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();
115 {
117 Address prev_builtin_end_offset = 0;
118 for (Builtin builtin = Builtins::kFirst; builtin <= Builtins::kLast;
119 ++builtin) {
120 const int builtin_index = static_cast<int>(builtin);
121 // Some builtins are leaf functions from the point of view of Win64 stack
122 // walking: they do not move the stack pointer and do not require a PDATA
123 // entry because the return address can be retrieved from [rsp].
124 if (unwind_infos[builtin_index].is_leaf_function()) continue;
125
126 uint64_t builtin_start_offset = blob->InstructionStartOf(builtin) -
127 reinterpret_cast<Address>(blob->code());
128 uint32_t builtin_size = blob->InstructionSizeOf(builtin);
129
130 const std::vector<int>& xdata_desc =
131 unwind_infos[builtin_index].fp_offsets();
132 if (xdata_desc.empty()) {
133 // Some builtins do not have any "push rbp - mov rbp, rsp" instructions
134 // to start a stack frame. We still emit a PDATA entry as if they had,
135 // relying on the fact that we can find the previous frame address from
136 // rbp in most cases. Note that since the function does not really start
137 // with a 'push rbp' we need to specify the start RVA in the PDATA entry
138 // a few bytes before the beginning of the function, if it does not
139 // overlap the end of the previous builtin.
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);
145 } else {
146 // Some builtins have one or more "push rbp - mov rbp, rsp" sequences,
147 // but not necessarily at the beginning of the function. In this case
148 // we want to yield a PDATA entry for each block of instructions that
149 // emit an rbp frame. If the function does not start with 'push rbp'
150 // we also emit a PDATA entry for the initial block of code up to the
151 // first 'push rbp', like in the case above.
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]);
158 }
159
160 for (size_t j = 0; j < xdata_desc.size(); j++) {
161 int chunk_start = xdata_desc[j];
162 int chunk_end =
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);
167 }
168 }
169
170 prev_builtin_end_offset = builtin_start_offset + builtin_size;
171 w->Newline();
172 }
173 }
174 w->EndPdataSection();
175 w->Newline();
176}
177
178#elif defined(V8_OS_WIN_ARM64)
179
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) {
186
187 // Fairly arbitrary but should fit all symbol names.
188 static constexpr int kTemporaryStringLength = 256;
189 base::EmbeddedVector<char, kTemporaryStringLength> unwind_info_full_symbol;
190
191 // Emit a RUNTIME_FUNCTION (PDATA) entry for each builtin function, as
192 // documented here:
193 // https://docs.microsoft.com/en-us/cpp/build/arm64-exception-handling.
194 w->Comment(
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;
202
204 for (Builtin builtin = Builtins::kFirst; builtin <= Builtins::kLast;
205 ++builtin) {
206 const int builtin_index = static_cast<int>(builtin);
207 if (unwind_infos[builtin_index].is_leaf_function()) continue;
208
209 uint64_t builtin_start_offset = blob->InstructionStartOf(builtin) -
210 reinterpret_cast<Address>(blob->code());
211 uint32_t builtin_size = blob->InstructionSizeOf(builtin);
212
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());
218
219 for (size_t j = 0; j < xdata_desc.size(); j++) {
220 int chunk_start = xdata_desc[j];
221 int chunk_end =
222 (j < xdata_desc.size() - 1) ? xdata_desc[j + 1] : builtin_size;
223 int chunk_len = ::RoundUp(chunk_end - chunk_start, kInstrSize);
224
225 while (chunk_len > 0) {
226 int allowed_chunk_len =
227 std::min(chunk_len, win64_unwindinfo::kMaxFunctionLength);
228 chunk_len -= win64_unwindinfo::kMaxFunctionLength;
229
230 // Record the chunk length and fp_adjustment for emitting UNWIND_INFO
231 // later.
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,
235 code_chunks.size());
236 w->DeclareRvaToSymbol(embedded_blob_data_symbol,
237 builtin_start_offset + chunk_start);
238 w->DeclareRvaToSymbol(unwind_info_full_symbol.begin());
239 }
240 }
241 }
242 w->EndPdataSection();
243 w->Newline();
244
245 // Emit an UNWIND_INFO (XDATA) structs, which contains the unwinding
246 // information.
247 w->DeclareExternalFunction(CRASH_HANDLER_FUNCTION_NAME_STRING);
248 w->StartXdataSection();
249 {
250 for (size_t i = 0; i < code_chunks.size(); i++) {
251 base::SNPrintF(unwind_info_full_symbol, "%s_%u", unwind_info_symbol,
252 i + 1);
253 w->DeclareLabel(unwind_info_full_symbol.begin());
254 std::vector<uint8_t> xdata =
255 win64_unwindinfo::GetUnwindInfoForBuiltinFunction(code_chunks[i],
256 fp_adjustments[i]);
257
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]);
262 }
263 w->Newline();
264 w->DeclareRvaToSymbol(CRASH_HANDLER_FUNCTION_NAME_STRING);
265 }
266 }
267 w->EndXdataSection();
268 w->Newline();
269}
270
271#endif // V8_OS_WIN_X64
272
273} // namespace
274
276 DataDirective directive) {
277#if defined(V8_COMPILER_IS_MSVC)
279 switch (directive) {
280 case kByte:
281 return "BYTE";
282 case kLong:
283 return "DWORD";
284 case kQuad:
285 return "QWORD";
286 default:
287 UNREACHABLE();
288 }
289 } else {
290 switch (directive) {
291 case kByte:
292 return "DCB";
293 case kLong:
294 return "DCDU";
295 case kQuad:
296 return "DCQU";
297 default:
298 UNREACHABLE();
299 }
300 }
301#else
302 switch (directive) {
303 case kByte:
304 return ".byte";
305 case kLong:
306 return ".long";
307 case kQuad:
308 return ".quad";
309 case kOcta:
310 return ".octa";
311 }
312 UNREACHABLE();
313#endif
314}
315
317 const char* unwind_info_symbol, const char* embedded_blob_data_symbol,
318 const EmbeddedData* blob, const void* unwind_infos) {
319// Windows ARM64 supports cross build which could require unwind info for
320// host_os. Ignore this case because it is only used in build time.
321#if defined(V8_OS_WIN_ARM64)
323 return;
324 }
325#endif // V8_OS_WIN_ARM64
326
327#if defined(V8_OS_WIN64)
329 EmitUnwindData(this, unwind_info_symbol, embedded_blob_data_symbol, blob,
330 reinterpret_cast<const win64_unwindinfo::BuiltinUnwindInfo*>(
331 unwind_infos));
332 }
333#endif // V8_OS_WIN64
334}
335
336// Windows, MSVC
337// -----------------------------------------------------------------------------
338
339#if defined(V8_COMPILER_IS_MSVC)
340
341// For x64 MSVC builds we emit assembly in MASM syntax.
342// See https://docs.microsoft.com/en-us/cpp/assembler/masm/directives-reference.
343// For Arm build, we emit assembly in MARMASM syntax.
344// Note that the same mksnapshot has to be used to compile the host and target.
345
346// The AARCH64 ABI requires instructions be 4-byte-aligned and Windows does
347// not have a stricter alignment requirement (see the TEXTAREA macro of
348// kxarm64.h in the Windows SDK), so code is 4-byte-aligned.
349// The data fields in the emitted assembly tend to be accessed with 8-byte
350// LDR instructions, so data is 8-byte-aligned.
351//
352// armasm64's warning A4228 states
353// Alignment value exceeds AREA alignment; alignment not guaranteed
354// To ensure that ALIGN directives are honored, their values are defined as
355// equal to their corresponding AREA's ALIGN attributes.
356
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)
361
364 fprintf(fp_, " AREA |.text|, CODE, ALIGN=%d, READONLY\n",
365 ARM64_CODE_ALIGNMENT_POWER);
366 } else {
367 fprintf(fp_, ".CODE\n");
368 }
369}
370
373 fprintf(fp_, " AREA |.rodata|, DATA, ALIGN=%d, READONLY\n",
374 ARM64_DATA_ALIGNMENT_POWER);
375 } else {
376 fprintf(fp_, ".CONST\n");
377 }
378}
379
381 uint32_t value) {
383 fprintf(fp_, "%s%s %s %d\n", SYMBOL_PREFIX, name, DirectiveAsString(kLong),
384 value);
385}
386
389 fprintf(fp_, " AREA |.pdata|, DATA, ALIGN=%d, READONLY\n",
390 ARM64_DATA_ALIGNMENT_POWER);
391 } else {
392 fprintf(fp_, "OPTION DOTNAME\n");
393 fprintf(fp_, ".pdata SEGMENT DWORD READ ''\n");
394 }
395}
396
399 fprintf(fp_, ".pdata ENDS\n");
400 }
401}
402
405 fprintf(fp_, " AREA |.xdata|, DATA, ALIGN=%d, READONLY\n",
406 ARM64_DATA_ALIGNMENT_POWER);
407 } else {
408 fprintf(fp_, "OPTION DOTNAME\n");
409 fprintf(fp_, ".xdata SEGMENT DWORD READ ''\n");
410 }
411}
412
415 fprintf(fp_, ".xdata ENDS\n");
416 }
417}
418
421 fprintf(fp_, " EXTERN %s \n", name);
422 } else {
423 fprintf(fp_, "EXTERN %s : PROC\n", name);
424 }
425}
426
428 uint64_t offset) {
430 if (offset > 0) {
431 fprintf(fp_, " DCD %s + %llu\n", name, offset);
432 } else {
433 fprintf(fp_, " DCD %s\n", name);
434 }
435 // The default relocation entry generated by MSVC armasm64.exe for DCD
436 // directive is IMAGE_REL_ARM64_ADDR64 which represents relocation for
437 // 64-bit pointer instead of 32-bit RVA. Append RELOC with
438 // IMAGE_REL_ARM64_ADDR32NB(2) to generate correct relocation entry for
439 // 32-bit RVA.
440 fprintf(fp_, " RELOC 2\n");
441 } else {
442 if (offset > 0) {
443 fprintf(fp_, "DD IMAGEREL %s+%llu\n", name, offset);
444 } else {
445 fprintf(fp_, "DD IMAGEREL %s\n", name);
446 }
447 }
448}
449
452 fprintf(fp_, " EXPORT %s%s\n", SYMBOL_PREFIX, name);
453 } else {
454 fprintf(fp_, "PUBLIC %s%s\n", SYMBOL_PREFIX, name);
455 }
456}
457
460 fprintf(fp_, " ALIGN %d\n", ARM64_CODE_ALIGNMENT);
461 } else {
462 // Diverges from other platforms due to compile error
463 // 'invalid combination with segment alignment'.
464 fprintf(fp_, "ALIGN 4\n");
465 }
466}
467
470 fprintf(fp_, " ALIGN %d\n", ARM64_DATA_ALIGNMENT);
471
472 } else {
473 fprintf(fp_, "ALIGN 4\n");
474 }
475}
476
477void PlatformEmbeddedFileWriterWin::Comment(const char* string) {
478 fprintf(fp_, "; %s\n", string);
479}
480
481void PlatformEmbeddedFileWriterWin::DeclareLabel(const char* name) {
483 fprintf(fp_, "%s%s\n", SYMBOL_PREFIX, name);
484
485 } else {
486 fprintf(fp_, "%s%s LABEL %s\n", SYMBOL_PREFIX, name,
488 }
489}
490
491void PlatformEmbeddedFileWriterWin::SourceInfo(int fileid, const char* filename,
492 int line) {
493 // TODO(mvstanton): output source information for MSVC.
494 // Its syntax is #line <line> "<filename>"
495}
496
497// TODO(mmarchini): investigate emitting size annotations for Windows
499 uint32_t size) {
501 fprintf(fp_, "%s%s FUNCTION\n", SYMBOL_PREFIX, name);
502
503 } else {
504 fprintf(fp_, "%s%s PROC\n", SYMBOL_PREFIX, name);
505 }
506}
507
510 fprintf(fp_, " ENDFUNC\n");
511
512 } else {
513 fprintf(fp_, "%s%s ENDP\n", SYMBOL_PREFIX, name);
514 }
515}
516
519 return fprintf(fp_, "0x%" PRIx64, value);
520
521 } else {
522 return fprintf(fp_, "0%" PRIx64 "h", value);
523 }
524}
525
529 // x86 falls into this case
530 fprintf(fp_, ".MODEL FLAT\n");
531 }
532}
533
535 int fileid, const char* filename) {}
536
539 fprintf(fp_, " END\n");
540 } else {
541 fprintf(fp_, "END\n");
542 }
543}
544
546 DataDirective directive) {
547 return fprintf(fp_, " %s ", DirectiveAsString(directive));
548}
549
550#undef ARM64_DATA_ALIGNMENT_POWER
551#undef ARM64_DATA_ALIGNMENT
552#undef ARM64_CODE_ALIGNMENT_POWER
553#undef ARM64_CODE_ALIGNMENT
554
555// All Windows builds without MSVC.
556// -----------------------------------------------------------------------------
557
558#else
559
560// The directives for text section prefix come from the COFF
561// (Common Object File Format) standards:
562// https://llvm.org/docs/Extensions.html
563//
564// .text$hot means this section contains hot code.
565// x means executable section.
566// r means read-only section.
568 fprintf(fp_, ".section .text$hot,\"xr\"\n");
569}
570
572 fprintf(fp_, ".section .rdata\n");
573}
574
576 uint32_t value) {
578 DeclareLabel(name);
580 fprintf(fp_, "%d", value);
581 Newline();
582}
583
585 fprintf(fp_, ".section .pdata\n");
586}
587
589
591 fprintf(fp_, ".section .xdata\n");
592}
593
595
597
599 uint64_t offset) {
600 if (offset > 0) {
601 fprintf(fp_, ".rva %s + %" PRIu64 "\n", name, offset);
602 } else {
603 fprintf(fp_, ".rva %s\n", name);
604 }
605}
606
608 fprintf(fp_, ".global %s%s\n", SYMBOL_PREFIX, name);
609}
610
612#if V8_TARGET_ARCH_X64
613 // On x64 use 64-bytes code alignment to allow 64-bytes loop header alignment.
614 static_assert(64 >= kCodeAlignment);
615 fprintf(fp_, ".balign 64\n");
616#elif V8_TARGET_ARCH_PPC64
617 // 64 byte alignment is needed on ppc64 to make sure p10 prefixed instructions
618 // don't cross 64-byte boundaries.
619 static_assert(64 >= kCodeAlignment);
620 fprintf(fp_, ".balign 64\n");
621#else
622 static_assert(32 >= kCodeAlignment);
623 fprintf(fp_, ".balign 32\n");
624#endif
625}
626
628 // On Windows ARM64, s390, PPC and possibly more platforms, aligned load
629 // instructions are used to retrieve v8_Default_embedded_blob_ and/or
630 // v8_Default_embedded_blob_size_. The generated instructions require the
631 // load target to be aligned at 8 bytes (2^3).
632 fprintf(fp_, ".balign 8\n");
633}
634
636 fprintf(fp_, "// %s\n", string);
637}
638
640 fprintf(fp_, "%s%s:\n", SYMBOL_PREFIX, name);
641}
642
644 int line) {
645 // BUG(9944): Use .cv_loc to ensure CodeView information is used on
646 // Windows.
647}
648
649// TODO(mmarchini): investigate emitting size annotations for Windows
651 uint32_t size) {
652 DeclareLabel(name);
653
655#if V8_ENABLE_DRUMBRAKE
656 || IsDrumBrakeInstructionHandler(name)
657#endif // V8_ENABLE_DRUMBRAKE
658 ) {
659 // Windows ARM64 assembly is in GAS syntax, but ".type" is invalid directive
660 // in PE/COFF for Windows.
662 } else {
663 // The directives for inserting debugging information on Windows come
664 // from the PE (Portable Executable) and COFF (Common Object File Format)
665 // standards. Documented here:
666 // https://docs.microsoft.com/en-us/windows/desktop/debug/pe-format
667 //
668 // .scl 2 means StorageClass external.
669 // .type 32 means Type Representation Function.
670 fprintf(fp_, ".def %s%s; .scl 2; .type 32; .endef;\n", SYMBOL_PREFIX, name);
671 }
672}
673
675
677 return fprintf(fp_, "0x%" PRIx64, value);
678}
679
681
683 int fileid, const char* filename) {
684 // BUG(9944): Use .cv_filename to ensure CodeView information is used on
685 // Windows.
686}
687
689
691 DataDirective directive) {
692 return fprintf(fp_, " %s ", DirectiveAsString(directive));
693}
694
695#endif
696
698#if defined(V8_COMPILER_IS_MSVC)
699 // Windows MASM doesn't have an .octa directive, use QWORDs instead.
700 // Note: MASM *really* does not like large data streams. It takes over 5
701 // minutes to assemble the ~350K lines of embedded.S produced when using
702 // BYTE directives in a debug build. QWORD produces roughly 120KLOC and
703 // reduces assembly time to ~40 seconds. Still terrible, but much better
704 // than before. See also: https://crbug.com/v8/8475.
705 return kQuad;
706#else
708#endif
709}
710
712#if defined(V8_COMPILER_IS_MSVC)
714 const uint64_t* quad_ptr = reinterpret_cast<const uint64_t*>(data);
715 return HexLiteral(*quad_ptr);
716#else
718#endif
719}
720
721#undef SYMBOL_PREFIX
722#undef V8_ASSEMBLER_IS_MASM
723#undef V8_ASSEMBLER_IS_MARMASM
724#undef V8_COMPILER_IS_MSVC
725
726} // namespace internal
727} // namespace v8
union v8::internal::@341::BuiltinMetadata::KindSpecificData data
static constexpr Builtin kFirst
Definition builtins.h:112
static constexpr bool kAllBuiltinsAreIsolateIndependent
Definition builtins.h:262
static constexpr Builtin kLast
Definition builtins.h:113
void SourceInfo(int fileid, const char *filename, int line) override
void DeclareRvaToSymbol(const char *name, uint64_t offset=0)
void DeclareFunctionBegin(const char *name, uint32_t size) override
void DeclareExternalFilename(int fileid, const char *filename) override
void DeclareUint32(const char *name, uint32_t value) override
void MaybeEmitUnwindData(const char *unwind_info_symbol, const char *embedded_blob_data_symbol, const EmbeddedData *blob, const void *unwind_infos) override
std::string filename
int32_t offset
Builtin builtin
int SNPrintF(Vector< char > str, const char *format,...)
Definition strings.cc:20
constexpr intptr_t kCodeAlignment
Definition globals.h:964
constexpr uint8_t kInstrSize
#define DCHECK(condition)
Definition logging.h:482
#define DCHECK_EQ(v1, v2)
Definition logging.h:485
constexpr T RoundUp(T x, intptr_t m)
Definition macros.h:387