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

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

Issue 3078033: Version 2.3.6 (Closed)
Patch Set: Created 10 years, 4 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/api.cc ('k') | src/arm/codegen-arm.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 102 matching lines...) Expand 10 before | Expand all | Expand 10 after
113 Address RelocInfo::call_address() { 113 Address RelocInfo::call_address() {
114 // The 2 instructions offset assumes patched debug break slot or return 114 // The 2 instructions offset assumes patched debug break slot or return
115 // sequence. 115 // sequence.
116 ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) || 116 ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) ||
117 (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence())); 117 (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()));
118 return Memory::Address_at(pc_ + 2 * Assembler::kInstrSize); 118 return Memory::Address_at(pc_ + 2 * Assembler::kInstrSize);
119 } 119 }
120 120
121 121
122 void RelocInfo::set_call_address(Address target) { 122 void RelocInfo::set_call_address(Address target) {
123 ASSERT(IsPatchedReturnSequence()); 123 ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) ||
124 // The 2 instructions offset assumes patched return sequence. 124 (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()));
125 ASSERT(IsJSReturn(rmode()));
126 Memory::Address_at(pc_ + 2 * Assembler::kInstrSize) = target; 125 Memory::Address_at(pc_ + 2 * Assembler::kInstrSize) = target;
127 } 126 }
128 127
129 128
130 Object* RelocInfo::call_object() { 129 Object* RelocInfo::call_object() {
131 return *call_object_address(); 130 return *call_object_address();
132 } 131 }
133 132
134 133
135 Object** RelocInfo::call_object_address() {
136 ASSERT(IsPatchedReturnSequence());
137 // The 2 instructions offset assumes patched return sequence.
138 ASSERT(IsJSReturn(rmode()));
139 return reinterpret_cast<Object**>(pc_ + 2 * Assembler::kInstrSize);
140 }
141
142
143 void RelocInfo::set_call_object(Object* target) { 134 void RelocInfo::set_call_object(Object* target) {
144 *call_object_address() = target; 135 *call_object_address() = target;
145 } 136 }
146 137
147 138
139 Object** RelocInfo::call_object_address() {
140 ASSERT((IsJSReturn(rmode()) && IsPatchedReturnSequence()) ||
141 (IsDebugBreakSlot(rmode()) && IsPatchedDebugBreakSlotSequence()));
142 return reinterpret_cast<Object**>(pc_ + 2 * Assembler::kInstrSize);
143 }
144
145
148 bool RelocInfo::IsPatchedReturnSequence() { 146 bool RelocInfo::IsPatchedReturnSequence() {
149 Instr current_instr = Assembler::instr_at(pc_); 147 Instr current_instr = Assembler::instr_at(pc_);
150 Instr next_instr = Assembler::instr_at(pc_ + Assembler::kInstrSize); 148 Instr next_instr = Assembler::instr_at(pc_ + Assembler::kInstrSize);
151 #ifdef USE_BLX 149 #ifdef USE_BLX
152 // A patched return sequence is: 150 // A patched return sequence is:
153 // ldr ip, [pc, #0] 151 // ldr ip, [pc, #0]
154 // blx ip 152 // blx ip
155 return ((current_instr & kLdrPCMask) == kLdrPCPattern) 153 return ((current_instr & kLdrPCMask) == kLdrPCPattern)
156 && ((next_instr & kBlxRegMask) == kBlxRegPattern); 154 && ((next_instr & kBlxRegMask) == kBlxRegPattern);
157 #else 155 #else
(...skipping 138 matching lines...) Expand 10 before | Expand all | Expand 10 after
296 // CPU::FlushICache(pc, sizeof(target)); 294 // CPU::FlushICache(pc, sizeof(target));
297 // However, on ARM, no instruction was actually patched by the assignment 295 // However, on ARM, no instruction was actually patched by the assignment
298 // above; the target address is not part of an instruction, it is patched in 296 // above; the target address is not part of an instruction, it is patched in
299 // the constant pool and is read via a data access; the instruction accessing 297 // the constant pool and is read via a data access; the instruction accessing
300 // this address in the constant pool remains unchanged. 298 // this address in the constant pool remains unchanged.
301 } 299 }
302 300
303 } } // namespace v8::internal 301 } } // namespace v8::internal
304 302
305 #endif // V8_ARM_ASSEMBLER_ARM_INL_H_ 303 #endif // V8_ARM_ASSEMBLER_ARM_INL_H_
OLDNEW
« no previous file with comments | « src/api.cc ('k') | src/arm/codegen-arm.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698