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

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

Issue 112082: Fix determining of JS lower stack bottom used in profiler's JS stack tracer to work with Chromium. (Closed)
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
« no previous file with comments | « no previous file | src/log.h » ('j') | src/top.h » ('J')
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 7141 matching lines...) Expand 10 before | Expand all | Expand 10 after
7152 GenerateThrowOutOfMemory(masm); 7152 GenerateThrowOutOfMemory(masm);
7153 // control flow for generated will not return. 7153 // control flow for generated will not return.
7154 7154
7155 __ bind(&throw_normal_exception); 7155 __ bind(&throw_normal_exception);
7156 GenerateThrowTOS(masm); 7156 GenerateThrowTOS(masm);
7157 } 7157 }
7158 7158
7159 7159
7160 void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) { 7160 void JSEntryStub::GenerateBody(MacroAssembler* masm, bool is_construct) {
7161 Label invoke, exit; 7161 Label invoke, exit;
7162 #ifdef ENABLE_LOGGING_AND_PROFILING
7163 Label not_outermost_js, not_outermost_js_2;
7164 #endif
7162 7165
7163 // Setup frame. 7166 // Setup frame.
7164 __ push(ebp); 7167 __ push(ebp);
7165 __ mov(ebp, Operand(esp)); 7168 __ mov(ebp, Operand(esp));
7166 7169
7167 // Save callee-saved registers (C calling conventions). 7170 // Save callee-saved registers (C calling conventions).
7168 int marker = is_construct ? StackFrame::ENTRY_CONSTRUCT : StackFrame::ENTRY; 7171 int marker = is_construct ? StackFrame::ENTRY_CONSTRUCT : StackFrame::ENTRY;
7169 // Push something that is not an arguments adaptor. 7172 // Push something that is not an arguments adaptor.
7170 __ push(Immediate(~ArgumentsAdaptorFrame::SENTINEL)); 7173 __ push(Immediate(~ArgumentsAdaptorFrame::SENTINEL));
7171 __ push(Immediate(Smi::FromInt(marker))); // @ function offset 7174 __ push(Immediate(Smi::FromInt(marker))); // @ function offset
7172 __ push(edi); 7175 __ push(edi);
7173 __ push(esi); 7176 __ push(esi);
7174 __ push(ebx); 7177 __ push(ebx);
7175 7178
7176 // Save copies of the top frame descriptor on the stack. 7179 // Save copies of the top frame descriptor on the stack.
7177 ExternalReference c_entry_fp(Top::k_c_entry_fp_address); 7180 ExternalReference c_entry_fp(Top::k_c_entry_fp_address);
7178 __ push(Operand::StaticVariable(c_entry_fp)); 7181 __ push(Operand::StaticVariable(c_entry_fp));
7179 7182
7183 #ifdef ENABLE_LOGGING_AND_PROFILING
7184 // If this is the outermost JS call, set js_entry_sp value.
7185 ExternalReference js_entry_sp(Top::k_js_entry_sp_address);
7186 __ cmp(Operand::StaticVariable(js_entry_sp), Immediate(0));
7187 __ j(NegateCondition(equal), &not_outermost_js);
7188 __ mov(Operand::StaticVariable(js_entry_sp), ebp);
7189 __ bind(&not_outermost_js);
7190 #endif
7191
7180 // Call a faked try-block that does the invoke. 7192 // Call a faked try-block that does the invoke.
7181 __ call(&invoke); 7193 __ call(&invoke);
7182 7194
7183 // Caught exception: Store result (exception) in the pending 7195 // Caught exception: Store result (exception) in the pending
7184 // exception field in the JSEnv and return a failure sentinel. 7196 // exception field in the JSEnv and return a failure sentinel.
7185 ExternalReference pending_exception(Top::k_pending_exception_address); 7197 ExternalReference pending_exception(Top::k_pending_exception_address);
7186 __ mov(Operand::StaticVariable(pending_exception), eax); 7198 __ mov(Operand::StaticVariable(pending_exception), eax);
7187 __ mov(eax, reinterpret_cast<int32_t>(Failure::Exception())); 7199 __ mov(eax, reinterpret_cast<int32_t>(Failure::Exception()));
7188 __ jmp(&exit); 7200 __ jmp(&exit);
7189 7201
(...skipping 23 matching lines...) Expand all
7213 } 7225 }
7214 __ mov(edx, Operand(edx, 0)); // deref address 7226 __ mov(edx, Operand(edx, 0)); // deref address
7215 __ lea(edx, FieldOperand(edx, Code::kHeaderSize)); 7227 __ lea(edx, FieldOperand(edx, Code::kHeaderSize));
7216 __ call(Operand(edx)); 7228 __ call(Operand(edx));
7217 7229
7218 // Unlink this frame from the handler chain. 7230 // Unlink this frame from the handler chain.
7219 __ pop(Operand::StaticVariable(ExternalReference(Top::k_handler_address))); 7231 __ pop(Operand::StaticVariable(ExternalReference(Top::k_handler_address)));
7220 // Pop next_sp. 7232 // Pop next_sp.
7221 __ add(Operand(esp), Immediate(StackHandlerConstants::kSize - kPointerSize)); 7233 __ add(Operand(esp), Immediate(StackHandlerConstants::kSize - kPointerSize));
7222 7234
7235 #ifdef ENABLE_LOGGING_AND_PROFILING
7236 // If current EBP value is the same as js_entry_sp value, it means that
7237 // the current function is the outermost.
7238 __ cmp(ebp, Operand::StaticVariable(js_entry_sp));
7239 __ j(NegateCondition(equal), &not_outermost_js_2);
7240 __ mov(Operand::StaticVariable(js_entry_sp), Immediate(0));
7241 __ bind(&not_outermost_js_2);
7242 #endif
7243
7223 // Restore the top frame descriptor from the stack. 7244 // Restore the top frame descriptor from the stack.
7224 __ bind(&exit); 7245 __ bind(&exit);
7225 __ pop(Operand::StaticVariable(ExternalReference(Top::k_c_entry_fp_address))); 7246 __ pop(Operand::StaticVariable(ExternalReference(Top::k_c_entry_fp_address)));
7226 7247
7227 // Restore callee-saved registers (C calling conventions). 7248 // Restore callee-saved registers (C calling conventions).
7228 __ pop(ebx); 7249 __ pop(ebx);
7229 __ pop(esi); 7250 __ pop(esi);
7230 __ pop(edi); 7251 __ pop(edi);
7231 __ add(Operand(esp), Immediate(2 * kPointerSize)); // remove markers 7252 __ add(Operand(esp), Immediate(2 * kPointerSize)); // remove markers
7232 7253
(...skipping 56 matching lines...) Expand 10 before | Expand all | Expand 10 after
7289 7310
7290 // Slow-case: Go through the JavaScript implementation. 7311 // Slow-case: Go through the JavaScript implementation.
7291 __ bind(&slow); 7312 __ bind(&slow);
7292 __ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION); 7313 __ InvokeBuiltin(Builtins::INSTANCE_OF, JUMP_FUNCTION);
7293 } 7314 }
7294 7315
7295 7316
7296 #undef __ 7317 #undef __
7297 7318
7298 } } // namespace v8::internal 7319 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | src/log.h » ('j') | src/top.h » ('J')

Powered by Google App Engine
This is Rietveld 408576698