| 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;
|
|
|