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

Side by Side Diff: src/x87/assembler-x87-inl.h

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/x87/assembler-x87.cc ('k') | src/x87/codegen-x87.cc » ('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 are 5 // modification, are permitted provided that the following conditions are
6 // met: 6 // 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 83 matching lines...) Expand 10 before | Expand all | Expand 10 after
94 Address RelocInfo::constant_pool_entry_address() { 94 Address RelocInfo::constant_pool_entry_address() {
95 UNREACHABLE(); 95 UNREACHABLE();
96 return NULL; 96 return NULL;
97 } 97 }
98 98
99 99
100 int RelocInfo::target_address_size() { 100 int RelocInfo::target_address_size() {
101 return Assembler::kSpecialTargetSize; 101 return Assembler::kSpecialTargetSize;
102 } 102 }
103 103
104 104 HeapObject* RelocInfo::target_object() {
105 Object* RelocInfo::target_object() {
106 DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); 105 DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT);
107 return Memory::Object_at(pc_); 106 return HeapObject::cast(Memory::Object_at(pc_));
108 } 107 }
109 108
110 109 Handle<HeapObject> RelocInfo::target_object_handle(Assembler* origin) {
111 Handle<Object> RelocInfo::target_object_handle(Assembler* origin) {
112 DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); 110 DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT);
113 return Memory::Object_Handle_at(pc_); 111 return Handle<HeapObject>::cast(Memory::Object_Handle_at(pc_));
114 } 112 }
115 113
116 114 void RelocInfo::set_target_object(HeapObject* target,
117 void RelocInfo::set_target_object(Object* target,
118 WriteBarrierMode write_barrier_mode, 115 WriteBarrierMode write_barrier_mode,
119 ICacheFlushMode icache_flush_mode) { 116 ICacheFlushMode icache_flush_mode) {
120 DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT); 117 DCHECK(IsCodeTarget(rmode_) || rmode_ == EMBEDDED_OBJECT);
121 Memory::Object_at(pc_) = target; 118 Memory::Object_at(pc_) = target;
122 if (icache_flush_mode != SKIP_ICACHE_FLUSH) { 119 if (icache_flush_mode != SKIP_ICACHE_FLUSH) {
123 Assembler::FlushICache(isolate_, pc_, sizeof(Address)); 120 Assembler::FlushICache(target->GetIsolate(), pc_, sizeof(Address));
124 } 121 }
125 if (write_barrier_mode == UPDATE_WRITE_BARRIER && 122 if (write_barrier_mode == UPDATE_WRITE_BARRIER && host() != nullptr) {
126 host() != NULL &&
127 target->IsHeapObject()) {
128 host()->GetHeap()->RecordWriteIntoCode(host(), this, target); 123 host()->GetHeap()->RecordWriteIntoCode(host(), this, target);
129 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode( 124 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(host(), this,
130 host(), this, HeapObject::cast(target)); 125 target);
131 } 126 }
132 } 127 }
133 128
134 129
135 Address RelocInfo::target_external_reference() { 130 Address RelocInfo::target_external_reference() {
136 DCHECK(rmode_ == RelocInfo::EXTERNAL_REFERENCE); 131 DCHECK(rmode_ == RelocInfo::EXTERNAL_REFERENCE);
137 return Memory::Address_at(pc_); 132 return Memory::Address_at(pc_);
138 } 133 }
139 134
140 135
141 Address RelocInfo::target_internal_reference() { 136 Address RelocInfo::target_internal_reference() {
142 DCHECK(rmode_ == INTERNAL_REFERENCE); 137 DCHECK(rmode_ == INTERNAL_REFERENCE);
143 return Memory::Address_at(pc_); 138 return Memory::Address_at(pc_);
144 } 139 }
145 140
146 141
147 Address RelocInfo::target_internal_reference_address() { 142 Address RelocInfo::target_internal_reference_address() {
148 DCHECK(rmode_ == INTERNAL_REFERENCE); 143 DCHECK(rmode_ == INTERNAL_REFERENCE);
149 return reinterpret_cast<Address>(pc_); 144 return reinterpret_cast<Address>(pc_);
150 } 145 }
151 146
152 147
153 Address RelocInfo::target_runtime_entry(Assembler* origin) { 148 Address RelocInfo::target_runtime_entry(Assembler* origin) {
154 DCHECK(IsRuntimeEntry(rmode_)); 149 DCHECK(IsRuntimeEntry(rmode_));
155 return reinterpret_cast<Address>(*reinterpret_cast<int32_t*>(pc_)); 150 return reinterpret_cast<Address>(*reinterpret_cast<int32_t*>(pc_));
156 } 151 }
157 152
158 153 void RelocInfo::set_target_runtime_entry(Isolate* isolate, Address target,
159 void RelocInfo::set_target_runtime_entry(Address target,
160 WriteBarrierMode write_barrier_mode, 154 WriteBarrierMode write_barrier_mode,
161 ICacheFlushMode icache_flush_mode) { 155 ICacheFlushMode icache_flush_mode) {
162 DCHECK(IsRuntimeEntry(rmode_)); 156 DCHECK(IsRuntimeEntry(rmode_));
163 if (target_address() != target) { 157 if (target_address() != target) {
164 set_target_address(target, write_barrier_mode, icache_flush_mode); 158 set_target_address(isolate, target, write_barrier_mode, icache_flush_mode);
165 } 159 }
166 } 160 }
167 161
168 162
169 Handle<Cell> RelocInfo::target_cell_handle() { 163 Handle<Cell> RelocInfo::target_cell_handle() {
170 DCHECK(rmode_ == RelocInfo::CELL); 164 DCHECK(rmode_ == RelocInfo::CELL);
171 Address address = Memory::Address_at(pc_); 165 Address address = Memory::Address_at(pc_);
172 return Handle<Cell>(reinterpret_cast<Cell**>(address)); 166 return Handle<Cell>(reinterpret_cast<Cell**>(address));
173 } 167 }
174 168
175 169
176 Cell* RelocInfo::target_cell() { 170 Cell* RelocInfo::target_cell() {
177 DCHECK(rmode_ == RelocInfo::CELL); 171 DCHECK(rmode_ == RelocInfo::CELL);
178 return Cell::FromValueAddress(Memory::Address_at(pc_)); 172 return Cell::FromValueAddress(Memory::Address_at(pc_));
179 } 173 }
180 174
181 175
182 void RelocInfo::set_target_cell(Cell* cell, 176 void RelocInfo::set_target_cell(Cell* cell,
183 WriteBarrierMode write_barrier_mode, 177 WriteBarrierMode write_barrier_mode,
184 ICacheFlushMode icache_flush_mode) { 178 ICacheFlushMode icache_flush_mode) {
185 DCHECK(cell->IsCell()); 179 DCHECK(cell->IsCell());
186 DCHECK(rmode_ == RelocInfo::CELL); 180 DCHECK(rmode_ == RelocInfo::CELL);
187 Address address = cell->address() + Cell::kValueOffset; 181 Address address = cell->address() + Cell::kValueOffset;
188 Memory::Address_at(pc_) = address; 182 Memory::Address_at(pc_) = address;
189 if (icache_flush_mode != SKIP_ICACHE_FLUSH) { 183 if (icache_flush_mode != SKIP_ICACHE_FLUSH) {
190 Assembler::FlushICache(isolate_, pc_, sizeof(Address)); 184 Assembler::FlushICache(cell->GetIsolate(), pc_, sizeof(Address));
191 } 185 }
192 if (write_barrier_mode == UPDATE_WRITE_BARRIER && host() != NULL) { 186 if (write_barrier_mode == UPDATE_WRITE_BARRIER && host() != NULL) {
193 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(host(), this, 187 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(host(), this,
194 cell); 188 cell);
195 } 189 }
196 } 190 }
197 191
198 192 Handle<Code> RelocInfo::code_age_stub_handle(Assembler* origin) {
199 Handle<Object> RelocInfo::code_age_stub_handle(Assembler* origin) {
200 DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); 193 DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE);
201 DCHECK(*pc_ == kCallOpcode); 194 DCHECK(*pc_ == kCallOpcode);
202 return Memory::Object_Handle_at(pc_ + 1); 195 return Handle<Code>::cast(Memory::Object_Handle_at(pc_ + 1));
203 } 196 }
204 197
205 198
206 Code* RelocInfo::code_age_stub() { 199 Code* RelocInfo::code_age_stub() {
207 DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); 200 DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE);
208 DCHECK(*pc_ == kCallOpcode); 201 DCHECK(*pc_ == kCallOpcode);
209 return Code::GetCodeFromTargetAddress( 202 return Code::GetCodeFromTargetAddress(
210 Assembler::target_address_at(pc_ + 1, host_)); 203 Assembler::target_address_at(pc_ + 1, host_));
211 } 204 }
212 205
213 206
214 void RelocInfo::set_code_age_stub(Code* stub, 207 void RelocInfo::set_code_age_stub(Code* stub,
215 ICacheFlushMode icache_flush_mode) { 208 ICacheFlushMode icache_flush_mode) {
216 DCHECK(*pc_ == kCallOpcode); 209 DCHECK(*pc_ == kCallOpcode);
217 DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE); 210 DCHECK(rmode_ == RelocInfo::CODE_AGE_SEQUENCE);
218 Assembler::set_target_address_at( 211 Assembler::set_target_address_at(stub->GetIsolate(), pc_ + 1, host_,
219 isolate_, pc_ + 1, host_, stub->instruction_start(), icache_flush_mode); 212 stub->instruction_start(),
213 icache_flush_mode);
220 } 214 }
221 215
222 216
223 Address RelocInfo::debug_call_address() { 217 Address RelocInfo::debug_call_address() {
224 DCHECK(IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()); 218 DCHECK(IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence());
225 Address location = pc_ + Assembler::kPatchDebugBreakSlotAddressOffset; 219 Address location = pc_ + Assembler::kPatchDebugBreakSlotAddressOffset;
226 return Assembler::target_address_at(location, host_); 220 return Assembler::target_address_at(location, host_);
227 } 221 }
228 222
229 223 void RelocInfo::set_debug_call_address(Isolate* isolate, Address target) {
230 void RelocInfo::set_debug_call_address(Address target) {
231 DCHECK(IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()); 224 DCHECK(IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence());
232 Address location = pc_ + Assembler::kPatchDebugBreakSlotAddressOffset; 225 Address location = pc_ + Assembler::kPatchDebugBreakSlotAddressOffset;
233 Assembler::set_target_address_at(isolate_, location, host_, target); 226 Assembler::set_target_address_at(isolate, location, host_, target);
234 if (host() != NULL) { 227 if (host() != NULL) {
235 Code* target_code = Code::GetCodeFromTargetAddress(target); 228 Code* target_code = Code::GetCodeFromTargetAddress(target);
236 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(host(), this, 229 host()->GetHeap()->incremental_marking()->RecordWriteIntoCode(host(), this,
237 target_code); 230 target_code);
238 } 231 }
239 } 232 }
240 233
241 234 void RelocInfo::WipeOut(Isolate* isolate) {
242 void RelocInfo::WipeOut() {
243 if (IsEmbeddedObject(rmode_) || IsExternalReference(rmode_) || 235 if (IsEmbeddedObject(rmode_) || IsExternalReference(rmode_) ||
244 IsInternalReference(rmode_)) { 236 IsInternalReference(rmode_)) {
245 Memory::Address_at(pc_) = NULL; 237 Memory::Address_at(pc_) = NULL;
246 } else if (IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)) { 238 } else if (IsCodeTarget(rmode_) || IsRuntimeEntry(rmode_)) {
247 // Effectively write zero into the relocation. 239 // Effectively write zero into the relocation.
248 Assembler::set_target_address_at(isolate_, pc_, host_, 240 Assembler::set_target_address_at(isolate, pc_, host_,
249 pc_ + sizeof(int32_t)); 241 pc_ + sizeof(int32_t));
250 } else { 242 } else {
251 UNREACHABLE(); 243 UNREACHABLE();
252 } 244 }
253 } 245 }
254 246
255 template <typename ObjectVisitor> 247 template <typename ObjectVisitor>
256 void RelocInfo::Visit(Isolate* isolate, ObjectVisitor* visitor) { 248 void RelocInfo::Visit(Isolate* isolate, ObjectVisitor* visitor) {
257 RelocInfo::Mode mode = rmode(); 249 RelocInfo::Mode mode = rmode();
258 if (mode == RelocInfo::EMBEDDED_OBJECT) { 250 if (mode == RelocInfo::EMBEDDED_OBJECT) {
(...skipping 174 matching lines...) Expand 10 before | Expand all | Expand 10 after
433 425
434 426
435 Address Assembler::target_address_at(Address pc, Address constant_pool) { 427 Address Assembler::target_address_at(Address pc, Address constant_pool) {
436 return pc + sizeof(int32_t) + *reinterpret_cast<int32_t*>(pc); 428 return pc + sizeof(int32_t) + *reinterpret_cast<int32_t*>(pc);
437 } 429 }
438 430
439 431
440 void Assembler::set_target_address_at(Isolate* isolate, Address pc, 432 void Assembler::set_target_address_at(Isolate* isolate, Address pc,
441 Address constant_pool, Address target, 433 Address constant_pool, Address target,
442 ICacheFlushMode icache_flush_mode) { 434 ICacheFlushMode icache_flush_mode) {
435 DCHECK_IMPLIES(isolate == nullptr, icache_flush_mode == SKIP_ICACHE_FLUSH);
443 int32_t* p = reinterpret_cast<int32_t*>(pc); 436 int32_t* p = reinterpret_cast<int32_t*>(pc);
444 *p = target - (pc + sizeof(int32_t)); 437 *p = target - (pc + sizeof(int32_t));
445 if (icache_flush_mode != SKIP_ICACHE_FLUSH) { 438 if (icache_flush_mode != SKIP_ICACHE_FLUSH) {
446 Assembler::FlushICache(isolate, p, sizeof(int32_t)); 439 Assembler::FlushICache(isolate, p, sizeof(int32_t));
447 } 440 }
448 } 441 }
449 442
450 Address Assembler::target_address_at(Address pc, Code* code) { 443 Address Assembler::target_address_at(Address pc, Code* code) {
451 Address constant_pool = code ? code->constant_pool() : NULL; 444 Address constant_pool = code ? code->constant_pool() : NULL;
452 return target_address_at(pc, constant_pool); 445 return target_address_at(pc, constant_pool);
(...skipping 92 matching lines...) Expand 10 before | Expand all | Expand 10 after
545 538
546 Operand::Operand(Immediate imm) { 539 Operand::Operand(Immediate imm) {
547 // [disp/r] 540 // [disp/r]
548 set_modrm(0, ebp); 541 set_modrm(0, ebp);
549 set_dispr(imm.x_, imm.rmode_); 542 set_dispr(imm.x_, imm.rmode_);
550 } 543 }
551 } // namespace internal 544 } // namespace internal
552 } // namespace v8 545 } // namespace v8
553 546
554 #endif // V8_X87_ASSEMBLER_X87_INL_H_ 547 #endif // V8_X87_ASSEMBLER_X87_INL_H_
OLDNEW
« no previous file with comments | « src/x87/assembler-x87.cc ('k') | src/x87/codegen-x87.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698