[baseline][arm64] Remove initial relocation when compiling on heap
Constant pool doc: shorturl.at/txS08 Bug: v8:11872 Change-Id: Idd36b4c1ef0dc634a7411f530cdfc50681d7e875 Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3024146 Commit-Queue: Victor Gomes <victorgomes@chromium.org> Reviewed-by: Leszek Swirski <leszeks@chromium.org> Cr-Commit-Position: refs/heads/master@{#75708}
This commit is contained in:
parent
7f58edd5ae
commit
1eb8770691
@ -4276,6 +4276,8 @@ bool Assembler::IsImmFP64(double imm) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void Assembler::GrowBuffer() {
|
void Assembler::GrowBuffer() {
|
||||||
|
bool previously_on_heap = buffer_->IsOnHeap();
|
||||||
|
|
||||||
// Compute new buffer size.
|
// Compute new buffer size.
|
||||||
int old_size = buffer_->size();
|
int old_size = buffer_->size();
|
||||||
int new_size = std::min(2 * old_size, old_size + 1 * MB);
|
int new_size = std::min(2 * old_size, old_size + 1 * MB);
|
||||||
@ -4318,6 +4320,21 @@ void Assembler::GrowBuffer() {
|
|||||||
WriteUnalignedValue<intptr_t>(address, internal_ref);
|
WriteUnalignedValue<intptr_t>(address, internal_ref);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Patch on-heap references to handles.
|
||||||
|
if (previously_on_heap && !buffer_->IsOnHeap()) {
|
||||||
|
Address base = reinterpret_cast<Address>(buffer_->start());
|
||||||
|
for (auto p : saved_handles_for_raw_object_ptr_) {
|
||||||
|
WriteUnalignedValue(base + p.first, p.second);
|
||||||
|
}
|
||||||
|
for (auto p : saved_offsets_for_runtime_entries_) {
|
||||||
|
Instruction* instr = reinterpret_cast<Instruction*>(base + p.first);
|
||||||
|
DCHECK(is_int26(p.second));
|
||||||
|
DCHECK(instr->IsBranchAndLink() || instr->IsUnconditionalBranch());
|
||||||
|
instr->SetInstructionBits(instr->Mask(UnconditionalBranchMask) |
|
||||||
|
p.second);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Pending relocation entries are also relative, no need to relocate.
|
// Pending relocation entries are also relative, no need to relocate.
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1844,7 +1844,13 @@ int64_t TurboAssembler::CalculateTargetOffset(Address target,
|
|||||||
|
|
||||||
void TurboAssembler::Jump(Address target, RelocInfo::Mode rmode,
|
void TurboAssembler::Jump(Address target, RelocInfo::Mode rmode,
|
||||||
Condition cond) {
|
Condition cond) {
|
||||||
JumpHelper(CalculateTargetOffset(target, rmode, pc_), rmode, cond);
|
int64_t offset = CalculateTargetOffset(target, rmode, pc_);
|
||||||
|
if (RelocInfo::IsRuntimeEntry(rmode) && IsOnHeap()) {
|
||||||
|
saved_offsets_for_runtime_entries_.push_back(
|
||||||
|
std::make_pair(pc_offset(), offset));
|
||||||
|
offset = CalculateTargetOffset(target, RelocInfo::NONE, pc_);
|
||||||
|
}
|
||||||
|
JumpHelper(offset, rmode, cond);
|
||||||
}
|
}
|
||||||
|
|
||||||
void TurboAssembler::Jump(Handle<Code> code, RelocInfo::Mode rmode,
|
void TurboAssembler::Jump(Handle<Code> code, RelocInfo::Mode rmode,
|
||||||
@ -1886,9 +1892,13 @@ void TurboAssembler::Call(Register target) {
|
|||||||
|
|
||||||
void TurboAssembler::Call(Address target, RelocInfo::Mode rmode) {
|
void TurboAssembler::Call(Address target, RelocInfo::Mode rmode) {
|
||||||
BlockPoolsScope scope(this);
|
BlockPoolsScope scope(this);
|
||||||
|
|
||||||
if (CanUseNearCallOrJump(rmode)) {
|
if (CanUseNearCallOrJump(rmode)) {
|
||||||
int64_t offset = CalculateTargetOffset(target, rmode, pc_);
|
int64_t offset = CalculateTargetOffset(target, rmode, pc_);
|
||||||
|
if (IsOnHeap() && RelocInfo::IsRuntimeEntry(rmode)) {
|
||||||
|
saved_offsets_for_runtime_entries_.push_back(
|
||||||
|
std::make_pair(pc_offset(), offset));
|
||||||
|
offset = CalculateTargetOffset(target, RelocInfo::NONE, pc_);
|
||||||
|
}
|
||||||
DCHECK(IsNearCallOffset(offset));
|
DCHECK(IsNearCallOffset(offset));
|
||||||
near_call(static_cast<int>(offset), rmode);
|
near_call(static_cast<int>(offset), rmode);
|
||||||
} else {
|
} else {
|
||||||
|
@ -353,7 +353,14 @@ void ConstantPool::Emit(const ConstantPoolKey& key) {
|
|||||||
if (key.is_value32()) {
|
if (key.is_value32()) {
|
||||||
assm_->dd(key.value32());
|
assm_->dd(key.value32());
|
||||||
} else {
|
} else {
|
||||||
assm_->dq(key.value64());
|
if (assm_->IsOnHeap() && RelocInfo::IsEmbeddedObjectMode(key.rmode())) {
|
||||||
|
assm_->saved_handles_for_raw_object_ptr_.push_back(
|
||||||
|
std::make_pair(assm_->pc_offset(), key.value64()));
|
||||||
|
Handle<Object> handle = assm_->GetEmbeddedObject(key.value64());
|
||||||
|
assm_->dq(handle->ptr());
|
||||||
|
} else {
|
||||||
|
assm_->dq(key.value64());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user