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

Side by Side Diff: src/arm/macro-assembler-arm.cc

Issue 460068: Add alignment check to object allocated in generated code for x64 and ARM (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: Created 11 years 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 | Annotate | Revision Log
« no previous file with comments | « no previous file | src/ia32/macro-assembler-ia32.cc » ('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 2006-2009 the V8 project authors. All rights reserved. 1 // Copyright 2006-2009 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 776 matching lines...) Expand 10 before | Expand all | Expand 10 after
787 ASSERT(!result.is(scratch1)); 787 ASSERT(!result.is(scratch1));
788 ASSERT(!scratch1.is(scratch2)); 788 ASSERT(!scratch1.is(scratch2));
789 789
790 // Load address of new object into result and allocation top address into 790 // Load address of new object into result and allocation top address into
791 // scratch1. 791 // scratch1.
792 ExternalReference new_space_allocation_top = 792 ExternalReference new_space_allocation_top =
793 ExternalReference::new_space_allocation_top_address(); 793 ExternalReference::new_space_allocation_top_address();
794 mov(scratch1, Operand(new_space_allocation_top)); 794 mov(scratch1, Operand(new_space_allocation_top));
795 if ((flags & RESULT_CONTAINS_TOP) == 0) { 795 if ((flags & RESULT_CONTAINS_TOP) == 0) {
796 ldr(result, MemOperand(scratch1)); 796 ldr(result, MemOperand(scratch1));
797 } else { 797 } else if (FLAG_debug_code) {
798 #ifdef DEBUG
799 // Assert that result actually contains top on entry. scratch2 is used 798 // Assert that result actually contains top on entry. scratch2 is used
800 // immediately below so this use of scratch2 does not cause difference with 799 // immediately below so this use of scratch2 does not cause difference with
801 // respect to register content between debug and release mode. 800 // respect to register content between debug and release mode.
802 ldr(scratch2, MemOperand(scratch1)); 801 ldr(scratch2, MemOperand(scratch1));
803 cmp(result, scratch2); 802 cmp(result, scratch2);
804 Check(eq, "Unexpected allocation top"); 803 Check(eq, "Unexpected allocation top");
805 #endif
806 } 804 }
807 805
808 // Calculate new top and bail out if new space is exhausted. Use result 806 // Calculate new top and bail out if new space is exhausted. Use result
809 // to calculate the new top. 807 // to calculate the new top.
810 ExternalReference new_space_allocation_limit = 808 ExternalReference new_space_allocation_limit =
811 ExternalReference::new_space_allocation_limit_address(); 809 ExternalReference::new_space_allocation_limit_address();
812 mov(scratch2, Operand(new_space_allocation_limit)); 810 mov(scratch2, Operand(new_space_allocation_limit));
813 ldr(scratch2, MemOperand(scratch2)); 811 ldr(scratch2, MemOperand(scratch2));
814 add(result, result, Operand(object_size * kPointerSize)); 812 add(result, result, Operand(object_size * kPointerSize));
815 cmp(result, Operand(scratch2)); 813 cmp(result, Operand(scratch2));
816 b(hi, gc_required); 814 b(hi, gc_required);
817 815
818 // Update allocation top. result temporarily holds the new top, 816 // Update allocation top. result temporarily holds the new top.
817 if (FLAG_debug_code) {
818 tst(result, Operand(kObjectAlignmentMask));
819 Check(eq, "Unaligned allocation in new space");
820 }
819 str(result, MemOperand(scratch1)); 821 str(result, MemOperand(scratch1));
820 822
821 // Tag and adjust back to start of new object. 823 // Tag and adjust back to start of new object.
822 if ((flags & TAG_OBJECT) != 0) { 824 if ((flags & TAG_OBJECT) != 0) {
823 sub(result, result, Operand((object_size * kPointerSize) - 825 sub(result, result, Operand((object_size * kPointerSize) -
824 kHeapObjectTag)); 826 kHeapObjectTag));
825 } else { 827 } else {
826 sub(result, result, Operand(object_size * kPointerSize)); 828 sub(result, result, Operand(object_size * kPointerSize));
827 } 829 }
828 } 830 }
829 831
830 832
831 void MacroAssembler::AllocateInNewSpace(Register object_size, 833 void MacroAssembler::AllocateInNewSpace(Register object_size,
832 Register result, 834 Register result,
833 Register scratch1, 835 Register scratch1,
834 Register scratch2, 836 Register scratch2,
835 Label* gc_required, 837 Label* gc_required,
836 AllocationFlags flags) { 838 AllocationFlags flags) {
837 ASSERT(!result.is(scratch1)); 839 ASSERT(!result.is(scratch1));
838 ASSERT(!scratch1.is(scratch2)); 840 ASSERT(!scratch1.is(scratch2));
839 841
840 // Load address of new object into result and allocation top address into 842 // Load address of new object into result and allocation top address into
841 // scratch1. 843 // scratch1.
842 ExternalReference new_space_allocation_top = 844 ExternalReference new_space_allocation_top =
843 ExternalReference::new_space_allocation_top_address(); 845 ExternalReference::new_space_allocation_top_address();
844 mov(scratch1, Operand(new_space_allocation_top)); 846 mov(scratch1, Operand(new_space_allocation_top));
845 if ((flags & RESULT_CONTAINS_TOP) == 0) { 847 if ((flags & RESULT_CONTAINS_TOP) == 0) {
846 ldr(result, MemOperand(scratch1)); 848 ldr(result, MemOperand(scratch1));
847 } else { 849 } else if (FLAG_debug_code) {
848 #ifdef DEBUG
849 // Assert that result actually contains top on entry. scratch2 is used 850 // Assert that result actually contains top on entry. scratch2 is used
850 // immediately below so this use of scratch2 does not cause difference with 851 // immediately below so this use of scratch2 does not cause difference with
851 // respect to register content between debug and release mode. 852 // respect to register content between debug and release mode.
852 ldr(scratch2, MemOperand(scratch1)); 853 ldr(scratch2, MemOperand(scratch1));
853 cmp(result, scratch2); 854 cmp(result, scratch2);
854 Check(eq, "Unexpected allocation top"); 855 Check(eq, "Unexpected allocation top");
855 #endif
856 } 856 }
857 857
858 // Calculate new top and bail out if new space is exhausted. Use result 858 // Calculate new top and bail out if new space is exhausted. Use result
859 // to calculate the new top. Object size is in words so a shift is required to 859 // to calculate the new top. Object size is in words so a shift is required to
860 // get the number of bytes 860 // get the number of bytes
861 ExternalReference new_space_allocation_limit = 861 ExternalReference new_space_allocation_limit =
862 ExternalReference::new_space_allocation_limit_address(); 862 ExternalReference::new_space_allocation_limit_address();
863 mov(scratch2, Operand(new_space_allocation_limit)); 863 mov(scratch2, Operand(new_space_allocation_limit));
864 ldr(scratch2, MemOperand(scratch2)); 864 ldr(scratch2, MemOperand(scratch2));
865 add(result, result, Operand(object_size, LSL, kPointerSizeLog2)); 865 add(result, result, Operand(object_size, LSL, kPointerSizeLog2));
866 cmp(result, Operand(scratch2)); 866 cmp(result, Operand(scratch2));
867 b(hi, gc_required); 867 b(hi, gc_required);
868 868
869 // Update allocation top. result temporarily holds the new top, 869 // Update allocation top. result temporarily holds the new top.
870 if (FLAG_debug_code) {
871 tst(result, Operand(kObjectAlignmentMask));
872 Check(eq, "Unaligned allocation in new space");
873 }
870 str(result, MemOperand(scratch1)); 874 str(result, MemOperand(scratch1));
871 875
872 // Adjust back to start of new object. 876 // Adjust back to start of new object.
873 sub(result, result, Operand(object_size, LSL, kPointerSizeLog2)); 877 sub(result, result, Operand(object_size, LSL, kPointerSizeLog2));
874 878
875 // Tag object if requested. 879 // Tag object if requested.
876 if ((flags & TAG_OBJECT) != 0) { 880 if ((flags & TAG_OBJECT) != 0) {
877 add(result, result, Operand(kHeapObjectTag)); 881 add(result, result, Operand(kHeapObjectTag));
878 } 882 }
879 } 883 }
(...skipping 275 matching lines...) Expand 10 before | Expand all | Expand 10 after
1155 // from the real pointer as a smi. 1159 // from the real pointer as a smi.
1156 intptr_t p1 = reinterpret_cast<intptr_t>(msg); 1160 intptr_t p1 = reinterpret_cast<intptr_t>(msg);
1157 intptr_t p0 = (p1 & ~kSmiTagMask) + kSmiTag; 1161 intptr_t p0 = (p1 & ~kSmiTagMask) + kSmiTag;
1158 ASSERT(reinterpret_cast<Object*>(p0)->IsSmi()); 1162 ASSERT(reinterpret_cast<Object*>(p0)->IsSmi());
1159 #ifdef DEBUG 1163 #ifdef DEBUG
1160 if (msg != NULL) { 1164 if (msg != NULL) {
1161 RecordComment("Abort message: "); 1165 RecordComment("Abort message: ");
1162 RecordComment(msg); 1166 RecordComment(msg);
1163 } 1167 }
1164 #endif 1168 #endif
1169 // Disable stub call restrictions to always allow calls to abort.
1170 set_allow_stub_calls(true);
1171
1165 mov(r0, Operand(p0)); 1172 mov(r0, Operand(p0));
1166 push(r0); 1173 push(r0);
1167 mov(r0, Operand(Smi::FromInt(p1 - p0))); 1174 mov(r0, Operand(Smi::FromInt(p1 - p0)));
1168 push(r0); 1175 push(r0);
1169 CallRuntime(Runtime::kAbort, 2); 1176 CallRuntime(Runtime::kAbort, 2);
1170 // will not return here 1177 // will not return here
1171 } 1178 }
1172 1179
1173 1180
1174 void MacroAssembler::LoadContext(Register dst, int context_chain_length) { 1181 void MacroAssembler::LoadContext(Register dst, int context_chain_length) {
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after
1219 } 1226 }
1220 1227
1221 1228
1222 void CodePatcher::Emit(Address addr) { 1229 void CodePatcher::Emit(Address addr) {
1223 masm()->emit(reinterpret_cast<Instr>(addr)); 1230 masm()->emit(reinterpret_cast<Instr>(addr));
1224 } 1231 }
1225 #endif // ENABLE_DEBUGGER_SUPPORT 1232 #endif // ENABLE_DEBUGGER_SUPPORT
1226 1233
1227 1234
1228 } } // namespace v8::internal 1235 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | src/ia32/macro-assembler-ia32.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698