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_writer.h b/compiler/oat_writer.h
index d681998..5feb5fc 100644
--- a/compiler/oat_writer.h
+++ b/compiler/oat_writer.h
@@ -27,9 +27,7 @@
#include "method_reference.h"
#include "mirror/class.h"
#include "oat.h"
-#include "os.h"
#include "safe_map.h"
-#include "ScopedFd.h"
#include "utils/array_ref.h"
namespace art {
@@ -41,7 +39,6 @@
class OutputStream;
class TimingLogger;
class TypeLookupTable;
-class ZipEntry;
namespace dwarf {
struct MethodDebugInfo;
@@ -64,11 +61,6 @@
// ...
// TypeLookupTable[D]
//
-// ClassOffsets[0] one table of OatClass offsets for each class def for each OatDexFile.
-// ClassOffsets[1]
-// ...
-// ClassOffsets[D]
-//
// OatClass[0] one variable sized OatClass for each of C DexFile::ClassDefs
// OatClass[1] contains OatClass entries with class status, offsets to code, etc.
// ...
@@ -101,65 +93,15 @@
//
class OatWriter {
public:
- enum class CreateTypeLookupTable {
- kCreate,
- kDontCreate,
- kDefault = kCreate
- };
-
- OatWriter(bool compiling_boot_image, TimingLogger* timings);
-
- // To produce a valid oat file, the user must first add sources with any combination of
- // - AddDexFileSource(),
- // - AddZippedDexFilesSource(),
- // - AddRawDexFileSource().
- // Then the user must call in order
- // - WriteAndOpenDexFiles()
- // - PrepareLayout(),
- // - WriteRodata(),
- // - WriteCode(),
- // - WriteHeader().
-
- // Add dex file source(s) from a file, either a plain dex file or
- // a zip file with one or more dex files.
- bool AddDexFileSource(
- const char* filename,
- const char* location,
- CreateTypeLookupTable create_type_lookup_table = CreateTypeLookupTable::kDefault);
- // Add dex file source(s) from a zip file specified by a file handle.
- bool AddZippedDexFilesSource(
- ScopedFd&& zip_fd,
- const char* location,
- CreateTypeLookupTable create_type_lookup_table = CreateTypeLookupTable::kDefault);
- // Add dex file source from raw memory.
- bool AddRawDexFileSource(
- const ArrayRef<const uint8_t>& data,
- const char* location,
- uint32_t location_checksum,
- CreateTypeLookupTable create_type_lookup_table = CreateTypeLookupTable::kDefault);
- dchecked_vector<const char*> GetSourceLocations() const;
-
- // Write raw dex files to the .rodata section and open them from the oat file.
- bool WriteAndOpenDexFiles(OutputStream* rodata,
- File* file,
- InstructionSet instruction_set,
- const InstructionSetFeatures* instruction_set_features,
- SafeMap<std::string, std::string>* key_value_store,
- /*out*/ std::unique_ptr<MemMap>* opened_dex_files_map,
- /*out*/ std::vector<std::unique_ptr<const DexFile>>* opened_dex_files);
- // Prepare layout of remaining data.
- void PrepareLayout(const CompilerDriver* compiler,
- ImageWriter* image_writer,
- const std::vector<const DexFile*>& dex_files);
- // Write the rest of .rodata section (ClassOffsets[], OatClass[], maps).
- bool WriteRodata(OutputStream* out);
- // Write the code to the .text section.
- bool WriteCode(OutputStream* out);
- // Write the oat header. This finalizes the oat file.
- bool WriteHeader(OutputStream* out,
- uint32_t image_file_location_oat_checksum,
- uintptr_t image_file_location_oat_begin,
- int32_t image_patch_delta);
+ OatWriter(const std::vector<const DexFile*>& dex_files,
+ uint32_t image_file_location_oat_checksum,
+ uintptr_t image_file_location_oat_begin,
+ int32_t image_patch_delta,
+ const CompilerDriver* compiler,
+ ImageWriter* image_writer,
+ bool compiling_boot_image,
+ TimingLogger* timings,
+ SafeMap<std::string, std::string>* key_value_store);
// Returns whether the oat file has an associated image.
bool HasImage() const {
@@ -188,6 +130,9 @@
return ArrayRef<const uintptr_t>(absolute_patch_locations_);
}
+ bool WriteRodata(OutputStream* out);
+ bool WriteCode(OutputStream* out);
+
~OatWriter();
ArrayRef<const dwarf::MethodDebugInfo> GetMethodDebugInfo() const {
@@ -199,7 +144,6 @@
}
private:
- class DexFileSource;
class OatClass;
class OatDexFile;
@@ -230,65 +174,29 @@
// with a given DexMethodVisitor.
bool VisitDexMethods(DexMethodVisitor* visitor);
- size_t InitOatHeader(InstructionSet instruction_set,
- const InstructionSetFeatures* instruction_set_features,
- uint32_t num_dex_files,
- SafeMap<std::string, std::string>* key_value_store);
+ size_t InitOatHeader();
size_t InitOatDexFiles(size_t offset);
+ size_t InitLookupTables(size_t offset);
+ size_t InitDexFiles(size_t offset);
size_t InitOatClasses(size_t offset);
size_t InitOatMaps(size_t offset);
size_t InitOatCode(size_t offset);
size_t InitOatCodeDexFiles(size_t offset);
- bool WriteClassOffsets(OutputStream* out);
- bool WriteClasses(OutputStream* out);
+ bool WriteTables(OutputStream* out, const size_t file_offset);
+ bool WriteLookupTables(OutputStream* out, const size_t file_offset);
size_t WriteMaps(OutputStream* out, const size_t file_offset, size_t relative_offset);
size_t WriteCode(OutputStream* out, const size_t file_offset, size_t relative_offset);
size_t WriteCodeDexFiles(OutputStream* out, const size_t file_offset, size_t relative_offset);
bool GetOatDataOffset(OutputStream* out);
- bool ReadDexFileHeader(File* file, OatDexFile* oat_dex_file);
- bool ValidateDexFileHeader(const uint8_t* raw_header, const char* location);
- bool WriteDexFiles(OutputStream* rodata, File* file);
- bool WriteDexFile(OutputStream* rodata, File* file, OatDexFile* oat_dex_file);
- bool SeekToDexFile(OutputStream* rodata, File* file, OatDexFile* oat_dex_file);
- bool WriteDexFile(OutputStream* rodata, File* file, OatDexFile* oat_dex_file, ZipEntry* dex_file);
- bool WriteDexFile(OutputStream* rodata, File* file, OatDexFile* oat_dex_file, File* dex_file);
- bool WriteDexFile(OutputStream* rodata, OatDexFile* oat_dex_file, const uint8_t* dex_file);
- bool WriteOatDexFiles(OutputStream* rodata);
- bool ExtendForTypeLookupTables(OutputStream* rodata, File* file, size_t offset);
- bool OpenDexFiles(File* file,
- /*out*/ std::unique_ptr<MemMap>* opened_dex_files_map,
- /*out*/ std::vector<std::unique_ptr<const DexFile>>* opened_dex_files);
- bool WriteTypeLookupTables(MemMap* opened_dex_files_map,
- const std::vector<std::unique_ptr<const DexFile>>& opened_dex_files);
bool WriteCodeAlignment(OutputStream* out, uint32_t aligned_code_delta);
bool WriteData(OutputStream* out, const void* data, size_t size);
- enum class WriteState {
- kAddingDexFileSources,
- kPrepareLayout,
- kWriteRoData,
- kWriteText,
- kWriteHeader,
- kDone
- };
-
- WriteState write_state_;
- TimingLogger* timings_;
-
- std::vector<std::unique_ptr<File>> raw_dex_files_;
- std::vector<std::unique_ptr<ZipArchive>> zip_archives_;
- std::vector<std::unique_ptr<ZipEntry>> zipped_dex_files_;
-
- // Using std::list<> which doesn't move elements around on push/emplace_back().
- // We need this because we keep plain pointers to the strings' c_str().
- std::list<std::string> zipped_dex_file_locations_;
-
dchecked_vector<dwarf::MethodDebugInfo> method_info_;
- const CompilerDriver* compiler_driver_;
- ImageWriter* image_writer_;
+ const CompilerDriver* const compiler_driver_;
+ ImageWriter* const image_writer_;
const bool compiling_boot_image_;
// note OatFile does not take ownership of the DexFiles
@@ -307,7 +215,13 @@
// Offset of the oat data from the start of the mmapped region of the elf file.
size_t oat_data_offset_;
+ // dependencies on the image.
+ uint32_t image_file_location_oat_checksum_;
+ uintptr_t image_file_location_oat_begin_;
+ int32_t image_patch_delta_;
+
// data to write
+ SafeMap<std::string, std::string>* key_value_store_;
std::unique_ptr<OatHeader> oat_header_;
dchecked_vector<OatDexFile> oat_dex_files_;
dchecked_vector<OatClass> oat_classes_;
@@ -343,12 +257,10 @@
uint32_t size_oat_dex_file_location_data_;
uint32_t size_oat_dex_file_location_checksum_;
uint32_t size_oat_dex_file_offset_;
- uint32_t size_oat_dex_file_class_offsets_offset_;
uint32_t size_oat_dex_file_lookup_table_offset_;
+ uint32_t size_oat_dex_file_class_offsets_;
uint32_t size_oat_lookup_table_alignment_;
uint32_t size_oat_lookup_table_;
- uint32_t size_oat_class_offsets_alignment_;
- uint32_t size_oat_class_offsets_;
uint32_t size_oat_class_type_;
uint32_t size_oat_class_status_;
uint32_t size_oat_class_method_bitmaps_;
@@ -357,7 +269,7 @@
std::unique_ptr<linker::RelativePatcher> relative_patcher_;
// The locations of absolute patches relative to the start of the executable section.
- dchecked_vector<uintptr_t> absolute_patch_locations_;
+ std::vector<uintptr_t> absolute_patch_locations_;
// Map method reference to assigned offset.
// Wrap the map in a class implementing linker::RelativePatcherTargetProvider.