summaryrefslogtreecommitdiff
path: root/deps/v8/src/snapshot/embedded-file-writer.cc
diff options
context:
space:
mode:
Diffstat (limited to 'deps/v8/src/snapshot/embedded-file-writer.cc')
-rw-r--r--deps/v8/src/snapshot/embedded-file-writer.cc843
1 files changed, 0 insertions, 843 deletions
diff --git a/deps/v8/src/snapshot/embedded-file-writer.cc b/deps/v8/src/snapshot/embedded-file-writer.cc
deleted file mode 100644
index 3ead35bd9a..0000000000
--- a/deps/v8/src/snapshot/embedded-file-writer.cc
+++ /dev/null
@@ -1,843 +0,0 @@
-// Copyright 2018 the V8 project authors. All rights reserved.
-// Use of this source code is governed by a BSD-style license that can be
-// found in the LICENSE file.
-
-#include "src/snapshot/embedded-file-writer.h"
-
-#include <algorithm>
-#include <cinttypes>
-
-#include "src/objects/code-inl.h"
-
-namespace v8 {
-namespace internal {
-
-// V8_CC_MSVC is true for both MSVC and clang on windows. clang can handle
-// __asm__-style inline assembly but MSVC cannot, and thus we need a more
-// precise compiler detection that can distinguish between the two. clang on
-// windows sets both __clang__ and _MSC_VER, MSVC sets only _MSC_VER.
-#if defined(_MSC_VER) && !defined(__clang__)
-#define V8_COMPILER_IS_MSVC
-#endif
-
-// MSVC uses MASM for x86 and x64, while it has a ARMASM for ARM32 and
-// ARMASM64 for ARM64. Since ARMASM and ARMASM64 accept a slightly tweaked
-// version of ARM assembly language, they are referred to together in Visual
-// Studio project files as MARMASM.
-//
-// ARM assembly language docs:
-// http://infocenter.arm.com/help/topic/com.arm.doc.dui0802b/index.html
-// Microsoft ARM assembler and assembly language docs:
-// https://docs.microsoft.com/en-us/cpp/assembler/arm/arm-assembler-reference
-#if defined(V8_COMPILER_IS_MSVC)
-#if defined(V8_TARGET_ARCH_ARM64) || defined(V8_TARGET_ARCH_ARM)
-#define V8_ASSEMBLER_IS_MARMASM
-#elif defined(V8_TARGET_ARCH_IA32) || defined(V8_TARGET_ARCH_X64)
-#define V8_ASSEMBLER_IS_MASM
-#else
-#error Unknown Windows assembler target architecture.
-#endif
-#endif
-
-// Name mangling.
-// Symbols are prefixed with an underscore on 32-bit architectures.
-#if defined(V8_TARGET_OS_WIN) && !defined(V8_TARGET_ARCH_X64) && \
- !defined(V8_TARGET_ARCH_ARM64)
-#define SYMBOL_PREFIX "_"
-#else
-#define SYMBOL_PREFIX ""
-#endif
-
-// Platform-independent bits.
-// -----------------------------------------------------------------------------
-
-namespace {
-
-DataDirective PointerSizeDirective() {
- if (kSystemPointerSize == 8) {
- return kQuad;
- } else {
- CHECK_EQ(4, kSystemPointerSize);
- return kLong;
- }
-}
-
-} // namespace
-
-const char* DirectiveAsString(DataDirective directive) {
-#if defined(V8_TARGET_OS_WIN) && defined(V8_ASSEMBLER_IS_MASM)
- switch (directive) {
- case kByte:
- return "BYTE";
- case kLong:
- return "DWORD";
- case kQuad:
- return "QWORD";
- default:
- UNREACHABLE();
- }
-#elif defined(V8_TARGET_OS_WIN) && defined(V8_ASSEMBLER_IS_MARMASM)
- switch (directive) {
- case kByte:
- return "DCB";
- case kLong:
- return "DCDU";
- case kQuad:
- return "DCQU";
- default:
- UNREACHABLE();
- }
-#elif defined(V8_OS_AIX)
- switch (directive) {
- case kByte:
- return ".byte";
- case kLong:
- return ".long";
- case kQuad:
- return ".llong";
- default:
- UNREACHABLE();
- }
-#else
- switch (directive) {
- case kByte:
- return ".byte";
- case kLong:
- return ".long";
- case kQuad:
- return ".quad";
- case kOcta:
- return ".octa";
- }
- UNREACHABLE();
-#endif
-}
-
-void EmbeddedFileWriter::PrepareBuiltinSourcePositionMap(Builtins* builtins) {
- for (int i = 0; i < Builtins::builtin_count; i++) {
- // Retrieve the SourcePositionTable and copy it.
- Code code = builtins->builtin(i);
- // Verify that the code object is still the "real code" and not a
- // trampoline (which wouldn't have source positions).
- DCHECK(!code->is_off_heap_trampoline());
- std::vector<unsigned char> data(
- code->SourcePositionTable()->GetDataStartAddress(),
- code->SourcePositionTable()->GetDataEndAddress());
- source_positions_[i] = data;
- }
-}
-
-#if defined(V8_OS_WIN_X64)
-std::string EmbeddedFileWriter::BuiltinsUnwindInfoLabel() const {
- char embedded_blob_data_symbol[kTemporaryStringLength];
- i::SNPrintF(i::Vector<char>(embedded_blob_data_symbol),
- "%s_Builtins_UnwindInfo", embedded_variant_);
- return embedded_blob_data_symbol;
-}
-
-void EmbeddedFileWriter::SetBuiltinUnwindData(
- int builtin_index, const win64_unwindinfo::BuiltinUnwindInfo& unwind_info) {
- DCHECK_LT(builtin_index, Builtins::builtin_count);
- unwind_infos_[builtin_index] = unwind_info;
-}
-
-void EmbeddedFileWriter::WriteUnwindInfoEntry(
- PlatformDependentEmbeddedFileWriter* w, uint64_t rva_start,
- uint64_t rva_end) const {
- w->DeclareRvaToSymbol(EmbeddedBlobDataSymbol().c_str(), rva_start);
- w->DeclareRvaToSymbol(EmbeddedBlobDataSymbol().c_str(), rva_end);
- w->DeclareRvaToSymbol(BuiltinsUnwindInfoLabel().c_str());
-}
-
-void EmbeddedFileWriter::WriteUnwindInfo(PlatformDependentEmbeddedFileWriter* w,
- const i::EmbeddedData* blob) const {
- // Emit an UNWIND_INFO (XDATA) struct, which contains the unwinding
- // information that is used for all builtin functions.
- DCHECK(win64_unwindinfo::CanEmitUnwindInfoForBuiltins());
- w->Comment("xdata for all the code in the embedded blob.");
- w->DeclareExternalFunction(CRASH_HANDLER_FUNCTION_NAME_STRING);
-
- w->StartXdataSection();
- {
- w->DeclareLabel(BuiltinsUnwindInfoLabel().c_str());
- std::vector<uint8_t> xdata =
- win64_unwindinfo::GetUnwindInfoForBuiltinFunctions();
- WriteBinaryContentsAsInlineAssembly(w, xdata.data(),
- static_cast<uint32_t>(xdata.size()));
- w->Comment(" ExceptionHandler");
- w->DeclareRvaToSymbol(CRASH_HANDLER_FUNCTION_NAME_STRING);
- }
- w->EndXdataSection();
- w->Newline();
-
- // Emit a RUNTIME_FUNCTION (PDATA) entry for each builtin function, as
- // documented here:
- // https://docs.microsoft.com/en-us/cpp/build/exception-handling-x64.
- w->Comment(
- "pdata for all the code in the embedded blob (structs of type "
- "RUNTIME_FUNCTION).");
- w->Comment(" BeginAddress");
- w->Comment(" EndAddress");
- w->Comment(" UnwindInfoAddress");
- w->StartPdataSection();
- {
- Address prev_builtin_end_offset = 0;
- for (int i = 0; i < Builtins::builtin_count; i++) {
- // Some builtins are leaf functions from the point of view of Win64 stack
- // walking: they do not move the stack pointer and do not require a PDATA
- // entry because the return address can be retrieved from [rsp].
- if (!blob->ContainsBuiltin(i)) continue;
- if (unwind_infos_[i].is_leaf_function()) continue;
-
- uint64_t builtin_start_offset = blob->InstructionStartOfBuiltin(i) -
- reinterpret_cast<Address>(blob->data());
- uint32_t builtin_size = blob->InstructionSizeOfBuiltin(i);
-
- const std::vector<int>& xdata_desc = unwind_infos_[i].fp_offsets();
- if (xdata_desc.empty()) {
- // Some builtins do not have any "push rbp - mov rbp, rsp" instructions
- // to start a stack frame. We still emit a PDATA entry as if they had,
- // relying on the fact that we can find the previous frame address from
- // rbp in most cases. Note that since the function does not really start
- // with a 'push rbp' we need to specify the start RVA in the PDATA entry
- // a few bytes before the beginning of the function, if it does not
- // overlap the end of the previous builtin.
- WriteUnwindInfoEntry(
- w,
- std::max(prev_builtin_end_offset,
- builtin_start_offset - win64_unwindinfo::kRbpPrefixLength),
- builtin_start_offset + builtin_size);
- } else {
- // Some builtins have one or more "push rbp - mov rbp, rsp" sequences,
- // but not necessarily at the beginning of the function. In this case
- // we want to yield a PDATA entry for each block of instructions that
- // emit an rbp frame. If the function does not start with 'push rbp'
- // we also emit a PDATA entry for the initial block of code up to the
- // first 'push rbp', like in the case above.
- if (xdata_desc[0] > 0) {
- WriteUnwindInfoEntry(w,
- std::max(prev_builtin_end_offset,
- builtin_start_offset -
- win64_unwindinfo::kRbpPrefixLength),
- builtin_start_offset + xdata_desc[0]);
- }
-
- for (size_t j = 0; j < xdata_desc.size(); j++) {
- int chunk_start = xdata_desc[j];
- int chunk_end =
- (j < xdata_desc.size() - 1) ? xdata_desc[j + 1] : builtin_size;
- WriteUnwindInfoEntry(w, builtin_start_offset + chunk_start,
- builtin_start_offset + chunk_end);
- }
- }
-
- prev_builtin_end_offset = builtin_start_offset + builtin_size;
- w->Newline();
- }
- }
- w->EndPdataSection();
- w->Newline();
-}
-#endif
-
-// V8_OS_MACOSX
-// Fuchsia target is explicitly excluded here for Mac hosts. This is to avoid
-// generating uncompilable assembly files for the Fuchsia target.
-// -----------------------------------------------------------------------------
-
-#if defined(V8_OS_MACOSX) && !defined(V8_TARGET_OS_FUCHSIA)
-
-void PlatformDependentEmbeddedFileWriter::SectionText() {
- fprintf(fp_, ".text\n");
-}
-
-void PlatformDependentEmbeddedFileWriter::SectionData() {
- fprintf(fp_, ".data\n");
-}
-
-void PlatformDependentEmbeddedFileWriter::SectionRoData() {
- fprintf(fp_, ".const_data\n");
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclareUint32(const char* name,
- uint32_t value) {
- DeclareSymbolGlobal(name);
- DeclareLabel(name);
- IndentedDataDirective(kLong);
- fprintf(fp_, "%d", value);
- Newline();
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclarePointerToSymbol(
- const char* name, const char* target) {
- DeclareSymbolGlobal(name);
- DeclareLabel(name);
- fprintf(fp_, " %s _%s\n", DirectiveAsString(PointerSizeDirective()), target);
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclareSymbolGlobal(
- const char* name) {
- // TODO(jgruber): Investigate switching to .globl. Using .private_extern
- // prevents something along the compilation chain from messing with the
- // embedded blob. Using .global here causes embedded blob hash verification
- // failures at runtime.
- fprintf(fp_, ".private_extern _%s\n", name);
-}
-
-void PlatformDependentEmbeddedFileWriter::AlignToCodeAlignment() {
- fprintf(fp_, ".balign 32\n");
-}
-
-void PlatformDependentEmbeddedFileWriter::AlignToDataAlignment() {
- fprintf(fp_, ".balign 8\n");
-}
-
-void PlatformDependentEmbeddedFileWriter::Comment(const char* string) {
- fprintf(fp_, "// %s\n", string);
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclareLabel(const char* name) {
- fprintf(fp_, "_%s:\n", name);
-}
-
-void PlatformDependentEmbeddedFileWriter::SourceInfo(int fileid,
- const char* filename,
- int line) {
- fprintf(fp_, ".loc %d %d\n", fileid, line);
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclareFunctionBegin(
- const char* name) {
- DeclareLabel(name);
-
- // TODO(mvstanton): Investigate the proper incantations to mark the label as
- // a function on OSX.
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclareFunctionEnd(const char* name) {
-}
-
-int PlatformDependentEmbeddedFileWriter::HexLiteral(uint64_t value) {
- return fprintf(fp_, "0x%" PRIx64, value);
-}
-
-void PlatformDependentEmbeddedFileWriter::FilePrologue() {}
-
-void PlatformDependentEmbeddedFileWriter::DeclareExternalFilename(
- int fileid, const char* filename) {
- fprintf(fp_, ".file %d \"%s\"\n", fileid, filename);
-}
-
-void PlatformDependentEmbeddedFileWriter::FileEpilogue() {}
-
-int PlatformDependentEmbeddedFileWriter::IndentedDataDirective(
- DataDirective directive) {
- return fprintf(fp_, " %s ", DirectiveAsString(directive));
-}
-
-// V8_OS_AIX
-// -----------------------------------------------------------------------------
-
-#elif defined(V8_OS_AIX)
-
-void PlatformDependentEmbeddedFileWriter::SectionText() {
- fprintf(fp_, ".csect .text[PR]\n");
-}
-
-void PlatformDependentEmbeddedFileWriter::SectionData() {
- fprintf(fp_, ".csect .data[RW]\n");
-}
-
-void PlatformDependentEmbeddedFileWriter::SectionRoData() {
- fprintf(fp_, ".csect[RO]\n");
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclareUint32(const char* name,
- uint32_t value) {
- DeclareSymbolGlobal(name);
- fprintf(fp_, ".align 2\n");
- fprintf(fp_, "%s:\n", name);
- IndentedDataDirective(kLong);
- fprintf(fp_, "%d\n", value);
- Newline();
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclarePointerToSymbol(
- const char* name, const char* target) {
- AlignToCodeAlignment();
- DeclareLabel(name);
- fprintf(fp_, " %s %s\n", DirectiveAsString(PointerSizeDirective()), target);
- Newline();
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclareSymbolGlobal(
- const char* name) {
- fprintf(fp_, ".globl %s\n", name);
-}
-
-void PlatformDependentEmbeddedFileWriter::AlignToCodeAlignment() {
- fprintf(fp_, ".align 5\n");
-}
-
-void PlatformDependentEmbeddedFileWriter::AlignToDataAlignment() {
- fprintf(fp_, ".align 3\n");
-}
-
-void PlatformDependentEmbeddedFileWriter::Comment(const char* string) {
- fprintf(fp_, "// %s\n", string);
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclareLabel(const char* name) {
- DeclareSymbolGlobal(name);
- fprintf(fp_, "%s:\n", name);
-}
-
-void PlatformDependentEmbeddedFileWriter::SourceInfo(int fileid,
- const char* filename,
- int line) {
- fprintf(fp_, ".xline %d, \"%s\"\n", line, filename);
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclareFunctionBegin(
- const char* name) {
- Newline();
- DeclareSymbolGlobal(name);
- fprintf(fp_, ".csect %s[DS]\n", name); // function descriptor
- fprintf(fp_, "%s:\n", name);
- fprintf(fp_, ".llong .%s, 0, 0\n", name);
- SectionText();
- fprintf(fp_, ".%s:\n", name);
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclareFunctionEnd(const char* name) {
-}
-
-int PlatformDependentEmbeddedFileWriter::HexLiteral(uint64_t value) {
- return fprintf(fp_, "0x%" PRIx64, value);
-}
-
-void PlatformDependentEmbeddedFileWriter::FilePrologue() {}
-
-void PlatformDependentEmbeddedFileWriter::DeclareExternalFilename(
- int fileid, const char* filename) {
- // File name cannot be declared with an identifier on AIX.
- // We use the SourceInfo method to emit debug info in
- //.xline <line-number> <file-name> format.
-}
-
-void PlatformDependentEmbeddedFileWriter::FileEpilogue() {}
-
-int PlatformDependentEmbeddedFileWriter::IndentedDataDirective(
- DataDirective directive) {
- return fprintf(fp_, " %s ", DirectiveAsString(directive));
-}
-
-// V8_TARGET_OS_WIN (MSVC)
-// -----------------------------------------------------------------------------
-
-#elif defined(V8_TARGET_OS_WIN) && defined(V8_ASSEMBLER_IS_MASM)
-
-// For MSVC builds we emit assembly in MASM syntax.
-// See https://docs.microsoft.com/en-us/cpp/assembler/masm/directives-reference.
-
-void PlatformDependentEmbeddedFileWriter::SectionText() {
- fprintf(fp_, ".CODE\n");
-}
-
-void PlatformDependentEmbeddedFileWriter::SectionData() {
- fprintf(fp_, ".DATA\n");
-}
-
-void PlatformDependentEmbeddedFileWriter::SectionRoData() {
- fprintf(fp_, ".CONST\n");
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclareUint32(const char* name,
- uint32_t value) {
- DeclareSymbolGlobal(name);
- fprintf(fp_, "%s%s %s %d\n", SYMBOL_PREFIX, name, DirectiveAsString(kLong),
- value);
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclarePointerToSymbol(
- const char* name, const char* target) {
- DeclareSymbolGlobal(name);
- fprintf(fp_, "%s%s %s %s%s\n", SYMBOL_PREFIX, name,
- DirectiveAsString(PointerSizeDirective()), SYMBOL_PREFIX, target);
-}
-
-#if defined(V8_OS_WIN_X64)
-
-void PlatformDependentEmbeddedFileWriter::StartPdataSection() {
- fprintf(fp_, "OPTION DOTNAME\n");
- fprintf(fp_, ".pdata SEGMENT DWORD READ ''\n");
-}
-
-void PlatformDependentEmbeddedFileWriter::EndPdataSection() {
- fprintf(fp_, ".pdata ENDS\n");
-}
-
-void PlatformDependentEmbeddedFileWriter::StartXdataSection() {
- fprintf(fp_, "OPTION DOTNAME\n");
- fprintf(fp_, ".xdata SEGMENT DWORD READ ''\n");
-}
-
-void PlatformDependentEmbeddedFileWriter::EndXdataSection() {
- fprintf(fp_, ".xdata ENDS\n");
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclareExternalFunction(
- const char* name) {
- fprintf(fp_, "EXTERN %s : PROC\n", name);
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclareRvaToSymbol(const char* name,
- uint64_t offset) {
- if (offset > 0) {
- fprintf(fp_, "DD IMAGEREL %s+%llu\n", name, offset);
- } else {
- fprintf(fp_, "DD IMAGEREL %s\n", name);
- }
-}
-
-#endif // defined(V8_OS_WIN_X64)
-
-void PlatformDependentEmbeddedFileWriter::DeclareSymbolGlobal(
- const char* name) {
- fprintf(fp_, "PUBLIC %s%s\n", SYMBOL_PREFIX, name);
-}
-
-void PlatformDependentEmbeddedFileWriter::AlignToCodeAlignment() {
- // Diverges from other platforms due to compile error
- // 'invalid combination with segment alignment'.
- fprintf(fp_, "ALIGN 4\n");
-}
-
-void PlatformDependentEmbeddedFileWriter::AlignToDataAlignment() {
- fprintf(fp_, "ALIGN 4\n");
-}
-
-void PlatformDependentEmbeddedFileWriter::Comment(const char* string) {
- fprintf(fp_, "; %s\n", string);
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclareLabel(const char* name) {
- fprintf(fp_, "%s%s LABEL %s\n", SYMBOL_PREFIX, name,
- DirectiveAsString(kByte));
-}
-
-void PlatformDependentEmbeddedFileWriter::SourceInfo(int fileid,
- const char* filename,
- int line) {
- // TODO(mvstanton): output source information for MSVC.
- // Its syntax is #line <line> "<filename>"
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclareFunctionBegin(
- const char* name) {
- fprintf(fp_, "%s%s PROC\n", SYMBOL_PREFIX, name);
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclareFunctionEnd(const char* name) {
- fprintf(fp_, "%s%s ENDP\n", SYMBOL_PREFIX, name);
-}
-
-int PlatformDependentEmbeddedFileWriter::HexLiteral(uint64_t value) {
- return fprintf(fp_, "0%" PRIx64 "h", value);
-}
-
-void PlatformDependentEmbeddedFileWriter::FilePrologue() {
-#if !defined(V8_TARGET_ARCH_X64)
- fprintf(fp_, ".MODEL FLAT\n");
-#endif
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclareExternalFilename(
- int fileid, const char* filename) {}
-
-void PlatformDependentEmbeddedFileWriter::FileEpilogue() {
- fprintf(fp_, "END\n");
-}
-
-int PlatformDependentEmbeddedFileWriter::IndentedDataDirective(
- DataDirective directive) {
- return fprintf(fp_, " %s ", DirectiveAsString(directive));
-}
-
-#undef V8_ASSEMBLER_IS_MASM
-
-#elif defined(V8_TARGET_OS_WIN) && defined(V8_ASSEMBLER_IS_MARMASM)
-
-// The the AARCH64 ABI requires instructions be 4-byte-aligned and Windows does
-// not have a stricter alignment requirement (see the TEXTAREA macro of
-// kxarm64.h in the Windows SDK), so code is 4-byte-aligned.
-// The data fields in the emitted assembly tend to be accessed with 8-byte
-// LDR instructions, so data is 8-byte-aligned.
-//
-// armasm64's warning A4228 states
-// Alignment value exceeds AREA alignment; alignment not guaranteed
-// To ensure that ALIGN directives are honored, their values are defined as
-// equal to their corresponding AREA's ALIGN attributes.
-
-#define ARM64_DATA_ALIGNMENT_POWER (3)
-#define ARM64_DATA_ALIGNMENT (1 << ARM64_DATA_ALIGNMENT_POWER)
-#define ARM64_CODE_ALIGNMENT_POWER (2)
-#define ARM64_CODE_ALIGNMENT (1 << ARM64_CODE_ALIGNMENT_POWER)
-
-void PlatformDependentEmbeddedFileWriter::SectionText() {
- fprintf(fp_, " AREA |.text|, CODE, ALIGN=%d, READONLY\n",
- ARM64_CODE_ALIGNMENT_POWER);
-}
-
-void PlatformDependentEmbeddedFileWriter::SectionData() {
- fprintf(fp_, " AREA |.data|, DATA, ALIGN=%d, READWRITE\n",
- ARM64_DATA_ALIGNMENT_POWER);
-}
-
-void PlatformDependentEmbeddedFileWriter::SectionRoData() {
- fprintf(fp_, " AREA |.rodata|, DATA, ALIGN=%d, READONLY\n",
- ARM64_DATA_ALIGNMENT_POWER);
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclareUint32(const char* name,
- uint32_t value) {
- DeclareSymbolGlobal(name);
- fprintf(fp_, "%s%s %s %d\n", SYMBOL_PREFIX, name, DirectiveAsString(kLong),
- value);
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclarePointerToSymbol(
- const char* name, const char* target) {
- DeclareSymbolGlobal(name);
- fprintf(fp_, "%s%s %s %s%s\n", SYMBOL_PREFIX, name,
- DirectiveAsString(PointerSizeDirective()), SYMBOL_PREFIX, target);
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclareSymbolGlobal(
- const char* name) {
- fprintf(fp_, " EXPORT %s%s\n", SYMBOL_PREFIX, name);
-}
-
-void PlatformDependentEmbeddedFileWriter::AlignToCodeAlignment() {
- fprintf(fp_, " ALIGN %d\n", ARM64_CODE_ALIGNMENT);
-}
-
-void PlatformDependentEmbeddedFileWriter::AlignToDataAlignment() {
- fprintf(fp_, " ALIGN %d\n", ARM64_DATA_ALIGNMENT);
-}
-
-void PlatformDependentEmbeddedFileWriter::Comment(const char* string) {
- fprintf(fp_, "; %s\n", string);
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclareLabel(const char* name) {
- fprintf(fp_, "%s%s\n", SYMBOL_PREFIX, name);
-}
-
-void PlatformDependentEmbeddedFileWriter::SourceInfo(int fileid,
- const char* filename,
- int line) {
- // TODO(mvstanton): output source information for MSVC.
- // Its syntax is #line <line> "<filename>"
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclareFunctionBegin(
- const char* name) {
- fprintf(fp_, "%s%s FUNCTION\n", SYMBOL_PREFIX, name);
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclareFunctionEnd(const char* name) {
- fprintf(fp_, " ENDFUNC\n");
-}
-
-int PlatformDependentEmbeddedFileWriter::HexLiteral(uint64_t value) {
- return fprintf(fp_, "0x%" PRIx64, value);
-}
-
-void PlatformDependentEmbeddedFileWriter::FilePrologue() {}
-
-void PlatformDependentEmbeddedFileWriter::DeclareExternalFilename(
- int fileid, const char* filename) {}
-
-void PlatformDependentEmbeddedFileWriter::FileEpilogue() {
- fprintf(fp_, " END\n");
-}
-
-int PlatformDependentEmbeddedFileWriter::IndentedDataDirective(
- DataDirective directive) {
- return fprintf(fp_, " %s ", DirectiveAsString(directive));
-}
-
-#undef V8_ASSEMBLER_IS_MARMASM
-#undef ARM64_DATA_ALIGNMENT_POWER
-#undef ARM64_DATA_ALIGNMENT
-#undef ARM64_CODE_ALIGNMENT_POWER
-#undef ARM64_CODE_ALIGNMENT
-
-// Everything but AIX, Windows with MSVC, or OSX.
-// -----------------------------------------------------------------------------
-
-#else
-
-void PlatformDependentEmbeddedFileWriter::SectionText() {
-#ifdef OS_CHROMEOS
- fprintf(fp_, ".section .text.hot.embedded\n");
-#else
- fprintf(fp_, ".section .text\n");
-#endif
-}
-
-void PlatformDependentEmbeddedFileWriter::SectionData() {
- fprintf(fp_, ".section .data\n");
-}
-
-void PlatformDependentEmbeddedFileWriter::SectionRoData() {
- if (i::FLAG_target_os == std::string("win"))
- fprintf(fp_, ".section .rdata\n");
- else
- fprintf(fp_, ".section .rodata\n");
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclareUint32(const char* name,
- uint32_t value) {
- DeclareSymbolGlobal(name);
- DeclareLabel(name);
- IndentedDataDirective(kLong);
- fprintf(fp_, "%d", value);
- Newline();
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclarePointerToSymbol(
- const char* name, const char* target) {
- DeclareSymbolGlobal(name);
- DeclareLabel(name);
- fprintf(fp_, " %s %s%s\n", DirectiveAsString(PointerSizeDirective()),
- SYMBOL_PREFIX, target);
-}
-
-#if defined(V8_OS_WIN_X64)
-
-void PlatformDependentEmbeddedFileWriter::StartPdataSection() {
- fprintf(fp_, ".section .pdata\n");
-}
-
-void PlatformDependentEmbeddedFileWriter::EndPdataSection() {}
-
-void PlatformDependentEmbeddedFileWriter::StartXdataSection() {
- fprintf(fp_, ".section .xdata\n");
-}
-
-void PlatformDependentEmbeddedFileWriter::EndXdataSection() {}
-
-void PlatformDependentEmbeddedFileWriter::DeclareExternalFunction(
- const char* name) {}
-
-void PlatformDependentEmbeddedFileWriter::DeclareRvaToSymbol(const char* name,
- uint64_t offset) {
- if (offset > 0) {
- fprintf(fp_, ".rva %s + %llu\n", name, offset);
- } else {
- fprintf(fp_, ".rva %s\n", name);
- }
-}
-
-#endif // defined(V8_OS_WIN_X64)
-
-void PlatformDependentEmbeddedFileWriter::DeclareSymbolGlobal(
- const char* name) {
- fprintf(fp_, ".global %s%s\n", SYMBOL_PREFIX, name);
-}
-
-void PlatformDependentEmbeddedFileWriter::AlignToCodeAlignment() {
- fprintf(fp_, ".balign 32\n");
-}
-
-void PlatformDependentEmbeddedFileWriter::AlignToDataAlignment() {
- // On Windows ARM64, s390, PPC and possibly more platforms, aligned load
- // instructions are used to retrieve v8_Default_embedded_blob_ and/or
- // v8_Default_embedded_blob_size_. The generated instructions require the
- // load target to be aligned at 8 bytes (2^3).
- fprintf(fp_, ".balign 8\n");
-}
-
-void PlatformDependentEmbeddedFileWriter::Comment(const char* string) {
- fprintf(fp_, "// %s\n", string);
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclareLabel(const char* name) {
- fprintf(fp_, "%s%s:\n", SYMBOL_PREFIX, name);
-}
-
-void PlatformDependentEmbeddedFileWriter::SourceInfo(int fileid,
- const char* filename,
- int line) {
- fprintf(fp_, ".loc %d %d\n", fileid, line);
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclareFunctionBegin(
- const char* name) {
- DeclareLabel(name);
-
- if (i::FLAG_target_os == std::string("win")) {
-#if defined(V8_TARGET_ARCH_ARM64)
- // Windows ARM64 assembly is in GAS syntax, but ".type" is invalid directive
- // in PE/COFF for Windows.
-#else
- // The directives for inserting debugging information on Windows come
- // from the PE (Portable Executable) and COFF (Common Object File Format)
- // standards. Documented here:
- // https://docs.microsoft.com/en-us/windows/desktop/debug/pe-format
- //
- // .scl 2 means StorageClass external.
- // .type 32 means Type Representation Function.
- fprintf(fp_, ".def %s%s; .scl 2; .type 32; .endef;\n", SYMBOL_PREFIX, name);
-#endif
- } else {
-#if defined(V8_TARGET_ARCH_ARM) || defined(V8_TARGET_ARCH_ARM64)
- // ELF format binaries on ARM use ".type <function name>, %function"
- // to create a DWARF subprogram entry.
- fprintf(fp_, ".type %s, %%function\n", name);
-#else
- // Other ELF Format binaries use ".type <function name>, @function"
- // to create a DWARF subprogram entry.
- fprintf(fp_, ".type %s, @function\n", name);
-#endif
- }
-}
-
-void PlatformDependentEmbeddedFileWriter::DeclareFunctionEnd(const char* name) {
-}
-
-int PlatformDependentEmbeddedFileWriter::HexLiteral(uint64_t value) {
- return fprintf(fp_, "0x%" PRIx64, value);
-}
-
-void PlatformDependentEmbeddedFileWriter::FilePrologue() {}
-
-void PlatformDependentEmbeddedFileWriter::DeclareExternalFilename(
- int fileid, const char* filename) {
- // Replace any Windows style paths (backslashes) with forward
- // slashes.
- std::string fixed_filename(filename);
- for (auto& c : fixed_filename) {
- if (c == '\\') {
- c = '/';
- }
- }
- fprintf(fp_, ".file %d \"%s\"\n", fileid, fixed_filename.c_str());
-}
-
-void PlatformDependentEmbeddedFileWriter::FileEpilogue() {}
-
-int PlatformDependentEmbeddedFileWriter::IndentedDataDirective(
- DataDirective directive) {
- return fprintf(fp_, " %s ", DirectiveAsString(directive));
-}
-
-#endif
-
-#undef SYMBOL_PREFIX
-#undef V8_COMPILER_IS_MSVC
-
-} // namespace internal
-} // namespace v8