Revert "Write dex files to oat file early."

This reverts commit 625a64aad13905d8a2454bf3cc0e874487b110d5.

Breaks the Mac build:

Undefined symbols for architecture i386:
  "_CloseArchive", referenced from:
      ... in oat_writer.o
ld: symbol(s) not found for architecture i386

Change-Id: I21608bc51437834e1e6abde9bcbe5e7d9998197e
diff --git a/compiler/oat_test.cc b/compiler/oat_test.cc
index 1fd5bdf..9f7ffa5 100644
--- a/compiler/oat_test.cc
+++ b/compiler/oat_test.cc
@@ -38,7 +38,6 @@
 #include "oat_file-inl.h"
 #include "oat_writer.h"
 #include "scoped_thread_state_change.h"
-#include "utils/test_dex_file_builder.h"
 
 namespace art {
 
@@ -130,74 +129,23 @@
                 const std::vector<const DexFile*>& dex_files,
                 SafeMap<std::string, std::string>& key_value_store) {
     TimingLogger timings("WriteElf", false, false);
-    OatWriter oat_writer(/*compiling_boot_image*/false, &timings);
-    for (const DexFile* dex_file : dex_files) {
-      ArrayRef<const uint8_t> raw_dex_file(
-          reinterpret_cast<const uint8_t*>(&dex_file->GetHeader()),
-          dex_file->GetHeader().file_size_);
-      if (!oat_writer.AddRawDexFileSource(raw_dex_file,
-                                          dex_file->GetLocation().c_str(),
-                                          dex_file->GetLocationChecksum())) {
-        return false;
-      }
-    }
-    return DoWriteElf(file, oat_writer, key_value_store);
-  }
-
-  bool WriteElf(File* file,
-                const std::vector<const char*>& dex_filenames,
-                SafeMap<std::string, std::string>& key_value_store) {
-    TimingLogger timings("WriteElf", false, false);
-    OatWriter oat_writer(/*compiling_boot_image*/false, &timings);
-    for (const char* dex_filename : dex_filenames) {
-      if (!oat_writer.AddDexFileSource(dex_filename, dex_filename)) {
-        return false;
-      }
-    }
-    return DoWriteElf(file, oat_writer, key_value_store);
-  }
-
-  bool WriteElf(File* file,
-                ScopedFd&& zip_fd,
-                const char* location,
-                SafeMap<std::string, std::string>& key_value_store) {
-    TimingLogger timings("WriteElf", false, false);
-    OatWriter oat_writer(/*compiling_boot_image*/false, &timings);
-    if (!oat_writer.AddZippedDexFilesSource(std::move(zip_fd), location)) {
-      return false;
-    }
-    return DoWriteElf(file, oat_writer, key_value_store);
-  }
-
-  bool DoWriteElf(File* file,
-                  OatWriter& oat_writer,
-                  SafeMap<std::string, std::string>& key_value_store) {
+    OatWriter oat_writer(dex_files,
+                         42U,
+                         4096U,
+                         0,
+                         compiler_driver_.get(),
+                         nullptr,
+                         /*compiling_boot_image*/false,
+                         &timings,
+                         &key_value_store);
     std::unique_ptr<ElfWriter> elf_writer = CreateElfWriterQuick(
         compiler_driver_->GetInstructionSet(),
         &compiler_driver_->GetCompilerOptions(),
         file);
+
     elf_writer->Start();
+
     OutputStream* rodata = elf_writer->StartRoData();
-    std::unique_ptr<MemMap> opened_dex_files_map;
-    std::vector<std::unique_ptr<const DexFile>> opened_dex_files;
-    if (!oat_writer.WriteAndOpenDexFiles(rodata,
-                                         file,
-                                         compiler_driver_->GetInstructionSet(),
-                                         compiler_driver_->GetInstructionSetFeatures(),
-                                         &key_value_store,
-                                         &opened_dex_files_map,
-                                         &opened_dex_files)) {
-      return false;
-    }
-    Runtime* runtime = Runtime::Current();
-    ClassLinker* const class_linker = runtime->GetClassLinker();
-    std::vector<const DexFile*> dex_files;
-    for (const std::unique_ptr<const DexFile>& dex_file : opened_dex_files) {
-      dex_files.push_back(dex_file.get());
-      ScopedObjectAccess soa(Thread::Current());
-      class_linker->RegisterDexFile(*dex_file, runtime->GetLinearAlloc());
-    }
-    oat_writer.PrepareLayout(compiler_driver_.get(), nullptr, dex_files);
     if (!oat_writer.WriteRodata(rodata)) {
       return false;
     }
@@ -209,10 +157,6 @@
     }
     elf_writer->EndText(text);
 
