diff options
Diffstat (limited to 'compiler/image_writer.h')
-rw-r--r-- | compiler/image_writer.h | 64 |
1 files changed, 41 insertions, 23 deletions
diff --git a/compiler/image_writer.h b/compiler/image_writer.h index e8bcf7f88..bdf06148e 100644 --- a/compiler/image_writer.h +++ b/compiler/image_writer.h @@ -37,17 +37,39 @@ namespace art { // Write a Space built during compilation for use during execution. class ImageWriter { public: - explicit ImageWriter(const CompilerDriver& compiler_driver) - : compiler_driver_(compiler_driver), oat_file_(NULL), image_end_(0), image_begin_(NULL), + ImageWriter(const CompilerDriver& compiler_driver, uintptr_t image_begin) + : compiler_driver_(compiler_driver), image_begin_(reinterpret_cast<byte*>(image_begin)), + image_end_(0), image_roots_address_(0), oat_file_(NULL), oat_data_begin_(NULL), interpreter_to_interpreter_bridge_offset_(0), - interpreter_to_compiled_code_bridge_offset_(0), portable_imt_conflict_trampoline_offset_(0), - portable_resolution_trampoline_offset_(0), quick_generic_jni_trampoline_offset_(0), - quick_imt_conflict_trampoline_offset_(0), quick_resolution_trampoline_offset_(0) {} + interpreter_to_compiled_code_bridge_offset_(0), jni_dlsym_lookup_offset_(0), + portable_imt_conflict_trampoline_offset_(0), portable_resolution_trampoline_offset_(0), + portable_to_interpreter_bridge_offset_(0), quick_generic_jni_trampoline_offset_(0), + quick_imt_conflict_trampoline_offset_(0), quick_resolution_trampoline_offset_(0), + quick_to_interpreter_bridge_offset_(0) { + CHECK_NE(image_begin, 0U); + } ~ImageWriter() {} + bool PrepareImageAddressSpace(); + + bool IsImageAddressSpaceReady() const { + return image_roots_address_ != 0u; + } + + mirror::Object* GetImageAddress(mirror::Object* object) const + SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { + if (object == NULL) { + return NULL; + } + return reinterpret_cast<mirror::Object*>(image_begin_ + GetImageOffset(object)); + } + + byte* GetOatFileBegin() const { + return image_begin_ + RoundUp(image_end_, kPageSize); + } + bool Write(const std::string& image_filename, - uintptr_t image_begin, const std::string& oat_filename, const std::string& oat_location) LOCKS_EXCLUDED(Locks::mutator_lock_); @@ -75,14 +97,6 @@ class ImageWriter { return reinterpret_cast<ImageWriter*>(writer)->GetImageAddress(obj); } - mirror::Object* GetImageAddress(mirror::Object* object) const - SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { - if (object == NULL) { - return NULL; - } - return reinterpret_cast<mirror::Object*>(image_begin_ + GetImageOffset(object)); - } - mirror::Object* GetLocalAddress(mirror::Object* object) const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_) { size_t offset = GetImageOffset(object); @@ -131,7 +145,9 @@ class ImageWriter { SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); // Lays out where the image objects will be at runtime. - void CalculateNewObjectOffsets(size_t oat_loaded_size, size_t oat_data_offset) + void CalculateNewObjectOffsets() + SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + void CreateHeader(size_t oat_loaded_size, size_t oat_data_offset) SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); mirror::ObjectArray<mirror::Object>* CreateImageRoots() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); @@ -162,23 +178,25 @@ class ImageWriter { SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); // Patches references in OatFile to expect runtime addresses. - void PatchOatCodeAndMethods(File* elf_file) - SHARED_LOCKS_REQUIRED(Locks::mutator_lock_); + void SetOatChecksumFromElfFile(File* elf_file); const CompilerDriver& compiler_driver_; + // Beginning target image address for the output image. + byte* image_begin_; + + // Offset to the free space in image_. + size_t image_end_; + + // The image roots address in the image. + uint32_t image_roots_address_; + // oat file with code for this image OatFile* oat_file_; // Memory mapped for generating the image. std::unique_ptr<MemMap> image_; - // Offset to the free space in image_. - size_t image_end_; - - // Beginning target image address for the output image. - byte* image_begin_; - // Saved hashes (objects are inside of the image so that they don't move). std::vector<std::pair<mirror::Object*, uint32_t>> saved_hashes_; |