[mksnapshot] Split out platform embedded file writers
Split out embedded file writers for AIX, Windows, and macOS. These are no longer selected by compile-time defines (e.g. V8_OS_WIN, V8_TARGET_ARCH_X64) but by --target-os and --target-arch runtime flags. Bug: v8:9103 Change-Id: I5d5cac15e48b5c743d74f8a382606a6194ba7865 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/1624216 Commit-Queue: Jakob Gruber <jgruber@chromium.org> Reviewed-by: Peter Marshall <petermarshall@chromium.org> Cr-Commit-Position: refs/heads/master@{#61785}
This commit is contained in:
parent
2b7ab6ad3e
commit
649d759f82
6
BUILD.gn
6
BUILD.gn
@ -3792,10 +3792,16 @@ if (v8_use_snapshot && current_toolchain == v8_snapshot_toolchain) {
|
||||
sources = [
|
||||
"src/snapshot/embedded-file-writer.cc",
|
||||
"src/snapshot/embedded-file-writer.h",
|
||||
"src/snapshot/embedded/platform-embedded-file-writer-aix.cc",
|
||||
"src/snapshot/embedded/platform-embedded-file-writer-aix.h",
|
||||
"src/snapshot/embedded/platform-embedded-file-writer-base.cc",
|
||||
"src/snapshot/embedded/platform-embedded-file-writer-base.h",
|
||||
"src/snapshot/embedded/platform-embedded-file-writer-generic.cc",
|
||||
"src/snapshot/embedded/platform-embedded-file-writer-generic.h",
|
||||
"src/snapshot/embedded/platform-embedded-file-writer-mac.cc",
|
||||
"src/snapshot/embedded/platform-embedded-file-writer-mac.h",
|
||||
"src/snapshot/embedded/platform-embedded-file-writer-win.cc",
|
||||
"src/snapshot/embedded/platform-embedded-file-writer-win.h",
|
||||
"src/snapshot/mksnapshot.cc",
|
||||
]
|
||||
|
||||
|
@ -9,8 +9,9 @@
|
||||
#include "src/codegen/source-position-table.h"
|
||||
#include "src/objects/code-inl.h"
|
||||
|
||||
// TODO(jgruber): Remove once windows-specific code is extracted.
|
||||
#include "src/snapshot/embedded/platform-embedded-file-writer-generic.h"
|
||||
// TODO(jgruber): Refactor to move windows-specific code into the
|
||||
// windows-specific file writer.
|
||||
#include "src/snapshot/embedded/platform-embedded-file-writer-win.h"
|
||||
|
||||
namespace v8 {
|
||||
namespace internal {
|
||||
@ -286,47 +287,47 @@ void EmbeddedFileWriter::SetBuiltinUnwindData(
|
||||
void EmbeddedFileWriter::WriteUnwindInfoEntry(PlatformEmbeddedFileWriterBase* w,
|
||||
uint64_t rva_start,
|
||||
uint64_t rva_end) const {
|
||||
PlatformEmbeddedFileWriterGeneric* w_gen =
|
||||
static_cast<PlatformEmbeddedFileWriterGeneric*>(w);
|
||||
w_gen->DeclareRvaToSymbol(EmbeddedBlobDataSymbol().c_str(), rva_start);
|
||||
w_gen->DeclareRvaToSymbol(EmbeddedBlobDataSymbol().c_str(), rva_end);
|
||||
w_gen->DeclareRvaToSymbol(BuiltinsUnwindInfoLabel().c_str());
|
||||
PlatformEmbeddedFileWriterWin* w_win =
|
||||
static_cast<PlatformEmbeddedFileWriterWin*>(w);
|
||||
w_win->DeclareRvaToSymbol(EmbeddedBlobDataSymbol().c_str(), rva_start);
|
||||
w_win->DeclareRvaToSymbol(EmbeddedBlobDataSymbol().c_str(), rva_end);
|
||||
w_win->DeclareRvaToSymbol(BuiltinsUnwindInfoLabel().c_str());
|
||||
}
|
||||
|
||||
void EmbeddedFileWriter::WriteUnwindInfo(PlatformEmbeddedFileWriterBase* w,
|
||||
const i::EmbeddedData* blob) const {
|
||||
PlatformEmbeddedFileWriterGeneric* w_gen =
|
||||
static_cast<PlatformEmbeddedFileWriterGeneric*>(w);
|
||||
PlatformEmbeddedFileWriterWin* w_win =
|
||||
static_cast<PlatformEmbeddedFileWriterWin*>(w);
|
||||
|
||||
// Emit an UNWIND_INFO (XDATA) struct, which contains the unwinding
|
||||
// information that is used for all builtin functions.
|
||||
DCHECK(win64_unwindinfo::CanEmitUnwindInfoForBuiltins());
|
||||
w_gen->Comment("xdata for all the code in the embedded blob.");
|
||||
w_gen->DeclareExternalFunction(CRASH_HANDLER_FUNCTION_NAME_STRING);
|
||||
w_win->Comment("xdata for all the code in the embedded blob.");
|
||||
w_win->DeclareExternalFunction(CRASH_HANDLER_FUNCTION_NAME_STRING);
|
||||
|
||||
w_gen->StartXdataSection();
|
||||
w_win->StartXdataSection();
|
||||
{
|
||||
w_gen->DeclareLabel(BuiltinsUnwindInfoLabel().c_str());
|
||||
w_win->DeclareLabel(BuiltinsUnwindInfoLabel().c_str());
|
||||
std::vector<uint8_t> xdata =
|
||||
win64_unwindinfo::GetUnwindInfoForBuiltinFunctions();
|
||||
WriteBinaryContentsAsInlineAssembly(w_gen, xdata.data(),
|
||||
WriteBinaryContentsAsInlineAssembly(w_win, xdata.data(),
|
||||
static_cast<uint32_t>(xdata.size()));
|
||||
w_gen->Comment(" ExceptionHandler");
|
||||
w_gen->DeclareRvaToSymbol(CRASH_HANDLER_FUNCTION_NAME_STRING);
|
||||
w_win->Comment(" ExceptionHandler");
|
||||
w_win->DeclareRvaToSymbol(CRASH_HANDLER_FUNCTION_NAME_STRING);
|
||||
}
|
||||
w_gen->EndXdataSection();
|
||||
w_gen->Newline();
|
||||
w_win->EndXdataSection();
|
||||
w_win->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_gen->Comment(
|
||||
w_win->Comment(
|
||||
"pdata for all the code in the embedded blob (structs of type "
|
||||
"RUNTIME_FUNCTION).");
|
||||
w_gen->Comment(" BeginAddress");
|
||||
w_gen->Comment(" EndAddress");
|
||||
w_gen->Comment(" UnwindInfoAddress");
|
||||
w_gen->StartPdataSection();
|
||||
w_win->Comment(" BeginAddress");
|
||||
w_win->Comment(" EndAddress");
|
||||
w_win->Comment(" UnwindInfoAddress");
|
||||
w_win->StartPdataSection();
|
||||
{
|
||||
Address prev_builtin_end_offset = 0;
|
||||
for (int i = 0; i < Builtins::builtin_count; i++) {
|
||||
@ -350,7 +351,7 @@ void EmbeddedFileWriter::WriteUnwindInfo(PlatformEmbeddedFileWriterBase* w,
|
||||
// a few bytes before the beginning of the function, if it does not
|
||||
// overlap the end of the previous builtin.
|
||||
WriteUnwindInfoEntry(
|
||||
w_gen,
|
||||
w_win,
|
||||
std::max(prev_builtin_end_offset,
|
||||
builtin_start_offset - win64_unwindinfo::kRbpPrefixLength),
|
||||
builtin_start_offset + builtin_size);
|
||||
@ -362,7 +363,7 @@ void EmbeddedFileWriter::WriteUnwindInfo(PlatformEmbeddedFileWriterBase* w,
|
||||
// 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_gen,
|
||||
WriteUnwindInfoEntry(w_win,
|
||||
std::max(prev_builtin_end_offset,
|
||||
builtin_start_offset -
|
||||
win64_unwindinfo::kRbpPrefixLength),
|
||||
@ -373,17 +374,17 @@ void EmbeddedFileWriter::WriteUnwindInfo(PlatformEmbeddedFileWriterBase* w,
|
||||
int chunk_start = xdata_desc[j];
|
||||
int chunk_end =
|
||||
(j < xdata_desc.size() - 1) ? xdata_desc[j + 1] : builtin_size;
|
||||
WriteUnwindInfoEntry(w_gen, builtin_start_offset + chunk_start,
|
||||
WriteUnwindInfoEntry(w_win, builtin_start_offset + chunk_start,
|
||||
builtin_start_offset + chunk_end);
|
||||
}
|
||||
}
|
||||
|
||||
prev_builtin_end_offset = builtin_start_offset + builtin_size;
|
||||
w_gen->Newline();
|
||||
w_win->Newline();
|
||||
}
|
||||
}
|
||||
w_gen->EndPdataSection();
|
||||
w_gen->Newline();
|
||||
w_win->EndPdataSection();
|
||||
w_win->Newline();
|
||||
}
|
||||
#endif
|
||||
|
||||
|
120
src/snapshot/embedded/platform-embedded-file-writer-aix.cc
Normal file
120
src/snapshot/embedded/platform-embedded-file-writer-aix.cc
Normal file
@ -0,0 +1,120 @@
|
||||
// Copyright 2019 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/platform-embedded-file-writer-aix.h"
|
||||
|
||||
namespace v8 {
|
||||
namespace internal {
|
||||
|
||||
#define SYMBOL_PREFIX ""
|
||||
|
||||
namespace {
|
||||
|
||||
const char* DirectiveAsString(DataDirective directive) {
|
||||
switch (directive) {
|
||||
case kByte:
|
||||
return ".byte";
|
||||
case kLong:
|
||||
return ".long";
|
||||
case kQuad:
|
||||
return ".llong";
|
||||
default:
|
||||
UNREACHABLE();
|
||||
}
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
void PlatformEmbeddedFileWriterAIX::SectionText() {
|
||||
fprintf(fp_, ".csect .text[PR]\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterAIX::SectionData() {
|
||||
fprintf(fp_, ".csect .data[RW]\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterAIX::SectionRoData() {
|
||||
fprintf(fp_, ".csect[RO]\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterAIX::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 PlatformEmbeddedFileWriterAIX::DeclarePointerToSymbol(const char* name,
|
||||
const char* target) {
|
||||
AlignToCodeAlignment();
|
||||
DeclareLabel(name);
|
||||
fprintf(fp_, " %s %s\n", DirectiveAsString(PointerSizeDirective()), target);
|
||||
Newline();
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterAIX::DeclareSymbolGlobal(const char* name) {
|
||||
fprintf(fp_, ".globl %s\n", name);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterAIX::AlignToCodeAlignment() {
|
||||
fprintf(fp_, ".align 5\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterAIX::AlignToDataAlignment() {
|
||||
fprintf(fp_, ".align 3\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterAIX::Comment(const char* string) {
|
||||
fprintf(fp_, "// %s\n", string);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterAIX::DeclareLabel(const char* name) {
|
||||
DeclareSymbolGlobal(name);
|
||||
fprintf(fp_, "%s:\n", name);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterAIX::SourceInfo(int fileid, const char* filename,
|
||||
int line) {
|
||||
fprintf(fp_, ".xline %d, \"%s\"\n", line, filename);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterAIX::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 PlatformEmbeddedFileWriterAIX::DeclareFunctionEnd(const char* name) {}
|
||||
|
||||
int PlatformEmbeddedFileWriterAIX::HexLiteral(uint64_t value) {
|
||||
return fprintf(fp_, "0x%" PRIx64, value);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterAIX::FilePrologue() {}
|
||||
|
||||
void PlatformEmbeddedFileWriterAIX::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 PlatformEmbeddedFileWriterAIX::FileEpilogue() {}
|
||||
|
||||
int PlatformEmbeddedFileWriterAIX::IndentedDataDirective(
|
||||
DataDirective directive) {
|
||||
return fprintf(fp_, " %s ", DirectiveAsString(directive));
|
||||
}
|
||||
|
||||
#undef SYMBOL_PREFIX
|
||||
|
||||
} // namespace internal
|
||||
} // namespace v8
|
61
src/snapshot/embedded/platform-embedded-file-writer-aix.h
Normal file
61
src/snapshot/embedded/platform-embedded-file-writer-aix.h
Normal file
@ -0,0 +1,61 @@
|
||||
// Copyright 2019 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.
|
||||
|
||||
#ifndef V8_SNAPSHOT_EMBEDDED_PLATFORM_EMBEDDED_FILE_WRITER_AIX_H_
|
||||
#define V8_SNAPSHOT_EMBEDDED_PLATFORM_EMBEDDED_FILE_WRITER_AIX_H_
|
||||
|
||||
#include "src/base/macros.h"
|
||||
#include "src/snapshot/embedded/platform-embedded-file-writer-base.h"
|
||||
|
||||
namespace v8 {
|
||||
namespace internal {
|
||||
|
||||
class PlatformEmbeddedFileWriterAIX : public PlatformEmbeddedFileWriterBase {
|
||||
public:
|
||||
PlatformEmbeddedFileWriterAIX(EmbeddedTargetArch target_arch,
|
||||
EmbeddedTargetOs target_os)
|
||||
: target_arch_(target_arch), target_os_(target_os) {
|
||||
USE(target_arch_);
|
||||
USE(target_os_);
|
||||
DCHECK_EQ(target_os_, EmbeddedTargetOs::kAIX);
|
||||
}
|
||||
|
||||
void SectionText() override;
|
||||
void SectionData() override;
|
||||
void SectionRoData() override;
|
||||
|
||||
void AlignToCodeAlignment() override;
|
||||
void AlignToDataAlignment() override;
|
||||
|
||||
void DeclareUint32(const char* name, uint32_t value) override;
|
||||
void DeclarePointerToSymbol(const char* name, const char* target) override;
|
||||
|
||||
void DeclareLabel(const char* name) override;
|
||||
|
||||
void SourceInfo(int fileid, const char* filename, int line) override;
|
||||
void DeclareFunctionBegin(const char* name) override;
|
||||
void DeclareFunctionEnd(const char* name) override;
|
||||
|
||||
int HexLiteral(uint64_t value) override;
|
||||
|
||||
void Comment(const char* string) override;
|
||||
|
||||
void FilePrologue() override;
|
||||
void DeclareExternalFilename(int fileid, const char* filename) override;
|
||||
void FileEpilogue() override;
|
||||
|
||||
int IndentedDataDirective(DataDirective directive) override;
|
||||
|
||||
private:
|
||||
void DeclareSymbolGlobal(const char* name);
|
||||
|
||||
private:
|
||||
const EmbeddedTargetArch target_arch_;
|
||||
const EmbeddedTargetOs target_os_;
|
||||
};
|
||||
|
||||
} // namespace internal
|
||||
} // namespace v8
|
||||
|
||||
#endif // V8_SNAPSHOT_EMBEDDED_PLATFORM_EMBEDDED_FILE_WRITER_AIX_H_
|
@ -6,11 +6,24 @@
|
||||
|
||||
#include <string>
|
||||
|
||||
#include "src/globals.h"
|
||||
#include "src/snapshot/embedded/platform-embedded-file-writer-aix.h"
|
||||
#include "src/snapshot/embedded/platform-embedded-file-writer-generic.h"
|
||||
#include "src/snapshot/embedded/platform-embedded-file-writer-mac.h"
|
||||
#include "src/snapshot/embedded/platform-embedded-file-writer-win.h"
|
||||
|
||||
namespace v8 {
|
||||
namespace internal {
|
||||
|
||||
DataDirective PointerSizeDirective() {
|
||||
if (kSystemPointerSize == 8) {
|
||||
return kQuad;
|
||||
} else {
|
||||
CHECK_EQ(4, kSystemPointerSize);
|
||||
return kLong;
|
||||
}
|
||||
}
|
||||
|
||||
namespace {
|
||||
|
||||
EmbeddedTargetArch DefaultEmbeddedTargetArch() {
|
||||
@ -83,9 +96,24 @@ EmbeddedTargetOs ToEmbeddedTargetOs(const char* s) {
|
||||
|
||||
std::unique_ptr<PlatformEmbeddedFileWriterBase> NewPlatformEmbeddedFileWriter(
|
||||
const char* target_arch, const char* target_os) {
|
||||
return std::unique_ptr<PlatformEmbeddedFileWriterGeneric>(
|
||||
new PlatformEmbeddedFileWriterGeneric(ToEmbeddedTargetArch(target_arch),
|
||||
ToEmbeddedTargetOs(target_os)));
|
||||
auto embedded_target_arch = ToEmbeddedTargetArch(target_arch);
|
||||
auto embedded_target_os = ToEmbeddedTargetOs(target_os);
|
||||
|
||||
if (embedded_target_os == EmbeddedTargetOs::kAIX) {
|
||||
return base::make_unique<PlatformEmbeddedFileWriterAIX>(
|
||||
embedded_target_arch, embedded_target_os);
|
||||
} else if (embedded_target_os == EmbeddedTargetOs::kMac) {
|
||||
return base::make_unique<PlatformEmbeddedFileWriterMac>(
|
||||
embedded_target_arch, embedded_target_os);
|
||||
} else if (embedded_target_os == EmbeddedTargetOs::kWin) {
|
||||
return base::make_unique<PlatformEmbeddedFileWriterWin>(
|
||||
embedded_target_arch, embedded_target_os);
|
||||
} else {
|
||||
return base::make_unique<PlatformEmbeddedFileWriterGeneric>(
|
||||
embedded_target_arch, embedded_target_os);
|
||||
}
|
||||
|
||||
UNREACHABLE();
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
|
@ -19,6 +19,8 @@ enum DataDirective {
|
||||
kOcta,
|
||||
};
|
||||
|
||||
DataDirective PointerSizeDirective();
|
||||
|
||||
enum class EmbeddedTargetOs {
|
||||
kAIX,
|
||||
kChromeOS,
|
||||
|
@ -12,93 +12,11 @@
|
||||
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";
|
||||
@ -110,456 +28,24 @@ const char* DirectiveAsString(DataDirective directive) {
|
||||
return ".octa";
|
||||
}
|
||||
UNREACHABLE();
|
||||
#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)
|
||||
} // namespace
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::SectionText() {
|
||||
fprintf(fp_, ".text\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::SectionData() {
|
||||
fprintf(fp_, ".data\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::SectionRoData() {
|
||||
fprintf(fp_, ".const_data\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::DeclareUint32(const char* name,
|
||||
uint32_t value) {
|
||||
DeclareSymbolGlobal(name);
|
||||
DeclareLabel(name);
|
||||
IndentedDataDirective(kLong);
|
||||
fprintf(fp_, "%d", value);
|
||||
Newline();
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::DeclarePointerToSymbol(
|
||||
const char* name, const char* target) {
|
||||
DeclareSymbolGlobal(name);
|
||||
DeclareLabel(name);
|
||||
fprintf(fp_, " %s _%s\n", DirectiveAsString(PointerSizeDirective()), target);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::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 PlatformEmbeddedFileWriterGeneric::AlignToCodeAlignment() {
|
||||
fprintf(fp_, ".balign 32\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::AlignToDataAlignment() {
|
||||
fprintf(fp_, ".balign 8\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::Comment(const char* string) {
|
||||
fprintf(fp_, "// %s\n", string);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::DeclareLabel(const char* name) {
|
||||
fprintf(fp_, "_%s:\n", name);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::SourceInfo(int fileid,
|
||||
const char* filename,
|
||||
int line) {
|
||||
fprintf(fp_, ".loc %d %d\n", fileid, line);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::DeclareFunctionBegin(const char* name) {
|
||||
DeclareLabel(name);
|
||||
|
||||
// TODO(mvstanton): Investigate the proper incantations to mark the label as
|
||||
// a function on OSX.
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::DeclareFunctionEnd(const char* name) {}
|
||||
|
||||
int PlatformEmbeddedFileWriterGeneric::HexLiteral(uint64_t value) {
|
||||
return fprintf(fp_, "0x%" PRIx64, value);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::FilePrologue() {}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::DeclareExternalFilename(
|
||||
int fileid, const char* filename) {
|
||||
fprintf(fp_, ".file %d \"%s\"\n", fileid, filename);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::FileEpilogue() {}
|
||||
|
||||
int PlatformEmbeddedFileWriterGeneric::IndentedDataDirective(
|
||||
DataDirective directive) {
|
||||
return fprintf(fp_, " %s ", DirectiveAsString(directive));
|
||||
}
|
||||
|
||||
// V8_OS_AIX
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
#elif defined(V8_OS_AIX)
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::SectionText() {
|
||||
fprintf(fp_, ".csect .text[PR]\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::SectionData() {
|
||||
fprintf(fp_, ".csect .data[RW]\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::SectionRoData() {
|
||||
fprintf(fp_, ".csect[RO]\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::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 PlatformEmbeddedFileWriterGeneric::DeclarePointerToSymbol(
|
||||
const char* name, const char* target) {
|
||||
AlignToCodeAlignment();
|
||||
DeclareLabel(name);
|
||||
fprintf(fp_, " %s %s\n", DirectiveAsString(PointerSizeDirective()), target);
|
||||
Newline();
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::DeclareSymbolGlobal(const char* name) {
|
||||
fprintf(fp_, ".globl %s\n", name);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::AlignToCodeAlignment() {
|
||||
fprintf(fp_, ".align 5\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::AlignToDataAlignment() {
|
||||
fprintf(fp_, ".align 3\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::Comment(const char* string) {
|
||||
fprintf(fp_, "// %s\n", string);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::DeclareLabel(const char* name) {
|
||||
DeclareSymbolGlobal(name);
|
||||
fprintf(fp_, "%s:\n", name);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::SourceInfo(int fileid,
|
||||
const char* filename,
|
||||
int line) {
|
||||
fprintf(fp_, ".xline %d, \"%s\"\n", line, filename);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::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 PlatformEmbeddedFileWriterGeneric::DeclareFunctionEnd(const char* name) {}
|
||||
|
||||
int PlatformEmbeddedFileWriterGeneric::HexLiteral(uint64_t value) {
|
||||
return fprintf(fp_, "0x%" PRIx64, value);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::FilePrologue() {}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::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 PlatformEmbeddedFileWriterGeneric::FileEpilogue() {}
|
||||
|
||||
int PlatformEmbeddedFileWriterGeneric::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 PlatformEmbeddedFileWriterGeneric::SectionText() {
|
||||
fprintf(fp_, ".CODE\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::SectionData() {
|
||||
fprintf(fp_, ".DATA\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::SectionRoData() {
|
||||
fprintf(fp_, ".CONST\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::DeclareUint32(const char* name,
|
||||
uint32_t value) {
|
||||
DeclareSymbolGlobal(name);
|
||||
fprintf(fp_, "%s%s %s %d\n", SYMBOL_PREFIX, name, DirectiveAsString(kLong),
|
||||
value);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::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 PlatformEmbeddedFileWriterGeneric::StartPdataSection() {
|
||||
fprintf(fp_, "OPTION DOTNAME\n");
|
||||
fprintf(fp_, ".pdata SEGMENT DWORD READ ''\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::EndPdataSection() {
|
||||
fprintf(fp_, ".pdata ENDS\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::StartXdataSection() {
|
||||
fprintf(fp_, "OPTION DOTNAME\n");
|
||||
fprintf(fp_, ".xdata SEGMENT DWORD READ ''\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::EndXdataSection() {
|
||||
fprintf(fp_, ".xdata ENDS\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::DeclareExternalFunction(
|
||||
const char* name) {
|
||||
fprintf(fp_, "EXTERN %s : PROC\n", name);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::DeclareRvaToSymbol(const char* name,
|
||||
uint64_t offset) {
|
||||
if (offset > 0) {
|
||||
fprintf(fp_, "DD IMAGEREL %s+%llu\n", name, offset);
|
||||
if (target_os_ == EmbeddedTargetOs::kChromeOS) {
|
||||
fprintf(fp_, ".section .text.hot.embedded\n");
|
||||
} else {
|
||||
fprintf(fp_, "DD IMAGEREL %s\n", name);
|
||||
fprintf(fp_, ".section .text\n");
|
||||
}
|
||||
}
|
||||
|
||||
#endif // defined(V8_OS_WIN_X64)
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::DeclareSymbolGlobal(const char* name) {
|
||||
fprintf(fp_, "PUBLIC %s%s\n", SYMBOL_PREFIX, name);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::AlignToCodeAlignment() {
|
||||
// Diverges from other platforms due to compile error
|
||||
// 'invalid combination with segment alignment'.
|
||||
fprintf(fp_, "ALIGN 4\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::AlignToDataAlignment() {
|
||||
fprintf(fp_, "ALIGN 4\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::Comment(const char* string) {
|
||||
fprintf(fp_, "; %s\n", string);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::DeclareLabel(const char* name) {
|
||||
fprintf(fp_, "%s%s LABEL %s\n", SYMBOL_PREFIX, name,
|
||||
DirectiveAsString(kByte));
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::SourceInfo(int fileid,
|
||||
const char* filename,
|
||||
int line) {
|
||||
// TODO(mvstanton): output source information for MSVC.
|
||||
// Its syntax is #line <line> "<filename>"
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::DeclareFunctionBegin(const char* name) {
|
||||
fprintf(fp_, "%s%s PROC\n", SYMBOL_PREFIX, name);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::DeclareFunctionEnd(const char* name) {
|
||||
fprintf(fp_, "%s%s ENDP\n", SYMBOL_PREFIX, name);
|
||||
}
|
||||
|
||||
int PlatformEmbeddedFileWriterGeneric::HexLiteral(uint64_t value) {
|
||||
return fprintf(fp_, "0%" PRIx64 "h", value);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::FilePrologue() {
|
||||
#if !defined(V8_TARGET_ARCH_X64)
|
||||
fprintf(fp_, ".MODEL FLAT\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::DeclareExternalFilename(
|
||||
int fileid, const char* filename) {}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::FileEpilogue() {
|
||||
fprintf(fp_, "END\n");
|
||||
}
|
||||
|
||||
int PlatformEmbeddedFileWriterGeneric::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 PlatformEmbeddedFileWriterGeneric::SectionText() {
|
||||
fprintf(fp_, " AREA |.text|, CODE, ALIGN=%d, READONLY\n",
|
||||
ARM64_CODE_ALIGNMENT_POWER);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::SectionData() {
|
||||
fprintf(fp_, " AREA |.data|, DATA, ALIGN=%d, READWRITE\n",
|
||||
ARM64_DATA_ALIGNMENT_POWER);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::SectionRoData() {
|
||||
fprintf(fp_, " AREA |.rodata|, DATA, ALIGN=%d, READONLY\n",
|
||||
ARM64_DATA_ALIGNMENT_POWER);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::DeclareUint32(const char* name,
|
||||
uint32_t value) {
|
||||
DeclareSymbolGlobal(name);
|
||||
fprintf(fp_, "%s%s %s %d\n", SYMBOL_PREFIX, name, DirectiveAsString(kLong),
|
||||
value);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::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 PlatformEmbeddedFileWriterGeneric::DeclareSymbolGlobal(const char* name) {
|
||||
fprintf(fp_, " EXPORT %s%s\n", SYMBOL_PREFIX, name);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::AlignToCodeAlignment() {
|
||||
fprintf(fp_, " ALIGN %d\n", ARM64_CODE_ALIGNMENT);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::AlignToDataAlignment() {
|
||||
fprintf(fp_, " ALIGN %d\n", ARM64_DATA_ALIGNMENT);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::Comment(const char* string) {
|
||||
fprintf(fp_, "; %s\n", string);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::DeclareLabel(const char* name) {
|
||||
fprintf(fp_, "%s%s\n", SYMBOL_PREFIX, name);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::SourceInfo(int fileid,
|
||||
const char* filename,
|
||||
int line) {
|
||||
// TODO(mvstanton): output source information for MSVC.
|
||||
// Its syntax is #line <line> "<filename>"
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::DeclareFunctionBegin(const char* name) {
|
||||
fprintf(fp_, "%s%s FUNCTION\n", SYMBOL_PREFIX, name);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::DeclareFunctionEnd(const char* name) {
|
||||
fprintf(fp_, " ENDFUNC\n");
|
||||
}
|
||||
|
||||
int PlatformEmbeddedFileWriterGeneric::HexLiteral(uint64_t value) {
|
||||
return fprintf(fp_, "0x%" PRIx64, value);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::FilePrologue() {}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::DeclareExternalFilename(
|
||||
int fileid, const char* filename) {}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::FileEpilogue() {
|
||||
fprintf(fp_, " END\n");
|
||||
}
|
||||
|
||||
int PlatformEmbeddedFileWriterGeneric::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 PlatformEmbeddedFileWriterGeneric::SectionText() {
|
||||
#if defined(V8_TARGET_OS_CHROMEOS)
|
||||
fprintf(fp_, ".section .text.hot.embedded\n");
|
||||
#else
|
||||
fprintf(fp_, ".section .text\n");
|
||||
#endif
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::SectionData() {
|
||||
fprintf(fp_, ".section .data\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::SectionRoData() {
|
||||
if (target_os_ == EmbeddedTargetOs::kWin) {
|
||||
fprintf(fp_, ".section .rdata\n");
|
||||
} else {
|
||||
fprintf(fp_, ".section .rodata\n");
|
||||
}
|
||||
fprintf(fp_, ".section .rodata\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::DeclareUint32(const char* name,
|
||||
@ -579,34 +65,6 @@ void PlatformEmbeddedFileWriterGeneric::DeclarePointerToSymbol(
|
||||
SYMBOL_PREFIX, target);
|
||||
}
|
||||
|
||||
#if defined(V8_OS_WIN_X64)
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::StartPdataSection() {
|
||||
fprintf(fp_, ".section .pdata\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::EndPdataSection() {}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::StartXdataSection() {
|
||||
fprintf(fp_, ".section .xdata\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::EndXdataSection() {}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::DeclareExternalFunction(
|
||||
const char* name) {}
|
||||
|
||||
void PlatformEmbeddedFileWriterGeneric::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 PlatformEmbeddedFileWriterGeneric::DeclareSymbolGlobal(const char* name) {
|
||||
fprintf(fp_, ".global %s%s\n", SYMBOL_PREFIX, name);
|
||||
}
|
||||
@ -640,30 +98,15 @@ void PlatformEmbeddedFileWriterGeneric::SourceInfo(int fileid,
|
||||
void PlatformEmbeddedFileWriterGeneric::DeclareFunctionBegin(const char* name) {
|
||||
DeclareLabel(name);
|
||||
|
||||
if (target_os_ == EmbeddedTargetOs::kWin) {
|
||||
#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)
|
||||
if (target_arch_ == EmbeddedTargetArch::kArm ||
|
||||
target_arch_ == EmbeddedTargetArch::kArm64) {
|
||||
// ELF format binaries on ARM use ".type <function name>, %function"
|
||||
// to create a DWARF subprogram entry.
|
||||
fprintf(fp_, ".type %s, %%function\n", name);
|
||||
#else
|
||||
} else {
|
||||
// Other ELF Format binaries use ".type <function name>, @function"
|
||||
// to create a DWARF subprogram entry.
|
||||
fprintf(fp_, ".type %s, @function\n", name);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
||||
@ -691,10 +134,7 @@ int PlatformEmbeddedFileWriterGeneric::IndentedDataDirective(
|
||||
return fprintf(fp_, " %s ", DirectiveAsString(directive));
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#undef SYMBOL_PREFIX
|
||||
#undef V8_COMPILER_IS_MSVC
|
||||
|
||||
} // namespace internal
|
||||
} // namespace v8
|
||||
|
@ -5,9 +5,6 @@
|
||||
#ifndef V8_SNAPSHOT_EMBEDDED_PLATFORM_EMBEDDED_FILE_WRITER_GENERIC_H_
|
||||
#define V8_SNAPSHOT_EMBEDDED_PLATFORM_EMBEDDED_FILE_WRITER_GENERIC_H_
|
||||
|
||||
#include <cinttypes>
|
||||
#include <cstdio> // For FILE.
|
||||
|
||||
#include "src/base/macros.h"
|
||||
#include "src/globals.h" // For V8_OS_WIN_X64
|
||||
#include "src/snapshot/embedded/platform-embedded-file-writer-base.h"
|
||||
@ -21,9 +18,9 @@ class PlatformEmbeddedFileWriterGeneric
|
||||
PlatformEmbeddedFileWriterGeneric(EmbeddedTargetArch target_arch,
|
||||
EmbeddedTargetOs target_os)
|
||||
: target_arch_(target_arch), target_os_(target_os) {
|
||||
// TODO(jgruber): Remove these once platforms have been split off.
|
||||
USE(target_arch_);
|
||||
USE(target_os_);
|
||||
DCHECK(target_os_ == EmbeddedTargetOs::kChromeOS ||
|
||||
target_os_ == EmbeddedTargetOs::kFuchsia ||
|
||||
target_os_ == EmbeddedTargetOs::kGeneric);
|
||||
}
|
||||
|
||||
void SectionText() override;
|
||||
@ -52,19 +49,6 @@ class PlatformEmbeddedFileWriterGeneric
|
||||
|
||||
int IndentedDataDirective(DataDirective directive) override;
|
||||
|
||||
#if defined(V8_OS_WIN_X64)
|
||||
// TODO(jgruber): Move these to the windows-specific writer.
|
||||
void StartPdataSection();
|
||||
void EndPdataSection();
|
||||
void StartXdataSection();
|
||||
void EndXdataSection();
|
||||
void DeclareExternalFunction(const char* name);
|
||||
|
||||
// Emits an RVA (address relative to the module load address) specified as an
|
||||
// offset from a given symbol.
|
||||
void DeclareRvaToSymbol(const char* name, uint64_t offset = 0);
|
||||
#endif // defined(V8_OS_WIN_X64)
|
||||
|
||||
private:
|
||||
void DeclareSymbolGlobal(const char* name);
|
||||
|
||||
|
109
src/snapshot/embedded/platform-embedded-file-writer-mac.cc
Normal file
109
src/snapshot/embedded/platform-embedded-file-writer-mac.cc
Normal file
@ -0,0 +1,109 @@
|
||||
// Copyright 2019 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/platform-embedded-file-writer-mac.h"
|
||||
|
||||
namespace v8 {
|
||||
namespace internal {
|
||||
|
||||
namespace {
|
||||
|
||||
const char* DirectiveAsString(DataDirective directive) {
|
||||
switch (directive) {
|
||||
case kByte:
|
||||
return ".byte";
|
||||
case kLong:
|
||||
return ".long";
|
||||
case kQuad:
|
||||
return ".quad";
|
||||
case kOcta:
|
||||
return ".octa";
|
||||
}
|
||||
UNREACHABLE();
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
void PlatformEmbeddedFileWriterMac::SectionText() { fprintf(fp_, ".text\n"); }
|
||||
|
||||
void PlatformEmbeddedFileWriterMac::SectionData() { fprintf(fp_, ".data\n"); }
|
||||
|
||||
void PlatformEmbeddedFileWriterMac::SectionRoData() {
|
||||
fprintf(fp_, ".const_data\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterMac::DeclareUint32(const char* name,
|
||||
uint32_t value) {
|
||||
DeclareSymbolGlobal(name);
|
||||
DeclareLabel(name);
|
||||
IndentedDataDirective(kLong);
|
||||
fprintf(fp_, "%d", value);
|
||||
Newline();
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterMac::DeclarePointerToSymbol(const char* name,
|
||||
const char* target) {
|
||||
DeclareSymbolGlobal(name);
|
||||
DeclareLabel(name);
|
||||
fprintf(fp_, " %s _%s\n", DirectiveAsString(PointerSizeDirective()), target);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterMac::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 PlatformEmbeddedFileWriterMac::AlignToCodeAlignment() {
|
||||
fprintf(fp_, ".balign 32\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterMac::AlignToDataAlignment() {
|
||||
fprintf(fp_, ".balign 8\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterMac::Comment(const char* string) {
|
||||
fprintf(fp_, "// %s\n", string);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterMac::DeclareLabel(const char* name) {
|
||||
fprintf(fp_, "_%s:\n", name);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterMac::SourceInfo(int fileid, const char* filename,
|
||||
int line) {
|
||||
fprintf(fp_, ".loc %d %d\n", fileid, line);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterMac::DeclareFunctionBegin(const char* name) {
|
||||
DeclareLabel(name);
|
||||
|
||||
// TODO(mvstanton): Investigate the proper incantations to mark the label as
|
||||
// a function on OSX.
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterMac::DeclareFunctionEnd(const char* name) {}
|
||||
|
||||
int PlatformEmbeddedFileWriterMac::HexLiteral(uint64_t value) {
|
||||
return fprintf(fp_, "0x%" PRIx64, value);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterMac::FilePrologue() {}
|
||||
|
||||
void PlatformEmbeddedFileWriterMac::DeclareExternalFilename(
|
||||
int fileid, const char* filename) {
|
||||
fprintf(fp_, ".file %d \"%s\"\n", fileid, filename);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterMac::FileEpilogue() {}
|
||||
|
||||
int PlatformEmbeddedFileWriterMac::IndentedDataDirective(
|
||||
DataDirective directive) {
|
||||
return fprintf(fp_, " %s ", DirectiveAsString(directive));
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
} // namespace v8
|
61
src/snapshot/embedded/platform-embedded-file-writer-mac.h
Normal file
61
src/snapshot/embedded/platform-embedded-file-writer-mac.h
Normal file
@ -0,0 +1,61 @@
|
||||
// Copyright 2019 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.
|
||||
|
||||
#ifndef V8_SNAPSHOT_EMBEDDED_PLATFORM_EMBEDDED_FILE_WRITER_MAC_H_
|
||||
#define V8_SNAPSHOT_EMBEDDED_PLATFORM_EMBEDDED_FILE_WRITER_MAC_H_
|
||||
|
||||
#include "src/base/macros.h"
|
||||
#include "src/snapshot/embedded/platform-embedded-file-writer-base.h"
|
||||
|
||||
namespace v8 {
|
||||
namespace internal {
|
||||
|
||||
class PlatformEmbeddedFileWriterMac : public PlatformEmbeddedFileWriterBase {
|
||||
public:
|
||||
PlatformEmbeddedFileWriterMac(EmbeddedTargetArch target_arch,
|
||||
EmbeddedTargetOs target_os)
|
||||
: target_arch_(target_arch), target_os_(target_os) {
|
||||
USE(target_arch_);
|
||||
USE(target_os_);
|
||||
DCHECK_EQ(target_os_, EmbeddedTargetOs::kMac);
|
||||
}
|
||||
|
||||
void SectionText() override;
|
||||
void SectionData() override;
|
||||
void SectionRoData() override;
|
||||
|
||||
void AlignToCodeAlignment() override;
|
||||
void AlignToDataAlignment() override;
|
||||
|
||||
void DeclareUint32(const char* name, uint32_t value) override;
|
||||
void DeclarePointerToSymbol(const char* name, const char* target) override;
|
||||
|
||||
void DeclareLabel(const char* name) override;
|
||||
|
||||
void SourceInfo(int fileid, const char* filename, int line) override;
|
||||
void DeclareFunctionBegin(const char* name) override;
|
||||
void DeclareFunctionEnd(const char* name) override;
|
||||
|
||||
int HexLiteral(uint64_t value) override;
|
||||
|
||||
void Comment(const char* string) override;
|
||||
|
||||
void FilePrologue() override;
|
||||
void DeclareExternalFilename(int fileid, const char* filename) override;
|
||||
void FileEpilogue() override;
|
||||
|
||||
int IndentedDataDirective(DataDirective directive) override;
|
||||
|
||||
private:
|
||||
void DeclareSymbolGlobal(const char* name);
|
||||
|
||||
private:
|
||||
const EmbeddedTargetArch target_arch_;
|
||||
const EmbeddedTargetOs target_os_;
|
||||
};
|
||||
|
||||
} // namespace internal
|
||||
} // namespace v8
|
||||
|
||||
#endif // V8_SNAPSHOT_EMBEDDED_PLATFORM_EMBEDDED_FILE_WRITER_MAC_H_
|
455
src/snapshot/embedded/platform-embedded-file-writer-win.cc
Normal file
455
src/snapshot/embedded/platform-embedded-file-writer-win.cc
Normal file
@ -0,0 +1,455 @@
|
||||
// Copyright 2019 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/platform-embedded-file-writer-win.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_ARCH_X64) && !defined(V8_TARGET_ARCH_ARM64)
|
||||
#define SYMBOL_PREFIX "_"
|
||||
#else
|
||||
#define SYMBOL_PREFIX ""
|
||||
#endif
|
||||
|
||||
// Notes:
|
||||
//
|
||||
// Cross-bitness builds are unsupported. It's thus safe to detect bitness
|
||||
// through compile-time defines.
|
||||
//
|
||||
// Cross-compiler builds (e.g. with mixed use of clang / MSVC) are likewise
|
||||
// unsupported and hence the compiler can also be detected through compile-time
|
||||
// defines.
|
||||
|
||||
namespace {
|
||||
|
||||
const char* DirectiveAsString(DataDirective directive) {
|
||||
#if defined(V8_ASSEMBLER_IS_MASM)
|
||||
switch (directive) {
|
||||
case kByte:
|
||||
return "BYTE";
|
||||
case kLong:
|
||||
return "DWORD";
|
||||
case kQuad:
|
||||
return "QWORD";
|
||||
default:
|
||||
UNREACHABLE();
|
||||
}
|
||||
#elif defined(V8_ASSEMBLER_IS_MARMASM)
|
||||
switch (directive) {
|
||||
case kByte:
|
||||
return "DCB";
|
||||
case kLong:
|
||||
return "DCDU";
|
||||
case kQuad:
|
||||
return "DCQU";
|
||||
default:
|
||||
UNREACHABLE();
|
||||
}
|
||||
#else
|
||||
switch (directive) {
|
||||
case kByte:
|
||||
return ".byte";
|
||||
case kLong:
|
||||
return ".long";
|
||||
case kQuad:
|
||||
return ".quad";
|
||||
case kOcta:
|
||||
return ".octa";
|
||||
}
|
||||
UNREACHABLE();
|
||||
#endif
|
||||
}
|
||||
|
||||
} // namespace
|
||||
|
||||
// Windows, MSVC, not arm/arm64.
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
#if 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 PlatformEmbeddedFileWriterWin::SectionText() { fprintf(fp_, ".CODE\n"); }
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::SectionData() { fprintf(fp_, ".DATA\n"); }
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::SectionRoData() {
|
||||
fprintf(fp_, ".CONST\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::DeclareUint32(const char* name,
|
||||
uint32_t value) {
|
||||
DeclareSymbolGlobal(name);
|
||||
fprintf(fp_, "%s%s %s %d\n", SYMBOL_PREFIX, name, DirectiveAsString(kLong),
|
||||
value);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::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 PlatformEmbeddedFileWriterWin::StartPdataSection() {
|
||||
fprintf(fp_, "OPTION DOTNAME\n");
|
||||
fprintf(fp_, ".pdata SEGMENT DWORD READ ''\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::EndPdataSection() {
|
||||
fprintf(fp_, ".pdata ENDS\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::StartXdataSection() {
|
||||
fprintf(fp_, "OPTION DOTNAME\n");
|
||||
fprintf(fp_, ".xdata SEGMENT DWORD READ ''\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::EndXdataSection() {
|
||||
fprintf(fp_, ".xdata ENDS\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::DeclareExternalFunction(const char* name) {
|
||||
fprintf(fp_, "EXTERN %s : PROC\n", name);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::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);
|
||||
}
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::DeclareSymbolGlobal(const char* name) {
|
||||
fprintf(fp_, "PUBLIC %s%s\n", SYMBOL_PREFIX, name);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::AlignToCodeAlignment() {
|
||||
// Diverges from other platforms due to compile error
|
||||
// 'invalid combination with segment alignment'.
|
||||
fprintf(fp_, "ALIGN 4\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::AlignToDataAlignment() {
|
||||
fprintf(fp_, "ALIGN 4\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::Comment(const char* string) {
|
||||
fprintf(fp_, "; %s\n", string);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::DeclareLabel(const char* name) {
|
||||
fprintf(fp_, "%s%s LABEL %s\n", SYMBOL_PREFIX, name,
|
||||
DirectiveAsString(kByte));
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::SourceInfo(int fileid, const char* filename,
|
||||
int line) {
|
||||
// TODO(mvstanton): output source information for MSVC.
|
||||
// Its syntax is #line <line> "<filename>"
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::DeclareFunctionBegin(const char* name) {
|
||||
fprintf(fp_, "%s%s PROC\n", SYMBOL_PREFIX, name);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::DeclareFunctionEnd(const char* name) {
|
||||
fprintf(fp_, "%s%s ENDP\n", SYMBOL_PREFIX, name);
|
||||
}
|
||||
|
||||
int PlatformEmbeddedFileWriterWin::HexLiteral(uint64_t value) {
|
||||
return fprintf(fp_, "0%" PRIx64 "h", value);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::FilePrologue() {
|
||||
if (target_arch_ != EmbeddedTargetArch::kX64) {
|
||||
fprintf(fp_, ".MODEL FLAT\n");
|
||||
}
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::DeclareExternalFilename(
|
||||
int fileid, const char* filename) {}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::FileEpilogue() { fprintf(fp_, "END\n"); }
|
||||
|
||||
int PlatformEmbeddedFileWriterWin::IndentedDataDirective(
|
||||
DataDirective directive) {
|
||||
return fprintf(fp_, " %s ", DirectiveAsString(directive));
|
||||
}
|
||||
|
||||
// Windows, MSVC, arm/arm64.
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
#elif defined(V8_ASSEMBLER_IS_MARMASM)
|
||||
|
||||
// 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 PlatformEmbeddedFileWriterWin::SectionText() {
|
||||
fprintf(fp_, " AREA |.text|, CODE, ALIGN=%d, READONLY\n",
|
||||
ARM64_CODE_ALIGNMENT_POWER);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::SectionData() {
|
||||
fprintf(fp_, " AREA |.data|, DATA, ALIGN=%d, READWRITE\n",
|
||||
ARM64_DATA_ALIGNMENT_POWER);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::SectionRoData() {
|
||||
fprintf(fp_, " AREA |.rodata|, DATA, ALIGN=%d, READONLY\n",
|
||||
ARM64_DATA_ALIGNMENT_POWER);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::DeclareUint32(const char* name,
|
||||
uint32_t value) {
|
||||
DeclareSymbolGlobal(name);
|
||||
fprintf(fp_, "%s%s %s %d\n", SYMBOL_PREFIX, name, DirectiveAsString(kLong),
|
||||
value);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::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 PlatformEmbeddedFileWriterWin::DeclareSymbolGlobal(const char* name) {
|
||||
fprintf(fp_, " EXPORT %s%s\n", SYMBOL_PREFIX, name);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::AlignToCodeAlignment() {
|
||||
fprintf(fp_, " ALIGN %d\n", ARM64_CODE_ALIGNMENT);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::AlignToDataAlignment() {
|
||||
fprintf(fp_, " ALIGN %d\n", ARM64_DATA_ALIGNMENT);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::Comment(const char* string) {
|
||||
fprintf(fp_, "; %s\n", string);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::DeclareLabel(const char* name) {
|
||||
fprintf(fp_, "%s%s\n", SYMBOL_PREFIX, name);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::SourceInfo(int fileid, const char* filename,
|
||||
int line) {
|
||||
// TODO(mvstanton): output source information for MSVC.
|
||||
// Its syntax is #line <line> "<filename>"
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::DeclareFunctionBegin(const char* name) {
|
||||
fprintf(fp_, "%s%s FUNCTION\n", SYMBOL_PREFIX, name);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::DeclareFunctionEnd(const char* name) {
|
||||
fprintf(fp_, " ENDFUNC\n");
|
||||
}
|
||||
|
||||
int PlatformEmbeddedFileWriterWin::HexLiteral(uint64_t value) {
|
||||
return fprintf(fp_, "0x%" PRIx64, value);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::FilePrologue() {}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::DeclareExternalFilename(
|
||||
int fileid, const char* filename) {}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::FileEpilogue() { fprintf(fp_, " END\n"); }
|
||||
|
||||
int PlatformEmbeddedFileWriterWin::IndentedDataDirective(
|
||||
DataDirective directive) {
|
||||
return fprintf(fp_, " %s ", DirectiveAsString(directive));
|
||||
}
|
||||
|
||||
#undef ARM64_DATA_ALIGNMENT_POWER
|
||||
#undef ARM64_DATA_ALIGNMENT
|
||||
#undef ARM64_CODE_ALIGNMENT_POWER
|
||||
#undef ARM64_CODE_ALIGNMENT
|
||||
|
||||
// All Windows builds without MSVC.
|
||||
// -----------------------------------------------------------------------------
|
||||
|
||||
#else
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::SectionText() {
|
||||
fprintf(fp_, ".section .text\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::SectionData() {
|
||||
fprintf(fp_, ".section .data\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::SectionRoData() {
|
||||
fprintf(fp_, ".section .rdata\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::DeclareUint32(const char* name,
|
||||
uint32_t value) {
|
||||
DeclareSymbolGlobal(name);
|
||||
DeclareLabel(name);
|
||||
IndentedDataDirective(kLong);
|
||||
fprintf(fp_, "%d", value);
|
||||
Newline();
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::DeclarePointerToSymbol(const char* name,
|
||||
const char* target) {
|
||||
DeclareSymbolGlobal(name);
|
||||
DeclareLabel(name);
|
||||
fprintf(fp_, " %s %s%s\n", DirectiveAsString(PointerSizeDirective()),
|
||||
SYMBOL_PREFIX, target);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::StartPdataSection() {
|
||||
fprintf(fp_, ".section .pdata\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::EndPdataSection() {}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::StartXdataSection() {
|
||||
fprintf(fp_, ".section .xdata\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::EndXdataSection() {}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::DeclareExternalFunction(const char* name) {}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::DeclareRvaToSymbol(const char* name,
|
||||
uint64_t offset) {
|
||||
if (offset > 0) {
|
||||
fprintf(fp_, ".rva %s + %" PRIu64 "\n", name, offset);
|
||||
} else {
|
||||
fprintf(fp_, ".rva %s\n", name);
|
||||
}
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::DeclareSymbolGlobal(const char* name) {
|
||||
fprintf(fp_, ".global %s%s\n", SYMBOL_PREFIX, name);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::AlignToCodeAlignment() {
|
||||
fprintf(fp_, ".balign 32\n");
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::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 PlatformEmbeddedFileWriterWin::Comment(const char* string) {
|
||||
fprintf(fp_, "// %s\n", string);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::DeclareLabel(const char* name) {
|
||||
fprintf(fp_, "%s%s:\n", SYMBOL_PREFIX, name);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::SourceInfo(int fileid, const char* filename,
|
||||
int line) {
|
||||
fprintf(fp_, ".loc %d %d\n", fileid, line);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::DeclareFunctionBegin(const char* name) {
|
||||
DeclareLabel(name);
|
||||
|
||||
if (target_arch_ == EmbeddedTargetArch::kArm64) {
|
||||
// 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);
|
||||
}
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::DeclareFunctionEnd(const char* name) {}
|
||||
|
||||
int PlatformEmbeddedFileWriterWin::HexLiteral(uint64_t value) {
|
||||
return fprintf(fp_, "0x%" PRIx64, value);
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::FilePrologue() {}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::DeclareExternalFilename(
|
||||
int fileid, const char* filename) {
|
||||
// Replace any Windows style paths (backslashes) with forward
|
||||
// slashes.
|
||||
std::string fixed_filename(filename);
|
||||
std::replace(fixed_filename.begin(), fixed_filename.end(), '\\', '/');
|
||||
fprintf(fp_, ".file %d \"%s\"\n", fileid, fixed_filename.c_str());
|
||||
}
|
||||
|
||||
void PlatformEmbeddedFileWriterWin::FileEpilogue() {}
|
||||
|
||||
int PlatformEmbeddedFileWriterWin::IndentedDataDirective(
|
||||
DataDirective directive) {
|
||||
return fprintf(fp_, " %s ", DirectiveAsString(directive));
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#undef SYMBOL_PREFIX
|
||||
#undef V8_ASSEMBLER_IS_MASM
|
||||
#undef V8_ASSEMBLER_IS_MARMASM
|
||||
#undef V8_COMPILER_IS_MSVC
|
||||
|
||||
} // namespace internal
|
||||
} // namespace v8
|
70
src/snapshot/embedded/platform-embedded-file-writer-win.h
Normal file
70
src/snapshot/embedded/platform-embedded-file-writer-win.h
Normal file
@ -0,0 +1,70 @@
|
||||
// Copyright 2019 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.
|
||||
|
||||
#ifndef V8_SNAPSHOT_EMBEDDED_PLATFORM_EMBEDDED_FILE_WRITER_WIN_H_
|
||||
#define V8_SNAPSHOT_EMBEDDED_PLATFORM_EMBEDDED_FILE_WRITER_WIN_H_
|
||||
|
||||
#include "src/base/macros.h"
|
||||
#include "src/snapshot/embedded/platform-embedded-file-writer-base.h"
|
||||
|
||||
namespace v8 {
|
||||
namespace internal {
|
||||
|
||||
class PlatformEmbeddedFileWriterWin : public PlatformEmbeddedFileWriterBase {
|
||||
public:
|
||||
PlatformEmbeddedFileWriterWin(EmbeddedTargetArch target_arch,
|
||||
EmbeddedTargetOs target_os)
|
||||
: target_arch_(target_arch), target_os_(target_os) {
|
||||
USE(target_os_);
|
||||
DCHECK_EQ(target_os_, EmbeddedTargetOs::kWin);
|
||||
}
|
||||
|
||||
void SectionText() override;
|
||||
void SectionData() override;
|
||||
void SectionRoData() override;
|
||||
|
||||
void AlignToCodeAlignment() override;
|
||||
void AlignToDataAlignment() override;
|
||||
|
||||
void DeclareUint32(const char* name, uint32_t value) override;
|
||||
void DeclarePointerToSymbol(const char* name, const char* target) override;
|
||||
|
||||
void DeclareLabel(const char* name) override;
|
||||
|
||||
void SourceInfo(int fileid, const char* filename, int line) override;
|
||||
void DeclareFunctionBegin(const char* name) override;
|
||||
void DeclareFunctionEnd(const char* name) override;
|
||||
|
||||
int HexLiteral(uint64_t value) override;
|
||||
|
||||
void Comment(const char* string) override;
|
||||
|
||||
void FilePrologue() override;
|
||||
void DeclareExternalFilename(int fileid, const char* filename) override;
|
||||
void FileEpilogue() override;
|
||||
|
||||
int IndentedDataDirective(DataDirective directive) override;
|
||||
|
||||
void StartPdataSection();
|
||||
void EndPdataSection();
|
||||
void StartXdataSection();
|
||||
void EndXdataSection();
|
||||
void DeclareExternalFunction(const char* name);
|
||||
|
||||
// Emits an RVA (address relative to the module load address) specified as an
|
||||
// offset from a given symbol.
|
||||
void DeclareRvaToSymbol(const char* name, uint64_t offset = 0);
|
||||
|
||||
private:
|
||||
void DeclareSymbolGlobal(const char* name);
|
||||
|
||||
private:
|
||||
const EmbeddedTargetArch target_arch_;
|
||||
const EmbeddedTargetOs target_os_;
|
||||
};
|
||||
|
||||
} // namespace internal
|
||||
} // namespace v8
|
||||
|
||||
#endif // V8_SNAPSHOT_EMBEDDED_PLATFORM_EMBEDDED_FILE_WRITER_WIN_H_
|
Loading…
Reference in New Issue
Block a user