Commit 07ba7ad0 authored by erik.corry@gmail.com's avatar erik.corry@gmail.com

Move the is_pregenerated flag so it does not overlap other flags.

Remove the before-or-after InstanceOf stub rule, which was too
subtle and lacked checking ssertions.
Unify the way the CEntry stub is pregenerated so that it is done
in the same way.
Review URL: http://codereview.chromium.org/8065006

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@9466 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent fd2bac7e
...@@ -3405,6 +3405,7 @@ bool CEntryStub::IsPregenerated() { ...@@ -3405,6 +3405,7 @@ bool CEntryStub::IsPregenerated() {
void CodeStub::GenerateStubsAheadOfTime() { void CodeStub::GenerateStubsAheadOfTime() {
CEntryStub::GenerateAheadOfTime();
WriteInt32ToHeapNumberStub::GenerateFixedRegStubsAheadOfTime(); WriteInt32ToHeapNumberStub::GenerateFixedRegStubsAheadOfTime();
StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime(); StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime();
RecordWriteStub::GenerateFixedRegStubsAheadOfTime(); RecordWriteStub::GenerateFixedRegStubsAheadOfTime();
...@@ -3419,6 +3420,13 @@ void CodeStub::GenerateFPStubs() { ...@@ -3419,6 +3420,13 @@ void CodeStub::GenerateFPStubs() {
} }
void CEntryStub::GenerateAheadOfTime() {
CEntryStub stub(1, kDontSaveFPRegs);
Handle<Code> code = stub.GetCode();
code->set_is_pregenerated(true);
}
void CEntryStub::GenerateThrowTOS(MacroAssembler* masm) { void CEntryStub::GenerateThrowTOS(MacroAssembler* masm) {
__ Throw(r0); __ Throw(r0);
} }
......
...@@ -130,6 +130,8 @@ Handle<Code> CodeStub::GetCode() { ...@@ -130,6 +130,8 @@ Handle<Code> CodeStub::GetCode() {
heap->public_set_code_stubs(*dict); heap->public_set_code_stubs(*dict);
code = *new_object; code = *new_object;
Activate(code); Activate(code);
} else {
ASSERT(IsPregenerated() == code->is_pregenerated());
} }
ASSERT(!NeedsImmovableCode() || heap->lo_space()->Contains(code)); ASSERT(!NeedsImmovableCode() || heap->lo_space()->Contains(code));
......
...@@ -50,13 +50,6 @@ namespace internal { ...@@ -50,13 +50,6 @@ namespace internal {
V(RegExpExec) \ V(RegExpExec) \
V(TranscendentalCache) \ V(TranscendentalCache) \
V(Instanceof) \ V(Instanceof) \
/* All stubs above this line only exist in a few versions, which are */ \
/* generated ahead of time. Therefore compiling a call to one of */ \
/* them can't cause a new stub to be compiled, so compiling a call to */ \
/* them is GC safe. The ones below this line exist in many variants */ \
/* so code compiling a call to one can cause a GC. This means they */ \
/* can't be called from other stubs, since stub generation code is */ \
/* not GC safe. */ \
V(ConvertToDouble) \ V(ConvertToDouble) \
V(WriteInt32ToHeapNumber) \ V(WriteInt32ToHeapNumber) \
V(StackCheck) \ V(StackCheck) \
...@@ -154,9 +147,7 @@ class CodeStub BASE_EMBEDDED { ...@@ -154,9 +147,7 @@ class CodeStub BASE_EMBEDDED {
} }
// See comment above, where Instanceof is defined. // See comment above, where Instanceof is defined.
virtual bool IsPregenerated() { virtual bool IsPregenerated() { return false; }
return MajorKey() <= Instanceof;
}
static void GenerateStubsAheadOfTime(); static void GenerateStubsAheadOfTime();
static void GenerateFPStubs(); static void GenerateFPStubs();
...@@ -574,6 +565,7 @@ class CEntryStub : public CodeStub { ...@@ -574,6 +565,7 @@ class CEntryStub : public CodeStub {
// their code generation. On machines that always have gp registers (x64) we // their code generation. On machines that always have gp registers (x64) we
// can generate both variants ahead of time. // can generate both variants ahead of time.
virtual bool IsPregenerated(); virtual bool IsPregenerated();
static void GenerateAheadOfTime();
private: private:
void GenerateCore(MacroAssembler* masm, void GenerateCore(MacroAssembler* masm,
......
...@@ -2170,9 +2170,6 @@ void Heap::CreateFixedStubs() { ...@@ -2170,9 +2170,6 @@ void Heap::CreateFixedStubs() {
// create them if we need them during the creation of another stub. // create them if we need them during the creation of another stub.
// Stub creation mixes raw pointers and handles in an unsafe manner so // Stub creation mixes raw pointers and handles in an unsafe manner so
// we cannot create stubs while we are creating stubs. // we cannot create stubs while we are creating stubs.
CEntryStub ces(1);
ces.GetCode();
CodeStub::GenerateStubsAheadOfTime(); CodeStub::GenerateStubsAheadOfTime();
} }
......
...@@ -4415,6 +4415,7 @@ bool CEntryStub::IsPregenerated() { ...@@ -4415,6 +4415,7 @@ bool CEntryStub::IsPregenerated() {
void CodeStub::GenerateStubsAheadOfTime() { void CodeStub::GenerateStubsAheadOfTime() {
CEntryStub::GenerateAheadOfTime();
StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime(); StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime();
// It is important that the store buffer overflow stubs are generated first. // It is important that the store buffer overflow stubs are generated first.
RecordWriteStub::GenerateFixedRegStubsAheadOfTime(); RecordWriteStub::GenerateFixedRegStubsAheadOfTime();
...@@ -4429,6 +4430,13 @@ void CodeStub::GenerateFPStubs() { ...@@ -4429,6 +4430,13 @@ void CodeStub::GenerateFPStubs() {
} }
void CEntryStub::GenerateAheadOfTime() {
CEntryStub stub(1, kDontSaveFPRegs);
Handle<Code> code = stub.GetCode();
code->set_is_pregenerated(true);
}
void CEntryStub::GenerateThrowTOS(MacroAssembler* masm) { void CEntryStub::GenerateThrowTOS(MacroAssembler* masm) {
__ Throw(eax); __ Throw(eax);
} }
......
...@@ -3888,7 +3888,7 @@ class Code: public HeapObject { ...@@ -3888,7 +3888,7 @@ class Code: public HeapObject {
class IsPregeneratedField: public BitField<bool, 14, 1> {}; class IsPregeneratedField: public BitField<bool, 14, 1> {};
// Signed field cannot be encoded using the BitField class. // Signed field cannot be encoded using the BitField class.
static const int kArgumentsCountShift = 14; static const int kArgumentsCountShift = 15;
static const int kArgumentsCountMask = ~((1 << kArgumentsCountShift) - 1); static const int kArgumentsCountMask = ~((1 << kArgumentsCountShift) - 1);
static const int kFlagsNotUsedInLookup = static const int kFlagsNotUsedInLookup =
......
...@@ -3370,13 +3370,16 @@ bool CEntryStub::NeedsImmovableCode() { ...@@ -3370,13 +3370,16 @@ bool CEntryStub::NeedsImmovableCode() {
bool CEntryStub::IsPregenerated() { bool CEntryStub::IsPregenerated() {
#ifdef _WIN64
return result_size_ == 1; return result_size_ == 1;
#else
return true;
#endif
} }
void CodeStub::GenerateStubsAheadOfTime() { void CodeStub::GenerateStubsAheadOfTime() {
CEntryStub save_doubles(1, kSaveFPRegs); CEntryStub::GenerateAheadOfTime();
save_doubles.GetCode()->set_is_pregenerated(true);
StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime(); StoreBufferOverflowStub::GenerateFixedRegStubsAheadOfTime();
// It is important that the store buffer overflow stubs are generated first. // It is important that the store buffer overflow stubs are generated first.
RecordWriteStub::GenerateFixedRegStubsAheadOfTime(); RecordWriteStub::GenerateFixedRegStubsAheadOfTime();
...@@ -3387,6 +3390,14 @@ void CodeStub::GenerateFPStubs() { ...@@ -3387,6 +3390,14 @@ void CodeStub::GenerateFPStubs() {
} }
void CEntryStub::GenerateAheadOfTime() {
CEntryStub stub(1, kDontSaveFPRegs);
stub.GetCode()->set_is_pregenerated(true);
CEntryStub save_doubles(1, kSaveFPRegs);
save_doubles.GetCode()->set_is_pregenerated(true);
}
void CEntryStub::GenerateThrowTOS(MacroAssembler* masm) { void CEntryStub::GenerateThrowTOS(MacroAssembler* masm) {
// Throw exception in eax. // Throw exception in eax.
__ Throw(rax); __ Throw(rax);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment