diff options
author | Vladimir Marko <vmarko@google.com> | 2014-09-25 18:08:03 +0000 |
---|---|---|
committer | Gerrit Code Review <noreply-gerritcodereview@google.com> | 2014-09-25 18:08:04 +0000 |
commit | 1ed5b27ee329208fd8ae22b8a9a61d708e2c1ffb (patch) | |
tree | e80187277f4a41c9b41a25ebb6dd9567b66fd2bf /compiler/image_writer.h | |
parent | 34bb808affbed7a1db177b9ef4ab5461c2b2106b (diff) | |
parent | f4da675bbc4615c5f854c81964cac9dd1153baea (diff) | |
download | art-1ed5b27ee329208fd8ae22b8a9a61d708e2c1ffb.zip art-1ed5b27ee329208fd8ae22b8a9a61d708e2c1ffb.tar.gz art-1ed5b27ee329208fd8ae22b8a9a61d708e2c1ffb.tar.bz2 |
Merge "Implement method calls using relative BL on ARM."
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 e8bcf7f..bdf0614 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_; |