Index: src/objects-inl.h |
diff --git a/src/objects-inl.h b/src/objects-inl.h |
index 89abe5043358c14642512f8d677104151b72a2d5..8a281901f9902af1c3251f0560da1fa3dd05e46d 100644 |
--- a/src/objects-inl.h |
+++ b/src/objects-inl.h |
@@ -1228,6 +1228,7 @@ void HeapObject::set_map_word(MapWord map_word) { |
HeapObject* HeapObject::FromAddress(Address address) { |
+ address = (Address)((uint32_t)address & ~1); |
ASSERT_TAG_ALIGNED(address); |
return reinterpret_cast<HeapObject*>(address + kHeapObjectTag); |
} |
@@ -3870,6 +3871,11 @@ void Code::set_is_pregenerated(bool value) { |
} |
+bool Code::is_thumb_mode() { |
+ return IsThumbModeField::decode(flags()); |
+} |
+ |
+ |
bool Code::optimizable() { |
ASSERT_EQ(FUNCTION, kind()); |
return READ_BYTE_FIELD(this, kOptimizableOffset) == 1; |
@@ -4082,12 +4088,18 @@ bool Code::is_debug_stub() { |
} |
+Code::Flags Code::SetThumbModeInFlags(Code::Flags flag) { |
+ return static_cast<Flags>(flag | IsThumbModeField::encode(true)); |
+} |
+ |
+ |
Code::Flags Code::ComputeFlags(Kind kind, |
InlineCacheState ic_state, |
ExtraICState extra_ic_state, |
StubType type, |
int argc, |
- InlineCacheHolderFlag holder) { |
+ InlineCacheHolderFlag holder, |
+ bool thumb_mode) { |
ASSERT(argc <= Code::kMaxArguments); |
// Since the extended extra ic state overlaps with the argument count |
// for CALL_ICs, do so checks to make sure that they don't interfere. |
@@ -4099,7 +4111,8 @@ Code::Flags Code::ComputeFlags(Kind kind, |
| ICStateField::encode(ic_state) |
| TypeField::encode(type) |
| ExtendedExtraICStateField::encode(extra_ic_state) |
- | CacheHolderField::encode(holder); |
+ | CacheHolderField::encode(holder) |
+ | IsThumbModeField::encode(thumb_mode); |
if (!Code::needs_extended_extra_ic_state(kind)) { |
bits |= (argc << kArgumentsCountShift); |
} |
@@ -4159,6 +4172,7 @@ Code::Flags Code::RemoveTypeFromFlags(Flags flags) { |
Code* Code::GetCodeFromTargetAddress(Address address) { |
+ address = (Address)((uint32_t)address & ~3); |
HeapObject* code = HeapObject::FromAddress(address - Code::kHeaderSize); |
// GetCodeFromTargetAddress might be called when marking objects during mark |
// sweep. reinterpret_cast is therefore used instead of the more appropriate |
@@ -4171,7 +4185,9 @@ Code* Code::GetCodeFromTargetAddress(Address address) { |
Object* Code::GetObjectFromEntryAddress(Address location_of_address) { |
return HeapObject:: |
- FromAddress(Memory::Address_at(location_of_address) - Code::kHeaderSize); |
+ FromAddress( |
+ Memory::Address_at((Address)((uint32_t)location_of_address & ~1)) |
+ - Code::kHeaderSize); |
} |
@@ -5351,7 +5367,8 @@ int Code::relocation_size() { |
byte* Code::entry() { |
- return instruction_start(); |
+ int mode_encoding = is_thumb_mode() ? 1 : 0; |
+ return mode_encoding + instruction_start(); |
} |