OLD | NEW |
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 73 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
84 // 00 [6 bits pc delta] | 84 // 00 [6 bits pc delta] |
85 // | 85 // |
86 // pc-jump: 00 1111 11, | 86 // pc-jump: 00 1111 11, |
87 // 00 [6 bits pc delta] | 87 // 00 [6 bits pc delta] |
88 // | 88 // |
89 // pc-jump: 01 1111 11, | 89 // pc-jump: 01 1111 11, |
90 // (variable length) 7 - 26 bit pc delta, written in chunks of 7 | 90 // (variable length) 7 - 26 bit pc delta, written in chunks of 7 |
91 // bits, the lowest 7 bits written first. | 91 // bits, the lowest 7 bits written first. |
92 // | 92 // |
93 // data-jump + pos: 00 1110 11, | 93 // data-jump + pos: 00 1110 11, |
94 // signed int, lowest byte written first | 94 // signed intptr_t, lowest byte written first |
95 // | 95 // |
96 // data-jump + st.pos: 01 1110 11, | 96 // data-jump + st.pos: 01 1110 11, |
97 // signed int, lowest byte written first | 97 // signed intptr_t, lowest byte written first |
98 // | 98 // |
99 // data-jump + comm.: 10 1110 11, | 99 // data-jump + comm.: 10 1110 11, |
100 // signed int, lowest byte written first | 100 // signed intptr_t, lowest byte written first |
101 // | 101 // |
102 const int kMaxRelocModes = 14; | 102 const int kMaxRelocModes = 14; |
103 | 103 |
104 const int kTagBits = 2; | 104 const int kTagBits = 2; |
105 const int kTagMask = (1 << kTagBits) - 1; | 105 const int kTagMask = (1 << kTagBits) - 1; |
106 const int kExtraTagBits = 4; | 106 const int kExtraTagBits = 4; |
107 const int kPositionTypeTagBits = 1; | 107 const int kPositionTypeTagBits = 1; |
108 const int kSmallDataBits = kBitsPerByte - kPositionTypeTagBits; | 108 const int kSmallDataBits = kBitsPerByte - kPositionTypeTagBits; |
109 | 109 |
110 const int kEmbeddedObjectTag = 0; | 110 const int kEmbeddedObjectTag = 0; |
(...skipping 41 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
152 } | 152 } |
153 | 153 |
154 | 154 |
155 void RelocInfoWriter::WriteTaggedPC(uint32_t pc_delta, int tag) { | 155 void RelocInfoWriter::WriteTaggedPC(uint32_t pc_delta, int tag) { |
156 // Write a byte of tagged pc-delta, possibly preceded by var. length pc-jump. | 156 // Write a byte of tagged pc-delta, possibly preceded by var. length pc-jump. |
157 pc_delta = WriteVariableLengthPCJump(pc_delta); | 157 pc_delta = WriteVariableLengthPCJump(pc_delta); |
158 *--pos_ = pc_delta << kTagBits | tag; | 158 *--pos_ = pc_delta << kTagBits | tag; |
159 } | 159 } |
160 | 160 |
161 | 161 |
162 void RelocInfoWriter::WriteTaggedData(int32_t data_delta, int tag) { | 162 void RelocInfoWriter::WriteTaggedData(intptr_t data_delta, int tag) { |
163 *--pos_ = data_delta << kPositionTypeTagBits | tag; | 163 *--pos_ = data_delta << kPositionTypeTagBits | tag; |
164 } | 164 } |
165 | 165 |
166 | 166 |
167 void RelocInfoWriter::WriteExtraTag(int extra_tag, int top_tag) { | 167 void RelocInfoWriter::WriteExtraTag(int extra_tag, int top_tag) { |
168 *--pos_ = top_tag << (kTagBits + kExtraTagBits) | | 168 *--pos_ = top_tag << (kTagBits + kExtraTagBits) | |
169 extra_tag << kTagBits | | 169 extra_tag << kTagBits | |
170 kDefaultTag; | 170 kDefaultTag; |
171 } | 171 } |
172 | 172 |
173 | 173 |
174 void RelocInfoWriter::WriteExtraTaggedPC(uint32_t pc_delta, int extra_tag) { | 174 void RelocInfoWriter::WriteExtraTaggedPC(uint32_t pc_delta, int extra_tag) { |
175 // Write two-byte tagged pc-delta, possibly preceded by var. length pc-jump. | 175 // Write two-byte tagged pc-delta, possibly preceded by var. length pc-jump. |
176 pc_delta = WriteVariableLengthPCJump(pc_delta); | 176 pc_delta = WriteVariableLengthPCJump(pc_delta); |
177 WriteExtraTag(extra_tag, 0); | 177 WriteExtraTag(extra_tag, 0); |
178 *--pos_ = pc_delta; | 178 *--pos_ = pc_delta; |
179 } | 179 } |
180 | 180 |
181 | 181 |
182 void RelocInfoWriter::WriteExtraTaggedData(int32_t data_delta, int top_tag) { | 182 void RelocInfoWriter::WriteExtraTaggedData(intptr_t data_delta, int top_tag) { |
183 WriteExtraTag(kDataJumpTag, top_tag); | 183 WriteExtraTag(kDataJumpTag, top_tag); |
184 for (int i = 0; i < kIntSize; i++) { | 184 for (int i = 0; i < kIntptrSize; i++) { |
185 *--pos_ = data_delta; | 185 *--pos_ = data_delta; |
186 data_delta = ArithmeticShiftRight(data_delta, kBitsPerByte); | 186 // Signed right shift is arithmetic shift. Tested in test-utils.cc. |
| 187 data_delta = data_delta >> kBitsPerByte; |
187 } | 188 } |
188 } | 189 } |
189 | 190 |
190 | 191 |
191 void RelocInfoWriter::Write(const RelocInfo* rinfo) { | 192 void RelocInfoWriter::Write(const RelocInfo* rinfo) { |
192 #ifdef DEBUG | 193 #ifdef DEBUG |
193 byte* begin_pos = pos_; | 194 byte* begin_pos = pos_; |
194 #endif | 195 #endif |
195 Counters::reloc_info_count.Increment(); | 196 Counters::reloc_info_count.Increment(); |
196 ASSERT(rinfo->pc() - last_pc_ >= 0); | 197 ASSERT(rinfo->pc() - last_pc_ >= 0); |
197 ASSERT(RelocInfo::NUMBER_OF_MODES < kMaxRelocModes); | 198 ASSERT(RelocInfo::NUMBER_OF_MODES < kMaxRelocModes); |
198 // Use unsigned delta-encoding for pc. | 199 // Use unsigned delta-encoding for pc. |
199 uint32_t pc_delta = rinfo->pc() - last_pc_; | 200 uint32_t pc_delta = rinfo->pc() - last_pc_; |
200 RelocInfo::Mode rmode = rinfo->rmode(); | 201 RelocInfo::Mode rmode = rinfo->rmode(); |
201 | 202 |
202 // The two most common modes are given small tags, and usually fit in a byte. | 203 // The two most common modes are given small tags, and usually fit in a byte. |
203 if (rmode == RelocInfo::EMBEDDED_OBJECT) { | 204 if (rmode == RelocInfo::EMBEDDED_OBJECT) { |
204 WriteTaggedPC(pc_delta, kEmbeddedObjectTag); | 205 WriteTaggedPC(pc_delta, kEmbeddedObjectTag); |
205 } else if (rmode == RelocInfo::CODE_TARGET) { | 206 } else if (rmode == RelocInfo::CODE_TARGET) { |
206 WriteTaggedPC(pc_delta, kCodeTargetTag); | 207 WriteTaggedPC(pc_delta, kCodeTargetTag); |
207 } else if (RelocInfo::IsPosition(rmode)) { | 208 } else if (RelocInfo::IsPosition(rmode)) { |
208 // Use signed delta-encoding for data. | 209 // Use signed delta-encoding for data. |
209 int32_t data_delta = rinfo->data() - last_data_; | 210 intptr_t data_delta = rinfo->data() - last_data_; |
210 int pos_type_tag = rmode == RelocInfo::POSITION ? kNonstatementPositionTag | 211 int pos_type_tag = rmode == RelocInfo::POSITION ? kNonstatementPositionTag |
211 : kStatementPositionTag; | 212 : kStatementPositionTag; |
212 // Check if data is small enough to fit in a tagged byte. | 213 // Check if data is small enough to fit in a tagged byte. |
213 if (is_intn(data_delta, kSmallDataBits)) { | 214 // We cannot use is_intn because data_delta is not an int32_t. |
| 215 if (data_delta >= -(1 << (kSmallDataBits-1)) && |
| 216 data_delta < 1 << (kSmallDataBits-1)) { |
214 WriteTaggedPC(pc_delta, kPositionTag); | 217 WriteTaggedPC(pc_delta, kPositionTag); |
215 WriteTaggedData(data_delta, pos_type_tag); | 218 WriteTaggedData(data_delta, pos_type_tag); |
216 last_data_ = rinfo->data(); | 219 last_data_ = rinfo->data(); |
217 } else { | 220 } else { |
218 // Otherwise, use costly encoding. | 221 // Otherwise, use costly encoding. |
219 WriteExtraTaggedPC(pc_delta, kPCJumpTag); | 222 WriteExtraTaggedPC(pc_delta, kPCJumpTag); |
220 WriteExtraTaggedData(data_delta, pos_type_tag); | 223 WriteExtraTaggedData(data_delta, pos_type_tag); |
221 last_data_ = rinfo->data(); | 224 last_data_ = rinfo->data(); |
222 } | 225 } |
223 } else if (RelocInfo::IsComment(rmode)) { | 226 } else if (RelocInfo::IsComment(rmode)) { |
(...skipping 33 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
257 rinfo_.pc_ += *pos_ >> kTagBits; | 260 rinfo_.pc_ += *pos_ >> kTagBits; |
258 } | 261 } |
259 | 262 |
260 | 263 |
261 inline void RelocIterator::AdvanceReadPC() { | 264 inline void RelocIterator::AdvanceReadPC() { |
262 rinfo_.pc_ += *--pos_; | 265 rinfo_.pc_ += *--pos_; |
263 } | 266 } |
264 | 267 |
265 | 268 |
266 void RelocIterator::AdvanceReadData() { | 269 void RelocIterator::AdvanceReadData() { |
267 int32_t x = 0; | 270 intptr_t x = 0; |
268 for (int i = 0; i < kIntSize; i++) { | 271 for (int i = 0; i < kIntptrSize; i++) { |
269 x |= *--pos_ << i * kBitsPerByte; | 272 x |= static_cast<intptr_t>(*--pos_) << i * kBitsPerByte; |
270 } | 273 } |
271 rinfo_.data_ += x; | 274 rinfo_.data_ += x; |
272 } | 275 } |
273 | 276 |
274 | 277 |
275 void RelocIterator::AdvanceReadVariableLengthPCJump() { | 278 void RelocIterator::AdvanceReadVariableLengthPCJump() { |
276 // Read the 32-kSmallPCDeltaBits most significant bits of the | 279 // Read the 32-kSmallPCDeltaBits most significant bits of the |
277 // pc jump in kChunkBits bit chunks and shift them into place. | 280 // pc jump in kChunkBits bit chunks and shift them into place. |
278 // Stop when the last chunk is encountered. | 281 // Stop when the last chunk is encountered. |
279 uint32_t pc_jump = 0; | 282 uint32_t pc_jump = 0; |
280 for (int i = 0; i < kIntSize; i++) { | 283 for (int i = 0; i < kIntSize; i++) { |
281 byte pc_jump_part = *--pos_; | 284 byte pc_jump_part = *--pos_; |
282 pc_jump |= (pc_jump_part >> kLastChunkTagBits) << i * kChunkBits; | 285 pc_jump |= (pc_jump_part >> kLastChunkTagBits) << i * kChunkBits; |
283 if ((pc_jump_part & kLastChunkTagMask) == 1) break; | 286 if ((pc_jump_part & kLastChunkTagMask) == 1) break; |
284 } | 287 } |
285 // The least significant kSmallPCDeltaBits bits will be added | 288 // The least significant kSmallPCDeltaBits bits will be added |
286 // later. | 289 // later. |
287 rinfo_.pc_ += pc_jump << kSmallPCDeltaBits; | 290 rinfo_.pc_ += pc_jump << kSmallPCDeltaBits; |
288 } | 291 } |
289 | 292 |
290 | 293 |
291 inline int RelocIterator::GetPositionTypeTag() { | 294 inline int RelocIterator::GetPositionTypeTag() { |
292 return *pos_ & ((1 << kPositionTypeTagBits) - 1); | 295 return *pos_ & ((1 << kPositionTypeTagBits) - 1); |
293 } | 296 } |
294 | 297 |
295 | 298 |
296 inline void RelocIterator::ReadTaggedData() { | 299 inline void RelocIterator::ReadTaggedData() { |
297 int8_t signed_b = *pos_; | 300 int8_t signed_b = *pos_; |
298 rinfo_.data_ += ArithmeticShiftRight(signed_b, kPositionTypeTagBits); | 301 // Signed right shift is arithmetic shift. Tested in test-utils.cc. |
| 302 rinfo_.data_ += signed_b >> kPositionTypeTagBits; |
299 } | 303 } |
300 | 304 |
301 | 305 |
302 inline RelocInfo::Mode RelocIterator::DebugInfoModeFromTag(int tag) { | 306 inline RelocInfo::Mode RelocIterator::DebugInfoModeFromTag(int tag) { |
303 if (tag == kStatementPositionTag) { | 307 if (tag == kStatementPositionTag) { |
304 return RelocInfo::STATEMENT_POSITION; | 308 return RelocInfo::STATEMENT_POSITION; |
305 } else if (tag == kNonstatementPositionTag) { | 309 } else if (tag == kNonstatementPositionTag) { |
306 return RelocInfo::POSITION; | 310 return RelocInfo::POSITION; |
307 } else { | 311 } else { |
308 ASSERT(tag == kCommentTag); | 312 ASSERT(tag == kCommentTag); |
(...skipping 310 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
619 return ExternalReference(FUNCTION_ADDR(Debug::Break)); | 623 return ExternalReference(FUNCTION_ADDR(Debug::Break)); |
620 } | 624 } |
621 | 625 |
622 | 626 |
623 ExternalReference ExternalReference::debug_step_in_fp_address() { | 627 ExternalReference ExternalReference::debug_step_in_fp_address() { |
624 return ExternalReference(Debug::step_in_fp_addr()); | 628 return ExternalReference(Debug::step_in_fp_addr()); |
625 } | 629 } |
626 #endif | 630 #endif |
627 | 631 |
628 } } // namespace v8::internal | 632 } } // namespace v8::internal |
OLD | NEW |