HArgument instructions currently require a frame. In Lithium we can ensure a frame

is created for these instructions via a compile info flag.

BUG=

Review URL: https://codereview.chromium.org/14354003

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@14339 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent ad2c227e
...@@ -989,12 +989,14 @@ LInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) { ...@@ -989,12 +989,14 @@ LInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) {
LInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* instr) { LInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* instr) {
info()->MarkAsRequiresFrame();
LOperand* value = UseRegister(instr->value()); LOperand* value = UseRegister(instr->value());
return DefineAsRegister(new(zone()) LArgumentsLength(value)); return DefineAsRegister(new(zone()) LArgumentsLength(value));
} }
LInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { LInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) {
info()->MarkAsRequiresFrame();
return DefineAsRegister(new(zone()) LArgumentsElements); return DefineAsRegister(new(zone()) LArgumentsElements);
} }
...@@ -2456,6 +2458,7 @@ LInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) { ...@@ -2456,6 +2458,7 @@ LInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) {
LInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) { LInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) {
info()->MarkAsRequiresFrame();
LOperand* args = UseRegister(instr->arguments()); LOperand* args = UseRegister(instr->arguments());
LOperand* length = UseTempRegister(instr->length()); LOperand* length = UseTempRegister(instr->length());
LOperand* index = UseRegister(instr->index()); LOperand* index = UseRegister(instr->index());
......
...@@ -83,7 +83,8 @@ class LCodeGen BASE_EMBEDDED { ...@@ -83,7 +83,8 @@ class LCodeGen BASE_EMBEDDED {
bool NeedsEagerFrame() const { bool NeedsEagerFrame() const {
return GetStackSlotCount() > 0 || return GetStackSlotCount() > 0 ||
info()->is_non_deferred_calling() || info()->is_non_deferred_calling() ||
!info()->IsStub(); !info()->IsStub() ||
info()->requires_frame();
} }
bool NeedsDeferredFrame() const { bool NeedsDeferredFrame() const {
return !NeedsEagerFrame() && info()->is_deferred_calling(); return !NeedsEagerFrame() && info()->is_deferred_calling();
......
...@@ -143,6 +143,14 @@ class CompilationInfo { ...@@ -143,6 +143,14 @@ class CompilationInfo {
return SavesCallerDoubles::decode(flags_); return SavesCallerDoubles::decode(flags_);
} }
void MarkAsRequiresFrame() {
flags_ |= RequiresFrame::encode(true);
}
bool requires_frame() const {
return RequiresFrame::decode(flags_);
}
void SetParseRestriction(ParseRestriction restriction) { void SetParseRestriction(ParseRestriction restriction) {
flags_ = ParseRestricitonField::update(flags_, restriction); flags_ = ParseRestricitonField::update(flags_, restriction);
} }
...@@ -300,6 +308,8 @@ class CompilationInfo { ...@@ -300,6 +308,8 @@ class CompilationInfo {
class SavesCallerDoubles: public BitField<bool, 12, 1> {}; class SavesCallerDoubles: public BitField<bool, 12, 1> {};
// If the set of valid statements is restricted. // If the set of valid statements is restricted.
class ParseRestricitonField: public BitField<ParseRestriction, 13, 1> {}; class ParseRestricitonField: public BitField<ParseRestriction, 13, 1> {};
// If the function requires a frame (for unspecified reasons)
class RequiresFrame: public BitField<bool, 14, 1> {};
unsigned flags_; unsigned flags_;
......
...@@ -87,7 +87,8 @@ class LCodeGen BASE_EMBEDDED { ...@@ -87,7 +87,8 @@ class LCodeGen BASE_EMBEDDED {
bool NeedsEagerFrame() const { bool NeedsEagerFrame() const {
return GetStackSlotCount() > 0 || return GetStackSlotCount() > 0 ||
info()->is_non_deferred_calling() || info()->is_non_deferred_calling() ||
!info()->IsStub(); !info()->IsStub() ||
info()->requires_frame();
} }
bool NeedsDeferredFrame() const { bool NeedsDeferredFrame() const {
return !NeedsEagerFrame() && info()->is_deferred_calling(); return !NeedsEagerFrame() && info()->is_deferred_calling();
......
...@@ -1056,11 +1056,13 @@ LInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) { ...@@ -1056,11 +1056,13 @@ LInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) {
LInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* length) { LInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* length) {
info()->MarkAsRequiresFrame();
return DefineAsRegister(new(zone()) LArgumentsLength(Use(length->value()))); return DefineAsRegister(new(zone()) LArgumentsLength(Use(length->value())));
} }
LInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { LInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) {
info()->MarkAsRequiresFrame();
return DefineAsRegister(new(zone()) LArgumentsElements); return DefineAsRegister(new(zone()) LArgumentsElements);
} }
...@@ -2575,6 +2577,7 @@ LInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) { ...@@ -2575,6 +2577,7 @@ LInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) {
LInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) { LInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) {
info()->MarkAsRequiresFrame();
LOperand* args = UseRegister(instr->arguments()); LOperand* args = UseRegister(instr->arguments());
LOperand* length = UseTempRegister(instr->length()); LOperand* length = UseTempRegister(instr->length());
LOperand* index = Use(instr->index()); LOperand* index = Use(instr->index());
......
...@@ -83,7 +83,8 @@ class LCodeGen BASE_EMBEDDED { ...@@ -83,7 +83,8 @@ class LCodeGen BASE_EMBEDDED {
bool NeedsEagerFrame() const { bool NeedsEagerFrame() const {
return GetStackSlotCount() > 0 || return GetStackSlotCount() > 0 ||
info()->is_non_deferred_calling() || info()->is_non_deferred_calling() ||
!info()->IsStub(); !info()->IsStub() ||
info()->requires_frame();
} }
bool NeedsDeferredFrame() const { bool NeedsDeferredFrame() const {
return !NeedsEagerFrame() && info()->is_deferred_calling(); return !NeedsEagerFrame() && info()->is_deferred_calling();
......
...@@ -997,11 +997,13 @@ LInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) { ...@@ -997,11 +997,13 @@ LInstruction* LChunkBuilder::DoCompareMap(HCompareMap* instr) {
LInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* length) { LInstruction* LChunkBuilder::DoArgumentsLength(HArgumentsLength* length) {
info()->MarkAsRequiresFrame();
return DefineAsRegister(new(zone()) LArgumentsLength(Use(length->value()))); return DefineAsRegister(new(zone()) LArgumentsLength(Use(length->value())));
} }
LInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) { LInstruction* LChunkBuilder::DoArgumentsElements(HArgumentsElements* elems) {
info()->MarkAsRequiresFrame();
return DefineAsRegister(new(zone()) LArgumentsElements); return DefineAsRegister(new(zone()) LArgumentsElements);
} }
...@@ -2378,6 +2380,7 @@ LInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) { ...@@ -2378,6 +2380,7 @@ LInstruction* LChunkBuilder::DoArgumentsObject(HArgumentsObject* instr) {
LInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) { LInstruction* LChunkBuilder::DoAccessArgumentsAt(HAccessArgumentsAt* instr) {
info()->MarkAsRequiresFrame();
LOperand* args = UseRegister(instr->arguments()); LOperand* args = UseRegister(instr->arguments());
LOperand* length = UseTempRegister(instr->length()); LOperand* length = UseTempRegister(instr->length());
LOperand* index = Use(instr->index()); LOperand* index = Use(instr->index());
......
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