-    if (!oat_writer.WriteHeader(elf_writer->GetStream(), 42U, 4096U, 0)) {
-      return false;
-    }
-
     elf_writer->SetBssSize(oat_writer.GetBssSize());
     elf_writer->WriteDynamicSection();
     elf_writer->WriteDebugInfo(oat_writer.GetMethodDebugInfo());
@@ -225,117 +169,6 @@
   std::unique_ptr<QuickCompilerCallbacks> callbacks_;
 };
 
-class ZipBuilder {
- public:
-  explicit ZipBuilder(File* zip_file) : zip_file_(zip_file) { }
-
-  bool AddFile(const char* location, const void* data, size_t size) {
-    off_t offset = lseek(zip_file_->Fd(), 0, SEEK_CUR);
-    if (offset == static_cast<off_t>(-1)) {
-      return false;
-    }
-
-    ZipFileHeader file_header;
-    file_header.crc32 = crc32(0u, reinterpret_cast<const Bytef*>(data), size);
-    file_header.compressed_size = size;
-    file_header.uncompressed_size = size;
-    file_header.filename_length = strlen(location);
-
-    if (!zip_file_->WriteFully(&file_header, sizeof(file_header)) ||
-        !zip_file_->WriteFully(location, file_header.filename_length) ||
-        !zip_file_->WriteFully(data, size)) {
-      return false;
-    }
-
-    CentralDirectoryFileHeader cdfh;
-    cdfh.crc32 = file_header.crc32;
-    cdfh.compressed_size = size;
-    cdfh.uncompressed_size = size;
-    cdfh.filename_length = file_header.filename_length;
-    cdfh.relative_offset_of_local_file_header = offset;
-    file_data_.push_back(FileData { cdfh, location });
-    return true;
-  }
-
-  bool Finish() {
-    off_t offset = lseek(zip_file_->Fd(), 0, SEEK_CUR);
-    if (offset == static_cast<off_t>(-1)) {
-      return false;
-    }
-
-    size_t central_directory_size = 0u;
-    for (const FileData& file_data : file_data_) {
-      if (!zip_file_->WriteFully(&file_data.cdfh, sizeof(file_data.cdfh)) ||
-          !zip_file_->WriteFully(file_data.location, file_data.cdfh.filename_length)) {
-        return false;
-      }
-      central_directory_size += sizeof(file_data.cdfh) + file_data.cdfh.filename_length;
-    }
-    EndOfCentralDirectoryRecord eocd_record;
-    eocd_record.number_of_central_directory_records_on_this_disk = file_data_.size();
-    eocd_record.total_number_of_central_directory_records = file_data_.size();
-    eocd_record.size_of_central_directory = central_directory_size;
-    eocd_record.offset_of_start_of_central_directory = offset;
-    return
-        zip_file_->WriteFully(&eocd_record, sizeof(eocd_record)) &&
-        zip_file_->Flush() == 0;
-  }
-
- private:
-  struct PACKED(1) ZipFileHeader {
-    uint32_t signature = 0x04034b50;
-    uint16_t version_needed_to_extract = 10;
-    uint16_t general_purpose_bit_flag = 0;
-    uint16_t compression_method = 0;            // 0 = store only.
-    uint16_t file_last_modification_time = 0u;
-    uint16_t file_last_modification_date = 0u;
-    uint32_t crc32;
-    uint32_t compressed_size;
-    uint32_t uncompressed_size;
-    uint16_t filename_length;
-    uint16_t extra_field_length = 0u;           // No extra fields.
-  };
-
-  struct PACKED(1) CentralDirectoryFileHeader {
-    uint32_t signature = 0x02014b50;
-    uint16_t version_made_by = 10;
-    uint16_t version_needed_to_extract = 10;
-    uint16_t general_purpose_bit_flag = 0;
-    uint16_t compression_method = 0;            // 0 = store only.
-    uint16_t file_last_modification_time = 0u;
-    uint16_t file_last_modification_date = 0u;
-    uint32_t crc32;
-    uint32_t compressed_size;
-    uint32_t uncompressed_size;
-    uint16_t filename_length;
-    uint16_t extra_field_length = 0u;           // No extra fields.
-    uint16_t file_comment_length = 0u;          // No file comment.
-    uint16_t disk_number_where_file_starts = 0u;
-    uint16_t internal_file_attributes = 0u;
-    uint32_t external_file_attributes = 0u;
-    uint32_t relative_offset_of_local_file_header;
-  };
-
-  struct PACKED(1) EndOfCentralDirectoryRecord {
-    uint32_t signature = 0x06054b50;
-    uint16_t number_of_this_disk = 0u;
-    uint16_t disk_where_central_directory_starts = 0u;
-    uint16_t number_of_central_directory_records_on_this_disk;
-    uint16_t total_number_of_central_directory_records;
-    uint32_t size_of_central_directory;
-    uint32_t offset_of_start_of_central_directory;
-    uint16_t comment_length = 0u;               // No file comment.
-  };
-
-  struct FileData {
-    CentralDirectoryFileHeader cdfh;
-    const char* location;
-  };
-
-  File* zip_file_;
-  std::vector<FileData> file_data_;
-};
-
 TEST_F(OatTest, WriteRead) {
   TimingLogger timings("OatTest::WriteRead", false, false);
   ClassLinker* class_linker = Runtime::Current()->GetClassLinker();
@@ -496,189 +329,4 @@
   EXPECT_LT(static_cast<size_t>(oat_file->Size()), static_cast<size_t>(tmp.GetFile()->GetLength()));
 }
 
