5 #include "src/snapshot/embedded-file-writer.h" 16 #if defined(_MSC_VER) && !defined(__clang__) 17 #define V8_COMPILER_IS_MSVC 22 #if defined(V8_OS_WIN) && !defined(V8_TARGET_ARCH_X64) && \ 23 !defined(V8_TARGET_ARCH_ARM64) 24 #define SYMBOL_PREFIX "_" 26 #define SYMBOL_PREFIX "" 34 DataDirective PointerSizeDirective() {
35 if (kPointerSize == 8) {
38 CHECK_EQ(4, kPointerSize);
45 const char* DirectiveAsString(DataDirective directive) {
46 #if defined(V8_OS_WIN) && defined(V8_COMPILER_IS_MSVC) 75 #if defined(V8_OS_MACOSX) 77 void PlatformDependentEmbeddedFileWriter::SectionText() {
78 fprintf(fp_,
".text\n");
81 void PlatformDependentEmbeddedFileWriter::SectionData() {
82 fprintf(fp_,
".data\n");
85 void PlatformDependentEmbeddedFileWriter::SectionRoData() {
86 fprintf(fp_,
".const_data\n");
89 void PlatformDependentEmbeddedFileWriter::DeclareUint32(
const char* name,
91 DeclareSymbolGlobal(name);
93 IndentedDataDirective(kLong);
94 fprintf(fp_,
"%d", value);
98 void PlatformDependentEmbeddedFileWriter::DeclarePointerToSymbol(
99 const char* name,
const char* target) {
100 DeclareSymbolGlobal(name);
102 fprintf(fp_,
" %s _%s\n", DirectiveAsString(PointerSizeDirective()), target);
105 void PlatformDependentEmbeddedFileWriter::DeclareSymbolGlobal(
111 fprintf(fp_,
".private_extern _%s\n", name);
114 void PlatformDependentEmbeddedFileWriter::AlignToCodeAlignment() {
115 fprintf(fp_,
".balign 32\n");
118 void PlatformDependentEmbeddedFileWriter::Comment(
const char*
string) {
119 fprintf(fp_,
"// %s\n",
string);
122 void PlatformDependentEmbeddedFileWriter::DeclareLabel(
const char* name) {
123 fprintf(fp_,
"_%s:\n", name);
126 void PlatformDependentEmbeddedFileWriter::DeclareFunctionBegin(
134 void PlatformDependentEmbeddedFileWriter::DeclareFunctionEnd(
const char* name) {
137 int PlatformDependentEmbeddedFileWriter::HexLiteral(uint64_t value) {
138 return fprintf(fp_,
"0x%" PRIx64, value);
141 void PlatformDependentEmbeddedFileWriter::FilePrologue() {}
143 void PlatformDependentEmbeddedFileWriter::FileEpilogue() {}
145 int PlatformDependentEmbeddedFileWriter::IndentedDataDirective(
146 DataDirective directive) {
147 return fprintf(fp_,
" %s ", DirectiveAsString(directive));
153 #elif defined(V8_OS_AIX) 159 void PlatformDependentEmbeddedFileWriter::SectionText() {
160 fprintf(fp_,
".csect .text[PR]\n");
163 void PlatformDependentEmbeddedFileWriter::SectionData() {
165 fprintf(fp_,
".csect .data[RW]\n");
168 void PlatformDependentEmbeddedFileWriter::SectionRoData() {
169 fprintf(fp_,
".csect[RO]\n");
172 void PlatformDependentEmbeddedFileWriter::DeclareUint32(
const char* name,
174 DeclareSymbolGlobal(name);
176 IndentedDataDirective(kLong);
177 fprintf(fp_,
"%d", value);
181 void PlatformDependentEmbeddedFileWriter::DeclarePointerToSymbol(
182 const char* name,
const char* target) {
183 DeclareSymbolGlobal(name);
185 fprintf(fp_,
" %s %s\n", DirectiveAsString(PointerSizeDirective()), target);
189 void PlatformDependentEmbeddedFileWriter::DeclareSymbolGlobal(
191 fprintf(fp_,
".globl %s\n", name);
194 void PlatformDependentEmbeddedFileWriter::AlignToCodeAlignment() {
195 fprintf(fp_,
".balign 32\n");
198 void PlatformDependentEmbeddedFileWriter::Comment(
const char*
string) {
199 fprintf(fp_,
"// %s\n",
string);
202 void PlatformDependentEmbeddedFileWriter::DeclareLabel(
const char* name) {
203 fprintf(fp_,
"%s:\n", name);
206 void PlatformDependentEmbeddedFileWriter::DeclareFunctionBegin(
211 void PlatformDependentEmbeddedFileWriter::DeclareFunctionEnd(
const char* name) {
214 int PlatformDependentEmbeddedFileWriter::HexLiteral(uint64_t value) {
215 return fprintf(fp_,
"0x%" PRIx64, value);
218 void PlatformDependentEmbeddedFileWriter::FilePrologue() {}
220 void PlatformDependentEmbeddedFileWriter::FileEpilogue() {}
222 int PlatformDependentEmbeddedFileWriter::IndentedDataDirective(
223 DataDirective directive) {
224 return fprintf(fp_,
" %s ", DirectiveAsString(directive));
230 #elif defined(V8_OS_WIN) && defined(V8_COMPILER_IS_MSVC) 235 void PlatformDependentEmbeddedFileWriter::SectionText() {
236 fprintf(fp_,
".CODE\n");
239 void PlatformDependentEmbeddedFileWriter::SectionData() {
240 fprintf(fp_,
".DATA\n");
243 void PlatformDependentEmbeddedFileWriter::SectionRoData() {
244 fprintf(fp_,
".CONST\n");
247 void PlatformDependentEmbeddedFileWriter::DeclareUint32(
const char* name,
249 DeclareSymbolGlobal(name);
250 fprintf(fp_,
"%s%s %s %d\n", SYMBOL_PREFIX, name, DirectiveAsString(kLong),
254 void PlatformDependentEmbeddedFileWriter::DeclarePointerToSymbol(
255 const char* name,
const char* target) {
256 DeclareSymbolGlobal(name);
257 fprintf(fp_,
"%s%s %s %s%s\n", SYMBOL_PREFIX, name,
258 DirectiveAsString(PointerSizeDirective()), SYMBOL_PREFIX, target);
261 void PlatformDependentEmbeddedFileWriter::DeclareSymbolGlobal(
263 fprintf(fp_,
"PUBLIC %s%s\n", SYMBOL_PREFIX, name);
266 void PlatformDependentEmbeddedFileWriter::AlignToCodeAlignment() {
269 fprintf(fp_,
"ALIGN 4\n");
272 void PlatformDependentEmbeddedFileWriter::Comment(
const char*
string) {
273 fprintf(fp_,
"; %s\n",
string);
276 void PlatformDependentEmbeddedFileWriter::DeclareLabel(
const char* name) {
277 fprintf(fp_,
"%s%s LABEL %s\n", SYMBOL_PREFIX, name,
278 DirectiveAsString(kByte));
281 void PlatformDependentEmbeddedFileWriter::DeclareFunctionBegin(
283 fprintf(fp_,
"%s%s PROC\n", SYMBOL_PREFIX, name);
286 void PlatformDependentEmbeddedFileWriter::DeclareFunctionEnd(
const char* name) {
287 fprintf(fp_,
"%s%s ENDP\n", SYMBOL_PREFIX, name);
290 int PlatformDependentEmbeddedFileWriter::HexLiteral(uint64_t value) {
291 return fprintf(fp_,
"0%" PRIx64
"h", value);
294 void PlatformDependentEmbeddedFileWriter::FilePrologue() {
295 #if !defined(V8_TARGET_ARCH_X64) && !defined(V8_TARGET_ARCH_ARM64) 296 fprintf(fp_,
".MODEL FLAT\n");
300 void PlatformDependentEmbeddedFileWriter::FileEpilogue() {
301 fprintf(fp_,
"END\n");
304 int PlatformDependentEmbeddedFileWriter::IndentedDataDirective(
305 DataDirective directive) {
306 return fprintf(fp_,
" %s ", DirectiveAsString(directive));
314 void PlatformDependentEmbeddedFileWriter::SectionText() {
316 fprintf(fp_,
".section .text.hot.embedded\n");
318 fprintf(fp_,
".section .text\n");
322 void PlatformDependentEmbeddedFileWriter::SectionData() {
323 fprintf(fp_,
".section .data\n");
326 void PlatformDependentEmbeddedFileWriter::SectionRoData() {
327 fprintf(fp_,
".section .rodata\n");
330 void PlatformDependentEmbeddedFileWriter::DeclareUint32(
const char* name,
332 DeclareSymbolGlobal(name);
334 IndentedDataDirective(kLong);
335 fprintf(fp_,
"%d", value);
339 void PlatformDependentEmbeddedFileWriter::DeclarePointerToSymbol(
340 const char* name,
const char* target) {
341 DeclareSymbolGlobal(name);
343 fprintf(fp_,
" %s %s%s\n", DirectiveAsString(PointerSizeDirective()),
344 SYMBOL_PREFIX, target);
347 void PlatformDependentEmbeddedFileWriter::DeclareSymbolGlobal(
349 fprintf(fp_,
".global %s%s\n", SYMBOL_PREFIX, name);
352 void PlatformDependentEmbeddedFileWriter::AlignToCodeAlignment() {
353 fprintf(fp_,
".balign 32\n");
356 void PlatformDependentEmbeddedFileWriter::Comment(
const char*
string) {
357 fprintf(fp_,
"// %s\n",
string);
360 void PlatformDependentEmbeddedFileWriter::DeclareLabel(
const char* name) {
361 fprintf(fp_,
"%s%s:\n", SYMBOL_PREFIX, name);
364 void PlatformDependentEmbeddedFileWriter::DeclareFunctionBegin(
368 #if defined(V8_OS_WIN) 376 fprintf(fp_,
".def %s%s; .scl 2; .type 32; .endef;\n", SYMBOL_PREFIX, name);
377 #elif defined(V8_TARGET_ARCH_ARM) || defined(V8_TARGET_ARCH_ARM64) 380 fprintf(fp_,
".type %s, %%function\n", name);
384 fprintf(fp_,
".type %s, @function\n", name);
388 void PlatformDependentEmbeddedFileWriter::DeclareFunctionEnd(
const char* name) {
391 int PlatformDependentEmbeddedFileWriter::HexLiteral(uint64_t value) {
392 return fprintf(fp_,
"0x%" PRIx64, value);
395 void PlatformDependentEmbeddedFileWriter::FilePrologue() {}
397 void PlatformDependentEmbeddedFileWriter::FileEpilogue() {}
399 int PlatformDependentEmbeddedFileWriter::IndentedDataDirective(
400 DataDirective directive) {
401 return fprintf(fp_,
" %s ", DirectiveAsString(directive));
407 #undef V8_COMPILER_IS_MSVC