diff options
| -rw-r--r-- | oatdump/oatdump.cc | 2 | ||||
| -rw-r--r-- | patchoat/patchoat.cc | 2 | ||||
| -rw-r--r-- | runtime/class_linker.cc | 1 | ||||
| -rw-r--r-- | runtime/gc/collector/concurrent_copying.cc | 1 | ||||
| -rw-r--r-- | runtime/gc/space/image_space.cc | 6 | ||||
| -rw-r--r-- | runtime/image-inl.h | 47 | ||||
| -rw-r--r-- | runtime/image.cc | 18 | ||||
| -rw-r--r-- | runtime/image.h | 3 | ||||
| -rw-r--r-- | runtime/intern_table.cc | 1 | ||||
| -rw-r--r-- | runtime/runtime.cc | 2 |
10 files changed, 60 insertions, 23 deletions
diff --git a/oatdump/oatdump.cc b/oatdump/oatdump.cc index 7b9ce5bd1b..57b52fcdd8 100644 --- a/oatdump/oatdump.cc +++ b/oatdump/oatdump.cc @@ -40,7 +40,7 @@ #include "gc/space/image_space.h" #include "gc/space/large_object_space.h" #include "gc/space/space-inl.h" -#include "image.h" +#include "image-inl.h" #include "indenter.h" #include "linker/buffered_output_stream.h" #include "linker/file_output_stream.h" diff --git a/patchoat/patchoat.cc b/patchoat/patchoat.cc index 7e4ce917db..1668dc5f25 100644 --- a/patchoat/patchoat.cc +++ b/patchoat/patchoat.cc @@ -35,7 +35,7 @@ #include "elf_file.h" #include "elf_file_impl.h" #include "gc/space/image_space.h" -#include "image.h" +#include "image-inl.h" #include "mirror/abstract_method.h" #include "mirror/object-inl.h" #include "mirror/method.h" diff --git a/runtime/class_linker.cc b/runtime/class_linker.cc index 336315d128..bb709e8774 100644 --- a/runtime/class_linker.cc +++ b/runtime/class_linker.cc @@ -53,6 +53,7 @@ #include "gc/heap.h" #include "gc/space/image_space.h" #include "handle_scope-inl.h" +#include "image-inl.h" #include "intern_table.h" #include "interpreter/interpreter.h" #include "jit/jit.h" diff --git a/runtime/gc/collector/concurrent_copying.cc b/runtime/gc/collector/concurrent_copying.cc index af7acbc45b..9397c3585a 100644 --- a/runtime/gc/collector/concurrent_copying.cc +++ b/runtime/gc/collector/concurrent_copying.cc @@ -24,6 +24,7 @@ #include "gc/reference_processor.h" #include "gc/space/image_space.h" #include "gc/space/space-inl.h" +#include "image-inl.h" #include "intern_table.h" #include "mirror/class-inl.h" #include "mirror/object-inl.h" diff --git a/runtime/gc/space/image_space.cc b/runtime/gc/space/image_space.cc index 9ff3d8db75..891e280ab2 100644 --- a/runtime/gc/space/image_space.cc +++ b/runtime/gc/space/image_space.cc @@ -30,6 +30,7 @@ #include "base/time_utils.h" #include "base/unix_file/fd_file.h" #include "gc/accounting/space_bitmap-inl.h" +#include "image-inl.h" #include "mirror/class-inl.h" #include "mirror/object-inl.h" #include "oat_file.h" @@ -1032,11 +1033,12 @@ static bool RelocateInPlace(ImageHeader& image_header, bitmap->VisitMarkedRange(objects_begin, objects_end, fixup_object_visitor); FixupObjectAdapter fixup_adapter(boot_image, boot_oat, app_image, app_oat); // Fixup image roots. - CHECK(app_image.ContainsSource(reinterpret_cast<uintptr_t>(image_header.GetImageRoots()))); + CHECK(app_image.ContainsSource(reinterpret_cast<uintptr_t>( + image_header.GetImageRoots<kWithoutReadBarrier>()))); image_header.RelocateImageObjects(app_image.Delta()); CHECK_EQ(image_header.GetImageBegin(), target_base); // Fix up dex cache DexFile pointers. - auto* dex_caches = image_header.GetImageRoot(ImageHeader::kDexCaches)-> + auto* dex_caches = image_header.GetImageRoot<kWithoutReadBarrier>(ImageHeader::kDexCaches)-> AsObjectArray<mirror::DexCache>(); for (int32_t i = 0, count = dex_caches->GetLength(); i < count; ++i) { mirror::DexCache* dex_cache = dex_caches->Get(i); diff --git a/runtime/image-inl.h b/runtime/image-inl.h new file mode 100644 index 0000000000..e3307d87b6 --- /dev/null +++ b/runtime/image-inl.h @@ -0,0 +1,47 @@ +/* + * Copyright (C) 2016 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ART_RUNTIME_IMAGE_INL_H_ +#define ART_RUNTIME_IMAGE_INL_H_ + +#include "image.h" + +namespace art { + +template <ReadBarrierOption kReadBarrierOption> +inline mirror::Object* ImageHeader::GetImageRoot(ImageRoot image_root) const { + mirror::ObjectArray<mirror::Object>* image_roots = GetImageRoots<kReadBarrierOption>(); + return image_roots->Get<kVerifyNone, kReadBarrierOption>(static_cast<int32_t>(image_root)); +} + +template <ReadBarrierOption kReadBarrierOption> +inline mirror::ObjectArray<mirror::Object>* ImageHeader::GetImageRoots() const { + // Need a read barrier as it's not visited during root scan. + // Pass in the address of the local variable to the read barrier + // rather than image_roots_ because it won't move (asserted below) + // and it's a const member. + mirror::ObjectArray<mirror::Object>* image_roots = + reinterpret_cast<mirror::ObjectArray<mirror::Object>*>(image_roots_); + mirror::ObjectArray<mirror::Object>* result = + ReadBarrier::BarrierForRoot<mirror::ObjectArray<mirror::Object>, kReadBarrierOption>( + &image_roots); + DCHECK_EQ(image_roots, result); + return image_roots; +} + +} // namespace art + +#endif // ART_RUNTIME_IMAGE_INL_H_ diff --git a/runtime/image.cc b/runtime/image.cc index 2fed4d3bd3..de00343451 100644 --- a/runtime/image.cc +++ b/runtime/image.cc @@ -128,24 +128,6 @@ const char* ImageHeader::GetMagic() const { return reinterpret_cast<const char*>(magic_); } -mirror::Object* ImageHeader::GetImageRoot(ImageRoot image_root) const { - return GetImageRoots()->Get(image_root); -} - -mirror::ObjectArray<mirror::Object>* ImageHeader::GetImageRoots() const { - // Need a read barrier as it's not visited during root scan. - // Pass in the address of the local variable to the read barrier - // rather than image_roots_ because it won't move (asserted below) - // and it's a const member. - mirror::ObjectArray<mirror::Object>* image_roots = - reinterpret_cast<mirror::ObjectArray<mirror::Object>*>(image_roots_); - mirror::ObjectArray<mirror::Object>* result = - ReadBarrier::BarrierForRoot<mirror::ObjectArray<mirror::Object>, kWithReadBarrier>( - &image_roots); - DCHECK_EQ(image_roots, result); - return result; -} - ArtMethod* ImageHeader::GetImageMethod(ImageMethod index) const { CHECK_LT(static_cast<size_t>(index), kImageMethodsCount); return reinterpret_cast<ArtMethod*>(image_methods_[index]); diff --git a/runtime/image.h b/runtime/image.h index b3f177bc8f..c449e43243 100644 --- a/runtime/image.h +++ b/runtime/image.h @@ -212,8 +212,11 @@ class PACKED(4) ImageHeader { return GetImageSection(kSectionArtMethods); } + template <ReadBarrierOption kReadBarrierOption = kWithReadBarrier> mirror::Object* GetImageRoot(ImageRoot image_root) const SHARED_REQUIRES(Locks::mutator_lock_); + + template <ReadBarrierOption kReadBarrierOption = kWithReadBarrier> mirror::ObjectArray<mirror::Object>* GetImageRoots() const SHARED_REQUIRES(Locks::mutator_lock_); diff --git a/runtime/intern_table.cc b/runtime/intern_table.cc index 96854dad0e..74a2532a5d 100644 --- a/runtime/intern_table.cc +++ b/runtime/intern_table.cc @@ -22,6 +22,7 @@ #include "gc/collector/garbage_collector.h" #include "gc/space/image_space.h" #include "gc/weak_root_state.h" +#include "image-inl.h" #include "mirror/dex_cache-inl.h" #include "mirror/object_array-inl.h" #include "mirror/object-inl.h" diff --git a/runtime/runtime.cc b/runtime/runtime.cc index f138c811d7..0c06ca672c 100644 --- a/runtime/runtime.cc +++ b/runtime/runtime.cc @@ -71,7 +71,7 @@ #include "gc/space/image_space.h" #include "gc/space/space-inl.h" #include "handle_scope-inl.h" -#include "image.h" +#include "image-inl.h" #include "instrumentation.h" #include "intern_table.h" #include "interpreter/interpreter.h" |