diff options
author | 2015-12-03 18:29:23 +0000 | |
---|---|---|
committer | 2015-12-04 15:58:02 +0000 | |
commit | 131980fc9aeb2b4d03480443e0fb494c76ce03a2 (patch) | |
tree | a071f8a706146ed4279c3cbe933d9a46910f480d | |
parent | 68cebffee2f44f0345bd7be7e4cbad0f10e64082 (diff) |
Add ElfWriter::GetStream().
This will be used for writing the OatHeader which is
currently oddly written through the .text stream.
Also move the error delaying output stream out of the
ElfBuilder<> to its own file and move all output stream
files to compiler/linker/.
Change-Id: I00db4e33ed80ac4757ec459946c7b5ae014a3a2e
23 files changed, 187 insertions, 118 deletions
diff --git a/build/Android.gtest.mk b/build/Android.gtest.mk index dcde5abbca..a17da3421f 100644 --- a/build/Android.gtest.mk +++ b/build/Android.gtest.mk @@ -248,6 +248,7 @@ COMPILER_GTEST_COMMON_SRC_FILES := \ compiler/elf_writer_test.cc \ compiler/image_test.cc \ compiler/jni/jni_compiler_test.cc \ + compiler/linker/output_stream_test.cc \ compiler/oat_test.cc \ compiler/optimizing/bounds_check_elimination_test.cc \ compiler/optimizing/dominator_test.cc \ @@ -266,7 +267,6 @@ COMPILER_GTEST_COMMON_SRC_FILES := \ compiler/optimizing/ssa_test.cc \ compiler/optimizing/stack_map_test.cc \ compiler/optimizing/suspend_check_test.cc \ - compiler/output_stream_test.cc \ compiler/utils/arena_allocator_test.cc \ compiler/utils/dedupe_set_test.cc \ compiler/utils/swap_space_test.cc \ diff --git a/compiler/Android.mk b/compiler/Android.mk index 0ed843b918..348eabdde5 100644 --- a/compiler/Android.mk +++ b/compiler/Android.mk @@ -58,6 +58,10 @@ LIBART_COMPILER_SRC_FILES := \ driver/compiler_driver.cc \ driver/compiler_options.cc \ driver/dex_compilation_unit.cc \ + linker/buffered_output_stream.cc \ + linker/file_output_stream.cc \ + linker/output_stream.cc \ + linker/vector_output_stream.cc \ linker/relative_patcher.cc \ jit/jit_compiler.cc \ jni/quick/calling_convention.cc \ @@ -100,16 +104,12 @@ LIBART_COMPILER_SRC_FILES := \ trampolines/trampoline_compiler.cc \ utils/assembler.cc \ utils/swap_space.cc \ - buffered_output_stream.cc \ compiler.cc \ elf_writer.cc \ elf_writer_debug.cc \ elf_writer_quick.cc \ - file_output_stream.cc \ image_writer.cc \ - oat_writer.cc \ - output_stream.cc \ - vector_output_stream.cc + oat_writer.cc LIBART_COMPILER_SRC_FILES_arm := \ dex/quick/arm/assemble_arm.cc \ diff --git a/compiler/dwarf/dwarf_test.h b/compiler/dwarf/dwarf_test.h index 5464ed9c49..c3a3ca9425 100644 --- a/compiler/dwarf/dwarf_test.h +++ b/compiler/dwarf/dwarf_test.h @@ -29,6 +29,7 @@ #include "common_runtime_test.h" #include "elf_builder.h" #include "gtest/gtest.h" +#include "linker/file_output_stream.h" #include "os.h" namespace art { diff --git a/compiler/elf_builder.h b/compiler/elf_builder.h index c19bc3db5c..bb07cc2913 100644 --- a/compiler/elf_builder.h +++ b/compiler/elf_builder.h @@ -23,10 +23,9 @@ #include "base/bit_utils.h" #include "base/casts.h" #include "base/unix_file/fd_file.h" -#include "buffered_output_stream.h" #include "elf_utils.h" -#include "file_output_stream.h" #include "leb128.h" +#include "linker/error_delaying_output_stream.h" #include "utils/array_ref.h" namespace art { @@ -121,8 +120,8 @@ class ElfBuilder FINAL { sections.push_back(this); // Align file position. if (header_.sh_type != SHT_NOBITS) { - header_.sh_offset = RoundUp(owner_->Seek(0, kSeekCurrent), header_.sh_addralign); - owner_->Seek(header_.sh_offset, kSeekSet); + header_.sh_offset = RoundUp(owner_->stream_.Seek(0, kSeekCurrent), header_.sh_addralign); + owner_->stream_.Seek(header_.sh_offset, kSeekSet); } // Align virtual memory address. if ((header_.sh_flags & SHF_ALLOC) != 0) { @@ -140,7 +139,7 @@ class ElfBuilder FINAL { CHECK_GT(header_.sh_size, 0u); } else { // Use the current file position to determine section size. - off_t file_offset = owner_->Seek(0, kSeekCurrent); + off_t file_offset = owner_->stream_.Seek(0, kSeekCurrent); CHECK_GE(file_offset, (off_t)header_.sh_offset); header_.sh_size = file_offset - header_.sh_offset; } @@ -162,7 +161,7 @@ class ElfBuilder FINAL { } else { CHECK(started_); CHECK_NE(header_.sh_type, (Elf_Word)SHT_NOBITS); - return owner_->Seek(0, kSeekCurrent) - header_.sh_offset; + return owner_->stream_.Seek(0, kSeekCurrent) - header_.sh_offset; } } @@ -177,21 +176,20 @@ class ElfBuilder FINAL { bool WriteFully(const void* buffer, size_t byte_count) OVERRIDE { CHECK(started_); CHECK(!finished_); - owner_->WriteFully(buffer, byte_count); - return true; + return owner_->stream_.WriteFully(buffer, byte_count); } // This function always succeeds to simplify code. // Use builder's Good() to check the actual status. off_t Seek(off_t offset, Whence whence) OVERRIDE { // Forward the seek as-is and trust the caller to use it reasonably. - return owner_->Seek(offset, whence); + return owner_->stream_.Seek(offset, whence); } // This function flushes the output and returns whether it succeeded. // If there was a previous failure, this does nothing and returns false, i.e. failed. bool Flush() OVERRIDE { - return owner_->Flush(); + return owner_->stream_.Flush(); } Elf_Word GetSectionIndex() const { @@ -277,26 +275,24 @@ class ElfBuilder FINAL { }; ElfBuilder(InstructionSet isa, OutputStream* output) - : isa_(isa), - output_(output), - output_good_(true), - output_offset_(0), - rodata_(this, ".rodata", SHT_PROGBITS, SHF_ALLOC, nullptr, 0, kPageSize, 0), - text_(this, ".text", SHT_PROGBITS, SHF_ALLOC | SHF_EXECINSTR, nullptr, 0, kPageSize, 0), - bss_(this, ".bss", SHT_NOBITS, SHF_ALLOC, nullptr, 0, kPageSize, 0), - dynstr_(this, ".dynstr", SHF_ALLOC, kPageSize), - dynsym_(this, ".dynsym", SHT_DYNSYM, SHF_ALLOC, &dynstr_), - hash_(this, ".hash", SHT_HASH, SHF_ALLOC, &dynsym_, 0, sizeof(Elf_Word), sizeof(Elf_Word)), - dynamic_(this, ".dynamic", SHT_DYNAMIC, SHF_ALLOC, &dynstr_, 0, kPageSize, sizeof(Elf_Dyn)), - eh_frame_(this, ".eh_frame", SHT_PROGBITS, SHF_ALLOC, nullptr, 0, kPageSize, 0), - eh_frame_hdr_(this, ".eh_frame_hdr", SHT_PROGBITS, SHF_ALLOC, nullptr, 0, 4, 0), - strtab_(this, ".strtab", 0, kPageSize), - symtab_(this, ".symtab", SHT_SYMTAB, 0, &strtab_), - debug_frame_(this, ".debug_frame", SHT_PROGBITS, 0, nullptr, 0, sizeof(Elf_Addr), 0), - debug_info_(this, ".debug_info", SHT_PROGBITS, 0, nullptr, 0, 1, 0), - debug_line_(this, ".debug_line", SHT_PROGBITS, 0, nullptr, 0, 1, 0), - shstrtab_(this, ".shstrtab", 0, 1), - virtual_address_(0) { + : isa_(isa), + stream_(output), + rodata_(this, ".rodata", SHT_PROGBITS, SHF_ALLOC, nullptr, 0, kPageSize, 0), + text_(this, ".text", SHT_PROGBITS, SHF_ALLOC | SHF_EXECINSTR, nullptr, 0, kPageSize, 0), + bss_(this, ".bss", SHT_NOBITS, SHF_ALLOC, nullptr, 0, kPageSize, 0), + dynstr_(this, ".dynstr", SHF_ALLOC, kPageSize), + dynsym_(this, ".dynsym", SHT_DYNSYM, SHF_ALLOC, &dynstr_), + hash_(this, ".hash", SHT_HASH, SHF_ALLOC, &dynsym_, 0, sizeof(Elf_Word), sizeof(Elf_Word)), + dynamic_(this, ".dynamic", SHT_DYNAMIC, SHF_ALLOC, &dynstr_, 0, kPageSize, sizeof(Elf_Dyn)), + eh_frame_(this, ".eh_frame", SHT_PROGBITS, SHF_ALLOC, nullptr, 0, kPageSize, 0), + eh_frame_hdr_(this, ".eh_frame_hdr", SHT_PROGBITS, SHF_ALLOC, nullptr, 0, 4, 0), + strtab_(this, ".strtab", 0, kPageSize), + symtab_(this, ".symtab", SHT_SYMTAB, 0, &strtab_), + debug_frame_(this, ".debug_frame", SHT_PROGBITS, 0, nullptr, 0, sizeof(Elf_Addr), 0), + debug_info_(this, ".debug_info", SHT_PROGBITS, 0, nullptr, 0, 1, 0), + debug_line_(this, ".debug_line", SHT_PROGBITS, 0, nullptr, 0, 1, 0), + shstrtab_(this, ".shstrtab", 0, 1), + virtual_address_(0) { text_.phdr_flags_ = PF_R | PF_X; bss_.phdr_flags_ = PF_R | PF_W; dynamic_.phdr_flags_ = PF_R | PF_W; @@ -353,7 +349,7 @@ class ElfBuilder FINAL { // We do not know the number of headers until later, so // it is easiest to just reserve a fixed amount of space. int size = sizeof(Elf_Ehdr) + sizeof(Elf_Phdr) * kMaxProgramHeaders; - Seek(size, kSeekSet); + stream_.Seek(size, kSeekSet); virtual_address_ += size; } @@ -377,9 +373,14 @@ class ElfBuilder FINAL { shdrs.push_back(section->header_); } Elf_Off section_headers_offset; - section_headers_offset = RoundUp(Seek(0, kSeekCurrent), sizeof(Elf_Off)); - Seek(section_headers_offset, kSeekSet); - WriteFully(shdrs.data(), shdrs.size() * sizeof(shdrs[0])); + section_headers_offset = RoundUp(stream_.Seek(0, kSeekCurrent), sizeof(Elf_Off)); + stream_.Seek(section_headers_offset, kSeekSet); + stream_.WriteFully(shdrs.data(), shdrs.size() * sizeof(shdrs[0])); + + // Flush everything else before writing the program headers. This should prevent + // the OS from reordering writes, so that we don't end up with valid headers + // and partially written data if we suddenly lose power, for example. + stream_.Flush(); // Write the initial file headers. std::vector<Elf_Phdr> phdrs = MakeProgramHeaders(); @@ -389,10 +390,10 @@ class ElfBuilder FINAL { elf_header.e_phnum = phdrs.size(); elf_header.e_shnum = shdrs.size(); elf_header.e_shstrndx = shstrtab_.GetSectionIndex(); - Seek(0, kSeekSet); - WriteFully(&elf_header, sizeof(elf_header)); - WriteFully(phdrs.data(), phdrs.size() * sizeof(phdrs[0])); - Flush(); + stream_.Seek(0, kSeekSet); + stream_.WriteFully(&elf_header, sizeof(elf_header)); + stream_.WriteFully(phdrs.data(), phdrs.size() * sizeof(phdrs[0])); + stream_.Flush(); } // The running program does not have access to section headers @@ -470,60 +471,15 @@ class ElfBuilder FINAL { // Returns true if all writes and seeks on the output stream succeeded. bool Good() { - return output_good_; + return stream_.Good(); } - private: - // This function always succeeds to simplify code. - // Use Good() to check the actual status of the output stream. - void WriteFully(const void* buffer, size_t byte_count) { - if (output_good_) { - if (!output_->WriteFully(buffer, byte_count)) { - PLOG(ERROR) << "Failed to write " << byte_count - << " bytes to ELF file at offset " << output_offset_; - output_good_ = false; - } - } - output_offset_ += byte_count; - } - - // This function always succeeds to simplify code. - // Use Good() to check the actual status of the output stream. - off_t Seek(off_t offset, Whence whence) { - // We keep shadow copy of the offset so that we return - // the expected value even if the output stream failed. - off_t new_offset; - switch (whence) { - case kSeekSet: - new_offset = offset; - break; - case kSeekCurrent: - new_offset = output_offset_ + offset; - break; - default: - LOG(FATAL) << "Unsupported seek type: " << whence; - UNREACHABLE(); - } - if (output_good_) { - off_t actual_offset = output_->Seek(offset, whence); - if (actual_offset == (off_t)-1) { - PLOG(ERROR) << "Failed to seek in ELF file. Offset=" << offset - << " whence=" << whence << " new_offset=" << new_offset; - output_good_ = false; - } - DCHECK_EQ(actual_offset, new_offset); - } - output_offset_ = new_offset; - return new_offset; - } - - bool Flush() { - if (output_good_) { - output_good_ = output_->Flush(); - } - return output_good_; + // Returns the builder's internal stream. + OutputStream* GetStream() { + return &stream_; } + private: static Elf_Ehdr MakeElfHeader(InstructionSet isa) { Elf_Ehdr elf_header = Elf_Ehdr(); switch (isa) { @@ -675,9 +631,7 @@ class ElfBuilder FINAL { InstructionSet isa_; - OutputStream* output_; - bool output_good_; // True if all writes to output succeeded. - off_t output_offset_; // Keep track of the current position in the stream. + ErrorDelayingOutputStream stream_; Section rodata_; Section text_; diff --git a/compiler/elf_writer.h b/compiler/elf_writer.h index 357d5f624e..c5a0fd50bd 100644 --- a/compiler/elf_writer.h +++ b/compiler/elf_writer.h @@ -62,6 +62,11 @@ class ElfWriter { virtual void WritePatchLocations(const ArrayRef<const uintptr_t>& patch_locations) = 0; virtual bool End() = 0; + // Get the ELF writer's stream. This stream can be used for writing data directly + // to a section after the section has been finished. When that's done, the user + // should Seek() back to the position where the stream was before this operation. + virtual OutputStream* GetStream() = 0; + protected: ElfWriter() = default; }; diff --git a/compiler/elf_writer_quick.cc b/compiler/elf_writer_quick.cc index 9da2af8d3e..e411496980 100644 --- a/compiler/elf_writer_quick.cc +++ b/compiler/elf_writer_quick.cc @@ -31,6 +31,8 @@ #include "elf_writer_debug.h" #include "globals.h" #include "leb128.h" +#include "linker/buffered_output_stream.h" +#include "linker/file_output_stream.h" #include "utils.h" namespace art { @@ -72,6 +74,8 @@ class ElfWriterQuick FINAL : public ElfWriter { void WritePatchLocations(const ArrayRef<const uintptr_t>& patch_locations) OVERRIDE; bool End() OVERRIDE; + virtual OutputStream* GetStream() OVERRIDE; + static void EncodeOatPatches(const std::vector<uintptr_t>& locations, std::vector<uint8_t>* buffer); @@ -191,6 +195,11 @@ bool ElfWriterQuick<ElfTypes>::End() { } template <typename ElfTypes> +OutputStream* ElfWriterQuick<ElfTypes>::GetStream() { + return builder_->GetStream(); +} + +template <typename ElfTypes> static void WriteDebugSymbols(ElfBuilder<ElfTypes>* builder, const ArrayRef<const dwarf::MethodDebugInfo>& method_infos) { bool generated_mapping_symbol = false; diff --git a/compiler/image_test.cc b/compiler/image_test.cc index 5f4a92299b..cda6240bd4 100644 --- a/compiler/image_test.cc +++ b/compiler/image_test.cc @@ -34,7 +34,6 @@ #include "scoped_thread_state_change.h" #include "signal_catcher.h" #include "utils.h" -#include "vector_output_stream.h" namespace art { diff --git a/compiler/linker/arm/relative_patcher_arm_base.cc b/compiler/linker/arm/relative_patcher_arm_base.cc index 13754fdaa1..73b0facf4b 100644 --- a/compiler/linker/arm/relative_patcher_arm_base.cc +++ b/compiler/linker/arm/relative_patcher_arm_base.cc @@ -17,9 +17,9 @@ #include "linker/arm/relative_patcher_arm_base.h" #include "compiled_method.h" +#include "linker/output_stream.h" #include "oat.h" #include "oat_quick_method_header.h" -#include "output_stream.h" namespace art { namespace linker { diff --git a/compiler/linker/arm64/relative_patcher_arm64.cc b/compiler/linker/arm64/relative_patcher_arm64.cc index 57018af840..3d4c2184f1 100644 --- a/compiler/linker/arm64/relative_patcher_arm64.cc +++ b/compiler/linker/arm64/relative_patcher_arm64.cc @@ -20,10 +20,10 @@ #include "art_method.h" #include "compiled_method.h" #include "driver/compiler_driver.h" -#include "utils/arm64/assembler_arm64.h" +#include "linker/output_stream.h" #include "oat.h" #include "oat_quick_method_header.h" -#include "output_stream.h" +#include "utils/arm64/assembler_arm64.h" namespace art { namespace linker { diff --git a/compiler/buffered_output_stream.cc b/compiler/linker/buffered_output_stream.cc index 4c66c764a9..4c66c764a9 100644 --- a/compiler/buffered_output_stream.cc +++ b/compiler/linker/buffered_output_stream.cc diff --git a/compiler/buffered_output_stream.h b/compiler/linker/buffered_output_stream.h index 1da3a6932f..a2eefbbf17 100644 --- a/compiler/buffered_output_stream.h +++ b/compiler/linker/buffered_output_stream.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef ART_COMPILER_BUFFERED_OUTPUT_STREAM_H_ -#define ART_COMPILER_BUFFERED_OUTPUT_STREAM_H_ +#ifndef ART_COMPILER_LINKER_BUFFERED_OUTPUT_STREAM_H_ +#define ART_COMPILER_LINKER_BUFFERED_OUTPUT_STREAM_H_ #include <memory> @@ -51,4 +51,4 @@ class BufferedOutputStream FINAL : public OutputStream { } // namespace art -#endif // ART_COMPILER_BUFFERED_OUTPUT_STREAM_H_ +#endif // ART_COMPILER_LINKER_BUFFERED_OUTPUT_STREAM_H_ diff --git a/compiler/linker/error_delaying_output_stream.h b/compiler/linker/error_delaying_output_stream.h new file mode 100644 index 0000000000..99410e4bb1 --- /dev/null +++ b/compiler/linker/error_delaying_output_stream.h @@ -0,0 +1,101 @@ +/* + * Copyright (C) 2015 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#ifndef ART_COMPILER_LINKER_ERROR_DELAYING_OUTPUT_STREAM_H_ +#define ART_COMPILER_LINKER_ERROR_DELAYING_OUTPUT_STREAM_H_ + +#include "output_stream.h" + +#include "base/logging.h" + +namespace art { + +// OutputStream wrapper that delays reporting an error until Flush(). +class ErrorDelayingOutputStream FINAL : public OutputStream { + public: + explicit ErrorDelayingOutputStream(OutputStream* output) + : OutputStream(output->GetLocation()), + output_(output), + output_good_(true), + output_offset_(0) { } + + // This function always succeeds to simplify code. + // Use Good() to check the actual status of the output stream. + bool WriteFully(const void* buffer, size_t byte_count) OVERRIDE { + if (output_good_) { + if (!output_->WriteFully(buffer, byte_count)) { + PLOG(ERROR) << "Failed to write " << byte_count + << " bytes to " << GetLocation() << " at offset " << output_offset_; + output_good_ = false; + } + } + output_offset_ += byte_count; + return true; + } + + // This function always succeeds to simplify code. + // Use Good() to check the actual status of the output stream. + off_t Seek(off_t offset, Whence whence) OVERRIDE { + // We keep shadow copy of the offset so that we return + // the expected value even if the output stream failed. + off_t new_offset; + switch (whence) { + case kSeekSet: + new_offset = offset; + break; + case kSeekCurrent: + new_offset = output_offset_ + offset; + break; + default: + LOG(FATAL) << "Unsupported seek type: " << whence; + UNREACHABLE(); + } + if (output_good_) { + off_t actual_offset = output_->Seek(offset, whence); + if (actual_offset == static_cast<off_t>(-1)) { + PLOG(ERROR) << "Failed to seek in " << GetLocation() << ". Offset=" << offset + << " whence=" << whence << " new_offset=" << new_offset; + output_good_ = false; + } + DCHECK_EQ(actual_offset, new_offset); + } + output_offset_ = new_offset; + return new_offset; + } + + // Flush the output and return whether all operations have succeeded. + // Do nothing if we already have a pending error. + bool Flush() OVERRIDE { + if (output_good_) { + output_good_ = output_->Flush(); + } + return output_good_; + } + + // Check (without flushing) whether all operations have succeeded so far. + bool Good() const { + return output_good_; + } + + private: + OutputStream* output_; + bool output_good_; // True if all writes to output succeeded. + off_t output_offset_; // Keep track of the current position in the stream. +}; + +} // namespace art + +#endif // ART_COMPILER_LINKER_ERROR_DELAYING_OUTPUT_STREAM_H_ diff --git a/compiler/file_output_stream.cc b/compiler/linker/file_output_stream.cc index bbfbdfdca8..bbfbdfdca8 100644 --- a/compiler/file_output_stream.cc +++ b/compiler/linker/file_output_stream.cc diff --git a/compiler/file_output_stream.h b/compiler/linker/file_output_stream.h index 6917d83f29..f2d845379f 100644 --- a/compiler/file_output_stream.h +++ b/compiler/linker/file_output_stream.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef ART_COMPILER_FILE_OUTPUT_STREAM_H_ -#define ART_COMPILER_FILE_OUTPUT_STREAM_H_ +#ifndef ART_COMPILER_LINKER_FILE_OUTPUT_STREAM_H_ +#define ART_COMPILER_LINKER_FILE_OUTPUT_STREAM_H_ #include "output_stream.h" @@ -43,4 +43,4 @@ class FileOutputStream FINAL : public OutputStream { } // namespace art -#endif // ART_COMPILER_FILE_OUTPUT_STREAM_H_ +#endif // ART_COMPILER_LINKER_FILE_OUTPUT_STREAM_H_ diff --git a/compiler/output_stream.cc b/compiler/linker/output_stream.cc index a8b64ca1ce..a8b64ca1ce 100644 --- a/compiler/output_stream.cc +++ b/compiler/linker/output_stream.cc diff --git a/compiler/output_stream.h b/compiler/linker/output_stream.h index 8f6b6d8235..96a5f489f0 100644 --- a/compiler/output_stream.h +++ b/compiler/linker/output_stream.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef ART_COMPILER_OUTPUT_STREAM_H_ -#define ART_COMPILER_OUTPUT_STREAM_H_ +#ifndef ART_COMPILER_LINKER_OUTPUT_STREAM_H_ +#define ART_COMPILER_LINKER_OUTPUT_STREAM_H_ #include <ostream> #include <string> @@ -61,4 +61,4 @@ class OutputStream { } // namespace art -#endif // ART_COMPILER_OUTPUT_STREAM_H_ +#endif // ART_COMPILER_LINKER_OUTPUT_STREAM_H_ diff --git a/compiler/output_stream_test.cc b/compiler/linker/output_stream_test.cc index 84c76f2c6c..84c76f2c6c 100644 --- a/compiler/output_stream_test.cc +++ b/compiler/linker/output_stream_test.cc diff --git a/compiler/vector_output_stream.cc b/compiler/linker/vector_output_stream.cc index 3d33673e1a..f758005c52 100644 --- a/compiler/vector_output_stream.cc +++ b/compiler/linker/vector_output_stream.cc @@ -21,7 +21,7 @@ namespace art { VectorOutputStream::VectorOutputStream(const std::string& location, std::vector<uint8_t>* vector) - : OutputStream(location), offset_(vector->size()), vector_(vector) {} + : OutputStream(location), offset_(vector->size()), vector_(vector) {} off_t VectorOutputStream::Seek(off_t offset, Whence whence) { CHECK(whence == kSeekSet || whence == kSeekCurrent || whence == kSeekEnd) << whence; diff --git a/compiler/vector_output_stream.h b/compiler/linker/vector_output_stream.h index a3c58d0800..321014374e 100644 --- a/compiler/vector_output_stream.h +++ b/compiler/linker/vector_output_stream.h @@ -14,8 +14,8 @@ * limitations under the License. */ -#ifndef ART_COMPILER_VECTOR_OUTPUT_STREAM_H_ -#define ART_COMPILER_VECTOR_OUTPUT_STREAM_H_ +#ifndef ART_COMPILER_LINKER_VECTOR_OUTPUT_STREAM_H_ +#define ART_COMPILER_LINKER_VECTOR_OUTPUT_STREAM_H_ #include "output_stream.h" @@ -66,4 +66,4 @@ class VectorOutputStream FINAL : public OutputStream { } // namespace art -#endif // ART_COMPILER_VECTOR_OUTPUT_STREAM_H_ +#endif // ART_COMPILER_LINKER_VECTOR_OUTPUT_STREAM_H_ diff --git a/compiler/oat_test.cc b/compiler/oat_test.cc index c305b120cb..b8610d0a7a 100644 --- a/compiler/oat_test.cc +++ b/compiler/oat_test.cc @@ -31,13 +31,13 @@ #include "elf_writer.h" #include "elf_writer_quick.h" #include "entrypoints/quick/quick_entrypoints.h" +#include "linker/vector_output_stream.h" #include "mirror/class-inl.h" #include "mirror/object_array-inl.h" #include "mirror/object-inl.h" #include "oat_file-inl.h" #include "oat_writer.h" #include "scoped_thread_state_change.h" -#include "vector_output_stream.h" namespace art { diff --git a/compiler/oat_writer.cc b/compiler/oat_writer.cc index a6a49f901a..0087a0df57 100644 --- a/compiler/oat_writer.cc +++ b/compiler/oat_writer.cc @@ -36,6 +36,7 @@ #include "gc/space/space.h" #include "handle_scope-inl.h" #include "image_writer.h" +#include "linker/output_stream.h" #include "linker/relative_patcher.h" #include "mirror/array.h" #include "mirror/class_loader.h" @@ -43,7 +44,6 @@ #include "mirror/object-inl.h" #include "oat_quick_method_header.h" #include "os.h" -#include "output_stream.h" #include "safe_map.h" #include "scoped_thread_state_change.h" #include "type_lookup_table.h" diff --git a/dex2oat/dex2oat.cc b/dex2oat/dex2oat.cc index 77211ce059..a1485e4dd3 100644 --- a/dex2oat/dex2oat.cc +++ b/dex2oat/dex2oat.cc @@ -74,7 +74,6 @@ #include "ScopedLocalRef.h" #include "scoped_thread_state_change.h" #include "utils.h" -#include "vector_output_stream.h" #include "well_known_classes.h" #include "zip_archive.h" diff --git a/oatdump/oatdump.cc b/oatdump/oatdump.cc index d20f7d53de..a99bb00979 100644 --- a/oatdump/oatdump.cc +++ b/oatdump/oatdump.cc @@ -42,6 +42,8 @@ #include "gc/space/space-inl.h" #include "image.h" #include "indenter.h" +#include "linker/buffered_output_stream.h" +#include "linker/file_output_stream.h" #include "mapping_table.h" #include "mirror/array-inl.h" #include "mirror/class-inl.h" @@ -52,7 +54,6 @@ #include "oat_file-inl.h" #include "oat_file_manager.h" #include "os.h" -#include "output_stream.h" #include "safe_map.h" #include "scoped_thread_state_change.h" #include "stack_map.h" |