diff options
Diffstat (limited to 'compiler/image_test.cc')
| -rw-r--r-- | compiler/image_test.cc | 31 |
1 files changed, 21 insertions, 10 deletions
diff --git a/compiler/image_test.cc b/compiler/image_test.cc index 4920f9baa5..992af29545 100644 --- a/compiler/image_test.cc +++ b/compiler/image_test.cc @@ -28,6 +28,7 @@ #include "elf_writer_quick.h" #include "gc/space/image_space.h" #include "image_writer.h" +#include "linker/multi_oat_relative_patcher.h" #include "lock_word.h" #include "mirror/object-inl.h" #include "oat_writer.h" @@ -72,10 +73,10 @@ void ImageTest::TestWriteRead(ImageHeader::StorageMode storage_mode) { ScratchFile oat_file(OS::CreateEmptyFile(oat_filename.c_str())); const uintptr_t requested_image_base = ART_BASE_ADDRESS; - std::unordered_map<const DexFile*, const char*> dex_file_to_oat_filename_map; + std::unordered_map<const DexFile*, size_t> dex_file_to_oat_index_map; std::vector<const char*> oat_filename_vector(1, oat_filename.c_str()); for (const DexFile* dex_file : class_linker->GetBootClassPath()) { - dex_file_to_oat_filename_map.emplace(dex_file, oat_filename.c_str()); + dex_file_to_oat_index_map.emplace(dex_file, 0); } std::unique_ptr<ImageWriter> writer(new ImageWriter(*compiler_driver_, requested_image_base, @@ -83,7 +84,7 @@ void ImageTest::TestWriteRead(ImageHeader::StorageMode storage_mode) { /*compile_app_image*/false, storage_mode, oat_filename_vector, - dex_file_to_oat_filename_map)); + dex_file_to_oat_index_map)); // TODO: compile_pic should be a test argument. { { @@ -123,10 +124,22 @@ void ImageTest::TestWriteRead(ImageHeader::StorageMode storage_mode) { &opened_dex_files_map, &opened_dex_files); ASSERT_TRUE(dex_files_ok); - oat_writer.PrepareLayout(compiler_driver_.get(), writer.get(), dex_files); + bool image_space_ok = writer->PrepareImageAddressSpace(); ASSERT_TRUE(image_space_ok); + linker::MultiOatRelativePatcher patcher(compiler_driver_->GetInstructionSet(), + instruction_set_features_.get()); + oat_writer.PrepareLayout(compiler_driver_.get(), writer.get(), dex_files, &patcher); + size_t rodata_size = oat_writer.GetOatHeader().GetExecutableOffset(); + size_t text_size = oat_writer.GetSize() - rodata_size; + elf_writer->SetLoadedSectionSizes(rodata_size, text_size, oat_writer.GetBssSize()); + + writer->UpdateOatFileLayout(/* oat_index */ 0u, + elf_writer->GetLoadedSize(), + oat_writer.GetOatDataOffset(), + oat_writer.GetSize()); + bool rodata_ok = oat_writer.WriteRodata(rodata); ASSERT_TRUE(rodata_ok); elf_writer->EndRoData(rodata); @@ -139,13 +152,13 @@ void ImageTest::TestWriteRead(ImageHeader::StorageMode storage_mode) { bool header_ok = oat_writer.WriteHeader(elf_writer->GetStream(), 0u, 0u, 0u); ASSERT_TRUE(header_ok); - elf_writer->SetBssSize(oat_writer.GetBssSize()); + writer->UpdateOatFileHeader(/* oat_index */ 0u, oat_writer.GetOatHeader()); + elf_writer->WriteDynamicSection(); elf_writer->WriteDebugInfo(oat_writer.GetMethodDebugInfo()); elf_writer->WritePatchLocations(oat_writer.GetAbsolutePatchLocations()); bool success = elf_writer->End(); - ASSERT_TRUE(success); } } @@ -158,12 +171,10 @@ void ImageTest::TestWriteRead(ImageHeader::StorageMode storage_mode) { std::vector<const char*> dup_image_filename(1, image_file.GetFilename().c_str()); bool success_image = writer->Write(kInvalidFd, dup_image_filename, - kInvalidFd, - dup_oat_filename, - dup_oat_filename[0]); + dup_oat_filename); ASSERT_TRUE(success_image); bool success_fixup = ElfWriter::Fixup(dup_oat.get(), - writer->GetOatDataBegin(dup_oat_filename[0])); + writer->GetOatDataBegin(0)); ASSERT_TRUE(success_fixup); ASSERT_EQ(dup_oat->FlushCloseOrErase(), 0) << "Could not flush and close oat file " |