| 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 174 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 185 } | 185 } |
| 186 } | 186 } |
| 187 | 187 |
| 188 | 188 |
| 189 void RelocInfoWriter::Write(const RelocInfo* rinfo) { | 189 void RelocInfoWriter::Write(const RelocInfo* rinfo) { |
| 190 #ifdef DEBUG | 190 #ifdef DEBUG |
| 191 byte* begin_pos = pos_; | 191 byte* begin_pos = pos_; |
| 192 #endif | 192 #endif |
| 193 Counters::reloc_info_count.Increment(); | 193 Counters::reloc_info_count.Increment(); |
| 194 ASSERT(rinfo->pc() - last_pc_ >= 0); | 194 ASSERT(rinfo->pc() - last_pc_ >= 0); |
| 195 ASSERT(reloc_mode_count < kMaxRelocModes); | 195 ASSERT(RelocInfo::NUMBER_OF_MODES < kMaxRelocModes); |
| 196 // Use unsigned delta-encoding for pc. | 196 // Use unsigned delta-encoding for pc. |
| 197 uint32_t pc_delta = rinfo->pc() - last_pc_; | 197 uint32_t pc_delta = rinfo->pc() - last_pc_; |
| 198 RelocMode rmode = rinfo->rmode(); | 198 RelocInfo::Mode rmode = rinfo->rmode(); |
| 199 | 199 |
| 200 // The two most common modes are given small tags, and usually fit in a byte. | 200 // The two most common modes are given small tags, and usually fit in a byte. |
| 201 if (rmode == embedded_object) { | 201 if (rmode == RelocInfo::EMBEDDED_OBJECT) { |
| 202 WriteTaggedPC(pc_delta, kEmbeddedObjectTag); | 202 WriteTaggedPC(pc_delta, kEmbeddedObjectTag); |
| 203 } else if (rmode == code_target) { | 203 } else if (rmode == RelocInfo::CODE_TARGET) { |
| 204 WriteTaggedPC(pc_delta, kCodeTargetTag); | 204 WriteTaggedPC(pc_delta, kCodeTargetTag); |
| 205 } else if (rmode == position || rmode == statement_position) { | 205 } else if (RelocInfo::IsPosition(rmode)) { |
| 206 // Use signed delta-encoding for data. | 206 // Use signed delta-encoding for data. |
| 207 int32_t data_delta = rinfo->data() - last_data_; | 207 int32_t data_delta = rinfo->data() - last_data_; |
| 208 int pos_type_tag = rmode == position ? kNonstatementPositionTag | 208 int pos_type_tag = rmode == RelocInfo::POSITION ? kNonstatementPositionTag |
| 209 : kStatementPositionTag; | 209 : kStatementPositionTag; |
| 210 // Check if data is small enough to fit in a tagged byte. | 210 // Check if data is small enough to fit in a tagged byte. |
| 211 if (is_intn(data_delta, kSmallDataBits)) { | 211 if (is_intn(data_delta, kSmallDataBits)) { |
| 212 WriteTaggedPC(pc_delta, kPositionTag); | 212 WriteTaggedPC(pc_delta, kPositionTag); |
| 213 WriteTaggedData(data_delta, pos_type_tag); | 213 WriteTaggedData(data_delta, pos_type_tag); |
| 214 last_data_ = rinfo->data(); | 214 last_data_ = rinfo->data(); |
| 215 } else { | 215 } else { |
| 216 // Otherwise, use costly encoding. | 216 // Otherwise, use costly encoding. |
| 217 WriteExtraTaggedPC(pc_delta, kPCJumpTag); | 217 WriteExtraTaggedPC(pc_delta, kPCJumpTag); |
| 218 WriteExtraTaggedData(data_delta, pos_type_tag); | 218 WriteExtraTaggedData(data_delta, pos_type_tag); |
| 219 last_data_ = rinfo->data(); | 219 last_data_ = rinfo->data(); |
| 220 } | 220 } |
| 221 } else if (rmode == comment) { | 221 } else if (RelocInfo::IsComment(rmode)) { |
| 222 // Comments are normally not generated, so we use the costly encoding. | 222 // Comments are normally not generated, so we use the costly encoding. |
| 223 WriteExtraTaggedPC(pc_delta, kPCJumpTag); | 223 WriteExtraTaggedPC(pc_delta, kPCJumpTag); |
| 224 WriteExtraTaggedData(rinfo->data() - last_data_, kCommentTag); | 224 WriteExtraTaggedData(rinfo->data() - last_data_, kCommentTag); |
| 225 last_data_ = rinfo->data(); | 225 last_data_ = rinfo->data(); |
| 226 } else { | 226 } else { |
| 227 // For all other modes we simply use the mode as the extra tag. | 227 // For all other modes we simply use the mode as the extra tag. |
| 228 // None of these modes need a data component. | 228 // None of these modes need a data component. |
| 229 ASSERT(rmode < kPCJumpTag && rmode < kDataJumpTag); | 229 ASSERT(rmode < kPCJumpTag && rmode < kDataJumpTag); |
| 230 WriteExtraTaggedPC(pc_delta, rmode); | 230 WriteExtraTaggedPC(pc_delta, rmode); |
| 231 } | 231 } |
| (...skipping 58 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 290 return *pos_ & ((1 << kPositionTypeTagBits) - 1); | 290 return *pos_ & ((1 << kPositionTypeTagBits) - 1); |
| 291 } | 291 } |
| 292 | 292 |
| 293 | 293 |
| 294 inline void RelocIterator::ReadTaggedData() { | 294 inline void RelocIterator::ReadTaggedData() { |
| 295 int8_t signed_b = *pos_; | 295 int8_t signed_b = *pos_; |
| 296 rinfo_.data_ += ArithmeticShiftRight(signed_b, kPositionTypeTagBits); | 296 rinfo_.data_ += ArithmeticShiftRight(signed_b, kPositionTypeTagBits); |
| 297 } | 297 } |
| 298 | 298 |
| 299 | 299 |
| 300 inline RelocMode RelocIterator::DebugInfoModeFromTag(int tag) { | 300 inline RelocInfo::Mode RelocIterator::DebugInfoModeFromTag(int tag) { |
| 301 if (tag == kStatementPositionTag) { | 301 if (tag == kStatementPositionTag) { |
| 302 return statement_position; | 302 return RelocInfo::STATEMENT_POSITION; |
| 303 } else if (tag == kNonstatementPositionTag) { | 303 } else if (tag == kNonstatementPositionTag) { |
| 304 return position; | 304 return RelocInfo::POSITION; |
| 305 } else { | 305 } else { |
| 306 ASSERT(tag == kCommentTag); | 306 ASSERT(tag == kCommentTag); |
| 307 return comment; | 307 return RelocInfo::COMMENT; |
| 308 } | 308 } |
| 309 } | 309 } |
| 310 | 310 |
| 311 | 311 |
| 312 void RelocIterator::next() { | 312 void RelocIterator::next() { |
| 313 ASSERT(!done()); | 313 ASSERT(!done()); |
| 314 // Basically, do the opposite of RelocInfoWriter::Write. | 314 // Basically, do the opposite of RelocInfoWriter::Write. |
| 315 // Reading of data is as far as possible avoided for unwanted modes, | 315 // Reading of data is as far as possible avoided for unwanted modes, |
| 316 // but we must always update the pc. | 316 // but we must always update the pc. |
| 317 // | 317 // |
| 318 // We exit this loop by returning when we find a mode we want. | 318 // We exit this loop by returning when we find a mode we want. |
| 319 while (pos_ > end_) { | 319 while (pos_ > end_) { |
| 320 int tag = AdvanceGetTag(); | 320 int tag = AdvanceGetTag(); |
| 321 if (tag == kEmbeddedObjectTag) { | 321 if (tag == kEmbeddedObjectTag) { |
| 322 ReadTaggedPC(); | 322 ReadTaggedPC(); |
| 323 if (SetMode(embedded_object)) return; | 323 if (SetMode(RelocInfo::EMBEDDED_OBJECT)) return; |
| 324 } else if (tag == kCodeTargetTag) { | 324 } else if (tag == kCodeTargetTag) { |
| 325 ReadTaggedPC(); | 325 ReadTaggedPC(); |
| 326 if (*(reinterpret_cast<int**>(rinfo_.pc())) == | 326 if (*(reinterpret_cast<int**>(rinfo_.pc())) == |
| 327 reinterpret_cast<int*>(0x61)) { | 327 reinterpret_cast<int*>(0x61)) { |
| 328 tag = 0; | 328 tag = 0; |
| 329 } | 329 } |
| 330 if (SetMode(code_target)) return; | 330 if (SetMode(RelocInfo::CODE_TARGET)) return; |
| 331 } else if (tag == kPositionTag) { | 331 } else if (tag == kPositionTag) { |
| 332 ReadTaggedPC(); | 332 ReadTaggedPC(); |
| 333 Advance(); | 333 Advance(); |
| 334 // Check if we want source positions. | 334 // Check if we want source positions. |
| 335 if (mode_mask_ & RelocInfo::kPositionMask) { | 335 if (mode_mask_ & RelocInfo::kPositionMask) { |
| 336 // Check if we want this type of source position. | 336 // Check if we want this type of source position. |
| 337 if (SetMode(DebugInfoModeFromTag(GetPositionTypeTag()))) { | 337 if (SetMode(DebugInfoModeFromTag(GetPositionTypeTag()))) { |
| 338 // Finally read the data before returning. | 338 // Finally read the data before returning. |
| 339 ReadTaggedData(); | 339 ReadTaggedData(); |
| 340 return; | 340 return; |
| (...skipping 14 matching lines...) Expand all Loading... |
| 355 if (mode_mask_ & RelocInfo::kDebugMask) { | 355 if (mode_mask_ & RelocInfo::kDebugMask) { |
| 356 int top_tag = GetTopTag(); | 356 int top_tag = GetTopTag(); |
| 357 AdvanceReadData(); | 357 AdvanceReadData(); |
| 358 if (SetMode(DebugInfoModeFromTag(top_tag))) return; | 358 if (SetMode(DebugInfoModeFromTag(top_tag))) return; |
| 359 } else { | 359 } else { |
| 360 // Otherwise, just skip over the data. | 360 // Otherwise, just skip over the data. |
| 361 Advance(kIntSize); | 361 Advance(kIntSize); |
| 362 } | 362 } |
| 363 } else { | 363 } else { |
| 364 AdvanceReadPC(); | 364 AdvanceReadPC(); |
| 365 if (SetMode(static_cast<RelocMode>(extra_tag))) return; | 365 if (SetMode(static_cast<RelocInfo::Mode>(extra_tag))) return; |
| 366 } | 366 } |
| 367 } | 367 } |
| 368 } | 368 } |
| 369 done_ = true; | 369 done_ = true; |
| 370 } | 370 } |
| 371 | 371 |
| 372 | 372 |
| 373 RelocIterator::RelocIterator(Code* code, int mode_mask) { | 373 RelocIterator::RelocIterator(Code* code, int mode_mask) { |
| 374 rinfo_.pc_ = code->instruction_start(); | 374 rinfo_.pc_ = code->instruction_start(); |
| 375 rinfo_.data_ = 0; | 375 rinfo_.data_ = 0; |
| (...skipping 18 matching lines...) Expand all Loading... |
| 394 if (mode_mask_ == 0) pos_ = end_; | 394 if (mode_mask_ == 0) pos_ = end_; |
| 395 next(); | 395 next(); |
| 396 } | 396 } |
| 397 | 397 |
| 398 | 398 |
| 399 // ----------------------------------------------------------------------------- | 399 // ----------------------------------------------------------------------------- |
| 400 // Implementation of RelocInfo | 400 // Implementation of RelocInfo |
| 401 | 401 |
| 402 | 402 |
| 403 #ifdef ENABLE_DISASSEMBLER | 403 #ifdef ENABLE_DISASSEMBLER |
| 404 const char* RelocInfo::RelocModeName(RelocMode rmode) { | 404 const char* RelocInfo::RelocModeName(RelocInfo::Mode rmode) { |
| 405 switch (rmode) { | 405 switch (rmode) { |
| 406 case no_reloc: | 406 case RelocInfo::NONE: |
| 407 return "no reloc"; | 407 return "no reloc"; |
| 408 case embedded_object: | 408 case RelocInfo::EMBEDDED_OBJECT: |
| 409 return "embedded object"; | 409 return "embedded object"; |
| 410 case embedded_string: | 410 case RelocInfo::EMBEDDED_STRING: |
| 411 return "embedded string"; | 411 return "embedded string"; |
| 412 case js_construct_call: | 412 case RelocInfo::CONSTRUCT_CALL: |
| 413 return "code target (js construct call)"; | 413 return "code target (js construct call)"; |
| 414 case exit_js_frame: | 414 case RelocInfo::CODE_TARGET_CONTEXT: |
| 415 return "code target (exit js frame)"; | |
| 416 case code_target_context: | |
| 417 return "code target (context)"; | 415 return "code target (context)"; |
| 418 case code_target: | 416 case RelocInfo::CODE_TARGET: |
| 419 return "code target"; | 417 return "code target"; |
| 420 case runtime_entry: | 418 case RelocInfo::RUNTIME_ENTRY: |
| 421 return "runtime entry"; | 419 return "runtime entry"; |
| 422 case js_return: | 420 case RelocInfo::JS_RETURN: |
| 423 return "js return"; | 421 return "js return"; |
| 424 case comment: | 422 case RelocInfo::COMMENT: |
| 425 return "comment"; | 423 return "comment"; |
| 426 case position: | 424 case RelocInfo::POSITION: |
| 427 return "position"; | 425 return "position"; |
| 428 case statement_position: | 426 case RelocInfo::STATEMENT_POSITION: |
| 429 return "statement position"; | 427 return "statement position"; |
| 430 case external_reference: | 428 case RelocInfo::EXTERNAL_REFERENCE: |
| 431 return "external reference"; | 429 return "external reference"; |
| 432 case internal_reference: | 430 case RelocInfo::INTERNAL_REFERENCE: |
| 433 return "internal reference"; | 431 return "internal reference"; |
| 434 case reloc_mode_count: | 432 case RelocInfo::NUMBER_OF_MODES: |
| 435 UNREACHABLE(); | 433 UNREACHABLE(); |
| 436 return "reloc_mode_count"; | 434 return "number_of_modes"; |
| 437 } | 435 } |
| 438 return "unknown relocation type"; | 436 return "unknown relocation type"; |
| 439 } | 437 } |
| 440 | 438 |
| 441 | 439 |
| 442 void RelocInfo::Print() { | 440 void RelocInfo::Print() { |
| 443 PrintF("%p %s", pc_, RelocModeName(rmode_)); | 441 PrintF("%p %s", pc_, RelocModeName(rmode_)); |
| 444 if (rmode_ == comment) { | 442 if (IsComment(rmode_)) { |
| 445 PrintF(" (%s)", data_); | 443 PrintF(" (%s)", data_); |
| 446 } else if (rmode_ == embedded_object) { | 444 } else if (rmode_ == EMBEDDED_OBJECT) { |
| 447 PrintF(" ("); | 445 PrintF(" ("); |
| 448 target_object()->ShortPrint(); | 446 target_object()->ShortPrint(); |
| 449 PrintF(")"); | 447 PrintF(")"); |
| 450 } else if (rmode_ == external_reference) { | 448 } else if (rmode_ == EXTERNAL_REFERENCE) { |
| 451 ExternalReferenceEncoder ref_encoder; | 449 ExternalReferenceEncoder ref_encoder; |
| 452 PrintF(" (%s) (%p)", | 450 PrintF(" (%s) (%p)", |
| 453 ref_encoder.NameOfAddress(*target_reference_address()), | 451 ref_encoder.NameOfAddress(*target_reference_address()), |
| 454 *target_reference_address()); | 452 *target_reference_address()); |
| 455 } else if (is_code_target(rmode_)) { | 453 } else if (IsCodeTarget(rmode_)) { |
| 456 Code* code = Debug::GetCodeTarget(target_address()); | 454 Code* code = Debug::GetCodeTarget(target_address()); |
| 457 PrintF(" (%s) (%p)", Code::Kind2String(code->kind()), target_address()); | 455 PrintF(" (%s) (%p)", Code::Kind2String(code->kind()), target_address()); |
| 458 } else if (is_position(rmode_)) { | 456 } else if (IsPosition(rmode_)) { |
| 459 PrintF(" (%d)", data()); | 457 PrintF(" (%d)", data()); |
| 460 } | 458 } |
| 461 | 459 |
| 462 PrintF("\n"); | 460 PrintF("\n"); |
| 463 } | 461 } |
| 464 #endif // ENABLE_DISASSEMBLER | 462 #endif // ENABLE_DISASSEMBLER |
| 465 | 463 |
| 466 | 464 |
| 467 #ifdef DEBUG | 465 #ifdef DEBUG |
| 468 void RelocInfo::Verify() { | 466 void RelocInfo::Verify() { |
| 469 switch (rmode_) { | 467 switch (rmode_) { |
| 470 case embedded_object: | 468 case EMBEDDED_OBJECT: |
| 471 Object::VerifyPointer(target_object()); | 469 Object::VerifyPointer(target_object()); |
| 472 break; | 470 break; |
| 473 case js_construct_call: | 471 case CONSTRUCT_CALL: |
| 474 case exit_js_frame: | 472 case CODE_TARGET_CONTEXT: |
| 475 case code_target_context: | 473 case CODE_TARGET: { |
| 476 case code_target: { | |
| 477 // convert inline target address to code object | 474 // convert inline target address to code object |
| 478 Address addr = target_address(); | 475 Address addr = target_address(); |
| 479 ASSERT(addr != NULL); | 476 ASSERT(addr != NULL); |
| 480 // Check that we can find the right code object. | 477 // Check that we can find the right code object. |
| 481 HeapObject* code = HeapObject::FromAddress(addr - Code::kHeaderSize); | 478 HeapObject* code = HeapObject::FromAddress(addr - Code::kHeaderSize); |
| 482 Object* found = Heap::FindCodeObject(addr); | 479 Object* found = Heap::FindCodeObject(addr); |
| 483 ASSERT(found->IsCode()); | 480 ASSERT(found->IsCode()); |
| 484 ASSERT(code->address() == HeapObject::cast(found)->address()); | 481 ASSERT(code->address() == HeapObject::cast(found)->address()); |
| 485 break; | 482 break; |
| 486 } | 483 } |
| 487 case embedded_string: | 484 case RelocInfo::EMBEDDED_STRING: |
| 488 case runtime_entry: | 485 case RUNTIME_ENTRY: |
| 489 case js_return: | 486 case JS_RETURN: |
| 490 case comment: | 487 case COMMENT: |
| 491 case position: | 488 case POSITION: |
| 492 case statement_position: | 489 case STATEMENT_POSITION: |
| 493 case external_reference: | 490 case EXTERNAL_REFERENCE: |
| 494 case internal_reference: | 491 case INTERNAL_REFERENCE: |
| 495 case no_reloc: | 492 case NONE: |
| 496 break; | 493 break; |
| 497 case reloc_mode_count: | 494 case NUMBER_OF_MODES: |
| 498 UNREACHABLE(); | 495 UNREACHABLE(); |
| 499 break; | 496 break; |
| 500 } | 497 } |
| 501 } | 498 } |
| 502 #endif // DEBUG | 499 #endif // DEBUG |
| 503 | 500 |
| 504 | 501 |
| 505 // ----------------------------------------------------------------------------- | 502 // ----------------------------------------------------------------------------- |
| 506 // Implementation of ExternalReference | 503 // Implementation of ExternalReference |
| 507 | 504 |
| (...skipping 62 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 570 | 567 |
| 571 ExternalReference ExternalReference::new_space_allocation_limit_address() { | 568 ExternalReference ExternalReference::new_space_allocation_limit_address() { |
| 572 return ExternalReference(Heap::NewSpaceAllocationLimitAddress()); | 569 return ExternalReference(Heap::NewSpaceAllocationLimitAddress()); |
| 573 } | 570 } |
| 574 | 571 |
| 575 ExternalReference ExternalReference::debug_step_in_fp_address() { | 572 ExternalReference ExternalReference::debug_step_in_fp_address() { |
| 576 return ExternalReference(Debug::step_in_fp_addr()); | 573 return ExternalReference(Debug::step_in_fp_addr()); |
| 577 } | 574 } |
| 578 | 575 |
| 579 } } // namespace v8::internal | 576 } } // namespace v8::internal |
| OLD | NEW |