Index: src/ia32/lithium-codegen-ia32.h |
diff --git a/src/ia32/lithium-codegen-ia32.h b/src/ia32/lithium-codegen-ia32.h |
index 4414e6a26c779d3423363305e0dd6dea4c3fba3a..84ea3a13d55c087734a2703f704c9ab8921a7baa 100644 |
--- a/src/ia32/lithium-codegen-ia32.h |
+++ b/src/ia32/lithium-codegen-ia32.h |
@@ -164,16 +164,44 @@ class LCodeGen BASE_EMBEDDED { |
bool GenerateRelocPadding(); |
bool GenerateSafepointTable(); |
- void CallCode(Handle<Code> code, RelocInfo::Mode mode, LInstruction* instr, |
- bool adjusted = true); |
- void CallRuntime(const Runtime::Function* fun, int argc, LInstruction* instr, |
- bool adjusted = true); |
- void CallRuntime(Runtime::FunctionId id, int argc, LInstruction* instr, |
- bool adjusted = true) { |
+ enum ContextMode { |
+ RESTORE_CONTEXT, |
+ CONTEXT_ADJUSTED |
+ }; |
+ |
+ enum SafepointMode { |
+ RECORD_SIMPLE_SAFEPOINT, |
+ RECORD_SAFEPOINT_WITH_REGISTERS_AND_NO_ARGUMENTS |
+ }; |
+ |
+ void CallCode(Handle<Code> code, |
+ RelocInfo::Mode mode, |
+ LInstruction* instr, |
+ ContextMode context_mode); |
+ |
+ void CallCodeGeneric(Handle<Code> code, |
+ RelocInfo::Mode mode, |
+ LInstruction* instr, |
+ ContextMode context_mode, |
+ SafepointMode safepoint_mode); |
+ |
+ void CallRuntime(const Runtime::Function* fun, |
+ int argc, |
+ LInstruction* instr, |
+ ContextMode context_mode); |
+ |
+ void CallRuntime(Runtime::FunctionId id, |
+ int argc, |
+ LInstruction* instr, |
+ ContextMode context_mode) { |
const Runtime::Function* function = Runtime::FunctionForId(id); |
- CallRuntime(function, argc, instr, adjusted); |
+ CallRuntime(function, argc, instr, context_mode); |
} |
+ void CallRuntimeFromDeferred(Runtime::FunctionId id, |
+ int argc, |
+ LInstruction* instr); |
+ |
// Generate a direct call to a known function. Expects the function |
// to be in edi. |
void CallKnownFunction(Handle<JSFunction> function, |
@@ -182,7 +210,9 @@ class LCodeGen BASE_EMBEDDED { |
void LoadHeapObject(Register result, Handle<HeapObject> object); |
- void RegisterLazyDeoptimization(LInstruction* instr); |
+ void RegisterLazyDeoptimization(LInstruction* instr, |
+ SafepointMode safepoint_mode); |
+ |
void RegisterEnvironmentForDeoptimization(LEnvironment* environment); |
void DeoptimizeIf(Condition cc, LEnvironment* environment); |
@@ -281,6 +311,26 @@ class LCodeGen BASE_EMBEDDED { |
// Compiler from a set of parallel moves to a sequential list of moves. |
LGapResolver resolver_; |
+ bool safepoint_registers_pushed_; |
+ |
+ class PushSafepointRegistersScope BASE_EMBEDDED { |
+ public: |
+ PushSafepointRegistersScope(LCodeGen* codegen) : codegen_(codegen) { |
+ ASSERT(!codegen_->safepoint_registers_pushed_); |
+ codegen_->safepoint_registers_pushed_ = true; |
+ codegen_->masm_->PushSafepointRegisters(); |
+ } |
+ |
+ ~PushSafepointRegistersScope() { |
+ ASSERT(codegen_->safepoint_registers_pushed_); |
+ codegen_->safepoint_registers_pushed_ = false; |
+ codegen_->masm_->PopSafepointRegisters(); |
+ } |
+ |
+ private: |
+ LCodeGen* codegen_; |
+ }; |
+ |
friend class LDeferredCode; |
friend class LEnvironment; |
friend class SafepointGenerator; |