| Index: src/arm/assembler-arm.cc
|
| diff --git a/src/arm/assembler-arm.cc b/src/arm/assembler-arm.cc
|
| index a441bc3bcc0498194872c4eb7ceb3ab515aa40e7..dc57cf4744a673a7846bd80f029001192e1dd905 100644
|
| --- a/src/arm/assembler-arm.cc
|
| +++ b/src/arm/assembler-arm.cc
|
| @@ -3586,7 +3586,6 @@ ConstantPoolArray::LayoutSection ConstantPoolBuilder::AddEntry(
|
| rmode != RelocInfo::STATEMENT_POSITION &&
|
| rmode != RelocInfo::CONST_POOL);
|
|
|
| -
|
| // Try to merge entries which won't be patched.
|
| int merged_index = -1;
|
| ConstantPoolArray::LayoutSection entry_section = current_section_;
|
| @@ -3656,8 +3655,22 @@ void ConstantPoolBuilder::Populate(Assembler* assm,
|
| constant_pool, ConstantPoolArray::EXTENDED_SECTION)));
|
| }
|
|
|
| - ConstantPoolArray::NumberOfEntries small_idx;
|
| - ConstantPoolArray::NumberOfEntries extended_idx;
|
| + // Set up initial offsets.
|
| + int offsets[ConstantPoolArray::NUMBER_OF_LAYOUT_SECTIONS]
|
| + [ConstantPoolArray::NUMBER_OF_TYPES];
|
| + for (int section = 0; section <= constant_pool->final_section(); section++) {
|
| + int section_start = (section == ConstantPoolArray::EXTENDED_SECTION)
|
| + ? small_entries()->total_count()
|
| + : 0;
|
| + for (int i = 0; i < ConstantPoolArray::NUMBER_OF_TYPES; i++) {
|
| + ConstantPoolArray::Type type = static_cast<ConstantPoolArray::Type>(i);
|
| + if (number_of_entries_[section].count_of(type) != 0) {
|
| + offsets[section][type] = constant_pool->OffsetOfElementAt(
|
| + number_of_entries_[section].base_of(type) + section_start);
|
| + }
|
| + }
|
| + }
|
| +
|
| for (std::vector<ConstantPoolEntry>::iterator entry = entries_.begin();
|
| entry != entries_.end(); entry++) {
|
| RelocInfo rinfo = entry->rinfo_;
|
| @@ -3667,27 +3680,21 @@ void ConstantPoolBuilder::Populate(Assembler* assm,
|
| // Update constant pool if necessary and get the entry's offset.
|
| int offset;
|
| if (entry->merged_index_ == -1) {
|
| - int index;
|
| - if (entry->section_ == ConstantPoolArray::EXTENDED_SECTION) {
|
| - index = small_entries()->total_count() +
|
| - extended_entries()->base_of(type) + extended_idx.count_of(type);
|
| - extended_idx.increment(type);
|
| - } else {
|
| - ASSERT(entry->section_ == ConstantPoolArray::SMALL_SECTION);
|
| - index = small_entries()->base_of(type) + small_idx.count_of(type);
|
| - small_idx.increment(type);
|
| - }
|
| + offset = offsets[entry->section_][type];
|
| + offsets[entry->section_][type] += ConstantPoolArray::entry_size(type);
|
| if (type == ConstantPoolArray::INT64) {
|
| - constant_pool->set(index, rinfo.data64());
|
| + constant_pool->set_at_offset(offset, rinfo.data64());
|
| } else if (type == ConstantPoolArray::INT32) {
|
| - constant_pool->set(index, static_cast<int32_t>(rinfo.data()));
|
| + constant_pool->set_at_offset(offset, rinfo.data());
|
| } else if (type == ConstantPoolArray::CODE_PTR) {
|
| - constant_pool->set(index, reinterpret_cast<Address>(rinfo.data()));
|
| + constant_pool->set_at_offset(offset,
|
| + reinterpret_cast<Address>(rinfo.data()));
|
| } else {
|
| ASSERT(type == ConstantPoolArray::HEAP_PTR);
|
| - constant_pool->set(index, reinterpret_cast<Object*>(rinfo.data()));
|
| + constant_pool->set_at_offset(offset,
|
| + reinterpret_cast<Object*>(rinfo.data()));
|
| }
|
| - offset = constant_pool->OffsetOfElementAt(index) - kHeapObjectTag;
|
| + offset -= kHeapObjectTag;
|
| entry->merged_index_ = offset; // Stash offset for merged entries.
|
| } else {
|
| ASSERT(entry->merged_index_ < (entry - entries_.begin()));
|
| @@ -3724,9 +3731,6 @@ void ConstantPoolBuilder::Populate(Assembler* assm,
|
| rinfo.pc(), Assembler::SetLdrRegisterImmediateOffset(instr, offset));
|
| }
|
| }
|
| -
|
| - ASSERT(small_idx.equals(*small_entries()));
|
| - ASSERT(extended_idx.equals(*extended_entries()));
|
| }
|
|
|
|
|
|
|