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 | 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 280 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
291 *pc_++ = (x) | 291 *pc_++ = (x) |
292 | 292 |
293 | 293 |
294 #ifdef GENERATED_CODE_COVERAGE | 294 #ifdef GENERATED_CODE_COVERAGE |
295 static void InitCoverageLog(); | 295 static void InitCoverageLog(); |
296 #endif | 296 #endif |
297 | 297 |
298 // Spare buffer. | 298 // Spare buffer. |
299 byte* Assembler::spare_buffer_ = NULL; | 299 byte* Assembler::spare_buffer_ = NULL; |
300 | 300 |
301 Assembler::Assembler(void* buffer, int buffer_size) { | 301 Assembler::Assembler(void* buffer, int buffer_size) |
| 302 : positions_recorder_(this) { |
302 if (buffer == NULL) { | 303 if (buffer == NULL) { |
303 // Do our own buffer management. | 304 // Do our own buffer management. |
304 if (buffer_size <= kMinimalBufferSize) { | 305 if (buffer_size <= kMinimalBufferSize) { |
305 buffer_size = kMinimalBufferSize; | 306 buffer_size = kMinimalBufferSize; |
306 | 307 |
307 if (spare_buffer_ != NULL) { | 308 if (spare_buffer_ != NULL) { |
308 buffer = spare_buffer_; | 309 buffer = spare_buffer_; |
309 spare_buffer_ = NULL; | 310 spare_buffer_ = NULL; |
310 } | 311 } |
311 } | 312 } |
(...skipping 20 matching lines...) Expand all Loading... |
332 memset(buffer_, 0xCC, buffer_size); // int3 | 333 memset(buffer_, 0xCC, buffer_size); // int3 |
333 } | 334 } |
334 #endif | 335 #endif |
335 | 336 |
336 // Setup buffer pointers. | 337 // Setup buffer pointers. |
337 ASSERT(buffer_ != NULL); | 338 ASSERT(buffer_ != NULL); |
338 pc_ = buffer_; | 339 pc_ = buffer_; |
339 reloc_info_writer.Reposition(buffer_ + buffer_size, pc_); | 340 reloc_info_writer.Reposition(buffer_ + buffer_size, pc_); |
340 | 341 |
341 last_pc_ = NULL; | 342 last_pc_ = NULL; |
342 current_statement_position_ = RelocInfo::kNoPosition; | |
343 current_position_ = RelocInfo::kNoPosition; | |
344 written_statement_position_ = current_statement_position_; | |
345 written_position_ = current_position_; | |
346 #ifdef GENERATED_CODE_COVERAGE | 343 #ifdef GENERATED_CODE_COVERAGE |
347 InitCoverageLog(); | 344 InitCoverageLog(); |
348 #endif | 345 #endif |
349 } | 346 } |
350 | 347 |
351 | 348 |
352 Assembler::~Assembler() { | 349 Assembler::~Assembler() { |
353 if (own_buffer_) { | 350 if (own_buffer_) { |
354 if (spare_buffer_ == NULL && buffer_size_ == kMinimalBufferSize) { | 351 if (spare_buffer_ == NULL && buffer_size_ == kMinimalBufferSize) { |
355 spare_buffer_ = buffer_; | 352 spare_buffer_ = buffer_; |
(...skipping 1218 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
1574 | 1571 |
1575 void Assembler::call(const Operand& adr) { | 1572 void Assembler::call(const Operand& adr) { |
1576 EnsureSpace ensure_space(this); | 1573 EnsureSpace ensure_space(this); |
1577 last_pc_ = pc_; | 1574 last_pc_ = pc_; |
1578 EMIT(0xFF); | 1575 EMIT(0xFF); |
1579 emit_operand(edx, adr); | 1576 emit_operand(edx, adr); |
1580 } | 1577 } |
1581 | 1578 |
1582 | 1579 |
1583 void Assembler::call(Handle<Code> code, RelocInfo::Mode rmode) { | 1580 void Assembler::call(Handle<Code> code, RelocInfo::Mode rmode) { |
1584 WriteRecordedPositions(); | 1581 positions_recorder()->WriteRecordedPositions(); |
1585 EnsureSpace ensure_space(this); | 1582 EnsureSpace ensure_space(this); |
1586 last_pc_ = pc_; | 1583 last_pc_ = pc_; |
1587 ASSERT(RelocInfo::IsCodeTarget(rmode)); | 1584 ASSERT(RelocInfo::IsCodeTarget(rmode)); |
1588 EMIT(0xE8); | 1585 EMIT(0xE8); |
1589 emit(reinterpret_cast<intptr_t>(code.location()), rmode); | 1586 emit(reinterpret_cast<intptr_t>(code.location()), rmode); |
1590 } | 1587 } |
1591 | 1588 |
1592 | 1589 |
1593 void Assembler::jmp(Label* L) { | 1590 void Assembler::jmp(Label* L) { |
1594 EnsureSpace ensure_space(this); | 1591 EnsureSpace ensure_space(this); |
(...skipping 862 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2457 EMIT(0xC0 | dst.code() << 3 | src.code()); | 2454 EMIT(0xC0 | dst.code() << 3 | src.code()); |
2458 } | 2455 } |
2459 | 2456 |
2460 | 2457 |
2461 void Assembler::Print() { | 2458 void Assembler::Print() { |
2462 Disassembler::Decode(stdout, buffer_, pc_); | 2459 Disassembler::Decode(stdout, buffer_, pc_); |
2463 } | 2460 } |
2464 | 2461 |
2465 | 2462 |
2466 void Assembler::RecordJSReturn() { | 2463 void Assembler::RecordJSReturn() { |
2467 WriteRecordedPositions(); | 2464 positions_recorder()->WriteRecordedPositions(); |
2468 EnsureSpace ensure_space(this); | 2465 EnsureSpace ensure_space(this); |
2469 RecordRelocInfo(RelocInfo::JS_RETURN); | 2466 RecordRelocInfo(RelocInfo::JS_RETURN); |
2470 } | 2467 } |
2471 | 2468 |
2472 | 2469 |
2473 void Assembler::RecordDebugBreakSlot() { | 2470 void Assembler::RecordDebugBreakSlot() { |
2474 WriteRecordedPositions(); | 2471 positions_recorder()->WriteRecordedPositions(); |
2475 EnsureSpace ensure_space(this); | 2472 EnsureSpace ensure_space(this); |
2476 RecordRelocInfo(RelocInfo::DEBUG_BREAK_SLOT); | 2473 RecordRelocInfo(RelocInfo::DEBUG_BREAK_SLOT); |
2477 } | 2474 } |
2478 | 2475 |
2479 | 2476 |
2480 void Assembler::RecordComment(const char* msg) { | 2477 void Assembler::RecordComment(const char* msg) { |
2481 if (FLAG_debug_code) { | 2478 if (FLAG_debug_code) { |
2482 EnsureSpace ensure_space(this); | 2479 EnsureSpace ensure_space(this); |
2483 RecordRelocInfo(RelocInfo::COMMENT, reinterpret_cast<intptr_t>(msg)); | 2480 RecordRelocInfo(RelocInfo::COMMENT, reinterpret_cast<intptr_t>(msg)); |
2484 } | 2481 } |
2485 } | 2482 } |
2486 | 2483 |
2487 | 2484 |
2488 void Assembler::RecordPosition(int pos) { | |
2489 ASSERT(pos != RelocInfo::kNoPosition); | |
2490 ASSERT(pos >= 0); | |
2491 current_position_ = pos; | |
2492 } | |
2493 | |
2494 | |
2495 void Assembler::RecordStatementPosition(int pos) { | |
2496 ASSERT(pos != RelocInfo::kNoPosition); | |
2497 ASSERT(pos >= 0); | |
2498 current_statement_position_ = pos; | |
2499 } | |
2500 | |
2501 | |
2502 bool Assembler::WriteRecordedPositions() { | |
2503 bool written = false; | |
2504 | |
2505 // Write the statement position if it is different from what was written last | |
2506 // time. | |
2507 if (current_statement_position_ != written_statement_position_) { | |
2508 EnsureSpace ensure_space(this); | |
2509 RecordRelocInfo(RelocInfo::STATEMENT_POSITION, current_statement_position_); | |
2510 written_statement_position_ = current_statement_position_; | |
2511 written = true; | |
2512 } | |
2513 | |
2514 // Write the position if it is different from what was written last time and | |
2515 // also different from the written statement position. | |
2516 if (current_position_ != written_position_ && | |
2517 current_position_ != written_statement_position_) { | |
2518 EnsureSpace ensure_space(this); | |
2519 RecordRelocInfo(RelocInfo::POSITION, current_position_); | |
2520 written_position_ = current_position_; | |
2521 written = true; | |
2522 } | |
2523 | |
2524 // Return whether something was written. | |
2525 return written; | |
2526 } | |
2527 | |
2528 | |
2529 void Assembler::GrowBuffer() { | 2485 void Assembler::GrowBuffer() { |
2530 ASSERT(overflow()); | 2486 ASSERT(overflow()); |
2531 if (!own_buffer_) FATAL("external code buffer is too small"); | 2487 if (!own_buffer_) FATAL("external code buffer is too small"); |
2532 | 2488 |
2533 // Compute new buffer size. | 2489 // Compute new buffer size. |
2534 CodeDesc desc; // the new buffer | 2490 CodeDesc desc; // the new buffer |
2535 if (buffer_size_ < 4*KB) { | 2491 if (buffer_size_ < 4*KB) { |
2536 desc.buffer_size = 4*KB; | 2492 desc.buffer_size = 4*KB; |
2537 } else { | 2493 } else { |
2538 desc.buffer_size = 2*buffer_size_; | 2494 desc.buffer_size = 2*buffer_size_; |
(...skipping 157 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
2696 fprintf(coverage_log, "%s\n", file_line); | 2652 fprintf(coverage_log, "%s\n", file_line); |
2697 fflush(coverage_log); | 2653 fflush(coverage_log); |
2698 } | 2654 } |
2699 } | 2655 } |
2700 | 2656 |
2701 #endif | 2657 #endif |
2702 | 2658 |
2703 } } // namespace v8::internal | 2659 } } // namespace v8::internal |
2704 | 2660 |
2705 #endif // V8_TARGET_ARCH_IA32 | 2661 #endif // V8_TARGET_ARCH_IA32 |
OLD | NEW |