diff --git a/AUTHORS b/AUTHORS index e20a8b53c0..3f47e044b7 100644 --- a/AUTHORS +++ b/AUTHORS @@ -113,6 +113,7 @@ James Pike James M Snell Jianghua Yang Jiawen Geng +Jiaxun Yang Joel Stanley Johan Bergström Jonathan Liu diff --git a/src/snapshot/embedded/platform-embedded-file-writer-aix.cc b/src/snapshot/embedded/platform-embedded-file-writer-aix.cc index 8b1b4500d6..ebb78477b6 100644 --- a/src/snapshot/embedded/platform-embedded-file-writer-aix.cc +++ b/src/snapshot/embedded/platform-embedded-file-writer-aix.cc @@ -96,10 +96,6 @@ void PlatformEmbeddedFileWriterAIX::DeclareFunctionBegin(const char* 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( @@ -122,12 +118,6 @@ DataDirective PlatformEmbeddedFileWriterAIX::ByteChunkDataDirective() const { return kLong; } -int PlatformEmbeddedFileWriterAIX::WriteByteChunk(const uint8_t* data) { - DCHECK_EQ(ByteChunkDataDirective(), kLong); - const uint32_t* long_ptr = reinterpret_cast(data); - return HexLiteral(*long_ptr); -} - #undef SYMBOL_PREFIX } // namespace internal diff --git a/src/snapshot/embedded/platform-embedded-file-writer-aix.h b/src/snapshot/embedded/platform-embedded-file-writer-aix.h index 8f99c1ae85..2c709e0a30 100644 --- a/src/snapshot/embedded/platform-embedded-file-writer-aix.h +++ b/src/snapshot/embedded/platform-embedded-file-writer-aix.h @@ -37,8 +37,6 @@ class PlatformEmbeddedFileWriterAIX : public PlatformEmbeddedFileWriterBase { void DeclareFunctionBegin(const char* name, uint32_t size) override; void DeclareFunctionEnd(const char* name) override; - int HexLiteral(uint64_t value) override; - void Comment(const char* string) override; void FilePrologue() override; @@ -48,7 +46,6 @@ class PlatformEmbeddedFileWriterAIX : public PlatformEmbeddedFileWriterBase { int IndentedDataDirective(DataDirective directive) override; DataDirective ByteChunkDataDirective() const override; - int WriteByteChunk(const uint8_t* data) override; private: void DeclareSymbolGlobal(const char* name); diff --git a/src/snapshot/embedded/platform-embedded-file-writer-base.cc b/src/snapshot/embedded/platform-embedded-file-writer-base.cc index 7a04a9dfab..1cd402d8ba 100644 --- a/src/snapshot/embedded/platform-embedded-file-writer-base.cc +++ b/src/snapshot/embedded/platform-embedded-file-writer-base.cc @@ -24,6 +24,10 @@ DataDirective PointerSizeDirective() { } } +int PlatformEmbeddedFileWriterBase::HexLiteral(uint64_t value) { + return fprintf(fp_, "0x%" PRIx64, value); +} + int DataDirectiveSize(DataDirective directive) { switch (directive) { case kByte: @@ -39,24 +43,37 @@ int DataDirectiveSize(DataDirective directive) { } int PlatformEmbeddedFileWriterBase::WriteByteChunk(const uint8_t* data) { - DCHECK_EQ(ByteChunkDataDirective(), kOcta); + size_t kSize = DataDirectiveSize(ByteChunkDataDirective()); + size_t kHalfSize = kSize / 2; + uint64_t high = 0, low = 0; - static constexpr size_t kSize = kInt64Size; - - uint64_t part1, part2; - // Use memcpy for the reads since {data} is not guaranteed to be aligned. + switch (kSize) { + case 1: + low = *data; + break; + case 4: + low = *reinterpret_cast(data); + break; + case 8: + low = *reinterpret_cast(data); + break; + case 16: #ifdef V8_TARGET_BIG_ENDIAN - memcpy(&part1, data, kSize); - memcpy(&part2, data + kSize, kSize); + memcpy(&high, data, kHalfSize); + memcpy(&low, data + kHalfSize, kHalfSize); #else - memcpy(&part1, data + kSize, kSize); - memcpy(&part2, data, kSize); + memcpy(&high, data + kHalfSize, kHalfSize); + memcpy(&low, data, kHalfSize); #endif // V8_TARGET_BIG_ENDIAN + break; + default: + UNREACHABLE(); + } - if (part1 != 0) { - return fprintf(fp(), "0x%" PRIx64 "%016" PRIx64, part1, part2); + if (high != 0) { + return fprintf(fp(), "0x%" PRIx64 "%016" PRIx64, high, low); } else { - return fprintf(fp(), "0x%" PRIx64, part2); + return fprintf(fp(), "0x%" PRIx64, low); } } diff --git a/src/snapshot/embedded/platform-embedded-file-writer-base.h b/src/snapshot/embedded/platform-embedded-file-writer-base.h index eab5ca8ec6..b8709cb932 100644 --- a/src/snapshot/embedded/platform-embedded-file-writer-base.h +++ b/src/snapshot/embedded/platform-embedded-file-writer-base.h @@ -67,7 +67,7 @@ class PlatformEmbeddedFileWriterBase { virtual void DeclareFunctionEnd(const char* name) = 0; // Returns the number of printed characters. - virtual int HexLiteral(uint64_t value) = 0; + virtual int HexLiteral(uint64_t value); virtual void Comment(const char* string) = 0; virtual void Newline() { fprintf(fp_, "\n"); } diff --git a/src/snapshot/embedded/platform-embedded-file-writer-generic.cc b/src/snapshot/embedded/platform-embedded-file-writer-generic.cc index f1d6efc767..7e779ec6e5 100644 --- a/src/snapshot/embedded/platform-embedded-file-writer-generic.cc +++ b/src/snapshot/embedded/platform-embedded-file-writer-generic.cc @@ -114,10 +114,6 @@ void PlatformEmbeddedFileWriterGeneric::DeclareFunctionBegin(const char* name, void PlatformEmbeddedFileWriterGeneric::DeclareFunctionEnd(const char* name) {} -int PlatformEmbeddedFileWriterGeneric::HexLiteral(uint64_t value) { - return fprintf(fp_, "0x%" PRIx64, value); -} - void PlatformEmbeddedFileWriterGeneric::FilePrologue() { // TODO(v8:10026): Add ELF note required for BTI. } @@ -146,6 +142,18 @@ int PlatformEmbeddedFileWriterGeneric::IndentedDataDirective( return fprintf(fp_, " %s ", DirectiveAsString(directive)); } +DataDirective PlatformEmbeddedFileWriterGeneric::ByteChunkDataDirective() + const { +#if defined(V8_TARGET_ARCH_MIPS) || defined(V8_TARGET_ARCH_MIPS64) + // MIPS uses a fixed 4 byte instruction set, using .long + // to prevent any unnecessary padding. + return kLong; +#else + // Other ISAs just listen to the base + return PlatformEmbeddedFileWriterBase::ByteChunkDataDirective(); +#endif +} + #undef SYMBOL_PREFIX } // namespace internal diff --git a/src/snapshot/embedded/platform-embedded-file-writer-generic.h b/src/snapshot/embedded/platform-embedded-file-writer-generic.h index 1f899cbb5c..4d8284f31f 100644 --- a/src/snapshot/embedded/platform-embedded-file-writer-generic.h +++ b/src/snapshot/embedded/platform-embedded-file-writer-generic.h @@ -39,8 +39,6 @@ class PlatformEmbeddedFileWriterGeneric void DeclareFunctionBegin(const char* name, uint32_t size) override; void DeclareFunctionEnd(const char* name) override; - int HexLiteral(uint64_t value) override; - void Comment(const char* string) override; void FilePrologue() override; @@ -49,6 +47,8 @@ class PlatformEmbeddedFileWriterGeneric int IndentedDataDirective(DataDirective directive) override; + DataDirective ByteChunkDataDirective() const override; + private: void DeclareSymbolGlobal(const char* name); diff --git a/src/snapshot/embedded/platform-embedded-file-writer-mac.cc b/src/snapshot/embedded/platform-embedded-file-writer-mac.cc index 234f8a1f48..a094a81ee2 100644 --- a/src/snapshot/embedded/platform-embedded-file-writer-mac.cc +++ b/src/snapshot/embedded/platform-embedded-file-writer-mac.cc @@ -89,10 +89,6 @@ void PlatformEmbeddedFileWriterMac::DeclareFunctionBegin(const char* name, void PlatformEmbeddedFileWriterMac::DeclareFunctionEnd(const char* name) {} -int PlatformEmbeddedFileWriterMac::HexLiteral(uint64_t value) { - return fprintf(fp_, "0x%" PRIx64, value); -} - void PlatformEmbeddedFileWriterMac::FilePrologue() {} void PlatformEmbeddedFileWriterMac::DeclareExternalFilename( diff --git a/src/snapshot/embedded/platform-embedded-file-writer-mac.h b/src/snapshot/embedded/platform-embedded-file-writer-mac.h index 76780d75f3..79f8fdf587 100644 --- a/src/snapshot/embedded/platform-embedded-file-writer-mac.h +++ b/src/snapshot/embedded/platform-embedded-file-writer-mac.h @@ -37,8 +37,6 @@ class PlatformEmbeddedFileWriterMac : public PlatformEmbeddedFileWriterBase { void DeclareFunctionBegin(const char* name, uint32_t size) override; void DeclareFunctionEnd(const char* name) override; - int HexLiteral(uint64_t value) override; - void Comment(const char* string) override; void FilePrologue() override;