From 6e07183e822a32856da9eb60006989496e06a9cc Mon Sep 17 00:00:00 2001 From: Vladimir Marko Date: Wed, 25 Mar 2015 11:13:39 +0000 Subject: Quick: Fix "select" pattern to update data used for GC maps. Follow-up to https://android-review.googlesource.com/143222 Change-Id: I1c12af9a19f76e64fd209f6cc2eaec5587b3083b --- compiler/dex/quick/codegen_util.cc | 52 +++++++++++++++++++++++--------------- 1 file changed, 31 insertions(+), 21 deletions(-) (limited to 'compiler/dex/quick/codegen_util.cc') diff --git a/compiler/dex/quick/codegen_util.cc b/compiler/dex/quick/codegen_util.cc index 4e7919b6d2..bd479bef5b 100644 --- a/compiler/dex/quick/codegen_util.cc +++ b/compiler/dex/quick/codegen_util.cc @@ -793,33 +793,43 @@ void Mir2Lir::CreateNativeGcMap() { prev_mir = mir; } +#if defined(BYTE_ORDER) && (BYTE_ORDER == LITTLE_ENDIAN) + static constexpr bool kLittleEndian = true; +#else + static constexpr bool kLittleEndian = false; +#endif + // Build the GC map. uint32_t reg_width = static_cast((max_ref_vreg + 8) / 8); GcMapBuilder native_gc_map_builder(&native_gc_map_, safepoints_.size(), max_native_offset, reg_width); -#if !defined(BYTE_ORDER) || (BYTE_ORDER != LITTLE_ENDIAN) - ArenaVector references_buffer(arena_->Adapter()); - references_buffer.resize(reg_width); -#endif - for (const auto& entry : safepoints_) { - uint32_t native_offset = entry.first->offset; - MIR* mir = entry.second; - UpdateReferenceVRegs(mir, prev_mir, references); -#if !defined(BYTE_ORDER) || (BYTE_ORDER != LITTLE_ENDIAN) - // Big-endian or unknown endianness, manually translate the bit vector data. - const auto* raw_storage = references->GetRawStorage(); - for (size_t i = 0; i != reg_width; ++i) { - references_buffer[i] = static_cast( - raw_storage[i / sizeof(raw_storage[0])] >> (8u * (i % sizeof(raw_storage[0])))); + if (kLittleEndian) { + for (const auto& entry : safepoints_) { + uint32_t native_offset = entry.first->offset; + MIR* mir = entry.second; + UpdateReferenceVRegs(mir, prev_mir, references); + // For little-endian, the bytes comprising the bit vector's raw storage are what we need. + native_gc_map_builder.AddEntry(native_offset, + reinterpret_cast(references->GetRawStorage())); + prev_mir = mir; + } + } else { + ArenaVector references_buffer(arena_->Adapter()); + references_buffer.resize(reg_width); + for (const auto& entry : safepoints_) { + uint32_t native_offset = entry.first->offset; + MIR* mir = entry.second; + UpdateReferenceVRegs(mir, prev_mir, references); + // Big-endian or unknown endianness, manually translate the bit vector data. + const auto* raw_storage = references->GetRawStorage(); + for (size_t i = 0; i != reg_width; ++i) { + references_buffer[i] = static_cast( + raw_storage[i / sizeof(raw_storage[0])] >> (8u * (i % sizeof(raw_storage[0])))); + } + native_gc_map_builder.AddEntry(native_offset, &references_buffer[0]); + prev_mir = mir; } - native_gc_map_builder.AddEntry(native_offset, &references_buffer[0]); -#else - // For little-endian, the bytes comprising the bit vector's raw storage are what we need. - native_gc_map_builder.AddEntry(native_offset, - reinterpret_cast(references->GetRawStorage())); -#endif - prev_mir = mir; } } -- cgit v1.2.3-59-g8ed1b