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

Side by Side Diff: src/ia32/codegen-ia32.cc

Issue 119414: Cleanup of ARM exception handlers. Remove the unused code and... (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 11 years, 6 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 | Annotate | Revision Log
« no previous file with comments | « src/frames-inl.h ('k') | src/ia32/frames-ia32.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 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 3234 matching lines...) Expand 10 before | Expand all | Expand 10 after
3245 has_unlinks = has_unlinks || shadows[i]->is_linked(); 3245 has_unlinks = has_unlinks || shadows[i]->is_linked();
3246 } 3246 }
3247 function_return_is_shadowed_ = function_return_was_shadowed; 3247 function_return_is_shadowed_ = function_return_was_shadowed;
3248 3248
3249 // Get an external reference to the handler address. 3249 // Get an external reference to the handler address.
3250 ExternalReference handler_address(Top::k_handler_address); 3250 ExternalReference handler_address(Top::k_handler_address);
3251 3251
3252 // Make sure that there's nothing left on the stack above the 3252 // Make sure that there's nothing left on the stack above the
3253 // handler structure. 3253 // handler structure.
3254 if (FLAG_debug_code) { 3254 if (FLAG_debug_code) {
3255 ASSERT(StackHandlerConstants::kAddressDisplacement == 0);
3256 __ mov(eax, Operand::StaticVariable(handler_address)); 3255 __ mov(eax, Operand::StaticVariable(handler_address));
3257 __ cmp(esp, Operand(eax)); 3256 __ cmp(esp, Operand(eax));
3258 __ Assert(equal, "stack pointer should point to top handler"); 3257 __ Assert(equal, "stack pointer should point to top handler");
3259 } 3258 }
3260 3259
3261 // If we can fall off the end of the try block, unlink from try chain. 3260 // If we can fall off the end of the try block, unlink from try chain.
3262 if (has_valid_frame()) { 3261 if (has_valid_frame()) {
3263 // The next handler address is on top of the frame. Unlink from 3262 // The next handler address is on top of the frame. Unlink from
3264 // the handler list and drop the rest of this handler from the 3263 // the handler list and drop the rest of this handler from the
3265 // frame. 3264 // frame.
(...skipping 18 matching lines...) Expand all
3284 } else { 3283 } else {
3285 shadows[i]->Bind(); 3284 shadows[i]->Bind();
3286 } 3285 }
3287 // Because we can be jumping here (to spilled code) from 3286 // Because we can be jumping here (to spilled code) from
3288 // unspilled code, we need to reestablish a spilled frame at 3287 // unspilled code, we need to reestablish a spilled frame at
3289 // this block. 3288 // this block.
3290 frame_->SpillAll(); 3289 frame_->SpillAll();
3291 3290
3292 // Reload sp from the top handler, because some statements that we 3291 // Reload sp from the top handler, because some statements that we
3293 // break from (eg, for...in) may have left stuff on the stack. 3292 // break from (eg, for...in) may have left stuff on the stack.
3294 ASSERT(StackHandlerConstants::kAddressDisplacement == 0);
3295 __ mov(esp, Operand::StaticVariable(handler_address)); 3293 __ mov(esp, Operand::StaticVariable(handler_address));
3296 frame_->Forget(frame_->height() - handler_height); 3294 frame_->Forget(frame_->height() - handler_height);
3297 3295
3298 ASSERT(StackHandlerConstants::kNextOffset == 0); 3296 ASSERT(StackHandlerConstants::kNextOffset == 0);
3299 frame_->EmitPop(Operand::StaticVariable(handler_address)); 3297 frame_->EmitPop(Operand::StaticVariable(handler_address));
3300 frame_->Drop(StackHandlerConstants::kSize / kPointerSize - 1); 3298 frame_->Drop(StackHandlerConstants::kSize / kPointerSize - 1);
3301 3299
3302 if (i == kReturnShadowIndex) { 3300 if (i == kReturnShadowIndex) {
3303 if (!function_return_is_shadowed_) frame_->PrepareForReturn(); 3301 if (!function_return_is_shadowed_) frame_->PrepareForReturn();
3304 shadows[i]->other_target()->Jump(&return_value); 3302 shadows[i]->other_target()->Jump(&return_value);
(...skipping 104 matching lines...) Expand 10 before | Expand all | Expand 10 after
3409 shadows[i]->Bind(); 3407 shadows[i]->Bind();
3410 } 3408 }
3411 // Because we can be jumping here (to spilled code) from 3409 // Because we can be jumping here (to spilled code) from
3412 // unspilled code, we need to reestablish a spilled frame at 3410 // unspilled code, we need to reestablish a spilled frame at
3413 // this block. 3411 // this block.
3414 frame_->SpillAll(); 3412 frame_->SpillAll();
3415 3413
3416 // Reload sp from the top handler, because some statements that 3414 // Reload sp from the top handler, because some statements that
3417 // we break from (eg, for...in) may have left stuff on the 3415 // we break from (eg, for...in) may have left stuff on the
3418 // stack. 3416 // stack.
3419 ASSERT(StackHandlerConstants::kAddressDisplacement == 0);
3420 __ mov(esp, Operand::StaticVariable(handler_address)); 3417 __ mov(esp, Operand::StaticVariable(handler_address));
3421 frame_->Forget(frame_->height() - handler_height); 3418 frame_->Forget(frame_->height() - handler_height);
3422 3419
3423 // Unlink this handler and drop it from the frame. 3420 // Unlink this handler and drop it from the frame.
3424 ASSERT(StackHandlerConstants::kNextOffset == 0); 3421 ASSERT(StackHandlerConstants::kNextOffset == 0);
3425 frame_->EmitPop(Operand::StaticVariable(handler_address)); 3422 frame_->EmitPop(Operand::StaticVariable(handler_address));
3426 frame_->Drop(StackHandlerConstants::kSize / kPointerSize - 1); 3423 frame_->Drop(StackHandlerConstants::kSize / kPointerSize - 1);
3427 3424
3428 if (i == kReturnShadowIndex) { 3425 if (i == kReturnShadowIndex) {
3429 // If this target shadowed the function return, materialize 3426 // If this target shadowed the function return, materialize
(...skipping 3518 matching lines...) Expand 10 before | Expand all | Expand 10 after
6948 __ Set(eax, Immediate(argc_)); 6945 __ Set(eax, Immediate(argc_));
6949 __ Set(ebx, Immediate(0)); 6946 __ Set(ebx, Immediate(0));
6950 __ GetBuiltinEntry(edx, Builtins::CALL_NON_FUNCTION); 6947 __ GetBuiltinEntry(edx, Builtins::CALL_NON_FUNCTION);
6951 Handle<Code> adaptor(Builtins::builtin(Builtins::ArgumentsAdaptorTrampoline)); 6948 Handle<Code> adaptor(Builtins::builtin(Builtins::ArgumentsAdaptorTrampoline));
6952 __ jmp(adaptor, RelocInfo::CODE_TARGET); 6949 __ jmp(adaptor, RelocInfo::CODE_TARGET);
6953 } 6950 }
6954 6951
6955 6952
6956 6953
6957 void CEntryStub::GenerateThrowTOS(MacroAssembler* masm) { 6954 void CEntryStub::GenerateThrowTOS(MacroAssembler* masm) {
6955 // eax holds the exception.
6956
6958 // Adjust this code if not the case. 6957 // Adjust this code if not the case.
6959 ASSERT(StackHandlerConstants::kSize == 4 * kPointerSize); 6958 ASSERT(StackHandlerConstants::kSize == 4 * kPointerSize);
6960 6959
6961 // Drop the sp to the top of the handler. 6960 // Drop the sp to the top of the handler.
6962 ASSERT(StackHandlerConstants::kAddressDisplacement == 0);
6963 ExternalReference handler_address(Top::k_handler_address); 6961 ExternalReference handler_address(Top::k_handler_address);
6964 __ mov(esp, Operand::StaticVariable(handler_address)); 6962 __ mov(esp, Operand::StaticVariable(handler_address));
6965 6963
6966 // Restore next handler and frame pointer, discard handler state. 6964 // Restore next handler and frame pointer, discard handler state.
6967 ASSERT(StackHandlerConstants::kNextOffset == 0); 6965 ASSERT(StackHandlerConstants::kNextOffset == 0);
6968 __ pop(Operand::StaticVariable(handler_address)); 6966 __ pop(Operand::StaticVariable(handler_address));
6969 ASSERT(StackHandlerConstants::kFPOffset == 1 * kPointerSize); 6967 ASSERT(StackHandlerConstants::kFPOffset == 1 * kPointerSize);
6970 __ pop(ebp); 6968 __ pop(ebp);
6971 __ pop(edx); // Remove state. 6969 __ pop(edx); // Remove state.
6972 6970
6973 // Before returning we restore the context from the frame pointer if not NULL. 6971 // Before returning we restore the context from the frame pointer if
6974 // The frame pointer is NULL in the exception handler of a JS entry frame. 6972 // not NULL. The frame pointer is NULL in the exception handler of
6975 __ xor_(esi, Operand(esi)); // tentatively set context pointer to NULL 6973 // a JS entry frame.
6974 __ xor_(esi, Operand(esi)); // Tentatively set context pointer to NULL.
6976 Label skip; 6975 Label skip;
6977 __ cmp(ebp, 0); 6976 __ cmp(ebp, 0);
6978 __ j(equal, &skip, not_taken); 6977 __ j(equal, &skip, not_taken);
6979 __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset)); 6978 __ mov(esi, Operand(ebp, StandardFrameConstants::kContextOffset));
6980 __ bind(&skip); 6979 __ bind(&skip);
6981 6980
6982 ASSERT(StackHandlerConstants::kPCOffset == 3 * kPointerSize); 6981 ASSERT(StackHandlerConstants::kPCOffset == 3 * kPointerSize);
6983 __ ret(0); 6982 __ ret(0);
6984 } 6983 }
6985 6984
(...skipping 76 matching lines...) Expand 10 before | Expand all | Expand 10 after
7062 // Retry. 7061 // Retry.
7063 __ bind(&retry); 7062 __ bind(&retry);
7064 } 7063 }
7065 7064
7066 7065
7067 void CEntryStub::GenerateThrowOutOfMemory(MacroAssembler* masm) { 7066 void CEntryStub::GenerateThrowOutOfMemory(MacroAssembler* masm) {
7068 // Adjust this code if not the case. 7067 // Adjust this code if not the case.
7069 ASSERT(StackHandlerConstants::kSize == 4 * kPointerSize); 7068 ASSERT(StackHandlerConstants::kSize == 4 * kPointerSize);
7070 7069
7071 // Drop sp to the top stack handler. 7070 // Drop sp to the top stack handler.
7072 ASSERT(StackHandlerConstants::kAddressDisplacement == 0);
7073 ExternalReference handler_address(Top::k_handler_address); 7071 ExternalReference handler_address(Top::k_handler_address);
7074 __ mov(esp, Operand::StaticVariable(handler_address)); 7072 __ mov(esp, Operand::StaticVariable(handler_address));
7075 7073
7076 // Unwind the handlers until the ENTRY handler is found. 7074 // Unwind the handlers until the ENTRY handler is found.
7077 Label loop, done; 7075 Label loop, done;
7078 __ bind(&loop); 7076 __ bind(&loop);
7079 // Load the type of the current stack handler. 7077 // Load the type of the current stack handler.
7080 const int kStateOffset = StackHandlerConstants::kStateOffset; 7078 const int kStateOffset = StackHandlerConstants::kStateOffset;
7081 __ cmp(Operand(esp, kStateOffset), Immediate(StackHandler::ENTRY)); 7079 __ cmp(Operand(esp, kStateOffset), Immediate(StackHandler::ENTRY));
7082 __ j(equal, &done); 7080 __ j(equal, &done);
(...skipping 251 matching lines...) Expand 10 before | Expand all | Expand 10 after
7334 7332
7335 // Slow-case: Go through the JavaScript implementation. 7333 // Slow-case: Go through the JavaScript implementation.
7336 __ bind(&slow); 7334 __ bind(&slow);
7337 __ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION); 7335 __ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION);
7338 } 7336 }
7339 7337
7340 7338
7341 #undef __ 7339 #undef __
7342 7340
7343 } } // namespace v8::internal 7341 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/frames-inl.h ('k') | src/ia32/frames-ia32.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698