diff options
Diffstat (limited to 'compiler/compiled_method.cc')
| -rw-r--r-- | compiler/compiled_method.cc | 181 |
1 files changed, 78 insertions, 103 deletions
diff --git a/compiler/compiled_method.cc b/compiler/compiled_method.cc index 40ef51344c..d1acada6dd 100644 --- a/compiler/compiled_method.cc +++ b/compiler/compiled_method.cc @@ -20,36 +20,29 @@ namespace art { CompiledCode::CompiledCode(CompilerDriver* compiler_driver, InstructionSet instruction_set, - const ArrayRef<const uint8_t>& quick_code) + const ArrayRef<const uint8_t>& quick_code, bool owns_code_array) : compiler_driver_(compiler_driver), instruction_set_(instruction_set), - portable_code_(nullptr), quick_code_(nullptr) { - SetCode(&quick_code, nullptr); + owns_code_array_(owns_code_array), quick_code_(nullptr) { + SetCode(&quick_code); } -CompiledCode::CompiledCode(CompilerDriver* compiler_driver, InstructionSet instruction_set, - const std::string& elf_object, const std::string& symbol) - : compiler_driver_(compiler_driver), instruction_set_(instruction_set), - portable_code_(compiler_driver_->DeduplicateCode( - ArrayRef<const uint8_t>(reinterpret_cast<const uint8_t*>(elf_object.data()), - elf_object.size()))), - quick_code_(nullptr), symbol_(symbol) { - CHECK_NE(elf_object.size(), 0U); - CHECK_NE(symbol.size(), 0U); - // TODO: we shouldn't just shove ELF objects in as "code" but - // change to have different kinds of compiled methods. This is - // being deferred until we work on hybrid execution or at least - // until we work on batch compilation. -} - -void CompiledCode::SetCode(const ArrayRef<const uint8_t>* quick_code, - const ArrayRef<const uint8_t>* portable_code) { - if (portable_code != nullptr) { - CHECK(!portable_code->empty()); - portable_code_ = compiler_driver_->DeduplicateCode(*portable_code); - } +void CompiledCode::SetCode(const ArrayRef<const uint8_t>* quick_code) { if (quick_code != nullptr) { CHECK(!quick_code->empty()); - quick_code_ = compiler_driver_->DeduplicateCode(*quick_code); + if (owns_code_array_) { + // If we are supposed to own the code, don't deduplicate it. + CHECK(quick_code_ == nullptr); + quick_code_ = new SwapVector<uint8_t>(quick_code->begin(), quick_code->end(), + compiler_driver_->GetSwapSpaceAllocator()); + } else { + quick_code_ = compiler_driver_->DeduplicateCode(*quick_code); + } + } +} + +CompiledCode::~CompiledCode() { + if (owns_code_array_) { + delete quick_code_; } } @@ -62,24 +55,15 @@ bool CompiledCode::operator==(const CompiledCode& rhs) const { } else { return std::equal(quick_code_->begin(), quick_code_->end(), rhs.quick_code_->begin()); } - } else if (portable_code_ != nullptr) { - if (rhs.portable_code_ == nullptr) { - return false; - } else if (portable_code_->size() != rhs.portable_code_->size()) { - return false; - } else { - return std::equal(portable_code_->begin(), portable_code_->end(), - rhs.portable_code_->begin()); - } } - return (rhs.quick_code_ == nullptr) && (rhs.portable_code_ == nullptr); + return (rhs.quick_code_ == nullptr); } -uint32_t CompiledCode::AlignCode(uint32_t offset) const { +size_t CompiledCode::AlignCode(size_t offset) const { return AlignCode(offset, instruction_set_); } -uint32_t CompiledCode::AlignCode(uint32_t offset, InstructionSet instruction_set) { +size_t CompiledCode::AlignCode(size_t offset, InstructionSet instruction_set) { return RoundUp(offset, GetInstructionSetAlignment(instruction_set)); } @@ -92,6 +76,7 @@ size_t CompiledCode::CodeDelta(InstructionSet instruction_set) { case kArm: case kArm64: case kMips: + case kMips64: case kX86: case kX86_64: return 0; @@ -111,6 +96,7 @@ const void* CompiledCode::CodePointer(const void* code_pointer, case kArm: case kArm64: case kMips: + case kMips64: case kX86: case kX86_64: return code_pointer; @@ -122,17 +108,12 @@ const void* CompiledCode::CodePointer(const void* code_pointer, } default: LOG(FATAL) << "Unknown InstructionSet: " << instruction_set; - return NULL; + return nullptr; } } -const std::string& CompiledCode::GetSymbol() const { - CHECK_NE(0U, symbol_.size()); - return symbol_; -} - const std::vector<uint32_t>& CompiledCode::GetOatdataOffsetsToCompliledCodeOffset() const { - CHECK_NE(0U, oatdata_offsets_to_compiled_code_offset_.size()) << symbol_; + CHECK_NE(0U, oatdata_offsets_to_compiled_code_offset_.size()); return oatdata_offsets_to_compiled_code_offset_; } @@ -146,84 +127,68 @@ CompiledMethod::CompiledMethod(CompilerDriver* driver, const size_t frame_size_in_bytes, const uint32_t core_spill_mask, const uint32_t fp_spill_mask, + DefaultSrcMap* src_mapping_table, const ArrayRef<const uint8_t>& mapping_table, const ArrayRef<const uint8_t>& vmap_table, const ArrayRef<const uint8_t>& native_gc_map, - const ArrayRef<const uint8_t>& cfi_info) - : CompiledCode(driver, instruction_set, quick_code), frame_size_in_bytes_(frame_size_in_bytes), - core_spill_mask_(core_spill_mask), fp_spill_mask_(fp_spill_mask), - mapping_table_(driver->DeduplicateMappingTable(mapping_table)), - vmap_table_(driver->DeduplicateVMapTable(vmap_table)), - gc_map_(driver->DeduplicateGCMap(native_gc_map)), - cfi_info_(cfi_info.data() == nullptr ? nullptr : driver->DeduplicateCFIInfo(cfi_info)) { -} - -CompiledMethod::CompiledMethod(CompilerDriver* driver, - InstructionSet instruction_set, - const ArrayRef<const uint8_t>& code, - const size_t frame_size_in_bytes, - const uint32_t core_spill_mask, - const uint32_t fp_spill_mask) - : CompiledCode(driver, instruction_set, code), - frame_size_in_bytes_(frame_size_in_bytes), - core_spill_mask_(core_spill_mask), fp_spill_mask_(fp_spill_mask), - cfi_info_(nullptr) { - mapping_table_ = driver->DeduplicateMappingTable(ArrayRef<const uint8_t>()); - vmap_table_ = driver->DeduplicateVMapTable(ArrayRef<const uint8_t>()); - gc_map_ = driver->DeduplicateGCMap(ArrayRef<const uint8_t>()); -} - -// Constructs a CompiledMethod for the Portable compiler. -CompiledMethod::CompiledMethod(CompilerDriver* driver, InstructionSet instruction_set, - const std::string& code, const ArrayRef<const uint8_t>& gc_map, - const std::string& symbol) - : CompiledCode(driver, instruction_set, code, symbol), - frame_size_in_bytes_(kStackAlignment), core_spill_mask_(0), - fp_spill_mask_(0), gc_map_(driver->DeduplicateGCMap(gc_map)), - cfi_info_(nullptr) { - mapping_table_ = driver->DeduplicateMappingTable(ArrayRef<const uint8_t>()); - vmap_table_ = driver->DeduplicateVMapTable(ArrayRef<const uint8_t>()); -} - -CompiledMethod::CompiledMethod(CompilerDriver* driver, InstructionSet instruction_set, - const std::string& code, const std::string& symbol) - : CompiledCode(driver, instruction_set, code, symbol), - frame_size_in_bytes_(kStackAlignment), core_spill_mask_(0), - fp_spill_mask_(0), cfi_info_(nullptr) { - mapping_table_ = driver->DeduplicateMappingTable(ArrayRef<const uint8_t>()); - vmap_table_ = driver->DeduplicateVMapTable(ArrayRef<const uint8_t>()); - gc_map_ = driver->DeduplicateGCMap(ArrayRef<const uint8_t>()); + const ArrayRef<const uint8_t>& cfi_info, + const ArrayRef<const LinkerPatch>& patches) + : CompiledCode(driver, instruction_set, quick_code, !driver->DedupeEnabled()), + owns_arrays_(!driver->DedupeEnabled()), + frame_size_in_bytes_(frame_size_in_bytes), core_spill_mask_(core_spill_mask), + fp_spill_mask_(fp_spill_mask), + patches_(patches.begin(), patches.end(), driver->GetSwapSpaceAllocator()) { + if (owns_arrays_) { + if (src_mapping_table == nullptr) { + src_mapping_table_ = new SwapSrcMap(driver->GetSwapSpaceAllocator()); + } else { + src_mapping_table_ = new SwapSrcMap(src_mapping_table->begin(), src_mapping_table->end(), + driver->GetSwapSpaceAllocator()); + } + mapping_table_ = mapping_table.empty() ? + nullptr : new SwapVector<uint8_t>(mapping_table.begin(), mapping_table.end(), + driver->GetSwapSpaceAllocator()); + vmap_table_ = new SwapVector<uint8_t>(vmap_table.begin(), vmap_table.end(), + driver->GetSwapSpaceAllocator()); + gc_map_ = native_gc_map.empty() ? nullptr : + new SwapVector<uint8_t>(native_gc_map.begin(), native_gc_map.end(), + driver->GetSwapSpaceAllocator()); + cfi_info_ = cfi_info.empty() ? nullptr : + new SwapVector<uint8_t>(cfi_info.begin(), cfi_info.end(), driver->GetSwapSpaceAllocator()); + } else { + src_mapping_table_ = src_mapping_table == nullptr ? + driver->DeduplicateSrcMappingTable(ArrayRef<SrcMapElem>()) : + driver->DeduplicateSrcMappingTable(ArrayRef<SrcMapElem>(*src_mapping_table)); + mapping_table_ = mapping_table.empty() ? + nullptr : driver->DeduplicateMappingTable(mapping_table); + vmap_table_ = driver->DeduplicateVMapTable(vmap_table); + gc_map_ = native_gc_map.empty() ? nullptr : driver->DeduplicateGCMap(native_gc_map); + cfi_info_ = cfi_info.empty() ? nullptr : driver->DeduplicateCFIInfo(cfi_info); + } } -CompiledMethod* CompiledMethod::SwapAllocCompiledMethod(CompilerDriver* driver, +CompiledMethod* CompiledMethod::SwapAllocCompiledMethod( + CompilerDriver* driver, InstructionSet instruction_set, const ArrayRef<const uint8_t>& quick_code, const size_t frame_size_in_bytes, const uint32_t core_spill_mask, const uint32_t fp_spill_mask, + DefaultSrcMap* src_mapping_table, const ArrayRef<const uint8_t>& mapping_table, const ArrayRef<const uint8_t>& vmap_table, const ArrayRef<const uint8_t>& native_gc_map, - const ArrayRef<const uint8_t>& cfi_info) { + const ArrayRef<const uint8_t>& cfi_info, + const ArrayRef<const LinkerPatch>& patches) { SwapAllocator<CompiledMethod> alloc(driver->GetSwapSpaceAllocator()); CompiledMethod* ret = alloc.allocate(1); alloc.construct(ret, driver, instruction_set, quick_code, frame_size_in_bytes, core_spill_mask, - fp_spill_mask, mapping_table, vmap_table, native_gc_map, cfi_info); + fp_spill_mask, src_mapping_table, mapping_table, vmap_table, native_gc_map, + cfi_info, patches); return ret; } -CompiledMethod* CompiledMethod::SwapAllocCompiledMethod(CompilerDriver* driver, - InstructionSet instruction_set, - const ArrayRef<const uint8_t>& quick_code, - const size_t frame_size_in_bytes, - const uint32_t core_spill_mask, - const uint32_t fp_spill_mask) { - SwapAllocator<CompiledMethod> alloc(driver->GetSwapSpaceAllocator()); - CompiledMethod* ret = alloc.allocate(1); - alloc.construct(ret, driver, instruction_set, quick_code, frame_size_in_bytes, core_spill_mask, - fp_spill_mask); - return ret; -} + void CompiledMethod::ReleaseSwapAllocatedCompiledMethod(CompilerDriver* driver, CompiledMethod* m) { SwapAllocator<CompiledMethod> alloc(driver->GetSwapSpaceAllocator()); @@ -231,4 +196,14 @@ void CompiledMethod::ReleaseSwapAllocatedCompiledMethod(CompilerDriver* driver, alloc.deallocate(m, 1); } +CompiledMethod::~CompiledMethod() { + if (owns_arrays_) { + delete src_mapping_table_; + delete mapping_table_; + delete vmap_table_; + delete gc_map_; + delete cfi_info_; + } +} + } // namespace art |