diff options
author | 2016-11-29 15:57:32 +0000 | |
---|---|---|
committer | 2017-09-20 10:58:42 +0100 | |
commit | 7452797678c4345d4a9e65b03e00af703c2c5fe0 (patch) | |
tree | fd23d118a6317737a692402a648217418c3d7b99 | |
parent | 3c683150bcf2f1cabbe2e5f9d10d8c670b67fb7e (diff) |
Refactor linker files from compiler/ to dex2oat/.
This shifts some code from the libart-compiler.so to dex2oat
and reduces memory needed for JIT. We also avoid loading the
libart-dexlayout.so for JIT but the memory savings are
minimal (one shared clean page, two shared dirty pages and
some per-app kernel mmap data) as the code has never been
needed in memory by JIT.
aosp_angler-userdebug file sizes (stripped):
lib64/libart-compiler.so: 2989112 -> 2671888 (-310KiB)
lib/libart-compiler.so: 2160816 -> 1939276 (-216KiB)
bin/dex2oat: 141868 -> 368808 (+222KiB)
LOAD/executable elf mapping sizes:
lib64/libart-compiler.so: 2866308 -> 2555500 (-304KiB)
lib/libart-compiler.so: 2050960 -> 1834836 (-211KiB)
bin/dex2oat: 129316 -> 345916 (+212KiB)
Test: m test-art-host-gtest
Test: testrunner.py --host
Test: cd art/; mma; cd -
Change-Id: If62f02847a6cbb208eaf7e1f3e91af4663fa4a5f
48 files changed, 318 insertions, 153 deletions
diff --git a/build/art.go b/build/art.go index 19b39cdbce..1bcaf51a1d 100644 --- a/build/art.go +++ b/build/art.go @@ -261,6 +261,7 @@ var artTestMutex sync.Mutex func init() { android.RegisterModuleType("art_cc_library", artLibrary) + android.RegisterModuleType("art_cc_static_library", artStaticLibrary) android.RegisterModuleType("art_cc_binary", artBinary) android.RegisterModuleType("art_cc_test", artTest) android.RegisterModuleType("art_cc_test_library", artTestLibrary) @@ -292,8 +293,18 @@ func artDefaultsFactory() android.Module { } func artLibrary() android.Module { - library, _ := cc.NewLibrary(android.HostAndDeviceSupported) - module := library.Init() + m, _ := cc.NewLibrary(android.HostAndDeviceSupported) + module := m.Init() + + installCodegenCustomizer(module, true) + + return module +} + +func artStaticLibrary() android.Module { + m, library := cc.NewLibrary(android.HostAndDeviceSupported) + library.BuildOnlyStatic() + module := m.Init() installCodegenCustomizer(module, true) diff --git a/compiler/Android.bp b/compiler/Android.bp index c798d9782a..14756792c0 100644 --- a/compiler/Android.bp +++ b/compiler/Android.bp @@ -38,7 +38,6 @@ art_cc_defaults { "driver/dex_compilation_unit.cc", "linker/buffered_output_stream.cc", "linker/file_output_stream.cc", - "linker/multi_oat_relative_patcher.cc", "linker/output_stream.cc", "linker/vector_output_stream.cc", "linker/relative_patcher.cc", @@ -95,10 +94,6 @@ art_cc_defaults { "utils/jni_macro_assembler.cc", "utils/swap_space.cc", "compiler.cc", - "elf_writer.cc", - "elf_writer_quick.cc", - "image_writer.cc", - "oat_writer.cc", ], codegen: { @@ -198,19 +193,10 @@ art_cc_defaults { generated_sources: ["art_compiler_operator_srcs"], shared_libs: [ "libbase", - "liblz4", "liblzma", ], include_dirs: ["art/disassembler"], export_include_dirs: ["."], - - // For SHA-1 checksumming of build ID - static: { - whole_static_libs: ["libcrypto"], - }, - shared: { - shared_libs: ["libcrypto"], - }, } gensrcs { @@ -222,7 +208,6 @@ gensrcs { "dex/dex_to_dex_compiler.h", "driver/compiler_driver.h", "driver/compiler_options.h", - "image_writer.h", "optimizing/locations.h", "utils/arm/constants_arm.h", @@ -265,7 +250,6 @@ art_cc_library { }, shared_libs: [ "libart", - "libart-dexlayout", ], } @@ -305,7 +289,6 @@ art_cc_library { }, shared_libs: [ "libartd", - "libartd-dexlayout" ], } @@ -332,15 +315,10 @@ art_cc_test { "dex/dex_to_dex_decompiler_test.cc", "driver/compiled_method_storage_test.cc", "driver/compiler_driver_test.cc", - "elf_writer_test.cc", "exception_test.cc", - "image_test.cc", - "image_write_read_test.cc", "jni/jni_compiler_test.cc", "linker/method_bss_mapping_encoder_test.cc", - "linker/multi_oat_relative_patcher_test.cc", "linker/output_stream_test.cc", - "oat_test.cc", "optimizing/bounds_check_elimination_test.cc", "optimizing/dominator_test.cc", "optimizing/find_loops_test.cc", diff --git a/compiler/debug/dwarf/dwarf_test.h b/compiler/debug/dwarf/dwarf_test.h index e1f538d9a7..b30ff143d3 100644 --- a/compiler/debug/dwarf/dwarf_test.h +++ b/compiler/debug/dwarf/dwarf_test.h @@ -28,8 +28,8 @@ #include "base/unix_file/fd_file.h" #include "common_runtime_test.h" -#include "elf_builder.h" #include "gtest/gtest.h" +#include "linker/elf_builder.h" #include "linker/file_output_stream.h" #include "os.h" @@ -62,8 +62,8 @@ class DwarfTest : public CommonRuntimeTest { // Write simple elf file with just the DWARF sections. InstructionSet isa = (sizeof(typename ElfTypes::Addr) == 8) ? kX86_64 : kX86; ScratchFile file; - FileOutputStream output_stream(file.GetFile()); - ElfBuilder<ElfTypes> builder(isa, nullptr, &output_stream); + linker::FileOutputStream output_stream(file.GetFile()); + linker::ElfBuilder<ElfTypes> builder(isa, nullptr, &output_stream); builder.Start(); if (!debug_info_data_.empty()) { builder.WriteSection(".debug_info", &debug_info_data_); diff --git a/compiler/debug/elf_debug_frame_writer.h b/compiler/debug/elf_debug_frame_writer.h index f9d33c1c30..6dacdfa48c 100644 --- a/compiler/debug/elf_debug_frame_writer.h +++ b/compiler/debug/elf_debug_frame_writer.h @@ -24,7 +24,7 @@ #include "debug/dwarf/dwarf_constants.h" #include "debug/dwarf/headers.h" #include "debug/method_debug_info.h" -#include "elf_builder.h" +#include "linker/elf_builder.h" namespace art { namespace debug { @@ -168,7 +168,7 @@ static void WriteCIE(InstructionSet isa, } template<typename ElfTypes> -void WriteCFISection(ElfBuilder<ElfTypes>* builder, +void WriteCFISection(linker::ElfBuilder<ElfTypes>* builder, const ArrayRef<const MethodDebugInfo>& method_infos, dwarf::CFIFormat format, bool write_oat_patches) { diff --git a/compiler/debug/elf_debug_info_writer.h b/compiler/debug/elf_debug_info_writer.h index 2801240d69..2b617273b5 100644 --- a/compiler/debug/elf_debug_info_writer.h +++ b/compiler/debug/elf_debug_info_writer.h @@ -29,9 +29,9 @@ #include "debug/method_debug_info.h" #include "dex_file-inl.h" #include "dex_file.h" -#include "elf_builder.h" #include "heap_poisoning.h" #include "linear_alloc.h" +#include "linker/elf_builder.h" #include "mirror/array.h" #include "mirror/class-inl.h" #include "mirror/class.h" @@ -68,7 +68,7 @@ class ElfDebugInfoWriter { using Elf_Addr = typename ElfTypes::Addr; public: - explicit ElfDebugInfoWriter(ElfBuilder<ElfTypes>* builder) + explicit ElfDebugInfoWriter(linker::ElfBuilder<ElfTypes>* builder) : builder_(builder), debug_abbrev_(&debug_abbrev_buffer_) { } @@ -93,7 +93,7 @@ class ElfDebugInfoWriter { } private: - ElfBuilder<ElfTypes>* builder_; + linker::ElfBuilder<ElfTypes>* builder_; std::vector<uintptr_t> debug_info_patches_; std::vector<uint8_t> debug_abbrev_buffer_; dwarf::DebugAbbrevWriter<> debug_abbrev_; diff --git a/compiler/debug/elf_debug_line_writer.h b/compiler/debug/elf_debug_line_writer.h index cdd1e53f94..cf5d65efac 100644 --- a/compiler/debug/elf_debug_line_writer.h +++ b/compiler/debug/elf_debug_line_writer.h @@ -25,7 +25,7 @@ #include "debug/dwarf/headers.h" #include "debug/elf_compilation_unit.h" #include "dex_file-inl.h" -#include "elf_builder.h" +#include "linker/elf_builder.h" #include "stack_map.h" namespace art { @@ -43,7 +43,7 @@ class ElfDebugLineWriter { using Elf_Addr = typename ElfTypes::Addr; public: - explicit ElfDebugLineWriter(ElfBuilder<ElfTypes>* builder) : builder_(builder) { + explicit ElfDebugLineWriter(linker::ElfBuilder<ElfTypes>* builder) : builder_(builder) { } void Start() { @@ -280,7 +280,7 @@ class ElfDebugLineWriter { } private: - ElfBuilder<ElfTypes>* builder_; + linker::ElfBuilder<ElfTypes>* builder_; std::vector<uintptr_t> debug_line_patches_; }; diff --git a/compiler/debug/elf_debug_writer.cc b/compiler/debug/elf_debug_writer.cc index c5ff85827e..33c46d7e1f 100644 --- a/compiler/debug/elf_debug_writer.cc +++ b/compiler/debug/elf_debug_writer.cc @@ -29,7 +29,7 @@ #include "debug/elf_gnu_debugdata_writer.h" #include "debug/elf_symtab_writer.h" #include "debug/method_debug_info.h" -#include "elf_builder.h" +#include "linker/elf_builder.h" #include "linker/vector_output_stream.h" #include "oat.h" @@ -37,7 +37,7 @@ namespace art { namespace debug { template <typename ElfTypes> -void WriteDebugInfo(ElfBuilder<ElfTypes>* builder, +void WriteDebugInfo(linker::ElfBuilder<ElfTypes>* builder, const ArrayRef<const MethodDebugInfo>& method_infos, dwarf::CFIFormat cfi_format, bool write_oat_patches) { @@ -133,8 +133,9 @@ static std::vector<uint8_t> WriteDebugElfFileForMethodsInternal( const ArrayRef<const MethodDebugInfo>& method_infos) { std::vector<uint8_t> buffer; buffer.reserve(KB); - VectorOutputStream out("Debug ELF file", &buffer); - std::unique_ptr<ElfBuilder<ElfTypes>> builder(new ElfBuilder<ElfTypes>(isa, features, &out)); + linker::VectorOutputStream out("Debug ELF file", &buffer); + std::unique_ptr<linker::ElfBuilder<ElfTypes>> builder( + new linker::ElfBuilder<ElfTypes>(isa, features, &out)); // No program headers since the ELF file is not linked and has no allocated sections. builder->Start(false /* write_program_headers */); WriteDebugInfo(builder.get(), @@ -165,8 +166,9 @@ static std::vector<uint8_t> WriteDebugElfFileForClassesInternal( REQUIRES_SHARED(Locks::mutator_lock_) { std::vector<uint8_t> buffer; buffer.reserve(KB); - VectorOutputStream out("Debug ELF file", &buffer); - std::unique_ptr<ElfBuilder<ElfTypes>> builder(new ElfBuilder<ElfTypes>(isa, features, &out)); + linker::VectorOutputStream out("Debug ELF file", &buffer); + std::unique_ptr<linker::ElfBuilder<ElfTypes>> builder( + new linker::ElfBuilder<ElfTypes>(isa, features, &out)); // No program headers since the ELF file is not linked and has no allocated sections. builder->Start(false /* write_program_headers */); ElfDebugInfoWriter<ElfTypes> info_writer(builder.get()); @@ -192,12 +194,12 @@ std::vector<uint8_t> WriteDebugElfFileForClasses(InstructionSet isa, // Explicit instantiations template void WriteDebugInfo<ElfTypes32>( - ElfBuilder<ElfTypes32>* builder, + linker::ElfBuilder<ElfTypes32>* builder, const ArrayRef<const MethodDebugInfo>& method_infos, dwarf::CFIFormat cfi_format, bool write_oat_patches); template void WriteDebugInfo<ElfTypes64>( - ElfBuilder<ElfTypes64>* builder, + linker::ElfBuilder<ElfTypes64>* builder, const ArrayRef<const MethodDebugInfo>& method_infos, dwarf::CFIFormat cfi_format, bool write_oat_patches); diff --git a/compiler/debug/elf_debug_writer.h b/compiler/debug/elf_debug_writer.h index 6e26ba36c4..d24ca9b203 100644 --- a/compiler/debug/elf_debug_writer.h +++ b/compiler/debug/elf_debug_writer.h @@ -23,7 +23,7 @@ #include "base/macros.h" #include "base/mutex.h" #include "debug/dwarf/dwarf_constants.h" -#include "elf_builder.h" +#include "linker/elf_builder.h" namespace art { class OatHeader; @@ -35,7 +35,7 @@ struct MethodDebugInfo; template <typename ElfTypes> void WriteDebugInfo( - ElfBuilder<ElfTypes>* builder, + linker::ElfBuilder<ElfTypes>* builder, const ArrayRef<const MethodDebugInfo>& method_infos, dwarf::CFIFormat cfi_format, bool write_oat_patches); diff --git a/compiler/debug/elf_gnu_debugdata_writer.h b/compiler/debug/elf_gnu_debugdata_writer.h index fb63d62572..1cdf6b0ad1 100644 --- a/compiler/debug/elf_gnu_debugdata_writer.h +++ b/compiler/debug/elf_gnu_debugdata_writer.h @@ -20,7 +20,7 @@ #include <vector> #include "arch/instruction_set.h" -#include "elf_builder.h" +#include "linker/elf_builder.h" #include "linker/vector_output_stream.h" // liblzma. @@ -85,8 +85,9 @@ static std::vector<uint8_t> MakeMiniDebugInfoInternal( const ArrayRef<const MethodDebugInfo>& method_infos) { std::vector<uint8_t> buffer; buffer.reserve(KB); - VectorOutputStream out("Mini-debug-info ELF file", &buffer); - std::unique_ptr<ElfBuilder<ElfTypes>> builder(new ElfBuilder<ElfTypes>(isa, features, &out)); + linker::VectorOutputStream out("Mini-debug-info ELF file", &buffer); + std::unique_ptr<linker::ElfBuilder<ElfTypes>> builder( + new linker::ElfBuilder<ElfTypes>(isa, features, &out)); builder->Start(); // Mirror .rodata and .text as NOBITS sections. // It is needed to detected relocations after compression. diff --git a/compiler/debug/elf_symtab_writer.h b/compiler/debug/elf_symtab_writer.h index abd2699a1f..b37f984860 100644 --- a/compiler/debug/elf_symtab_writer.h +++ b/compiler/debug/elf_symtab_writer.h @@ -20,7 +20,7 @@ #include <unordered_set> #include "debug/method_debug_info.h" -#include "elf_builder.h" +#include "linker/elf_builder.h" #include "utils.h" namespace art { @@ -36,7 +36,7 @@ namespace debug { constexpr bool kGenerateSingleArmMappingSymbol = true; template <typename ElfTypes> -static void WriteDebugSymbols(ElfBuilder<ElfTypes>* builder, +static void WriteDebugSymbols(linker::ElfBuilder<ElfTypes>* builder, const ArrayRef<const MethodDebugInfo>& method_infos, bool with_signature) { uint64_t mapping_symbol_address = std::numeric_limits<uint64_t>::max(); diff --git a/compiler/linker/buffered_output_stream.cc b/compiler/linker/buffered_output_stream.cc index 4c66c764a9..07066b76ac 100644 --- a/compiler/linker/buffered_output_stream.cc +++ b/compiler/linker/buffered_output_stream.cc @@ -19,6 +19,7 @@ #include <string.h> namespace art { +namespace linker { BufferedOutputStream::BufferedOutputStream(std::unique_ptr<OutputStream> out) : OutputStream(out->GetLocation()), // Before out is moved to out_. @@ -67,4 +68,5 @@ off_t BufferedOutputStream::Seek(off_t offset, Whence whence) { return out_->Seek(offset, whence); } +} // namespace linker } // namespace art diff --git a/compiler/linker/buffered_output_stream.h b/compiler/linker/buffered_output_stream.h index a2eefbbf17..66994e82a1 100644 --- a/compiler/linker/buffered_output_stream.h +++ b/compiler/linker/buffered_output_stream.h @@ -24,6 +24,7 @@ #include "globals.h" namespace art { +namespace linker { class BufferedOutputStream FINAL : public OutputStream { public: @@ -49,6 +50,7 @@ class BufferedOutputStream FINAL : public OutputStream { DISALLOW_COPY_AND_ASSIGN(BufferedOutputStream); }; +} // namespace linker } // namespace art #endif // ART_COMPILER_LINKER_BUFFERED_OUTPUT_STREAM_H_ diff --git a/compiler/elf_builder.h b/compiler/linker/elf_builder.h index 2ef9fa1ccb..79412370bc 100644 --- a/compiler/elf_builder.h +++ b/compiler/linker/elf_builder.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef ART_COMPILER_ELF_BUILDER_H_ -#define ART_COMPILER_ELF_BUILDER_H_ +#ifndef ART_COMPILER_LINKER_ELF_BUILDER_H_ +#define ART_COMPILER_LINKER_ELF_BUILDER_H_ #include <vector> @@ -30,6 +30,7 @@ #include "linker/error_delaying_output_stream.h" namespace art { +namespace linker { // Writes ELF file. // @@ -1021,6 +1022,7 @@ class ElfBuilder FINAL { DISALLOW_COPY_AND_ASSIGN(ElfBuilder); }; +} // namespace linker } // namespace art -#endif // ART_COMPILER_ELF_BUILDER_H_ +#endif // ART_COMPILER_LINKER_ELF_BUILDER_H_ diff --git a/compiler/linker/error_delaying_output_stream.h b/compiler/linker/error_delaying_output_stream.h index 99410e4bb1..33e6b5ab23 100644 --- a/compiler/linker/error_delaying_output_stream.h +++ b/compiler/linker/error_delaying_output_stream.h @@ -22,6 +22,7 @@ #include "base/logging.h" namespace art { +namespace linker { // OutputStream wrapper that delays reporting an error until Flush(). class ErrorDelayingOutputStream FINAL : public OutputStream { @@ -96,6 +97,7 @@ class ErrorDelayingOutputStream FINAL : public OutputStream { off_t output_offset_; // Keep track of the current position in the stream. }; +} // namespace linker } // namespace art #endif // ART_COMPILER_LINKER_ERROR_DELAYING_OUTPUT_STREAM_H_ diff --git a/compiler/linker/file_output_stream.cc b/compiler/linker/file_output_stream.cc index bbfbdfdca8..477846ec65 100644 --- a/compiler/linker/file_output_stream.cc +++ b/compiler/linker/file_output_stream.cc @@ -22,6 +22,7 @@ #include "base/unix_file/fd_file.h" namespace art { +namespace linker { FileOutputStream::FileOutputStream(File* file) : OutputStream(file->GetPath()), file_(file) {} @@ -37,4 +38,5 @@ bool FileOutputStream::Flush() { return file_->Flush() == 0; } +} // namespace linker } // namespace art diff --git a/compiler/linker/file_output_stream.h b/compiler/linker/file_output_stream.h index f2d845379f..28296a47fd 100644 --- a/compiler/linker/file_output_stream.h +++ b/compiler/linker/file_output_stream.h @@ -22,6 +22,7 @@ #include "os.h" namespace art { +namespace linker { class FileOutputStream FINAL : public OutputStream { public: @@ -41,6 +42,7 @@ class FileOutputStream FINAL : public OutputStream { DISALLOW_COPY_AND_ASSIGN(FileOutputStream); }; +} // namespace linker } // namespace art #endif // ART_COMPILER_LINKER_FILE_OUTPUT_STREAM_H_ diff --git a/compiler/linker/output_stream.cc b/compiler/linker/output_stream.cc index a8b64ca1ce..f5a19138a5 100644 --- a/compiler/linker/output_stream.cc +++ b/compiler/linker/output_stream.cc @@ -17,6 +17,7 @@ #include "output_stream.h" namespace art { +namespace linker { std::ostream& operator<<(std::ostream& os, const Whence& rhs) { switch (rhs) { @@ -28,4 +29,5 @@ std::ostream& operator<<(std::ostream& os, const Whence& rhs) { return os; } +} // namespace linker } // namespace art diff --git a/compiler/linker/output_stream.h b/compiler/linker/output_stream.h index 96a5f489f0..5310e2fa41 100644 --- a/compiler/linker/output_stream.h +++ b/compiler/linker/output_stream.h @@ -23,6 +23,7 @@ #include "base/macros.h" namespace art { +namespace linker { enum Whence { kSeekSet = SEEK_SET, @@ -59,6 +60,7 @@ class OutputStream { DISALLOW_COPY_AND_ASSIGN(OutputStream); }; +} // namespace linker } // namespace art #endif // ART_COMPILER_LINKER_OUTPUT_STREAM_H_ diff --git a/compiler/linker/output_stream_test.cc b/compiler/linker/output_stream_test.cc index 87cb10000b..ad298406be 100644 --- a/compiler/linker/output_stream_test.cc +++ b/compiler/linker/output_stream_test.cc @@ -23,6 +23,7 @@ #include "common_runtime_test.h" namespace art { +namespace linker { class OutputStreamTest : public CommonRuntimeTest { protected: @@ -133,4 +134,5 @@ TEST_F(OutputStreamTest, BufferedFlush) { ASSERT_TRUE(checking_output_stream->flush_called); } +} // namespace linker } // namespace art diff --git a/compiler/linker/relative_patcher.h b/compiler/linker/relative_patcher.h index 53a096627f..e079946e71 100644 --- a/compiler/linker/relative_patcher.h +++ b/compiler/linker/relative_patcher.h @@ -29,7 +29,6 @@ namespace art { class CompiledMethod; class LinkerPatch; -class OutputStream; namespace debug { struct MethodDebugInfo; @@ -37,6 +36,8 @@ struct MethodDebugInfo; namespace linker { +class OutputStream; + /** * @class RelativePatcherTargetProvider * @brief Interface for providing method offsets for relative call targets. diff --git a/compiler/linker/relative_patcher_test.h b/compiler/linker/relative_patcher_test.h index ca8743a561..f7dbc1ef1c 100644 --- a/compiler/linker/relative_patcher_test.h +++ b/compiler/linker/relative_patcher_test.h @@ -252,8 +252,8 @@ class RelativePatcherTest : public testing::Test { } // Map method reference to assinged offset. - // Wrap the map in a class implementing linker::RelativePatcherTargetProvider. - class MethodOffsetMap FINAL : public linker::RelativePatcherTargetProvider { + // Wrap the map in a class implementing RelativePatcherTargetProvider. + class MethodOffsetMap FINAL : public RelativePatcherTargetProvider { public: std::pair<bool, uint32_t> FindMethodOffset(MethodReference ref) OVERRIDE { auto it = map.find(ref); diff --git a/compiler/linker/vector_output_stream.cc b/compiler/linker/vector_output_stream.cc index f758005c52..75f90e5f94 100644 --- a/compiler/linker/vector_output_stream.cc +++ b/compiler/linker/vector_output_stream.cc @@ -19,6 +19,7 @@ #include "base/logging.h" namespace art { +namespace linker { VectorOutputStream::VectorOutputStream(const std::string& location, std::vector<uint8_t>* vector) : OutputStream(location), offset_(vector->size()), vector_(vector) {} @@ -45,4 +46,5 @@ off_t VectorOutputStream::Seek(off_t offset, Whence whence) { return offset_; } +} // namespace linker } // namespace art diff --git a/compiler/linker/vector_output_stream.h b/compiler/linker/vector_output_stream.h index a9b93e7a83..92caf596ab 100644 --- a/compiler/linker/vector_output_stream.h +++ b/compiler/linker/vector_output_stream.h @@ -24,6 +24,7 @@ #include <vector> namespace art { +namespace linker { class VectorOutputStream FINAL : public OutputStream { public: @@ -64,6 +65,7 @@ class VectorOutputStream FINAL : public OutputStream { DISALLOW_COPY_AND_ASSIGN(VectorOutputStream); }; +} // namespace linker } // namespace art #endif // ART_COMPILER_LINKER_VECTOR_OUTPUT_STREAM_H_ diff --git a/compiler/optimizing/optimizing_compiler.cc b/compiler/optimizing/optimizing_compiler.cc index e128a15cfd..8dd2762a75 100644 --- a/compiler/optimizing/optimizing_compiler.cc +++ b/compiler/optimizing/optimizing_compiler.cc @@ -63,7 +63,6 @@ #include "driver/compiler_driver-inl.h" #include "driver/compiler_options.h" #include "driver/dex_compilation_unit.h" -#include "elf_writer_quick.h" #include "graph_checker.h" #include "graph_visualizer.h" #include "gvn.h" diff --git a/dex2oat/Android.bp b/dex2oat/Android.bp index f13f01cabe..bdb8ff1fb1 100644 --- a/dex2oat/Android.bp +++ b/dex2oat/Android.bp @@ -14,6 +14,78 @@ // limitations under the License. // +art_cc_defaults { + name: "libart-dex2oat-defaults", + defaults: ["art_defaults"], + host_supported: true, + clang: true, + srcs: [ + "linker/elf_writer.cc", + "linker/elf_writer_quick.cc", + "linker/image_writer.cc", + "linker/multi_oat_relative_patcher.cc", + "linker/oat_writer.cc", + ], + target: { + host: { + // For compiler driver TLS. + host_ldlibs: ["-lpthread"], + }, + android: { + // For atrace. + shared_libs: ["libcutils"], + }, + }, + generated_sources: ["art_dex2oat_operator_srcs"], + shared_libs: [ + "libart-compiler", + "libart-dexlayout", + "libbase", + "liblz4", + "liblzma", + ], + export_include_dirs: ["."], + + // For SHA-1 checksumming of build ID + static: { + whole_static_libs: ["libcrypto"], + }, + shared: { + shared_libs: ["libcrypto"], + }, +} + +gensrcs { + name: "art_dex2oat_operator_srcs", + cmd: "$(location generate-operator-out.py) art/dex2oat $(in) > $(out)", + tool_files: ["generate-operator-out.py"], + srcs: [ + "linker/image_writer.h", + ], + output_extension: "operator_out.cc", +} + +art_cc_static_library { + name: "libart-dex2oat", + defaults: ["libart-dex2oat-defaults"], + shared_libs: [ + "libart-compiler", + "libart" + ], +} + +art_cc_static_library { + name: "libartd-dex2oat", + defaults: [ + "art_debug_defaults", + "libart-dex2oat-defaults", + ], + shared_libs: [ + "libartd-compiler", + "libartd" + ], +} + cc_library_headers { name: "dex2oat_headers", host_supported: true, @@ -45,11 +117,16 @@ art_cc_binary { "dex2oat-defaults", ], shared_libs: [ - "libart", "libart-compiler", + "libart-dexlayout", + "libart", "libbase", + "liblz4", "libsigchain", ], + static_libs: [ + "libart-dex2oat", + ] } art_cc_binary { @@ -59,11 +136,16 @@ art_cc_binary { "dex2oat-defaults", ], shared_libs: [ - "libartd", "libartd-compiler", + "libartd-dexlayout", + "libartd", "libbase", + "liblz4", "libsigchain", ], + static_libs: [ + "libartd-dex2oat", + ] } art_cc_binary { @@ -85,6 +167,7 @@ art_cc_binary { "-z muldefs", ], static_libs: [ + "libart-dex2oat", "libart-compiler", "libart-dexlayout", "libart", @@ -115,6 +198,7 @@ art_cc_binary { "-z muldefs", ], static_libs: [ + "libartd-dex2oat", "libartd-compiler", "libartd-dexlayout", "libartd", @@ -131,6 +215,21 @@ art_cc_test { srcs: [ "dex2oat_test.cc", "dex2oat_image_test.cc", + "linker/elf_writer_test.cc", + "linker/image_test.cc", + "linker/image_write_read_test.cc", + "linker/multi_oat_relative_patcher_test.cc", + "linker/oat_writer_test.cc", ], header_libs: ["dex2oat_headers"], + shared_libs: [ + "libartd-compiler", + "libartd-dexlayout", + "libbase", + "liblz4", + "libsigchain", + ], + static_libs: [ + "libartd-dex2oat", + ] } diff --git a/dex2oat/dex2oat.cc b/dex2oat/dex2oat.cc index d8caf42f69..21d38956e3 100644 --- a/dex2oat/dex2oat.cc +++ b/dex2oat/dex2oat.cc @@ -61,19 +61,20 @@ #include "driver/compiler_driver.h" #include "driver/compiler_options.h" #include "elf_file.h" -#include "elf_writer.h" -#include "elf_writer_quick.h" #include "gc/space/image_space.h" #include "gc/space/space-inl.h" #include "gc/verification.h" -#include "image_writer.h" #include "interpreter/unstarted_runtime.h" #include "java_vm_ext.h" #include "jit/profile_compilation_info.h" #include "leb128.h" #include "linker/buffered_output_stream.h" +#include "linker/elf_writer.h" +#include "linker/elf_writer_quick.h" #include "linker/file_output_stream.h" +#include "linker/image_writer.h" #include "linker/multi_oat_relative_patcher.h" +#include "linker/oat_writer.h" #include "mirror/class-inl.h" #include "mirror/class_loader.h" #include "mirror/object-inl.h" @@ -81,7 +82,6 @@ #include "nativehelper/ScopedLocalRef.h" #include "oat_file.h" #include "oat_file_assistant.h" -#include "oat_writer.h" #include "os.h" #include "runtime.h" #include "runtime_options.h" @@ -1455,8 +1455,9 @@ class Dex2Oat FINAL { // Note: we're only invalidating the magic data in the file, as dex2oat needs the rest of // the information to remain valid. if (update_input_vdex_) { - std::unique_ptr<BufferedOutputStream> vdex_out = std::make_unique<BufferedOutputStream>( - std::make_unique<FileOutputStream>(vdex_files_.back().get())); + std::unique_ptr<linker::BufferedOutputStream> vdex_out = + std::make_unique<linker::BufferedOutputStream>( + std::make_unique<linker::FileOutputStream>(vdex_files_.back().get())); if (!vdex_out->WriteFully(&VdexFile::Header::kVdexInvalidMagic, arraysize(VdexFile::Header::kVdexInvalidMagic))) { PLOG(ERROR) << "Failed to invalidate vdex header. File: " << vdex_out->GetLocation(); @@ -2026,14 +2027,14 @@ class Dex2Oat FINAL { VLOG(compiler) << "App image base=" << reinterpret_cast<void*>(image_base_); } - image_writer_.reset(new ImageWriter(*driver_, - image_base_, - compiler_options_->GetCompilePic(), - IsAppImage(), - image_storage_mode_, - oat_filenames_, - dex_file_oat_index_map_, - dirty_image_objects_.get())); + image_writer_.reset(new linker::ImageWriter(*driver_, + image_base_, + compiler_options_->GetCompilePic(), + IsAppImage(), + image_storage_mode_, + oat_filenames_, + dex_file_oat_index_map_, + dirty_image_objects_.get())); // We need to prepare method offsets in the image address space for direct method patching. TimingLogger::ScopedTiming t2("dex2oat Prepare image address space", timings_); @@ -2046,7 +2047,7 @@ class Dex2Oat FINAL { // Initialize the writers with the compiler driver, image writer, and their // dex files. The writers were created without those being there yet. for (size_t i = 0, size = oat_files_.size(); i != size; ++i) { - std::unique_ptr<OatWriter>& oat_writer = oat_writers_[i]; + std::unique_ptr<linker::OatWriter>& oat_writer = oat_writers_[i]; std::vector<const DexFile*>& dex_files = dex_files_per_oat_file_[i]; oat_writer->Initialize(driver_.get(), image_writer_.get(), dex_files); } @@ -2057,8 +2058,9 @@ class Dex2Oat FINAL { verifier::VerifierDeps* verifier_deps = callbacks_->GetVerifierDeps(); for (size_t i = 0, size = oat_files_.size(); i != size; ++i) { File* vdex_file = vdex_files_[i].get(); - std::unique_ptr<BufferedOutputStream> vdex_out = - std::make_unique<BufferedOutputStream>(std::make_unique<FileOutputStream>(vdex_file)); + std::unique_ptr<linker::BufferedOutputStream> vdex_out = + std::make_unique<linker::BufferedOutputStream>( + std::make_unique<linker::FileOutputStream>(vdex_file)); if (!oat_writers_[i]->WriteVerifierDeps(vdex_out.get(), verifier_deps)) { LOG(ERROR) << "Failed to write verifier dependencies into VDEX " << vdex_file->GetPath(); @@ -2082,8 +2084,8 @@ class Dex2Oat FINAL { TimingLogger::ScopedTiming t2("dex2oat Write ELF", timings_); linker::MultiOatRelativePatcher patcher(instruction_set_, instruction_set_features_.get()); for (size_t i = 0, size = oat_files_.size(); i != size; ++i) { - std::unique_ptr<ElfWriter>& elf_writer = elf_writers_[i]; - std::unique_ptr<OatWriter>& oat_writer = oat_writers_[i]; + std::unique_ptr<linker::ElfWriter>& elf_writer = elf_writers_[i]; + std::unique_ptr<linker::OatWriter>& oat_writer = oat_writers_[i]; oat_writer->PrepareLayout(&patcher); @@ -2116,14 +2118,14 @@ class Dex2Oat FINAL { for (size_t i = 0, size = oat_files_.size(); i != size; ++i) { std::unique_ptr<File>& oat_file = oat_files_[i]; - std::unique_ptr<ElfWriter>& elf_writer = elf_writers_[i]; - std::unique_ptr<OatWriter>& oat_writer = oat_writers_[i]; + std::unique_ptr<linker::ElfWriter>& elf_writer = elf_writers_[i]; + std::unique_ptr<linker::OatWriter>& oat_writer = oat_writers_[i]; // We need to mirror the layout of the ELF file in the compressed debug-info. // Therefore PrepareDebugInfo() relies on the SetLoadedSectionSizes() call further above. elf_writer->PrepareDebugInfo(oat_writer->GetMethodDebugInfo()); - OutputStream*& rodata = rodata_[i]; + linker::OutputStream*& rodata = rodata_[i]; DCHECK(rodata != nullptr); if (!oat_writer->WriteRodata(rodata)) { LOG(ERROR) << "Failed to write .rodata section to the ELF file " << oat_file->GetPath(); @@ -2132,7 +2134,7 @@ class Dex2Oat FINAL { elf_writer->EndRoData(rodata); rodata = nullptr; - OutputStream* text = elf_writer->StartText(); + linker::OutputStream* text = elf_writer->StartText(); if (!oat_writer->WriteCode(text)) { LOG(ERROR) << "Failed to write .text section to the ELF file " << oat_file->GetPath(); return false; @@ -2510,13 +2512,13 @@ class Dex2Oat FINAL { elf_writers_.reserve(oat_files_.size()); oat_writers_.reserve(oat_files_.size()); for (const std::unique_ptr<File>& oat_file : oat_files_) { - elf_writers_.emplace_back(CreateElfWriterQuick(instruction_set_, - instruction_set_features_.get(), - compiler_options_.get(), - oat_file.get())); + elf_writers_.emplace_back(linker::CreateElfWriterQuick(instruction_set_, + instruction_set_features_.get(), + compiler_options_.get(), + oat_file.get())); elf_writers_.back()->Start(); const bool do_dexlayout = DoDexLayoutOptimizations(); - oat_writers_.emplace_back(new OatWriter( + oat_writers_.emplace_back(new linker::OatWriter( IsBootImage(), timings_, do_dexlayout ? profile_compilation_info_.get() : nullptr)); } } @@ -2679,7 +2681,7 @@ class Dex2Oat FINAL { return false; } - if (!ElfWriter::Fixup(oat_file.get(), oat_data_begins[i])) { + if (!linker::ElfWriter::Fixup(oat_file.get(), oat_data_begins[i])) { oat_file->Erase(); LOG(ERROR) << "Failed to fixup ELF file " << oat_file->GetPath(); return false; @@ -2882,11 +2884,11 @@ class Dex2Oat FINAL { std::vector<const DexFile*> dex_files_; std::string no_inline_from_string_; - std::vector<std::unique_ptr<ElfWriter>> elf_writers_; - std::vector<std::unique_ptr<OatWriter>> oat_writers_; - std::vector<OutputStream*> rodata_; - std::vector<std::unique_ptr<OutputStream>> vdex_out_; - std::unique_ptr<ImageWriter> image_writer_; + std::vector<std::unique_ptr<linker::ElfWriter>> elf_writers_; + std::vector<std::unique_ptr<linker::OatWriter>> oat_writers_; + std::vector<linker::OutputStream*> rodata_; + std::vector<std::unique_ptr<linker::OutputStream>> vdex_out_; + std::unique_ptr<linker::ImageWriter> image_writer_; std::unique_ptr<CompilerDriver> driver_; std::vector<std::unique_ptr<MemMap>> opened_dex_files_maps_; diff --git a/dex2oat/generate-operator-out.py b/dex2oat/generate-operator-out.py new file mode 120000 index 0000000000..cc291d20c1 --- /dev/null +++ b/dex2oat/generate-operator-out.py @@ -0,0 +1 @@ +../tools/generate-operator-out.py
\ No newline at end of file diff --git a/compiler/elf_writer.cc b/dex2oat/linker/elf_writer.cc index 37e4f113fa..ca34864293 100644 --- a/compiler/elf_writer.cc +++ b/dex2oat/linker/elf_writer.cc @@ -20,6 +20,7 @@ #include "elf_file.h" namespace art { +namespace linker { uintptr_t ElfWriter::GetOatDataAddress(ElfFile* elf_file) { uintptr_t oatdata_address = elf_file->FindSymbolAddress(SHT_DYNSYM, @@ -59,4 +60,5 @@ bool ElfWriter::Fixup(File* file, uintptr_t oat_data_begin) { return elf_file->Fixup(base_address); } +} // namespace linker } // namespace art diff --git a/compiler/elf_writer.h b/dex2oat/linker/elf_writer.h index a8a5bc32b7..0eb36eda0f 100644 --- a/compiler/elf_writer.h +++ b/dex2oat/linker/elf_writer.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef ART_COMPILER_ELF_WRITER_H_ -#define ART_COMPILER_ELF_WRITER_H_ +#ifndef ART_DEX2OAT_LINKER_ELF_WRITER_H_ +#define ART_DEX2OAT_LINKER_ELF_WRITER_H_ #include <stdint.h> #include <cstddef> @@ -30,12 +30,15 @@ namespace art { class ElfFile; -class OutputStream; namespace debug { struct MethodDebugInfo; } // namespace debug +namespace linker { + +class OutputStream; + class ElfWriter { public: // Looks up information about location of oat file in elf file container. @@ -78,6 +81,7 @@ class ElfWriter { ElfWriter() = default; }; +} // namespace linker } // namespace art -#endif // ART_COMPILER_ELF_WRITER_H_ +#endif // ART_DEX2OAT_LINKER_ELF_WRITER_H_ diff --git a/compiler/elf_writer_quick.cc b/dex2oat/linker/elf_writer_quick.cc index 5d6dd2e1d7..93f5a1d6cf 100644 --- a/compiler/elf_writer_quick.cc +++ b/dex2oat/linker/elf_writer_quick.cc @@ -27,17 +27,18 @@ #include "debug/method_debug_info.h" #include "driver/compiler_options.h" #include "elf.h" -#include "elf_builder.h" #include "elf_utils.h" #include "globals.h" #include "leb128.h" #include "linker/buffered_output_stream.h" +#include "linker/elf_builder.h" #include "linker/file_output_stream.h" #include "thread-current-inl.h" #include "thread_pool.h" #include "utils.h" namespace art { +namespace linker { // .eh_frame and .debug_frame are almost identical. // Except for some minor formatting differences, the main difference @@ -315,4 +316,5 @@ size_t ElfWriterQuick<ElfTypes>::GetLoadedSize() { template class ElfWriterQuick<ElfTypes32>; template class ElfWriterQuick<ElfTypes64>; +} // namespace linker } // namespace art diff --git a/compiler/elf_writer_quick.h b/dex2oat/linker/elf_writer_quick.h index 3d5dd39a66..e20957c5ce 100644 --- a/compiler/elf_writer_quick.h +++ b/dex2oat/linker/elf_writer_quick.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef ART_COMPILER_ELF_WRITER_QUICK_H_ -#define ART_COMPILER_ELF_WRITER_QUICK_H_ +#ifndef ART_DEX2OAT_LINKER_ELF_WRITER_QUICK_H_ +#define ART_DEX2OAT_LINKER_ELF_WRITER_QUICK_H_ #include <memory> @@ -28,11 +28,14 @@ namespace art { class CompilerOptions; class InstructionSetFeatures; +namespace linker { + std::unique_ptr<ElfWriter> CreateElfWriterQuick(InstructionSet instruction_set, const InstructionSetFeatures* features, const CompilerOptions* compiler_options, File* elf_file); +} // namespace linker } // namespace art -#endif // ART_COMPILER_ELF_WRITER_QUICK_H_ +#endif // ART_DEX2OAT_LINKER_ELF_WRITER_QUICK_H_ diff --git a/compiler/elf_writer_test.cc b/dex2oat/linker/elf_writer_test.cc index 984e9ee4e9..9f8ed77526 100644 --- a/compiler/elf_writer_test.cc +++ b/dex2oat/linker/elf_writer_test.cc @@ -18,14 +18,15 @@ #include "base/unix_file/fd_file.h" #include "common_compiler_test.h" -#include "elf_builder.h" #include "elf_file.h" #include "elf_file_impl.h" #include "elf_writer_quick.h" +#include "linker/elf_builder.h" #include "oat.h" #include "utils.h" namespace art { +namespace linker { class ElfWriterTest : public CommonCompilerTest { protected: @@ -161,4 +162,5 @@ TEST_F(ElfWriterTest, EncodeDecodeOatPatches) { } } +} // namespace linker } // namespace art diff --git a/compiler/image_test.cc b/dex2oat/linker/image_test.cc index 7b623dd979..ab6e7a875a 100644 --- a/compiler/image_test.cc +++ b/dex2oat/linker/image_test.cc @@ -24,6 +24,7 @@ #include "thread.h" namespace art { +namespace linker { TEST_F(ImageTest, TestImageLayout) { std::vector<size_t> image_sizes; @@ -153,4 +154,5 @@ TEST_F(ImageTest, TestDefaultMethods) { ASSERT_TRUE(class_linker_->IsQuickToInterpreterBridge(code)); } +} // namespace linker } // namespace art diff --git a/compiler/image_test.h b/dex2oat/linker/image_test.h index f1adeddb69..71f1fa607e 100644 --- a/compiler/image_test.h +++ b/dex2oat/linker/image_test.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef ART_COMPILER_IMAGE_TEST_H_ -#define ART_COMPILER_IMAGE_TEST_H_ +#ifndef ART_DEX2OAT_LINKER_IMAGE_TEST_H_ +#define ART_DEX2OAT_LINKER_IMAGE_TEST_H_ #include "image.h" @@ -33,11 +33,11 @@ #include "debug/method_debug_info.h" #include "dex/quick_compiler_callbacks.h" #include "driver/compiler_options.h" -#include "elf_writer.h" -#include "elf_writer_quick.h" #include "gc/space/image_space.h" #include "image_writer.h" #include "linker/buffered_output_stream.h" +#include "linker/elf_writer.h" +#include "linker/elf_writer_quick.h" #include "linker/file_output_stream.h" #include "linker/multi_oat_relative_patcher.h" #include "lock_word.h" @@ -48,6 +48,7 @@ #include "utils.h" namespace art { +namespace linker { static const uintptr_t kRequestedImageBase = ART_BASE_ADDRESS; @@ -494,7 +495,7 @@ inline void ImageTest::TestWriteRead(ImageHeader::StorageMode storage_mode) { } } - +} // namespace linker } // namespace art -#endif // ART_COMPILER_IMAGE_TEST_H_ +#endif // ART_DEX2OAT_LINKER_IMAGE_TEST_H_ diff --git a/compiler/image_write_read_test.cc b/dex2oat/linker/image_write_read_test.cc index 32c0b06766..30996b562b 100644 --- a/compiler/image_write_read_test.cc +++ b/dex2oat/linker/image_write_read_test.cc @@ -17,6 +17,7 @@ #include "image_test.h" namespace art { +namespace linker { TEST_F(ImageTest, WriteReadUncompressed) { TestWriteRead(ImageHeader::kStorageModeUncompressed); @@ -30,4 +31,5 @@ TEST_F(ImageTest, WriteReadLZ4HC) { TestWriteRead(ImageHeader::kStorageModeLZ4HC); } +} // namespace linker } // namespace art diff --git a/compiler/image_writer.cc b/dex2oat/linker/image_writer.cc index 4ffe238cc7..ee568e80ea 100644 --- a/compiler/image_writer.cc +++ b/dex2oat/linker/image_writer.cc @@ -38,7 +38,6 @@ #include "driver/compiler_driver.h" #include "elf_file.h" #include "elf_utils.h" -#include "elf_writer.h" #include "gc/accounting/card_table-inl.h" #include "gc/accounting/heap_bitmap.h" #include "gc/accounting/space_bitmap-inl.h" @@ -82,6 +81,7 @@ using ::art::mirror::ObjectArray; using ::art::mirror::String; namespace art { +namespace linker { // Separate objects into multiple bins to optimize dirty memory use. static constexpr bool kBinObjects = true; @@ -2835,5 +2835,5 @@ void ImageWriter::CopyAndFixupPointer(void** target, void* value) { } } - +} // namespace linker } // namespace art diff --git a/compiler/image_writer.h b/dex2oat/linker/image_writer.h index 2fc394e862..bdea0009a6 100644 --- a/compiler/image_writer.h +++ b/dex2oat/linker/image_writer.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef ART_COMPILER_IMAGE_WRITER_H_ -#define ART_COMPILER_IMAGE_WRITER_H_ +#ifndef ART_DEX2OAT_LINKER_IMAGE_WRITER_H_ +#define ART_DEX2OAT_LINKER_IMAGE_WRITER_H_ #include <stdint.h> #include "base/memory_tool.h" @@ -66,6 +66,8 @@ class ImtConflictTable; static constexpr int kInvalidFd = -1; +namespace linker { + // Write a Space built during compilation for use during execution. class ImageWriter FINAL { public: @@ -620,6 +622,7 @@ class ImageWriter FINAL { DISALLOW_COPY_AND_ASSIGN(ImageWriter); }; +} // namespace linker } // namespace art -#endif // ART_COMPILER_IMAGE_WRITER_H_ +#endif // ART_DEX2OAT_LINKER_IMAGE_WRITER_H_ diff --git a/compiler/linker/multi_oat_relative_patcher.cc b/dex2oat/linker/multi_oat_relative_patcher.cc index 4ae75d61c7..178a78f0bb 100644 --- a/compiler/linker/multi_oat_relative_patcher.cc +++ b/dex2oat/linker/multi_oat_relative_patcher.cc @@ -26,8 +26,7 @@ namespace linker { MultiOatRelativePatcher::MultiOatRelativePatcher(InstructionSet instruction_set, const InstructionSetFeatures* features) : method_offset_map_(), - relative_patcher_( - linker::RelativePatcher::Create(instruction_set, features, &method_offset_map_)), + relative_patcher_(RelativePatcher::Create(instruction_set, features, &method_offset_map_)), adjustment_(0u), instruction_set_(instruction_set), start_size_code_alignment_(0u), diff --git a/compiler/linker/multi_oat_relative_patcher.h b/dex2oat/linker/multi_oat_relative_patcher.h index 02cd4b0118..6683366467 100644 --- a/compiler/linker/multi_oat_relative_patcher.h +++ b/dex2oat/linker/multi_oat_relative_patcher.h @@ -14,13 +14,13 @@ * limitations under the License. */ -#ifndef ART_COMPILER_LINKER_MULTI_OAT_RELATIVE_PATCHER_H_ -#define ART_COMPILER_LINKER_MULTI_OAT_RELATIVE_PATCHER_H_ +#ifndef ART_DEX2OAT_LINKER_MULTI_OAT_RELATIVE_PATCHER_H_ +#define ART_DEX2OAT_LINKER_MULTI_OAT_RELATIVE_PATCHER_H_ #include "arch/instruction_set.h" #include "debug/method_debug_info.h" #include "method_reference.h" -#include "relative_patcher.h" +#include "linker/relative_patcher.h" #include "safe_map.h" namespace art { @@ -131,8 +131,8 @@ class MultiOatRelativePatcher FINAL { private: // Map method reference to assigned offset. - // Wrap the map in a class implementing linker::RelativePatcherTargetProvider. - class MethodOffsetMap : public linker::RelativePatcherTargetProvider { + // Wrap the map in a class implementing RelativePatcherTargetProvider. + class MethodOffsetMap : public RelativePatcherTargetProvider { public: std::pair<bool, uint32_t> FindMethodOffset(MethodReference ref) OVERRIDE; SafeMap<MethodReference, uint32_t> map; @@ -155,4 +155,4 @@ class MultiOatRelativePatcher FINAL { } // namespace linker } // namespace art -#endif // ART_COMPILER_LINKER_MULTI_OAT_RELATIVE_PATCHER_H_ +#endif // ART_DEX2OAT_LINKER_MULTI_OAT_RELATIVE_PATCHER_H_ diff --git a/compiler/linker/multi_oat_relative_patcher_test.cc b/dex2oat/linker/multi_oat_relative_patcher_test.cc index 5c359dc9ca..1b2d43e4c5 100644 --- a/compiler/linker/multi_oat_relative_patcher_test.cc +++ b/dex2oat/linker/multi_oat_relative_patcher_test.cc @@ -19,7 +19,7 @@ #include "compiled_method.h" #include "debug/method_debug_info.h" #include "gtest/gtest.h" -#include "vector_output_stream.h" +#include "linker/vector_output_stream.h" namespace art { namespace linker { diff --git a/compiler/oat_writer.cc b/dex2oat/linker/oat_writer.cc index ce1b755a9d..51c2a037a0 100644 --- a/compiler/oat_writer.cc +++ b/dex2oat/linker/oat_writer.cc @@ -61,6 +61,7 @@ #include "zip_archive.h" namespace art { +namespace linker { namespace { // anonymous namespace @@ -600,7 +601,7 @@ bool OatWriter::WriteAndOpenDexFiles( return true; } -void OatWriter::PrepareLayout(linker::MultiOatRelativePatcher* relative_patcher) { +void OatWriter::PrepareLayout(MultiOatRelativePatcher* relative_patcher) { CHECK(write_state_ == WriteState::kPrepareLayout); relative_patcher_ = relative_patcher; @@ -3629,4 +3630,5 @@ const uint8_t* OatWriter::LookupBootImageClassTableSlot(const DexFile& dex_file, UNREACHABLE(); } +} // namespace linker } // namespace art diff --git a/compiler/oat_writer.h b/dex2oat/linker/oat_writer.h index ef0ce52743..a93dd23493 100644 --- a/compiler/oat_writer.h +++ b/dex2oat/linker/oat_writer.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef ART_COMPILER_OAT_WRITER_H_ -#define ART_COMPILER_OAT_WRITER_H_ +#ifndef ART_DEX2OAT_LINKER_OAT_WRITER_H_ +#define ART_DEX2OAT_LINKER_OAT_WRITER_H_ #include <stdint.h> #include <cstddef> @@ -23,7 +23,7 @@ #include "base/array_ref.h" #include "base/dchecked_vector.h" -#include "linker/relative_patcher.h" // For linker::RelativePatcherTargetProvider. +#include "linker/relative_patcher.h" // For RelativePatcherTargetProvider. #include "mem_map.h" #include "method_reference.h" #include "mirror/class.h" @@ -38,9 +38,7 @@ namespace art { class BitVector; class CompiledMethod; class CompilerDriver; -class ImageWriter; class ProfileCompilationInfo; -class OutputStream; class TimingLogger; class TypeLookupTable; class VdexFile; @@ -50,14 +48,16 @@ namespace debug { struct MethodDebugInfo; } // namespace debug -namespace linker { -class MultiOatRelativePatcher; -} // namespace linker - namespace verifier { - class VerifierDeps; +class VerifierDeps; } // namespace verifier +namespace linker { + +class ImageWriter; +class MultiOatRelativePatcher; +class OutputStream; + // OatHeader variable length with count of D OatDexFiles // // TypeLookupTable[0] one descriptor to class def index hash table for each OatDexFile. @@ -183,7 +183,7 @@ class OatWriter { } // Prepare layout of remaining data. - void PrepareLayout(linker::MultiOatRelativePatcher* relative_patcher); + void PrepareLayout(MultiOatRelativePatcher* relative_patcher); // Write the rest of .rodata section (ClassOffsets[], OatClass[], maps). bool WriteRodata(OutputStream* out); // Write the code to the .text section. @@ -478,7 +478,7 @@ class OatWriter { uint32_t size_method_bss_mappings_; // The helper for processing relative patches is external so that we can patch across oat files. - linker::MultiOatRelativePatcher* relative_patcher_; + MultiOatRelativePatcher* relative_patcher_; // The locations of absolute patches relative to the start of the executable section. dchecked_vector<uintptr_t> absolute_patch_locations_; @@ -489,6 +489,7 @@ class OatWriter { DISALLOW_COPY_AND_ASSIGN(OatWriter); }; +} // namespace linker } // namespace art -#endif // ART_COMPILER_OAT_WRITER_H_ +#endif // ART_DEX2OAT_LINKER_OAT_WRITER_H_ diff --git a/compiler/oat_test.cc b/dex2oat/linker/oat_writer_test.cc index 6f8904979d..0600ceb12d 100644 --- a/compiler/oat_test.cc +++ b/dex2oat/linker/oat_writer_test.cc @@ -30,10 +30,10 @@ #include "dex/verification_results.h" #include "driver/compiler_driver.h" #include "driver/compiler_options.h" -#include "elf_writer.h" -#include "elf_writer_quick.h" #include "entrypoints/quick/quick_entrypoints.h" #include "linker/buffered_output_stream.h" +#include "linker/elf_writer.h" +#include "linker/elf_writer_quick.h" #include "linker/file_output_stream.h" #include "linker/multi_oat_relative_patcher.h" #include "linker/vector_output_stream.h" @@ -46,6 +46,7 @@ #include "utils/test_dex_file_builder.h" namespace art { +namespace linker { NO_RETURN static void Usage(const char* fmt, ...) { va_list ap; @@ -212,8 +213,8 @@ class OatTest : public CommonCompilerTest { ScopedObjectAccess soa(Thread::Current()); class_linker->RegisterDexFile(*dex_file, nullptr); } - linker::MultiOatRelativePatcher patcher(compiler_driver_->GetInstructionSet(), - instruction_set_features_.get()); + MultiOatRelativePatcher patcher(compiler_driver_->GetInstructionSet(), + instruction_set_features_.get()); oat_writer.Initialize(compiler_driver_.get(), nullptr, dex_files); oat_writer.PrepareLayout(&patcher); size_t rodata_size = oat_writer.GetOatHeader().GetExecutableOffset(); @@ -867,4 +868,5 @@ TEST_F(OatTest, UpdateChecksum) { EXPECT_EQ(216138397U, oat_header->GetChecksum()); } +} // namespace linker } // namespace art diff --git a/oatdump/oatdump.cc b/oatdump/oatdump.cc index 7b11258a89..36bd4bcc24 100644 --- a/oatdump/oatdump.cc +++ b/oatdump/oatdump.cc @@ -41,7 +41,6 @@ #include "dex_file-inl.h" #include "dex_instruction-inl.h" #include "disassembler.h" -#include "elf_builder.h" #include "gc/accounting/space_bitmap-inl.h" #include "gc/space/image_space.h" #include "gc/space/large_object_space.h" @@ -51,6 +50,7 @@ #include "indenter.h" #include "interpreter/unstarted_runtime.h" #include "linker/buffered_output_stream.h" +#include "linker/elf_builder.h" #include "linker/file_output_stream.h" #include "mirror/array-inl.h" #include "mirror/class-inl.h" @@ -133,9 +133,10 @@ class OatSymbolizer FINAL { if (elf_file == nullptr) { return false; } - std::unique_ptr<BufferedOutputStream> output_stream = - std::make_unique<BufferedOutputStream>(std::make_unique<FileOutputStream>(elf_file.get())); - builder_.reset(new ElfBuilder<ElfTypes>(isa, features.get(), output_stream.get())); + std::unique_ptr<linker::BufferedOutputStream> output_stream = + std::make_unique<linker::BufferedOutputStream>( + std::make_unique<linker::FileOutputStream>(elf_file.get())); + builder_.reset(new linker::ElfBuilder<ElfTypes>(isa, features.get(), output_stream.get())); builder_->Start(); @@ -326,7 +327,7 @@ class OatSymbolizer FINAL { private: const OatFile* oat_file_; - std::unique_ptr<ElfBuilder<ElfTypes> > builder_; + std::unique_ptr<linker::ElfBuilder<ElfTypes>> builder_; std::vector<debug::MethodDebugInfo> method_debug_infos_; std::unordered_set<uint32_t> seen_offsets_; const std::string output_name_; diff --git a/runtime/class_linker.h b/runtime/class_linker.h index 2f92da36b4..f97433c0b7 100644 --- a/runtime/class_linker.h +++ b/runtime/class_linker.h @@ -43,6 +43,13 @@ namespace space { class ImageSpace; } // namespace space } // namespace gc + +namespace linker { + struct CompilationHelper; + class ImageWriter; + class OatWriter; +} // namespace linker + namespace mirror { class ClassLoader; class DexCache; @@ -1276,12 +1283,12 @@ class ClassLinker { class FindVirtualMethodHolderVisitor; friend class AppImageClassLoadersAndDexCachesHelper; - friend struct CompilationHelper; // For Compile in ImageTest. friend class ImageDumper; // for DexLock - friend class ImageWriter; // for GetClassRoots + friend struct linker::CompilationHelper; // For Compile in ImageTest. + friend class linker::ImageWriter; // for GetClassRoots + friend class linker::OatWriter; // for boot image string/class table slot address lookup. friend class JniCompilerTest; // for GetRuntimeQuickGenericJniStub friend class JniInternalTest; // for GetRuntimeQuickGenericJniStub - friend class OatWriter; // for boot image string/class table slot address lookup. friend class VMClassLoader; // for LookupClass and FindClassInBaseDexClassLoader. ART_FRIEND_TEST(ClassLinkerTest, RegisterDexFileName); // for DexLock, and RegisterDexFileLocked ART_FRIEND_TEST(mirror::DexCacheMethodHandlesTest, Open); // for AllocDexCache diff --git a/runtime/class_table.h b/runtime/class_table.h index 0ffe93e051..744c010218 100644 --- a/runtime/class_table.h +++ b/runtime/class_table.h @@ -32,6 +32,14 @@ namespace art { class OatFile; +namespace linker { +class ImageWriter; +} // namespace linker + +namespace linker { +class OatWriter; +} // namespace linker + namespace mirror { class Class; class ClassLoader; @@ -286,8 +294,8 @@ class ClassTable { // Keep track of oat files with GC roots associated with dex caches in `strong_roots_`. std::vector<const OatFile*> oat_files_ GUARDED_BY(lock_); - friend class ImageWriter; // for InsertWithoutLocks. - friend class OatWriter; // for boot class TableSlot address lookup. + friend class linker::ImageWriter; // for InsertWithoutLocks. + friend class linker::OatWriter; // for boot class TableSlot address lookup. }; } // namespace art diff --git a/runtime/image.h b/runtime/image.h index da043335ff..3844186a9b 100644 --- a/runtime/image.h +++ b/runtime/image.h @@ -29,6 +29,10 @@ namespace art { class ArtField; class ArtMethod; +namespace linker { +class ImageWriter; +} // namespace linker + class ObjectVisitor { public: virtual ~ObjectVisitor() {} @@ -442,7 +446,7 @@ class PACKED(4) ImageHeader { // is the compressed size in the file. uint32_t data_size_; - friend class ImageWriter; + friend class linker::ImageWriter; }; std::ostream& operator<<(std::ostream& os, const ImageHeader::ImageMethod& policy); diff --git a/runtime/intern_table.h b/runtime/intern_table.h index 3e3abbdda2..05f2794b38 100644 --- a/runtime/intern_table.h +++ b/runtime/intern_table.h @@ -38,6 +38,10 @@ class ImageSpace; enum VisitRootFlags : uint8_t; +namespace linker { +class OatWriter; +} // namespace linker + namespace mirror { class String; } // namespace mirror @@ -223,7 +227,7 @@ class InternTable { // modifying the zygote intern table. The back of table is modified when strings are interned. std::vector<UnorderedSet> tables_; - friend class OatWriter; // for boot image string table slot address lookup. + friend class linker::OatWriter; // for boot image string table slot address lookup. ART_FRIEND_TEST(InternTableTest, CrossHash); }; @@ -283,7 +287,7 @@ class InternTable { // Weak root state, used for concurrent system weak processing and more. gc::WeakRootState weak_root_state_ GUARDED_BY(Locks::intern_table_lock_); - friend class OatWriter; // for boot image string table slot address lookup. + friend class linker::OatWriter; // for boot image string table slot address lookup. friend class Transaction; ART_FRIEND_TEST(InternTableTest, CrossHash); DISALLOW_COPY_AND_ASSIGN(InternTable); |