12faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes/* 22faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Copyright (C) 2011 The Android Open Source Project 32faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 42faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Licensed under the Apache License, Version 2.0 (the "License"); 52faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * you may not use this file except in compliance with the License. 62faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * You may obtain a copy of the License at 72faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 82faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * http://www.apache.org/licenses/LICENSE-2.0 92faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * 102faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * Unless required by applicable law or agreed to in writing, software 112faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * distributed under the License is distributed on an "AS IS" BASIS, 122faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 132faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * See the License for the specific language governing permissions and 142faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes * limitations under the License. 152faa5f1271587cda765f26bcf2951065300a01ffElliott Hughes */ 163320cf46afd082398aa401b246e6f301cebdf64dBrian Carlstrom 173320cf46afd082398aa401b246e6f301cebdf64dBrian Carlstrom#include "compiled_method.h" 18193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier#include "driver/compiler_driver.h" 193320cf46afd082398aa401b246e6f301cebdf64dBrian Carlstrom 203320cf46afd082398aa401b246e6f301cebdf64dBrian Carlstromnamespace art { 213320cf46afd082398aa401b246e6f301cebdf64dBrian Carlstrom 22193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu ChartierCompiledCode::CompiledCode(CompilerDriver* compiler_driver, InstructionSet instruction_set, 2362746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe const ArrayRef<const uint8_t>& quick_code) 24ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers : compiler_driver_(compiler_driver), instruction_set_(instruction_set), 25d6ed642458c8820e1beca72f3d7b5f0be4a4b64bDave Allison portable_code_(nullptr), quick_code_(nullptr) { 26ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers SetCode(&quick_code, nullptr); 27265091e581c9f643b37e7966890911f09e223269Brian Carlstrom} 28265091e581c9f643b37e7966890911f09e223269Brian Carlstrom 29193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu ChartierCompiledCode::CompiledCode(CompilerDriver* compiler_driver, InstructionSet instruction_set, 30193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier const std::string& elf_object, const std::string& symbol) 31ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers : compiler_driver_(compiler_driver), instruction_set_(instruction_set), 3262746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe portable_code_(compiler_driver_->DeduplicateCode( 3362746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe ArrayRef<const uint8_t>(reinterpret_cast<const uint8_t*>(elf_object.data()), 3462746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe elf_object.size()))), 3562746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe quick_code_(nullptr), symbol_(symbol) { 36265091e581c9f643b37e7966890911f09e223269Brian Carlstrom CHECK_NE(elf_object.size(), 0U); 37265091e581c9f643b37e7966890911f09e223269Brian Carlstrom CHECK_NE(symbol.size(), 0U); 38265091e581c9f643b37e7966890911f09e223269Brian Carlstrom // TODO: we shouldn't just shove ELF objects in as "code" but 39265091e581c9f643b37e7966890911f09e223269Brian Carlstrom // change to have different kinds of compiled methods. This is 40265091e581c9f643b37e7966890911f09e223269Brian Carlstrom // being deferred until we work on hybrid execution or at least 41265091e581c9f643b37e7966890911f09e223269Brian Carlstrom // until we work on batch compilation. 42193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier} 43193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier 4462746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampevoid CompiledCode::SetCode(const ArrayRef<const uint8_t>* quick_code, 4562746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe const ArrayRef<const uint8_t>* portable_code) { 46ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers if (portable_code != nullptr) { 47ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers CHECK(!portable_code->empty()); 48ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers portable_code_ = compiler_driver_->DeduplicateCode(*portable_code); 49ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 50ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers if (quick_code != nullptr) { 51ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers CHECK(!quick_code->empty()); 52ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers quick_code_ = compiler_driver_->DeduplicateCode(*quick_code); 53ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 54ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers} 55ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers 56ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogersbool CompiledCode::operator==(const CompiledCode& rhs) const { 57ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers if (quick_code_ != nullptr) { 58ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers if (rhs.quick_code_ == nullptr) { 59ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return false; 60ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } else if (quick_code_->size() != rhs.quick_code_->size()) { 61ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return false; 62ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } else { 63ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return std::equal(quick_code_->begin(), quick_code_->end(), rhs.quick_code_->begin()); 64ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 65ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } else if (portable_code_ != nullptr) { 66ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers if (rhs.portable_code_ == nullptr) { 67ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return false; 68ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } else if (portable_code_->size() != rhs.portable_code_->size()) { 69ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return false; 70ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } else { 71ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return std::equal(portable_code_->begin(), portable_code_->end(), 72ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers rhs.portable_code_->begin()); 73ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 74ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers } 75ef7d42fca18c16fbaf103822ad16f23246e2905dIan Rogers return (rhs.quick_code_ == nullptr) && (rhs.portable_code_ == nullptr); 76265091e581c9f643b37e7966890911f09e223269Brian Carlstrom} 77265091e581c9f643b37e7966890911f09e223269Brian Carlstrom 78598c513a2737d872e22ea8bcedec61b92deff357Logan Chienuint32_t CompiledCode::AlignCode(uint32_t offset) const { 79598c513a2737d872e22ea8bcedec61b92deff357Logan Chien return AlignCode(offset, instruction_set_); 80598c513a2737d872e22ea8bcedec61b92deff357Logan Chien} 81598c513a2737d872e22ea8bcedec61b92deff357Logan Chien 82598c513a2737d872e22ea8bcedec61b92deff357Logan Chienuint32_t CompiledCode::AlignCode(uint32_t offset, InstructionSet instruction_set) { 83af13ad9fd18b6f75fe82e7995224c55654594f93Andreas Gampe return RoundUp(offset, GetInstructionSetAlignment(instruction_set)); 84598c513a2737d872e22ea8bcedec61b92deff357Logan Chien} 85598c513a2737d872e22ea8bcedec61b92deff357Logan Chien 86598c513a2737d872e22ea8bcedec61b92deff357Logan Chiensize_t CompiledCode::CodeDelta() const { 8750abf0ad03c2cad0fa7969fc1b0bfadb0ca3bf3aDave Allison return CodeDelta(instruction_set_); 8850abf0ad03c2cad0fa7969fc1b0bfadb0ca3bf3aDave Allison} 8950abf0ad03c2cad0fa7969fc1b0bfadb0ca3bf3aDave Allison 9050abf0ad03c2cad0fa7969fc1b0bfadb0ca3bf3aDave Allisonsize_t CompiledCode::CodeDelta(InstructionSet instruction_set) { 9150abf0ad03c2cad0fa7969fc1b0bfadb0ca3bf3aDave Allison switch (instruction_set) { 92598c513a2737d872e22ea8bcedec61b92deff357Logan Chien case kArm: 93b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith case kArm64: 94598c513a2737d872e22ea8bcedec61b92deff357Logan Chien case kMips: 95598c513a2737d872e22ea8bcedec61b92deff357Logan Chien case kX86: 96fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko case kX86_64: 97598c513a2737d872e22ea8bcedec61b92deff357Logan Chien return 0; 98598c513a2737d872e22ea8bcedec61b92deff357Logan Chien case kThumb2: { 99598c513a2737d872e22ea8bcedec61b92deff357Logan Chien // +1 to set the low-order bit so a BLX will switch to Thumb mode 100598c513a2737d872e22ea8bcedec61b92deff357Logan Chien return 1; 101598c513a2737d872e22ea8bcedec61b92deff357Logan Chien } 102598c513a2737d872e22ea8bcedec61b92deff357Logan Chien default: 10350abf0ad03c2cad0fa7969fc1b0bfadb0ca3bf3aDave Allison LOG(FATAL) << "Unknown InstructionSet: " << instruction_set; 104598c513a2737d872e22ea8bcedec61b92deff357Logan Chien return 0; 105598c513a2737d872e22ea8bcedec61b92deff357Logan Chien } 106598c513a2737d872e22ea8bcedec61b92deff357Logan Chien} 107598c513a2737d872e22ea8bcedec61b92deff357Logan Chien 108598c513a2737d872e22ea8bcedec61b92deff357Logan Chienconst void* CompiledCode::CodePointer(const void* code_pointer, 109598c513a2737d872e22ea8bcedec61b92deff357Logan Chien InstructionSet instruction_set) { 110598c513a2737d872e22ea8bcedec61b92deff357Logan Chien switch (instruction_set) { 111598c513a2737d872e22ea8bcedec61b92deff357Logan Chien case kArm: 112b95a5345ae4217b70ca36f0cced92f68dda7caf5Stuart Monteith case kArm64: 113598c513a2737d872e22ea8bcedec61b92deff357Logan Chien case kMips: 114598c513a2737d872e22ea8bcedec61b92deff357Logan Chien case kX86: 115fca82208f7128fcda09b6a4743199308332558a2Dmitry Petrochenko case kX86_64: 116598c513a2737d872e22ea8bcedec61b92deff357Logan Chien return code_pointer; 117598c513a2737d872e22ea8bcedec61b92deff357Logan Chien case kThumb2: { 118598c513a2737d872e22ea8bcedec61b92deff357Logan Chien uintptr_t address = reinterpret_cast<uintptr_t>(code_pointer); 119598c513a2737d872e22ea8bcedec61b92deff357Logan Chien // Set the low-order bit so a BLX will switch to Thumb mode 120598c513a2737d872e22ea8bcedec61b92deff357Logan Chien address |= 0x1; 121598c513a2737d872e22ea8bcedec61b92deff357Logan Chien return reinterpret_cast<const void*>(address); 122598c513a2737d872e22ea8bcedec61b92deff357Logan Chien } 123598c513a2737d872e22ea8bcedec61b92deff357Logan Chien default: 124598c513a2737d872e22ea8bcedec61b92deff357Logan Chien LOG(FATAL) << "Unknown InstructionSet: " << instruction_set; 125598c513a2737d872e22ea8bcedec61b92deff357Logan Chien return NULL; 126598c513a2737d872e22ea8bcedec61b92deff357Logan Chien } 127598c513a2737d872e22ea8bcedec61b92deff357Logan Chien} 128598c513a2737d872e22ea8bcedec61b92deff357Logan Chien 129265091e581c9f643b37e7966890911f09e223269Brian Carlstromconst std::string& CompiledCode::GetSymbol() const { 130265091e581c9f643b37e7966890911f09e223269Brian Carlstrom CHECK_NE(0U, symbol_.size()); 131265091e581c9f643b37e7966890911f09e223269Brian Carlstrom return symbol_; 132265091e581c9f643b37e7966890911f09e223269Brian Carlstrom} 133265091e581c9f643b37e7966890911f09e223269Brian Carlstrom 134265091e581c9f643b37e7966890911f09e223269Brian Carlstromconst std::vector<uint32_t>& CompiledCode::GetOatdataOffsetsToCompliledCodeOffset() const { 135265091e581c9f643b37e7966890911f09e223269Brian Carlstrom CHECK_NE(0U, oatdata_offsets_to_compiled_code_offset_.size()) << symbol_; 136265091e581c9f643b37e7966890911f09e223269Brian Carlstrom return oatdata_offsets_to_compiled_code_offset_; 137265091e581c9f643b37e7966890911f09e223269Brian Carlstrom} 138265091e581c9f643b37e7966890911f09e223269Brian Carlstrom 139265091e581c9f643b37e7966890911f09e223269Brian Carlstromvoid CompiledCode::AddOatdataOffsetToCompliledCodeOffset(uint32_t offset) { 140265091e581c9f643b37e7966890911f09e223269Brian Carlstrom oatdata_offsets_to_compiled_code_offset_.push_back(offset); 141265091e581c9f643b37e7966890911f09e223269Brian Carlstrom} 142265091e581c9f643b37e7966890911f09e223269Brian Carlstrom 14372d32629303f8f39362a4099481f48646aed042fIan RogersCompiledMethod::CompiledMethod(CompilerDriver* driver, 144193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier InstructionSet instruction_set, 14562746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe const ArrayRef<const uint8_t>& quick_code, 1463320cf46afd082398aa401b246e6f301cebdf64dBrian Carlstrom const size_t frame_size_in_bytes, 1473320cf46afd082398aa401b246e6f301cebdf64dBrian Carlstrom const uint32_t core_spill_mask, 1483320cf46afd082398aa401b246e6f301cebdf64dBrian Carlstrom const uint32_t fp_spill_mask, 14962746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe const ArrayRef<const uint8_t>& mapping_table, 15062746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe const ArrayRef<const uint8_t>& vmap_table, 15162746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe const ArrayRef<const uint8_t>& native_gc_map, 15262746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe const ArrayRef<const uint8_t>& cfi_info) 15372d32629303f8f39362a4099481f48646aed042fIan Rogers : CompiledCode(driver, instruction_set, quick_code), frame_size_in_bytes_(frame_size_in_bytes), 1540c7abda482f53db3d153c073d1c7a145f84e0626Ian Rogers core_spill_mask_(core_spill_mask), fp_spill_mask_(fp_spill_mask), 15562746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe mapping_table_(driver->DeduplicateMappingTable(mapping_table)), 15662746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe vmap_table_(driver->DeduplicateVMapTable(vmap_table)), 15762746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe gc_map_(driver->DeduplicateGCMap(native_gc_map)), 15862746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe cfi_info_(cfi_info.data() == nullptr ? nullptr : driver->DeduplicateCFIInfo(cfi_info)) { 1593320cf46afd082398aa401b246e6f301cebdf64dBrian Carlstrom} 1603320cf46afd082398aa401b246e6f301cebdf64dBrian Carlstrom 16172d32629303f8f39362a4099481f48646aed042fIan RogersCompiledMethod::CompiledMethod(CompilerDriver* driver, 162193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier InstructionSet instruction_set, 16362746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe const ArrayRef<const uint8_t>& code, 1643320cf46afd082398aa401b246e6f301cebdf64dBrian Carlstrom const size_t frame_size_in_bytes, 1653320cf46afd082398aa401b246e6f301cebdf64dBrian Carlstrom const uint32_t core_spill_mask, 166169c9a7f46776b235d0a37d5e0ff27682deffe06Ian Rogers const uint32_t fp_spill_mask) 16772d32629303f8f39362a4099481f48646aed042fIan Rogers : CompiledCode(driver, instruction_set, code), 168598c513a2737d872e22ea8bcedec61b92deff357Logan Chien frame_size_in_bytes_(frame_size_in_bytes), 169ae9fd93c39a341e2dffe15c61cc7d9e841fa92c4Mark Mendell core_spill_mask_(core_spill_mask), fp_spill_mask_(fp_spill_mask), 170ae9fd93c39a341e2dffe15c61cc7d9e841fa92c4Mark Mendell cfi_info_(nullptr) { 17162746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe mapping_table_ = driver->DeduplicateMappingTable(ArrayRef<const uint8_t>()); 17262746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe vmap_table_ = driver->DeduplicateVMapTable(ArrayRef<const uint8_t>()); 17362746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe gc_map_ = driver->DeduplicateGCMap(ArrayRef<const uint8_t>()); 174193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier} 175193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier 176193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier// Constructs a CompiledMethod for the Portable compiler. 17772d32629303f8f39362a4099481f48646aed042fIan RogersCompiledMethod::CompiledMethod(CompilerDriver* driver, InstructionSet instruction_set, 17862746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe const std::string& code, const ArrayRef<const uint8_t>& gc_map, 179193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier const std::string& symbol) 18072d32629303f8f39362a4099481f48646aed042fIan Rogers : CompiledCode(driver, instruction_set, code, symbol), 181193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier frame_size_in_bytes_(kStackAlignment), core_spill_mask_(0), 18262746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe fp_spill_mask_(0), gc_map_(driver->DeduplicateGCMap(gc_map)), 18362746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe cfi_info_(nullptr) { 18462746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe mapping_table_ = driver->DeduplicateMappingTable(ArrayRef<const uint8_t>()); 18562746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe vmap_table_ = driver->DeduplicateVMapTable(ArrayRef<const uint8_t>()); 186193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier} 187193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier 18872d32629303f8f39362a4099481f48646aed042fIan RogersCompiledMethod::CompiledMethod(CompilerDriver* driver, InstructionSet instruction_set, 189193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier const std::string& code, const std::string& symbol) 19072d32629303f8f39362a4099481f48646aed042fIan Rogers : CompiledCode(driver, instruction_set, code, symbol), 191193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier frame_size_in_bytes_(kStackAlignment), core_spill_mask_(0), 19262746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe fp_spill_mask_(0), cfi_info_(nullptr) { 19362746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe mapping_table_ = driver->DeduplicateMappingTable(ArrayRef<const uint8_t>()); 19462746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe vmap_table_ = driver->DeduplicateVMapTable(ArrayRef<const uint8_t>()); 19562746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe gc_map_ = driver->DeduplicateGCMap(ArrayRef<const uint8_t>()); 19662746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe} 19762746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe 19862746d8d9c4400e4764f162b22bfb1a32be287a9Andreas GampeCompiledMethod* CompiledMethod::SwapAllocCompiledMethod(CompilerDriver* driver, 19962746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe InstructionSet instruction_set, 20062746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe const ArrayRef<const uint8_t>& quick_code, 20162746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe const size_t frame_size_in_bytes, 20262746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe const uint32_t core_spill_mask, 20362746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe const uint32_t fp_spill_mask, 20462746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe const ArrayRef<const uint8_t>& mapping_table, 20562746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe const ArrayRef<const uint8_t>& vmap_table, 20662746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe const ArrayRef<const uint8_t>& native_gc_map, 20762746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe const ArrayRef<const uint8_t>& cfi_info) { 20862746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe SwapAllocator<CompiledMethod> alloc(driver->GetSwapSpaceAllocator()); 20962746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe CompiledMethod* ret = alloc.allocate(1); 21062746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe alloc.construct(ret, driver, instruction_set, quick_code, frame_size_in_bytes, core_spill_mask, 21162746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe fp_spill_mask, mapping_table, vmap_table, native_gc_map, cfi_info); 21262746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe return ret; 21362746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe} 21462746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe 21562746d8d9c4400e4764f162b22bfb1a32be287a9Andreas GampeCompiledMethod* CompiledMethod::SwapAllocCompiledMethod(CompilerDriver* driver, 21662746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe InstructionSet instruction_set, 21762746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe const ArrayRef<const uint8_t>& quick_code, 21862746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe const size_t frame_size_in_bytes, 21962746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe const uint32_t core_spill_mask, 22062746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe const uint32_t fp_spill_mask) { 22162746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe SwapAllocator<CompiledMethod> alloc(driver->GetSwapSpaceAllocator()); 22262746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe CompiledMethod* ret = alloc.allocate(1); 22362746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe alloc.construct(ret, driver, instruction_set, quick_code, frame_size_in_bytes, core_spill_mask, 22462746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe fp_spill_mask); 22562746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe return ret; 22662746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe} 22762746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe 22862746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampevoid CompiledMethod::ReleaseSwapAllocatedCompiledMethod(CompilerDriver* driver, CompiledMethod* m) { 22962746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe SwapAllocator<CompiledMethod> alloc(driver->GetSwapSpaceAllocator()); 23062746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe alloc.destroy(m); 23162746d8d9c4400e4764f162b22bfb1a32be287a9Andreas Gampe alloc.deallocate(m, 1); 232193bad9b9cfd10642043fa2ebbfc68bd5f9ede4bMathieu Chartier} 233d6ed642458c8820e1beca72f3d7b5f0be4a4b64bDave Allison 2343320cf46afd082398aa401b246e6f301cebdf64dBrian Carlstrom} // namespace art 235