Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(149)

Side by Side Diff: src/serialize.cc

Issue 153923005: A64: Synchronize with r17525. (Closed) Base URL: https://v8.googlecode.com/svn/branches/experimental/a64
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/runtime.cc ('k') | src/spaces.h » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 1650 matching lines...) Expand 10 before | Expand all | Expand 10 after
1661 current_contents, kPlain, kStartOfObject, 0); 1661 current_contents, kPlain, kStartOfObject, 0);
1662 bytes_processed_so_far_ += kPointerSize; 1662 bytes_processed_so_far_ += kPointerSize;
1663 current++; 1663 current++;
1664 } 1664 }
1665 } 1665 }
1666 } 1666 }
1667 } 1667 }
1668 1668
1669 1669
1670 void Serializer::ObjectSerializer::VisitEmbeddedPointer(RelocInfo* rinfo) { 1670 void Serializer::ObjectSerializer::VisitEmbeddedPointer(RelocInfo* rinfo) {
1671 Object** current = rinfo->target_object_address(); 1671 Object* current = rinfo->target_object();
1672 1672
1673 int skip = OutputRawData(rinfo->target_address_address(), 1673 int skip = OutputRawData(rinfo->target_address_address(),
1674 kCanReturnSkipInsteadOfSkipping); 1674 kCanReturnSkipInsteadOfSkipping);
1675 HowToCode representation = rinfo->IsCodedSpecially() ? kFromCode : kPlain; 1675 HowToCode representation = rinfo->IsCodedSpecially() ? kFromCode : kPlain;
1676 serializer_->SerializeObject(*current, representation, kStartOfObject, skip); 1676 serializer_->SerializeObject(current, representation, kStartOfObject, skip);
1677 bytes_processed_so_far_ += rinfo->target_address_size(); 1677 bytes_processed_so_far_ += rinfo->target_address_size();
1678 } 1678 }
1679 1679
1680 1680
1681 void Serializer::ObjectSerializer::VisitExternalReference(Address* p) { 1681 void Serializer::ObjectSerializer::VisitExternalReference(Address* p) {
1682 Address references_start = reinterpret_cast<Address>(p); 1682 Address references_start = reinterpret_cast<Address>(p);
1683 int skip = OutputRawData(references_start, kCanReturnSkipInsteadOfSkipping); 1683 int skip = OutputRawData(references_start, kCanReturnSkipInsteadOfSkipping);
1684 1684
1685 sink_->Put(kExternalReference + kPlain + kStartOfObject, "ExternalRef"); 1685 sink_->Put(kExternalReference + kPlain + kStartOfObject, "ExternalRef");
1686 sink_->PutInt(skip, "SkipB4ExternalRef"); 1686 sink_->PutInt(skip, "SkipB4ExternalRef");
1687 int reference_id = serializer_->EncodeExternalReference(*p); 1687 int reference_id = serializer_->EncodeExternalReference(*p);
1688 sink_->PutInt(reference_id, "reference id"); 1688 sink_->PutInt(reference_id, "reference id");
1689 bytes_processed_so_far_ += kPointerSize; 1689 bytes_processed_so_far_ += kPointerSize;
1690 } 1690 }
1691 1691
1692 1692
1693 void Serializer::ObjectSerializer::VisitExternalReference(RelocInfo* rinfo) { 1693 void Serializer::ObjectSerializer::VisitExternalReference(RelocInfo* rinfo) {
1694 Address references_start = rinfo->target_address_address(); 1694 Address references_start = rinfo->target_address_address();
1695 int skip = OutputRawData(references_start, kCanReturnSkipInsteadOfSkipping); 1695 int skip = OutputRawData(references_start, kCanReturnSkipInsteadOfSkipping);
1696 1696
1697 Address* current = rinfo->target_reference_address(); 1697 Address current = rinfo->target_reference();
1698 int representation = rinfo->IsCodedSpecially() ? 1698 int representation = rinfo->IsCodedSpecially() ?
1699 kFromCode + kStartOfObject : kPlain + kStartOfObject; 1699 kFromCode + kStartOfObject : kPlain + kStartOfObject;
1700 sink_->Put(kExternalReference + representation, "ExternalRef"); 1700 sink_->Put(kExternalReference + representation, "ExternalRef");
1701 sink_->PutInt(skip, "SkipB4ExternalRef"); 1701 sink_->PutInt(skip, "SkipB4ExternalRef");
1702 int reference_id = serializer_->EncodeExternalReference(*current); 1702 int reference_id = serializer_->EncodeExternalReference(current);
1703 sink_->PutInt(reference_id, "reference id"); 1703 sink_->PutInt(reference_id, "reference id");
1704 bytes_processed_so_far_ += rinfo->target_address_size(); 1704 bytes_processed_so_far_ += rinfo->target_address_size();
1705 } 1705 }
1706 1706
1707 1707
1708 void Serializer::ObjectSerializer::VisitRuntimeEntry(RelocInfo* rinfo) { 1708 void Serializer::ObjectSerializer::VisitRuntimeEntry(RelocInfo* rinfo) {
1709 Address target_start = rinfo->target_address_address(); 1709 Address target_start = rinfo->target_address_address();
1710 int skip = OutputRawData(target_start, kCanReturnSkipInsteadOfSkipping); 1710 int skip = OutputRawData(target_start, kCanReturnSkipInsteadOfSkipping);
1711 Address target = rinfo->target_address(); 1711 Address target = rinfo->target_address();
1712 uint32_t encoding = serializer_->EncodeExternalReference(target); 1712 uint32_t encoding = serializer_->EncodeExternalReference(target);
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
1769 return; 1769 return;
1770 } 1770 }
1771 } 1771 }
1772 } 1772 }
1773 // One of the strings in the natives cache should match the resource. We 1773 // One of the strings in the natives cache should match the resource. We
1774 // can't serialize any other kinds of external strings. 1774 // can't serialize any other kinds of external strings.
1775 UNREACHABLE(); 1775 UNREACHABLE();
1776 } 1776 }
1777 1777
1778 1778
1779 static Code* CloneCodeObject(HeapObject* code) {
1780 Address copy = new byte[code->Size()];
1781 OS::MemCopy(copy, code->address(), code->Size());
1782 return Code::cast(HeapObject::FromAddress(copy));
1783 }
1784
1785
1786 static void WipeOutRelocations(Code* code) {
1787 int mode_mask =
1788 RelocInfo::kCodeTargetMask |
1789 RelocInfo::ModeMask(RelocInfo::EMBEDDED_OBJECT) |
1790 RelocInfo::ModeMask(RelocInfo::EXTERNAL_REFERENCE) |
1791 RelocInfo::ModeMask(RelocInfo::RUNTIME_ENTRY);
1792 for (RelocIterator it(code, mode_mask); !it.done(); it.next()) {
1793 it.rinfo()->WipeOut();
1794 }
1795 }
1796
1797
1779 int Serializer::ObjectSerializer::OutputRawData( 1798 int Serializer::ObjectSerializer::OutputRawData(
1780 Address up_to, Serializer::ObjectSerializer::ReturnSkip return_skip) { 1799 Address up_to, Serializer::ObjectSerializer::ReturnSkip return_skip) {
1781 Address object_start = object_->address(); 1800 Address object_start = object_->address();
1782 Address base = object_start + bytes_processed_so_far_; 1801 int base = bytes_processed_so_far_;
1783 int up_to_offset = static_cast<int>(up_to - object_start); 1802 int up_to_offset = static_cast<int>(up_to - object_start);
1784 int to_skip = up_to_offset - bytes_processed_so_far_; 1803 int to_skip = up_to_offset - bytes_processed_so_far_;
1785 int bytes_to_output = to_skip; 1804 int bytes_to_output = to_skip;
1786 bytes_processed_so_far_ += to_skip; 1805 bytes_processed_so_far_ += to_skip;
1787 // This assert will fail if the reloc info gives us the target_address_address 1806 // This assert will fail if the reloc info gives us the target_address_address
1788 // locations in a non-ascending order. Luckily that doesn't happen. 1807 // locations in a non-ascending order. Luckily that doesn't happen.
1789 ASSERT(to_skip >= 0); 1808 ASSERT(to_skip >= 0);
1790 bool outputting_code = false; 1809 bool outputting_code = false;
1791 if (to_skip != 0 && code_object_ && !code_has_been_output_) { 1810 if (to_skip != 0 && code_object_ && !code_has_been_output_) {
1792 // Output the code all at once and fix later. 1811 // Output the code all at once and fix later.
1793 bytes_to_output = object_->Size() + to_skip - bytes_processed_so_far_; 1812 bytes_to_output = object_->Size() + to_skip - bytes_processed_so_far_;
1794 outputting_code = true; 1813 outputting_code = true;
1795 code_has_been_output_ = true; 1814 code_has_been_output_ = true;
1796 } 1815 }
1797 if (bytes_to_output != 0 && 1816 if (bytes_to_output != 0 &&
1798 (!code_object_ || outputting_code)) { 1817 (!code_object_ || outputting_code)) {
1799 #define RAW_CASE(index) \ 1818 #define RAW_CASE(index) \
1800 if (!outputting_code && bytes_to_output == index * kPointerSize && \ 1819 if (!outputting_code && bytes_to_output == index * kPointerSize && \
1801 index * kPointerSize == to_skip) { \ 1820 index * kPointerSize == to_skip) { \
1802 sink_->PutSection(kRawData + index, "RawDataFixed"); \ 1821 sink_->PutSection(kRawData + index, "RawDataFixed"); \
1803 to_skip = 0; /* This insn already skips. */ \ 1822 to_skip = 0; /* This insn already skips. */ \
1804 } else /* NOLINT */ 1823 } else /* NOLINT */
1805 COMMON_RAW_LENGTHS(RAW_CASE) 1824 COMMON_RAW_LENGTHS(RAW_CASE)
1806 #undef RAW_CASE 1825 #undef RAW_CASE
1807 { /* NOLINT */ 1826 { /* NOLINT */
1808 // We always end up here if we are outputting the code of a code object. 1827 // We always end up here if we are outputting the code of a code object.
1809 sink_->Put(kRawData, "RawData"); 1828 sink_->Put(kRawData, "RawData");
1810 sink_->PutInt(bytes_to_output, "length"); 1829 sink_->PutInt(bytes_to_output, "length");
1811 } 1830 }
1831
1832 // To make snapshots reproducible, we need to wipe out all pointers in code.
1833 if (code_object_) {
1834 Code* code = CloneCodeObject(object_);
1835 WipeOutRelocations(code);
1836 // We need to wipe out the header fields *after* wiping out the
1837 // relocations, because some of these fields are needed for the latter.
1838 code->WipeOutHeader();
1839 object_start = code->address();
1840 }
1841
1842 const char* description = code_object_ ? "Code" : "Byte";
1812 for (int i = 0; i < bytes_to_output; i++) { 1843 for (int i = 0; i < bytes_to_output; i++) {
1813 unsigned int data = base[i]; 1844 sink_->PutSection(object_start[base + i], description);
1814 sink_->PutSection(data, "Byte");
1815 } 1845 }
1846 if (code_object_) delete[] object_start;
1816 } 1847 }
1817 if (to_skip != 0 && return_skip == kIgnoringReturn) { 1848 if (to_skip != 0 && return_skip == kIgnoringReturn) {
1818 sink_->Put(kSkip, "Skip"); 1849 sink_->Put(kSkip, "Skip");
1819 sink_->PutInt(to_skip, "SkipDistance"); 1850 sink_->PutInt(to_skip, "SkipDistance");
1820 to_skip = 0; 1851 to_skip = 0;
1821 } 1852 }
1822 return to_skip; 1853 return to_skip;
1823 } 1854 }
1824 1855
1825 1856
(...skipping 38 matching lines...) Expand 10 before | Expand all | Expand 10 after
1864 1895
1865 bool SnapshotByteSource::AtEOF() { 1896 bool SnapshotByteSource::AtEOF() {
1866 if (0u + length_ - position_ > 2 * sizeof(uint32_t)) return false; 1897 if (0u + length_ - position_ > 2 * sizeof(uint32_t)) return false;
1867 for (int x = position_; x < length_; x++) { 1898 for (int x = position_; x < length_; x++) {
1868 if (data_[x] != SerializerDeserializer::nop()) return false; 1899 if (data_[x] != SerializerDeserializer::nop()) return false;
1869 } 1900 }
1870 return true; 1901 return true;
1871 } 1902 }
1872 1903
1873 } } // namespace v8::internal 1904 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/runtime.cc ('k') | src/spaces.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698