| OLD | NEW |
| 1 // Copyright 2016 the V8 project authors. All rights reserved. | 1 // Copyright 2016 the V8 project authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "src/snapshot/deserializer.h" | 5 #include "src/snapshot/deserializer.h" |
| 6 | 6 |
| 7 #include "src/bootstrapper.h" | 7 #include "src/bootstrapper.h" |
| 8 #include "src/external-reference-table.h" | 8 #include "src/external-reference-table.h" |
| 9 #include "src/heap/heap.h" | 9 #include "src/heap/heap.h" |
| 10 #include "src/isolate.h" | 10 #include "src/isolate.h" |
| (...skipping 489 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 500 DCHECK(where == kBuiltin); \ | 500 DCHECK(where == kBuiltin); \ |
| 501 DCHECK(deserializing_user_code()); \ | 501 DCHECK(deserializing_user_code()); \ |
| 502 int builtin_id = source_.GetInt(); \ | 502 int builtin_id = source_.GetInt(); \ |
| 503 DCHECK_LE(0, builtin_id); \ | 503 DCHECK_LE(0, builtin_id); \ |
| 504 DCHECK_LT(builtin_id, Builtins::builtin_count); \ | 504 DCHECK_LT(builtin_id, Builtins::builtin_count); \ |
| 505 Builtins::Name name = static_cast<Builtins::Name>(builtin_id); \ | 505 Builtins::Name name = static_cast<Builtins::Name>(builtin_id); \ |
| 506 new_object = isolate->builtins()->builtin(name); \ | 506 new_object = isolate->builtins()->builtin(name); \ |
| 507 emit_write_barrier = false; \ | 507 emit_write_barrier = false; \ |
| 508 } \ | 508 } \ |
| 509 if (within == kInnerPointer) { \ | 509 if (within == kInnerPointer) { \ |
| 510 if (space_number != CODE_SPACE || new_object->IsCode()) { \ | 510 if (new_object->IsCode()) { \ |
| 511 Code* new_code_object = reinterpret_cast<Code*>(new_object); \ | 511 Code* new_code_object = Code::cast(new_object); \ |
| 512 new_object = \ | 512 new_object = \ |
| 513 reinterpret_cast<Object*>(new_code_object->instruction_start()); \ | 513 reinterpret_cast<Object*>(new_code_object->instruction_start()); \ |
| 514 } else { \ | 514 } else { \ |
| 515 DCHECK(space_number == CODE_SPACE); \ | |
| 516 Cell* cell = Cell::cast(new_object); \ | 515 Cell* cell = Cell::cast(new_object); \ |
| 517 new_object = reinterpret_cast<Object*>(cell->ValueAddress()); \ | 516 new_object = reinterpret_cast<Object*>(cell->ValueAddress()); \ |
| 518 } \ | 517 } \ |
| 519 } \ | 518 } \ |
| 520 if (how == kFromCode) { \ | 519 if (how == kFromCode) { \ |
| 521 Address location_of_branch_data = reinterpret_cast<Address>(current); \ | 520 Address location_of_branch_data = reinterpret_cast<Address>(current); \ |
| 522 Assembler::deserialization_set_special_target_at( \ | 521 Assembler::deserialization_set_special_target_at( \ |
| 523 isolate, location_of_branch_data, \ | 522 isolate, location_of_branch_data, \ |
| 524 Code::cast(HeapObject::FromAddress(current_object_address)), \ | 523 Code::cast(HeapObject::FromAddress(current_object_address)), \ |
| 525 reinterpret_cast<Address>(new_object)); \ | 524 reinterpret_cast<Address>(new_object)); \ |
| (...skipping 46 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 572 CASE_STATEMENT(where, how, within, space) \ | 571 CASE_STATEMENT(where, how, within, space) \ |
| 573 CASE_BODY(where, how, within, space) | 572 CASE_BODY(where, how, within, space) |
| 574 | 573 |
| 575 // Deserialize a new object and write a pointer to it to the current | 574 // Deserialize a new object and write a pointer to it to the current |
| 576 // object. | 575 // object. |
| 577 ALL_SPACES(kNewObject, kPlain, kStartOfObject) | 576 ALL_SPACES(kNewObject, kPlain, kStartOfObject) |
| 578 // Support for direct instruction pointers in functions. It's an inner | 577 // Support for direct instruction pointers in functions. It's an inner |
| 579 // pointer because it points at the entry point, not at the start of the | 578 // pointer because it points at the entry point, not at the start of the |
| 580 // code object. | 579 // code object. |
| 581 SINGLE_CASE(kNewObject, kPlain, kInnerPointer, CODE_SPACE) | 580 SINGLE_CASE(kNewObject, kPlain, kInnerPointer, CODE_SPACE) |
| 581 // Support for pointers into a cell. It's an inner pointer because it |
| 582 // points directly at the value field, not the start of the cell object. |
| 583 SINGLE_CASE(kNewObject, kPlain, kInnerPointer, OLD_SPACE) |
| 582 // Deserialize a new code object and write a pointer to its first | 584 // Deserialize a new code object and write a pointer to its first |
| 583 // instruction to the current code object. | 585 // instruction to the current code object. |
| 584 ALL_SPACES(kNewObject, kFromCode, kInnerPointer) | 586 ALL_SPACES(kNewObject, kFromCode, kInnerPointer) |
| 585 // Find a recently deserialized object using its offset from the current | 587 // Find a recently deserialized object using its offset from the current |
| 586 // allocation point and write a pointer to it to the current object. | 588 // allocation point and write a pointer to it to the current object. |
| 587 ALL_SPACES(kBackref, kPlain, kStartOfObject) | 589 ALL_SPACES(kBackref, kPlain, kStartOfObject) |
| 588 ALL_SPACES(kBackrefWithSkip, kPlain, kStartOfObject) | 590 ALL_SPACES(kBackrefWithSkip, kPlain, kStartOfObject) |
| 589 #if V8_CODE_EMBEDS_OBJECT_POINTER | 591 #if V8_CODE_EMBEDS_OBJECT_POINTER |
| 590 // Deserialize a new object from pointer found in code and write | 592 // Deserialize a new object from pointer found in code and write |
| 591 // a pointer to it to the current object. Required only for MIPS, PPC, ARM | 593 // a pointer to it to the current object. Required only for MIPS, PPC, ARM |
| 592 // or S390 with embedded constant pool, and omitted on the other | 594 // or S390 with embedded constant pool, and omitted on the other |
| 593 // architectures because it is fully unrolled and would cause bloat. | 595 // architectures because it is fully unrolled and would cause bloat. |
| 594 ALL_SPACES(kNewObject, kFromCode, kStartOfObject) | 596 ALL_SPACES(kNewObject, kFromCode, kStartOfObject) |
| 595 // Find a recently deserialized code object using its offset from the | 597 // Find a recently deserialized code object using its offset from the |
| 596 // current allocation point and write a pointer to it to the current | 598 // current allocation point and write a pointer to it to the current |
| 597 // object. Required only for MIPS, PPC, ARM or S390 with embedded | 599 // object. Required only for MIPS, PPC, ARM or S390 with embedded |
| 598 // constant pool. | 600 // constant pool. |
| 599 ALL_SPACES(kBackref, kFromCode, kStartOfObject) | 601 ALL_SPACES(kBackref, kFromCode, kStartOfObject) |
| 600 ALL_SPACES(kBackrefWithSkip, kFromCode, kStartOfObject) | 602 ALL_SPACES(kBackrefWithSkip, kFromCode, kStartOfObject) |
| 601 #endif | 603 #endif |
| 602 // Find a recently deserialized code object using its offset from the | 604 // Find a recently deserialized code object using its offset from the |
| 603 // current allocation point and write a pointer to its first instruction | 605 // current allocation point and write a pointer to its first instruction |
| 604 // to the current code object or the instruction pointer in a function | 606 // to the current code object or the instruction pointer in a function |
| 605 // object. | 607 // object. |
| 606 ALL_SPACES(kBackref, kFromCode, kInnerPointer) | 608 ALL_SPACES(kBackref, kFromCode, kInnerPointer) |
| 607 ALL_SPACES(kBackrefWithSkip, kFromCode, kInnerPointer) | 609 ALL_SPACES(kBackrefWithSkip, kFromCode, kInnerPointer) |
| 608 ALL_SPACES(kBackref, kPlain, kInnerPointer) | 610 // Support for direct instruction pointers in functions. |
| 609 ALL_SPACES(kBackrefWithSkip, kPlain, kInnerPointer) | 611 SINGLE_CASE(kBackref, kPlain, kInnerPointer, CODE_SPACE) |
| 612 SINGLE_CASE(kBackrefWithSkip, kPlain, kInnerPointer, CODE_SPACE) |
| 613 // Support for pointers into a cell. |
| 614 SINGLE_CASE(kBackref, kPlain, kInnerPointer, OLD_SPACE) |
| 615 SINGLE_CASE(kBackrefWithSkip, kPlain, kInnerPointer, OLD_SPACE) |
| 610 // Find an object in the roots array and write a pointer to it to the | 616 // Find an object in the roots array and write a pointer to it to the |
| 611 // current object. | 617 // current object. |
| 612 SINGLE_CASE(kRootArray, kPlain, kStartOfObject, 0) | 618 SINGLE_CASE(kRootArray, kPlain, kStartOfObject, 0) |
| 613 #if V8_CODE_EMBEDS_OBJECT_POINTER | 619 #if V8_CODE_EMBEDS_OBJECT_POINTER |
| 614 // Find an object in the roots array and write a pointer to it to in code. | 620 // Find an object in the roots array and write a pointer to it to in code. |
| 615 SINGLE_CASE(kRootArray, kFromCode, kStartOfObject, 0) | 621 SINGLE_CASE(kRootArray, kFromCode, kStartOfObject, 0) |
| 616 #endif | 622 #endif |
| 617 // Find an object in the partial snapshots cache and write a pointer to it | 623 // Find an object in the partial snapshots cache and write a pointer to it |
| 618 // to the current object. | 624 // to the current object. |
| 619 SINGLE_CASE(kPartialSnapshotCache, kPlain, kStartOfObject, 0) | 625 SINGLE_CASE(kPartialSnapshotCache, kPlain, kStartOfObject, 0) |
| (...skipping 186 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 806 | 812 |
| 807 default: | 813 default: |
| 808 CHECK(false); | 814 CHECK(false); |
| 809 } | 815 } |
| 810 } | 816 } |
| 811 CHECK_EQ(limit, current); | 817 CHECK_EQ(limit, current); |
| 812 return true; | 818 return true; |
| 813 } | 819 } |
| 814 } // namespace internal | 820 } // namespace internal |
| 815 } // namespace v8 | 821 } // namespace v8 |
| OLD | NEW |