Revision: 6964
Author: [email protected]
Date: Mon Feb 28 04:09:53 2011
Log: Detect overflow of contant pool in virtual frame compiler.
Gracefully fallback to a different code pattern when that happens.
BUG=http://crbug.com/61802
TEST=none
Review URL: http://codereview.chromium.org/6599002
http://code.google.com/p/v8/source/detail?r=6964
Modified:
/branches/bleeding_edge/src/frame-element.h
/branches/bleeding_edge/src/ia32/codegen-ia32.cc
/branches/bleeding_edge/src/ia32/virtual-frame-ia32.cc
/branches/bleeding_edge/src/ia32/virtual-frame-ia32.h
/branches/bleeding_edge/src/virtual-frame-heavy-inl.h
/branches/bleeding_edge/src/x64/codegen-x64.cc
/branches/bleeding_edge/src/x64/virtual-frame-x64.h
=======================================
--- /branches/bleeding_edge/src/frame-element.h Tue Dec 7 03:31:57 2010
+++ /branches/bleeding_edge/src/frame-element.h Mon Feb 28 04:09:53 2011
@@ -113,6 +113,10 @@
static ZoneObjectList* ConstantList();
+ static bool ConstantPoolOverflowed() {
+ return !DataField::is_valid(ConstantList()->length());
+ }
+
// Clear the constants indirection table.
static void ClearConstantList() {
ConstantList()->Clear();
=======================================
--- /branches/bleeding_edge/src/ia32/codegen-ia32.cc Tue Feb 22 09:20:25
2011
+++ /branches/bleeding_edge/src/ia32/codegen-ia32.cc Mon Feb 28 04:09:53
2011
@@ -5360,10 +5360,20 @@
void CodeGenerator::VisitLiteral(Literal* node) {
Comment cmnt(masm_, "[ Literal");
- if (in_safe_int32_mode()) {
- frame_->PushUntaggedElement(node->handle());
+ if (frame_->ConstantPoolOverflowed()) {
+ Result temp = allocator_->Allocate();
+ ASSERT(temp.is_valid());
+ if (in_safe_int32_mode()) {
+ temp.set_untagged_int32(true);
+ }
+ __ Set(temp.reg(), Immediate(node->handle()));
+ frame_->Push(&temp);
} else {
- frame_->Push(node->handle());
+ if (in_safe_int32_mode()) {
+ frame_->PushUntaggedElement(node->handle());
+ } else {
+ frame_->Push(node->handle());
+ }
}
}
=======================================
--- /branches/bleeding_edge/src/ia32/virtual-frame-ia32.cc Sun Feb 13
08:19:53 2011
+++ /branches/bleeding_edge/src/ia32/virtual-frame-ia32.cc Mon Feb 28
04:09:53 2011
@@ -1306,6 +1306,7 @@
void VirtualFrame::PushUntaggedElement(Handle<Object> value) {
+ ASSERT(!ConstantPoolOverflowed());
elements_.Add(FrameElement::ConstantElement(value,
FrameElement::NOT_SYNCED));
elements_[element_count() - 1].set_untagged_int32(true);
}
=======================================
--- /branches/bleeding_edge/src/ia32/virtual-frame-ia32.h Sun Feb 13
08:19:53 2011
+++ /branches/bleeding_edge/src/ia32/virtual-frame-ia32.h Mon Feb 28
04:09:53 2011
@@ -419,6 +419,8 @@
void EmitPush(Immediate immediate,
TypeInfo info = TypeInfo::Unknown());
+ inline bool ConstantPoolOverflowed();
+
// Push an element on the virtual frame.
inline void Push(Register reg, TypeInfo info = TypeInfo::Unknown());
inline void Push(Handle<Object> value);
=======================================
--- /branches/bleeding_edge/src/virtual-frame-heavy-inl.h Tue Dec 7
03:01:02 2010
+++ /branches/bleeding_edge/src/virtual-frame-heavy-inl.h Mon Feb 28
04:09:53 2011
@@ -80,9 +80,15 @@
elements_.Add(element);
}
}
+
+
+bool VirtualFrame::ConstantPoolOverflowed() {
+ return FrameElement::ConstantPoolOverflowed();
+}
void VirtualFrame::Push(Handle<Object> value) {
+ ASSERT(!ConstantPoolOverflowed());
FrameElement element =
FrameElement::ConstantElement(value, FrameElement::NOT_SYNCED);
elements_.Add(element);
=======================================
--- /branches/bleeding_edge/src/x64/codegen-x64.cc Fri Feb 25 05:22:38 2011
+++ /branches/bleeding_edge/src/x64/codegen-x64.cc Mon Feb 28 04:09:53 2011
@@ -4694,7 +4694,18 @@
void CodeGenerator::VisitLiteral(Literal* node) {
Comment cmnt(masm_, "[ Literal");
- frame_->Push(node->handle());
+ if (frame_->ConstantPoolOverflowed()) {
+ Result temp = allocator_->Allocate();
+ ASSERT(temp.is_valid());
+ if (node->handle()->IsSmi()) {
+ __ Move(temp.reg(), Smi::cast(*node->handle()));
+ } else {
+ __ movq(temp.reg(), node->handle(), RelocInfo::EMBEDDED_OBJECT);
+ }
+ frame_->Push(&temp);
+ } else {
+ frame_->Push(node->handle());
+ }
}
=======================================
--- /branches/bleeding_edge/src/x64/virtual-frame-x64.h Fri Feb 25 05:22:38
2011
+++ /branches/bleeding_edge/src/x64/virtual-frame-x64.h Mon Feb 28 04:09:53
2011
@@ -400,6 +400,8 @@
// Uses kScratchRegister, emits appropriate relocation info.
void EmitPush(Handle<Object> value);
+ inline bool ConstantPoolOverflowed();
+
// Push an element on the virtual frame.
inline void Push(Register reg, TypeInfo info = TypeInfo::Unknown());
inline void Push(Handle<Object> value);
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev