v8
V8 is Google’s open source high-performance JavaScript and WebAssembly engine, written in C++.
Loading...
Searching...
No Matches
platform-embedded-file-writer-base.cc
Go to the documentation of this file.
1// Copyright 2019 the V8 project authors. All rights reserved.
2// Use of this source code is governed by a BSD-style license that can be
3// found in the LICENSE file.
4
6
7#include <string>
8
15
16namespace v8 {
17namespace internal {
18
20 if (kSystemPointerSize == 8) {
21 return kQuad;
22 } else {
24 return kLong;
25 }
26}
27
29 return fprintf(fp_, "0x%" PRIx64, value);
30}
31
33 switch (directive) {
34 case kByte:
35 return 1;
36 case kLong:
37 return 4;
38 case kQuad:
39 return 8;
40 case kOcta:
41 return 16;
42 }
44}
45
48 size_t kHalfSize = kSize / 2;
49 uint64_t high = 0, low = 0;
50
51 switch (kSize) {
52 case 1:
53 low = *data;
54 break;
55 case 4:
56 low = *reinterpret_cast<const uint32_t*>(data);
57 break;
58 case 8:
59 low = *reinterpret_cast<const uint64_t*>(data);
60 break;
61 case 16:
62#ifdef V8_TARGET_BIG_ENDIAN
63 memcpy(&high, data, kHalfSize);
64 memcpy(&low, data + kHalfSize, kHalfSize);
65#else
66 memcpy(&high, data + kHalfSize, kHalfSize);
67 memcpy(&low, data, kHalfSize);
68#endif // V8_TARGET_BIG_ENDIAN
69 break;
70 default:
72 }
73
74 if (high != 0) {
75 return fprintf(fp(), "0x%" PRIx64 "%016" PRIx64, high, low);
76 } else {
77 return fprintf(fp(), "0x%" PRIx64, low);
78 }
79}
80
81namespace {
82
83EmbeddedTargetArch DefaultEmbeddedTargetArch() {
84#if defined(V8_TARGET_ARCH_ARM)
86#elif defined(V8_TARGET_ARCH_ARM64)
88#elif defined(V8_TARGET_ARCH_IA32)
90#elif defined(V8_TARGET_ARCH_X64)
92#else
94#endif
95}
96
97EmbeddedTargetArch ToEmbeddedTargetArch(const char* s) {
98 if (s == nullptr) {
99 return DefaultEmbeddedTargetArch();
100 }
101
102 std::string string(s);
103 if (string == "arm") {
105 } else if (string == "arm64") {
107 } else if (string == "ia32") {
109 } else if (string == "x64") {
111 } else {
113 }
114}
115
116EmbeddedTargetOs DefaultEmbeddedTargetOs() {
117#if defined(V8_OS_AIX)
119#elif defined(V8_OS_DARWIN)
121#elif defined(V8_OS_WIN)
123#elif defined(V8_OS_ZOS)
125#else
127#endif
128}
129
130EmbeddedTargetOs ToEmbeddedTargetOs(const char* s) {
131 if (s == nullptr) {
132 return DefaultEmbeddedTargetOs();
133 }
134
135 std::string string(s);
136 // Python 3.9+ on IBM i returns os400 as sys.platform instead of aix
137 if (string == "aix" || string == "os400") {
139 } else if (string == "chromeos") {
141 } else if (string == "fuchsia") {
143 } else if (string == "ios" || string == "mac") {
145 } else if (string == "win") {
147 } else if (string == "starboard") {
149 } else if (string == "zos") {
151 } else {
153 }
154}
155
156} // namespace
157
158std::unique_ptr<PlatformEmbeddedFileWriterBase> NewPlatformEmbeddedFileWriter(
159 const char* target_arch, const char* target_os) {
160 auto embedded_target_arch = ToEmbeddedTargetArch(target_arch);
161 auto embedded_target_os = ToEmbeddedTargetOs(target_os);
162
163 if (embedded_target_os == EmbeddedTargetOs::kStarboard) {
164 // target OS is "Starboard" for all starboard build so we need to
165 // use host OS macros to decide which writer to use.
166 // Cobalt also has Windows-based Posix target platform,
167 // in which case generic writer should be used.
168 switch (DefaultEmbeddedTargetOs()) {
170#if defined(V8_TARGET_OS_WIN)
172 // V8_TARGET_OS_WIN is used to enable WINDOWS-specific assembly code,
173 // for windows-hosted non-windows targets, we should still fallback to
174 // the generic writer.
175#endif
176 embedded_target_os = DefaultEmbeddedTargetOs();
177 break;
178 default:
179 // In the block below, we will use WriterGeneric for other cases.
180 break;
181 }
182 }
183
184 if (embedded_target_os == EmbeddedTargetOs::kAIX) {
185 return std::make_unique<PlatformEmbeddedFileWriterAIX>(embedded_target_arch,
186 embedded_target_os);
187 } else if (embedded_target_os == EmbeddedTargetOs::kMac) {
188 return std::make_unique<PlatformEmbeddedFileWriterMac>(embedded_target_arch,
189 embedded_target_os);
190 } else if (embedded_target_os == EmbeddedTargetOs::kWin) {
191 return std::make_unique<PlatformEmbeddedFileWriterWin>(embedded_target_arch,
192 embedded_target_os);
193 } else if (embedded_target_os == EmbeddedTargetOs::kZOS) {
194 return std::make_unique<PlatformEmbeddedFileWriterZOS>(embedded_target_arch,
195 embedded_target_os);
196 } else {
197 return std::make_unique<PlatformEmbeddedFileWriterGeneric>(
198 embedded_target_arch, embedded_target_os);
199 }
200
201 UNREACHABLE();
202}
203
204} // namespace internal
205} // namespace v8
union v8::internal::@341::BuiltinMetadata::KindSpecificData data
int DataDirectiveSize(DataDirective directive)
constexpr int kSystemPointerSize
Definition globals.h:410
std::unique_ptr< PlatformEmbeddedFileWriterBase > NewPlatformEmbeddedFileWriter(const char *target_arch, const char *target_os)
template const char * string
#define CHECK_EQ(lhs, rhs)