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

Side by Side Diff: src/ppc/assembler-ppc.cc

Issue 2732273003: Disentangle assembler from isolate. (Closed)
Patch Set: Address feedback. Created 3 years, 9 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
« no previous file with comments | « src/ppc/assembler-ppc.h ('k') | src/ppc/assembler-ppc-inl.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 (c) 1994-2006 Sun Microsystems Inc. 1 // Copyright (c) 1994-2006 Sun Microsystems Inc.
2 // All Rights Reserved. 2 // All Rights Reserved.
3 // 3 //
4 // Redistribution and use in source and binary forms, with or without 4 // Redistribution and use in source and binary forms, with or without
5 // modification, are permitted provided that the following conditions 5 // modification, are permitted provided that the following conditions
6 // are met: 6 // are met:
7 // 7 //
8 // - Redistributions of source code must retain the above copyright notice, 8 // - Redistributions of source code must retain the above copyright notice,
9 // this list of conditions and the following disclaimer. 9 // this list of conditions and the following disclaimer.
10 // 10 //
(...skipping 166 matching lines...) Expand 10 before | Expand all | Expand 10 after
177 return Assembler::target_address_at(pc_, host_); 177 return Assembler::target_address_at(pc_, host_);
178 } 178 }
179 179
180 uint32_t RelocInfo::wasm_function_table_size_reference() { 180 uint32_t RelocInfo::wasm_function_table_size_reference() {
181 DCHECK(IsWasmFunctionTableSizeReference(rmode_)); 181 DCHECK(IsWasmFunctionTableSizeReference(rmode_));
182 return static_cast<uint32_t>( 182 return static_cast<uint32_t>(
183 reinterpret_cast<intptr_t>(Assembler::target_address_at(pc_, host_))); 183 reinterpret_cast<intptr_t>(Assembler::target_address_at(pc_, host_)));
184 } 184 }
185 185
186 void RelocInfo::unchecked_update_wasm_memory_reference( 186 void RelocInfo::unchecked_update_wasm_memory_reference(
187 Address address, ICacheFlushMode flush_mode) { 187 Isolate* isolate, Address address, ICacheFlushMode flush_mode) {
188 Assembler::set_target_address_at(isolate_, pc_, host_, address, flush_mode); 188 Assembler::set_target_address_at(isolate, pc_, host_, address, flush_mode);
189 } 189 }
190 190
191 void RelocInfo::unchecked_update_wasm_size(uint32_t size, 191 void RelocInfo::unchecked_update_wasm_size(Isolate* isolate, uint32_t size,
192 ICacheFlushMode flush_mode) { 192 ICacheFlushMode flush_mode) {
193 Assembler::set_target_address_at(isolate_, pc_, host_, 193 Assembler::set_target_address_at(isolate, pc_, host_,
194 reinterpret_cast<Address>(size), flush_mode); 194 reinterpret_cast<Address>(size), flush_mode);
195 } 195 }
196 196
197 // ----------------------------------------------------------------------------- 197 // -----------------------------------------------------------------------------
198 // Implementation of Operand and MemOperand 198 // Implementation of Operand and MemOperand
199 // See assembler-ppc-inl.h for inlined constructors 199 // See assembler-ppc-inl.h for inlined constructors
200 200
201 Operand::Operand(Handle<Object> handle) { 201 Operand::Operand(Handle<Object> handle) {
202 AllowDeferredHandleDereference using_raw_address; 202 AllowDeferredHandleDereference using_raw_address;
203 rm_ = no_reg; 203 rm_ = no_reg;
(...skipping 20 matching lines...) Expand all
224 MemOperand::MemOperand(Register ra, Register rb) { 224 MemOperand::MemOperand(Register ra, Register rb) {
225 ra_ = ra; 225 ra_ = ra;
226 rb_ = rb; 226 rb_ = rb;
227 offset_ = 0; 227 offset_ = 0;
228 } 228 }
229 229
230 230
231 // ----------------------------------------------------------------------------- 231 // -----------------------------------------------------------------------------
232 // Specific instructions, constants, and masks. 232 // Specific instructions, constants, and masks.
233 233
234 Assembler::Assembler(Isolate* isolate, void* buffer, int buffer_size) 234 Assembler::Assembler(IsolateData isolate_data, void* buffer, int buffer_size)
235 : AssemblerBase(isolate, buffer, buffer_size), 235 : AssemblerBase(isolate_data, buffer, buffer_size),
236 recorded_ast_id_(TypeFeedbackId::None()), 236 recorded_ast_id_(TypeFeedbackId::None()),
237 constant_pool_builder_(kLoadPtrMaxReachBits, kLoadDoubleMaxReachBits) { 237 constant_pool_builder_(kLoadPtrMaxReachBits, kLoadDoubleMaxReachBits) {
238 reloc_info_writer.Reposition(buffer_ + buffer_size_, pc_); 238 reloc_info_writer.Reposition(buffer_ + buffer_size_, pc_);
239 239
240 no_trampoline_pool_before_ = 0; 240 no_trampoline_pool_before_ = 0;
241 trampoline_pool_blocked_nesting_ = 0; 241 trampoline_pool_blocked_nesting_ = 0;
242 constant_pool_entry_sharing_blocked_nesting_ = 0; 242 constant_pool_entry_sharing_blocked_nesting_ = 0;
243 next_trampoline_check_ = kMaxInt; 243 next_trampoline_check_ = kMaxInt;
244 internal_trampoline_exception_ = false; 244 internal_trampoline_exception_ = false;
245 last_bound_pos_ = 0; 245 last_bound_pos_ = 0;
(...skipping 240 matching lines...) Expand 10 before | Expand all | Expand 10 after
486 instr |= (imm16 & kImm16Mask); 486 instr |= (imm16 & kImm16Mask);
487 } 487 }
488 instr_at_put(pos, instr); 488 instr_at_put(pos, instr);
489 break; 489 break;
490 } 490 }
491 case kUnboundMovLabelOffsetOpcode: { 491 case kUnboundMovLabelOffsetOpcode: {
492 // Load the position of the label relative to the generated code object 492 // Load the position of the label relative to the generated code object
493 // pointer in a register. 493 // pointer in a register.
494 Register dst = Register::from_code(instr_at(pos + kInstrSize)); 494 Register dst = Register::from_code(instr_at(pos + kInstrSize));
495 int32_t offset = target_pos + (Code::kHeaderSize - kHeapObjectTag); 495 int32_t offset = target_pos + (Code::kHeaderSize - kHeapObjectTag);
496 CodePatcher patcher(isolate(), reinterpret_cast<byte*>(buffer_ + pos), 2, 496 PatchingAssembler patcher(isolate_data(),
497 CodePatcher::DONT_FLUSH); 497 reinterpret_cast<byte*>(buffer_ + pos), 2);
498 patcher.masm()->bitwise_mov32(dst, offset); 498 patcher.bitwise_mov32(dst, offset);
499 break; 499 break;
500 } 500 }
501 case kUnboundAddLabelOffsetOpcode: { 501 case kUnboundAddLabelOffsetOpcode: {
502 // dst = base + position + immediate 502 // dst = base + position + immediate
503 Instr operands = instr_at(pos + kInstrSize); 503 Instr operands = instr_at(pos + kInstrSize);
504 Register dst = Register::from_code((operands >> 21) & 0x1f); 504 Register dst = Register::from_code((operands >> 21) & 0x1f);
505 Register base = Register::from_code((operands >> 16) & 0x1f); 505 Register base = Register::from_code((operands >> 16) & 0x1f);
506 int32_t offset = target_pos + SIGN_EXT_IMM16(operands & kImm16Mask); 506 int32_t offset = target_pos + SIGN_EXT_IMM16(operands & kImm16Mask);
507 CodePatcher patcher(isolate(), reinterpret_cast<byte*>(buffer_ + pos), 2, 507 PatchingAssembler patcher(isolate_data(),
508 CodePatcher::DONT_FLUSH); 508 reinterpret_cast<byte*>(buffer_ + pos), 2);
509 patcher.masm()->bitwise_add32(dst, base, offset); 509 patcher.bitwise_add32(dst, base, offset);
510 break; 510 break;
511 } 511 }
512 case kUnboundMovLabelAddrOpcode: { 512 case kUnboundMovLabelAddrOpcode: {
513 // Load the address of the label in a register. 513 // Load the address of the label in a register.
514 Register dst = Register::from_code(instr_at(pos + kInstrSize)); 514 Register dst = Register::from_code(instr_at(pos + kInstrSize));
515 CodePatcher patcher(isolate(), reinterpret_cast<byte*>(buffer_ + pos), 515 PatchingAssembler patcher(isolate_data(),
516 kMovInstructionsNoConstantPool, 516 reinterpret_cast<byte*>(buffer_ + pos),
517 CodePatcher::DONT_FLUSH); 517 kMovInstructionsNoConstantPool);
518 // Keep internal references relative until EmitRelocations. 518 // Keep internal references relative until EmitRelocations.
519 patcher.masm()->bitwise_mov(dst, target_pos); 519 patcher.bitwise_mov(dst, target_pos);
520 break; 520 break;
521 } 521 }
522 case kUnboundJumpTableEntryOpcode: { 522 case kUnboundJumpTableEntryOpcode: {
523 CodePatcher patcher(isolate(), reinterpret_cast<byte*>(buffer_ + pos), 523 PatchingAssembler patcher(isolate_data(),
524 kPointerSize / kInstrSize, CodePatcher::DONT_FLUSH); 524 reinterpret_cast<byte*>(buffer_ + pos),
525 kPointerSize / kInstrSize);
525 // Keep internal references relative until EmitRelocations. 526 // Keep internal references relative until EmitRelocations.
526 patcher.masm()->dp(target_pos); 527 patcher.dp(target_pos);
527 break; 528 break;
528 } 529 }
529 default: 530 default:
530 DCHECK(false); 531 DCHECK(false);
531 break; 532 break;
532 } 533 }
533 } 534 }
534 535
535 536
536 int Assembler::max_reach_from(int pos) { 537 int Assembler::max_reach_from(int pos) {
(...skipping 1941 matching lines...) Expand 10 before | Expand all | Expand 10 after
2478 2479
2479 2480
2480 void Assembler::EmitRelocations() { 2481 void Assembler::EmitRelocations() {
2481 EnsureSpaceFor(relocations_.size() * kMaxRelocSize); 2482 EnsureSpaceFor(relocations_.size() * kMaxRelocSize);
2482 2483
2483 for (std::vector<DeferredRelocInfo>::iterator it = relocations_.begin(); 2484 for (std::vector<DeferredRelocInfo>::iterator it = relocations_.begin();
2484 it != relocations_.end(); it++) { 2485 it != relocations_.end(); it++) {
2485 RelocInfo::Mode rmode = it->rmode(); 2486 RelocInfo::Mode rmode = it->rmode();
2486 Address pc = buffer_ + it->position(); 2487 Address pc = buffer_ + it->position();
2487 Code* code = NULL; 2488 Code* code = NULL;
2488 RelocInfo rinfo(isolate(), pc, rmode, it->data(), code); 2489 RelocInfo rinfo(pc, rmode, it->data(), code);
2489 2490
2490 // Fix up internal references now that they are guaranteed to be bound. 2491 // Fix up internal references now that they are guaranteed to be bound.
2491 if (RelocInfo::IsInternalReference(rmode)) { 2492 if (RelocInfo::IsInternalReference(rmode)) {
2492 // Jump table entry 2493 // Jump table entry
2493 intptr_t pos = reinterpret_cast<intptr_t>(Memory::Address_at(pc)); 2494 intptr_t pos = reinterpret_cast<intptr_t>(Memory::Address_at(pc));
2494 Memory::Address_at(pc) = buffer_ + pos; 2495 Memory::Address_at(pc) = buffer_ + pos;
2495 } else if (RelocInfo::IsInternalReferenceEncoded(rmode)) { 2496 } else if (RelocInfo::IsInternalReferenceEncoded(rmode)) {
2496 // mov sequence 2497 // mov sequence
2497 intptr_t pos = reinterpret_cast<intptr_t>(target_address_at(pc, code)); 2498 intptr_t pos = reinterpret_cast<intptr_t>(target_address_at(pc, code));
2498 set_target_address_at(isolate(), pc, code, buffer_ + pos, 2499 set_target_address_at(nullptr, pc, code, buffer_ + pos,
2499 SKIP_ICACHE_FLUSH); 2500 SKIP_ICACHE_FLUSH);
2500 } 2501 }
2501 2502
2502 reloc_info_writer.Write(&rinfo); 2503 reloc_info_writer.Write(&rinfo);
2503 } 2504 }
2504 } 2505 }
2505 2506
2506 2507
2507 void Assembler::BlockTrampolinePoolFor(int instructions) { 2508 void Assembler::BlockTrampolinePoolFor(int instructions) {
2508 BlockTrampolinePoolBefore(pc_offset() + instructions * kInstrSize); 2509 BlockTrampolinePoolBefore(pc_offset() + instructions * kInstrSize);
(...skipping 24 matching lines...) Expand all
2533 // First we emit jump, then we emit trampoline pool. 2534 // First we emit jump, then we emit trampoline pool.
2534 b(size + kInstrSize, LeaveLK); 2535 b(size + kInstrSize, LeaveLK);
2535 for (int i = size; i > 0; i -= kInstrSize) { 2536 for (int i = size; i > 0; i -= kInstrSize) {
2536 b(i, LeaveLK); 2537 b(i, LeaveLK);
2537 } 2538 }
2538 2539
2539 trampoline_ = Trampoline(pc_offset() - size, tracked_branch_count_); 2540 trampoline_ = Trampoline(pc_offset() - size, tracked_branch_count_);
2540 } 2541 }
2541 } 2542 }
2542 2543
2544 PatchingAssembler::PatchingAssembler(IsolateData isolate_data, byte* address,
2545 int instructions)
2546 : Assembler(isolate_data, address, instructions * kInstrSize + kGap) {
2547 DCHECK_EQ(reloc_info_writer.pos(), buffer_ + buffer_size_);
2548 }
2549
2550 PatchingAssembler::~PatchingAssembler() {
2551 // Check that the code was patched as expected.
2552 DCHECK_EQ(pc_, buffer_ + buffer_size_ - kGap);
2553 DCHECK_EQ(reloc_info_writer.pos(), buffer_ + buffer_size_);
2554 }
2555
2556 void PatchingAssembler::FlushICache(Isolate* isolate) {
2557 Assembler::FlushICache(isolate, buffer_, buffer_size_ - kGap);
2558 }
2543 2559
2544 } // namespace internal 2560 } // namespace internal
2545 } // namespace v8 2561 } // namespace v8
2546 2562
2547 #endif // V8_TARGET_ARCH_PPC 2563 #endif // V8_TARGET_ARCH_PPC
OLDNEW
« no previous file with comments | « src/ppc/assembler-ppc.h ('k') | src/ppc/assembler-ppc-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698