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

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

Issue 1234833003: Debugger: use debug break slots to break at function exit. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: fix for arm Created 5 years, 5 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 | « no previous file | src/arm/assembler-arm-inl.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 719 matching lines...) Expand 10 before | Expand all | Expand 10 after
730 } 730 }
731 731
732 // Return the code target address at a call site from the return address 732 // Return the code target address at a call site from the return address
733 // of that call in the instruction stream. 733 // of that call in the instruction stream.
734 INLINE(static Address target_address_from_return_address(Address pc)); 734 INLINE(static Address target_address_from_return_address(Address pc));
735 735
736 // Given the address of the beginning of a call, return the address 736 // Given the address of the beginning of a call, return the address
737 // in the instruction stream that the call will return from. 737 // in the instruction stream that the call will return from.
738 INLINE(static Address return_address_from_call_start(Address pc)); 738 INLINE(static Address return_address_from_call_start(Address pc));
739 739
740 // Return the code target address of the patch debug break slot
741 INLINE(static Address break_address_from_return_address(Address pc));
742
743 // This sets the branch destination (which is in the constant pool on ARM). 740 // This sets the branch destination (which is in the constant pool on ARM).
744 // This is for calls and branches within generated code. 741 // This is for calls and branches within generated code.
745 inline static void deserialization_set_special_target_at( 742 inline static void deserialization_set_special_target_at(
746 Address constant_pool_entry, Code* code, Address target); 743 Address constant_pool_entry, Code* code, Address target);
747 744
748 // This sets the internal reference at the pc. 745 // This sets the internal reference at the pc.
749 inline static void deserialization_set_target_internal_reference_at( 746 inline static void deserialization_set_target_internal_reference_at(
750 Address pc, Address target, 747 Address pc, Address target,
751 RelocInfo::Mode mode = RelocInfo::INTERNAL_REFERENCE); 748 RelocInfo::Mode mode = RelocInfo::INTERNAL_REFERENCE);
752 749
753 // Here we are patching the address in the constant pool, not the actual call 750 // Here we are patching the address in the constant pool, not the actual call
754 // instruction. The address in the constant pool is the same size as a 751 // instruction. The address in the constant pool is the same size as a
755 // pointer. 752 // pointer.
756 static const int kSpecialTargetSize = kPointerSize; 753 static const int kSpecialTargetSize = kPointerSize;
757 754
758 // Size of an instruction. 755 // Size of an instruction.
759 static const int kInstrSize = sizeof(Instr); 756 static const int kInstrSize = sizeof(Instr);
760 757
761 // Distance between start of patched return sequence and the emitted address
762 // to jump to.
763 // Patched return sequence is:
764 // ldr ip, [pc, #0] @ emited address and start
765 // blx ip
766 static const int kPatchReturnSequenceAddressOffset = 0 * kInstrSize;
767
768 // Distance between start of patched debug break slot and the emitted address 758 // Distance between start of patched debug break slot and the emitted address
769 // to jump to. 759 // to jump to.
770 // Patched debug break slot code is: 760 // Patched debug break slot code is:
771 // ldr ip, [pc, #0] @ emited address and start 761 // ldr ip, [pc, #0] @ emited address and start
772 // blx ip 762 // blx ip
773 static const int kPatchDebugBreakSlotAddressOffset = 0 * kInstrSize; 763 static const int kPatchDebugBreakSlotAddressOffset = 2 * kInstrSize;
774
775 static const int kPatchDebugBreakSlotReturnOffset = 2 * kInstrSize;
776 764
777 // Difference between address of current opcode and value read from pc 765 // Difference between address of current opcode and value read from pc
778 // register. 766 // register.
779 static const int kPcLoadDelta = 8; 767 static const int kPcLoadDelta = 8;
780 768
781 static const int kJSReturnSequenceInstructions = 4; 769 static const int kDebugBreakSlotInstructions = 4;
782 static const int kJSReturnSequenceLength =
783 kJSReturnSequenceInstructions * kInstrSize;
784 static const int kDebugBreakSlotInstructions = 3;
785 static const int kDebugBreakSlotLength = 770 static const int kDebugBreakSlotLength =
786 kDebugBreakSlotInstructions * kInstrSize; 771 kDebugBreakSlotInstructions * kInstrSize;
787 772
788 // --------------------------------------------------------------------------- 773 // ---------------------------------------------------------------------------
789 // Code generation 774 // Code generation
790 775
791 // Insert the smallest number of nop instructions 776 // Insert the smallest number of nop instructions
792 // possible to align the pc offset to a multiple 777 // possible to align the pc offset to a multiple
793 // of m. m must be a power of 2 (>= 4). 778 // of m. m must be a power of 2 (>= 4).
794 void Align(int m); 779 void Align(int m);
(...skipping 552 matching lines...) Expand 10 before | Expand all | Expand 10 after
1347 } 1332 }
1348 1333
1349 private: 1334 private:
1350 Assembler* assem_; 1335 Assembler* assem_;
1351 1336
1352 DISALLOW_IMPLICIT_CONSTRUCTORS(BlockConstPoolScope); 1337 DISALLOW_IMPLICIT_CONSTRUCTORS(BlockConstPoolScope);
1353 }; 1338 };
1354 1339
1355 // Debugging 1340 // Debugging
1356 1341
1357 // Mark address of the ExitJSFrame code.
1358 void RecordJSReturn();
1359
1360 // Mark generator continuation. 1342 // Mark generator continuation.
1361 void RecordGeneratorContinuation(); 1343 void RecordGeneratorContinuation();
1362 1344
1363 // Mark address of a debug break slot. 1345 // Mark address of a debug break slot.
1364 void RecordDebugBreakSlot(); 1346 void RecordDebugBreakSlot(RelocInfo::Mode mode, int argc = 0);
1365 void RecordDebugBreakSlotForCall(int argc);
1366 void RecordDebugBreakSlotForConstructCall();
1367 1347
1368 // Record the AST id of the CallIC being compiled, so that it can be placed 1348 // Record the AST id of the CallIC being compiled, so that it can be placed
1369 // in the relocation information. 1349 // in the relocation information.
1370 void SetRecordedAstId(TypeFeedbackId ast_id) { 1350 void SetRecordedAstId(TypeFeedbackId ast_id) {
1371 DCHECK(recorded_ast_id_.IsNone()); 1351 DCHECK(recorded_ast_id_.IsNone());
1372 recorded_ast_id_ = ast_id; 1352 recorded_ast_id_ = ast_id;
1373 } 1353 }
1374 1354
1375 TypeFeedbackId RecordedAstId() { 1355 TypeFeedbackId RecordedAstId() {
1376 DCHECK(!recorded_ast_id_.IsNone()); 1356 DCHECK(!recorded_ast_id_.IsNone());
(...skipping 295 matching lines...) Expand 10 before | Expand all | Expand 10 after
1672 public: 1652 public:
1673 explicit EnsureSpace(Assembler* assembler) { 1653 explicit EnsureSpace(Assembler* assembler) {
1674 assembler->CheckBuffer(); 1654 assembler->CheckBuffer();
1675 } 1655 }
1676 }; 1656 };
1677 1657
1678 1658
1679 } } // namespace v8::internal 1659 } } // namespace v8::internal
1680 1660
1681 #endif // V8_ARM_ASSEMBLER_ARM_H_ 1661 #endif // V8_ARM_ASSEMBLER_ARM_H_
OLDNEW
« no previous file with comments | « no previous file | src/arm/assembler-arm-inl.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698