Author: [EMAIL PROTECTED]
Date: Mon Nov 10 14:53:19 2008
New Revision: 727
Modified:
branches/bleeding_edge/src/bootstrapper.cc
branches/bleeding_edge/src/bootstrapper.h
branches/bleeding_edge/src/codegen-arm.cc
branches/bleeding_edge/src/macro-assembler-arm.cc
branches/bleeding_edge/src/macro-assembler-ia32.cc
Log:
Fix CALL_NON_FUNCTION.
Using two flags to specify the state of targets:
1) FixupIsPCRelative specifies where to patch (relative to pc or at pc);
2) FixupUseCodeObject specifies what to patch (code object or start
address).
Review URL: http://codereview.chromium.org/10233
Modified: branches/bleeding_edge/src/bootstrapper.cc
==============================================================================
--- branches/bleeding_edge/src/bootstrapper.cc (original)
+++ branches/bleeding_edge/src/bootstrapper.cc Mon Nov 10 14:53:19 2008
@@ -205,11 +205,20 @@
Code* code = Code::cast(code_[i]);
Address pc = code->instruction_start() + pc_[i];
bool is_pc_relative =
Bootstrapper::FixupFlagsIsPCRelative::decode(flags);
- if (is_pc_relative) {
- Assembler::set_target_address_at(pc, f->code()->instruction_start());
+ bool use_code_object =
Bootstrapper::FixupFlagsUseCodeObject::decode(flags);
+
+ if (use_code_object) {
+ if (is_pc_relative) {
+ Assembler::set_target_address_at(
+ pc, reinterpret_cast<Address>(f->code()));
+ } else {
+ *reinterpret_cast<Object**>(pc) = f->code();
+ }
} else {
- *reinterpret_cast<Object**>(pc) = f->code();
+ ASSERT(is_pc_relative);
+ Assembler::set_target_address_at(pc, f->code()->instruction_start());
}
+
LOG(StringEvent("resolved", name));
}
Clear();
Modified: branches/bleeding_edge/src/bootstrapper.h
==============================================================================
--- branches/bleeding_edge/src/bootstrapper.h (original)
+++ branches/bleeding_edge/src/bootstrapper.h Mon Nov 10 14:53:19 2008
@@ -66,7 +66,8 @@
// Encoding/decoding support for fixup flags.
class FixupFlagsIsPCRelative: public BitField<bool, 0, 1> {};
- class FixupFlagsArgumentsCount: public BitField<uint32_t, 1, 32-1> {};
+ class FixupFlagsUseCodeObject: public BitField<bool, 1, 1> {};
+ class FixupFlagsArgumentsCount: public BitField<uint32_t, 2, 32-2> {};
};
}} // namespace v8::internal
Modified: branches/bleeding_edge/src/codegen-arm.cc
==============================================================================
--- branches/bleeding_edge/src/codegen-arm.cc (original)
+++ branches/bleeding_edge/src/codegen-arm.cc Mon Nov 10 14:53:19 2008
@@ -4283,7 +4283,10 @@
// Slow-case: Non-function called.
__ bind(&slow);
__ mov(r0, Operand(argc_)); // Setup the number of arguments.
- __ InvokeBuiltin(Builtins::CALL_NON_FUNCTION, JUMP_JS);
+ __ mov(r2, Operand(0));
+ __ GetBuiltinEntry(r3, Builtins::CALL_NON_FUNCTION);
+ __
Jump(Handle<Code>(Builtins::builtin(Builtins::ArgumentsAdaptorTrampoline)),
+ RelocInfo::CODE_TARGET);
}
Modified: branches/bleeding_edge/src/macro-assembler-arm.cc
==============================================================================
--- branches/bleeding_edge/src/macro-assembler-arm.cc (original)
+++ branches/bleeding_edge/src/macro-assembler-arm.cc Mon Nov 10 14:53:19
2008
@@ -818,7 +818,8 @@
int argc = Builtins::GetArgumentsCount(id);
uint32_t flags =
Bootstrapper::FixupFlagsArgumentsCount::encode(argc) |
- Bootstrapper::FixupFlagsIsPCRelative::encode(true);
+ Bootstrapper::FixupFlagsIsPCRelative::encode(true) |
+ Bootstrapper::FixupFlagsUseCodeObject::encode(false);
Unresolved entry = { pc_offset() - sizeof(Instr), flags, name };
unresolved_.Add(entry);
}
@@ -835,10 +836,13 @@
int argc = Builtins::GetArgumentsCount(id);
uint32_t flags =
Bootstrapper::FixupFlagsArgumentsCount::encode(argc) |
- Bootstrapper::FixupFlagsIsPCRelative::encode(true);
+ Bootstrapper::FixupFlagsIsPCRelative::encode(true) |
+ Bootstrapper::FixupFlagsUseCodeObject::encode(true);
Unresolved entry = { pc_offset() - sizeof(Instr), flags, name };
unresolved_.Add(entry);
}
+
+ add(target, target, Operand(Code::kHeaderSize - kHeapObjectTag));
}
Modified: branches/bleeding_edge/src/macro-assembler-ia32.cc
==============================================================================
--- branches/bleeding_edge/src/macro-assembler-ia32.cc (original)
+++ branches/bleeding_edge/src/macro-assembler-ia32.cc Mon Nov 10 14:53:19
2008
@@ -873,7 +873,8 @@
if (!resolved) {
uint32_t flags =
Bootstrapper::FixupFlagsArgumentsCount::encode(argc) |
- Bootstrapper::FixupFlagsIsPCRelative::encode(true);
+ Bootstrapper::FixupFlagsIsPCRelative::encode(true) |
+ Bootstrapper::FixupFlagsUseCodeObject::encode(false);
Unresolved entry = { pc_offset() - sizeof(int32_t), flags, name };
unresolved_.Add(entry);
}
@@ -891,7 +892,8 @@
if (!resolved) {
uint32_t flags =
Bootstrapper::FixupFlagsArgumentsCount::encode(argc) |
- Bootstrapper::FixupFlagsIsPCRelative::encode(false);
+ Bootstrapper::FixupFlagsIsPCRelative::encode(false) |
+ Bootstrapper::FixupFlagsUseCodeObject::encode(true);
Unresolved entry = { pc_offset() - sizeof(int32_t), flags, name };
unresolved_.Add(entry);
}
--~--~---------~--~----~------------~-------~--~----~
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
-~----------~----~----~----~------~----~------~--~---