-TEST_F(OatTest, DexFileInput) {
-  TimingLogger timings("OatTest::DexFileInput", false, false);
-
-  std::vector<const char*> input_filenames;
-
-  ScratchFile dex_file1;
-  TestDexFileBuilder builder1;
-  builder1.AddField("Lsome.TestClass;", "int", "someField");
-  builder1.AddMethod("Lsome.TestClass;", "()I", "foo");
-  std::unique_ptr<const DexFile> dex_file1_data = builder1.Build(dex_file1.GetFilename());
-  bool success = dex_file1.GetFile()->WriteFully(&dex_file1_data->GetHeader(),
-                                                 dex_file1_data->GetHeader().file_size_);
-  ASSERT_TRUE(success);
-  success = dex_file1.GetFile()->Flush() == 0;
-  ASSERT_TRUE(success);
-  input_filenames.push_back(dex_file1.GetFilename().c_str());
-
-  ScratchFile dex_file2;
-  TestDexFileBuilder builder2;
-  builder2.AddField("Land.AnotherTestClass;", "boolean", "someOtherField");
-  builder2.AddMethod("Land.AnotherTestClass;", "()J", "bar");
-  std::unique_ptr<const DexFile> dex_file2_data = builder2.Build(dex_file2.GetFilename());
-  success = dex_file2.GetFile()->WriteFully(&dex_file2_data->GetHeader(),
-                                            dex_file2_data->GetHeader().file_size_);
-  ASSERT_TRUE(success);
-  success = dex_file2.GetFile()->Flush() == 0;
-  ASSERT_TRUE(success);
-  input_filenames.push_back(dex_file2.GetFilename().c_str());
-
-  ScratchFile oat_file;
-  SafeMap<std::string, std::string> key_value_store;
-  key_value_store.Put(OatHeader::kImageLocationKey, "test.art");
-  success = WriteElf(oat_file.GetFile(), input_filenames, key_value_store);
-  ASSERT_TRUE(success);
-
-  std::string error_msg;
-  std::unique_ptr<OatFile> opened_oat_file(OatFile::Open(oat_file.GetFilename(),
-                                                         oat_file.GetFilename(),
-                                                         nullptr,
-                                                         nullptr,
-                                                         false,
-                                                         nullptr,
-                                                         &error_msg));
-  ASSERT_TRUE(opened_oat_file != nullptr);
-  ASSERT_EQ(2u, opened_oat_file->GetOatDexFiles().size());
-  std::unique_ptr<const DexFile> opened_dex_file1 =
-      opened_oat_file->GetOatDexFiles()[0]->OpenDexFile(&error_msg);
-  std::unique_ptr<const DexFile> opened_dex_file2 =
-      opened_oat_file->GetOatDexFiles()[1]->OpenDexFile(&error_msg);
-
-  ASSERT_EQ(dex_file1_data->GetHeader().file_size_, opened_dex_file1->GetHeader().file_size_);
-  ASSERT_EQ(0, memcmp(&dex_file1_data->GetHeader(),
-                      &opened_dex_file1->GetHeader(),
-                      dex_file1_data->GetHeader().file_size_));
-  ASSERT_EQ(dex_file1_data->GetLocation(), opened_dex_file1->GetLocation());
-
-  ASSERT_EQ(dex_file2_data->GetHeader().file_size_, opened_dex_file2->GetHeader().file_size_);
-  ASSERT_EQ(0, memcmp(&dex_file2_data->GetHeader(),
-                      &opened_dex_file2->GetHeader(),
-                      dex_file2_data->GetHeader().file_size_));
-  ASSERT_EQ(dex_file2_data->GetLocation(), opened_dex_file2->GetLocation());
-}
-
-TEST_F(OatTest, ZipFileInput) {
-  TimingLogger timings("OatTest::DexFileInput", false, false);
-
-  ScratchFile zip_file;
-  ZipBuilder zip_builder(zip_file.GetFile());
-
-  ScratchFile dex_file1;
-  TestDexFileBuilder builder1;
-  builder1.AddField("Lsome.TestClass;", "long", "someField");
-  builder1.AddMethod("Lsome.TestClass;", "()D", "foo");
-  std::unique_ptr<const DexFile> dex_file1_data = builder1.Build(dex_file1.GetFilename());
-  bool success = dex_file1.GetFile()->WriteFully(&dex_file1_data->GetHeader(),
-                                                 dex_file1_data->GetHeader().file_size_);
-  ASSERT_TRUE(success);
-  success = dex_file1.GetFile()->Flush() == 0;
-  ASSERT_TRUE(success);
-  success = zip_builder.AddFile("classes.dex",
-                                &dex_file1_data->GetHeader(),
-                                dex_file1_data->GetHeader().file_size_);
-  ASSERT_TRUE(success);
-
-  ScratchFile dex_file2;
-  TestDexFileBuilder builder2;
-  builder2.AddField("Land.AnotherTestClass;", "boolean", "someOtherField");
-  builder2.AddMethod("Land.AnotherTestClass;", "()J", "bar");
-  std::unique_ptr<const DexFile> dex_file2_data = builder2.Build(dex_file2.GetFilename());
-  success = dex_file2.GetFile()->WriteFully(&dex_file2_data->GetHeader(),
-                                            dex_file2_data->GetHeader().file_size_);
-  ASSERT_TRUE(success);
-  success = dex_file2.GetFile()->Flush() == 0;
-  ASSERT_TRUE(success);
-  success = zip_builder.AddFile("classes2.dex",
-                                &dex_file2_data->GetHeader(),
-                                dex_file2_data->GetHeader().file_size_);
-  ASSERT_TRUE(success);
-
-  success = zip_builder.Finish();
-  ASSERT_TRUE(success) << strerror(errno);
-
-  SafeMap<std::string, std::string> key_value_store;
-  key_value_store.Put(OatHeader::kImageLocationKey, "test.art");
-  {
-    // Test using the AddDexFileSource() interface with the zip file.
-    std::vector<const char*> input_filenames { zip_file.GetFilename().c_str() };  // NOLINT [readability/braces] [4]
-
-    ScratchFile oat_file;
-    success = WriteElf(oat_file.GetFile(), input_filenames, key_value_store);
-    ASSERT_TRUE(success);
-
-    std::string error_msg;
-    std::unique_ptr<OatFile> opened_oat_file(OatFile::Open(oat_file.GetFilename(),
-                                                           oat_file.GetFilename(),
-                                                           nullptr,
-                                                           nullptr,
-                                                           false,
-                                                           nullptr,
-                                                           &error_msg));
-    ASSERT_TRUE(opened_oat_file != nullptr);
-    ASSERT_EQ(2u, opened_oat_file->GetOatDexFiles().size());
-    std::unique_ptr<const DexFile> opened_dex_file1 =
-        opened_oat_file->GetOatDexFiles()[0]->OpenDexFile(&error_msg);
-    std::unique_ptr<const DexFile> opened_dex_file2 =
-        opened_oat_file->GetOatDexFiles()[1]->OpenDexFile(&error_msg);
-
-    ASSERT_EQ(dex_file1_data->GetHeader().file_size_, opened_dex_file1->GetHeader().file_size_);
-    ASSERT_EQ(0, memcmp(&dex_file1_data->GetHeader(),
-                        &opened_dex_file1->GetHeader(),
-                        dex_file1_data->GetHeader().file_size_));
-    ASSERT_EQ(DexFile::GetMultiDexLocation(0, zip_file.GetFilename().c_str()),
-              opened_dex_file1->GetLocation());
-
-    ASSERT_EQ(dex_file2_data->GetHeader().file_size_, opened_dex_file2->GetHeader().file_size_);
-    ASSERT_EQ(0, memcmp(&dex_file2_data->GetHeader(),
-                        &opened_dex_file2->GetHeader(),
-                        dex_file2_data->GetHeader().file_size_));
-    ASSERT_EQ(DexFile::GetMultiDexLocation(1, zip_file.GetFilename().c_str()),
-              opened_dex_file2->GetLocation());
-  }
-
-  {
-    // Test using the AddZipDexFileSource() interface with the zip file handle.
-    ScopedFd zip_fd(dup(zip_file.GetFd()));
-    ASSERT_NE(-1, zip_fd.get());
-
-    ScratchFile oat_file;
-    success = WriteElf(oat_file.GetFile(),
-                       std::move(zip_fd),
-                       zip_file.GetFilename().c_str(),
-                       key_value_store);
-    ASSERT_TRUE(success);
-
-    std::string error_msg;
-    std::unique_ptr<OatFile> opened_oat_file(OatFile::Open(oat_file.GetFilename(),
-                                                           oat_file.GetFilename(),
-                                                           nullptr,
-                                                           nullptr,
-                                                           false,
-                                                           nullptr,
-                                                           &error_msg));
-    ASSERT_TRUE(opened_oat_file != nullptr);
-    ASSERT_EQ(2u, opened_oat_file->GetOatDexFiles().size());
-    std::unique_ptr<const DexFile> opened_dex_file1 =
-        opened_oat_file->GetOatDexFiles()[0]->OpenDexFile(&error_msg);
-    std::unique_ptr<const DexFile> opened_dex_file2 =
-        opened_oat_file->GetOatDexFiles()[1]->OpenDexFile(&error_msg);
-
-    ASSERT_EQ(dex_file1_data->GetHeader().file_size_, opened_dex_file1->GetHeader().file_size_);
-    ASSERT_EQ(0, memcmp(&dex_file1_data->GetHeader(),
-                        &opened_dex_file1->GetHeader(),
-                        dex_file1_data->GetHeader().file_size_));
-    ASSERT_EQ(DexFile::GetMultiDexLocation(0, zip_file.GetFilename().c_str()),
-              opened_dex_file1->GetLocation());
-
-    ASSERT_EQ(dex_file2_data->GetHeader().file_size_, opened_dex_file2->GetHeader().file_size_);
-    ASSERT_EQ(0, memcmp(&dex_file2_data->GetHeader(),
-                        &opened_dex_file2->GetHeader(),
-                        dex_file2_data->GetHeader().file_size_));
-    ASSERT_EQ(DexFile::GetMultiDexLocation(1, zip_file.GetFilename().c_str()),
-              opened_dex_file2->GetLocation());
-  }
-}
-
 }  // namespace art