oat.cc revision 7624d25dad2d1ba25969ae704fccf68649103ae5
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 */ 16e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 17e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom#include "oat.h" 182dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "utils.h" 19e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 20e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom#include <zlib.h> 21e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 22e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstromnamespace art { 23e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 24e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstromconst uint8_t OatHeader::kOatMagic[] = { 'o', 'a', 't', '\n' }; 257624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Markoconst uint8_t OatHeader::kOatVersion[] = { '0', '2', '8', '\0' }; 26e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 27a72ec820f8cb8e04b0ba87a62e36b05a2c92ef36Elliott HughesOatHeader::OatHeader() { 28a72ec820f8cb8e04b0ba87a62e36b05a2c92ef36Elliott Hughes memset(this, 0, sizeof(*this)); 29a72ec820f8cb8e04b0ba87a62e36b05a2c92ef36Elliott Hughes} 30a72ec820f8cb8e04b0ba87a62e36b05a2c92ef36Elliott Hughes 3181f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian CarlstromOatHeader::OatHeader(InstructionSet instruction_set, 327020278bce98a0735dc6abcbd33bdf1ed2634f1dDave Allison const InstructionSetFeatures& instruction_set_features, 3381f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstrom const std::vector<const DexFile*>* dex_files, 3428db0129e5d7ef642cf8845c86c0e11832817085Brian Carlstrom uint32_t image_file_location_oat_checksum, 35700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom uint32_t image_file_location_oat_data_begin, 3681f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstrom const std::string& image_file_location) { 37e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom memcpy(magic_, kOatMagic, sizeof(kOatMagic)); 38e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom memcpy(version_, kOatVersion, sizeof(kOatVersion)); 3981f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstrom 40e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom adler32_checksum_ = adler32(0L, Z_NULL, 0); 4181f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstrom 42f852fb2921128d3b71a76e6b17c78d10fb7085e2Brian Carlstrom CHECK_NE(instruction_set, kNone); 43a72ec820f8cb8e04b0ba87a62e36b05a2c92ef36Elliott Hughes instruction_set_ = instruction_set; 44a72ec820f8cb8e04b0ba87a62e36b05a2c92ef36Elliott Hughes UpdateChecksum(&instruction_set_, sizeof(instruction_set_)); 4581f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstrom 467020278bce98a0735dc6abcbd33bdf1ed2634f1dDave Allison instruction_set_features_ = instruction_set_features; 477020278bce98a0735dc6abcbd33bdf1ed2634f1dDave Allison UpdateChecksum(&instruction_set_features_, sizeof(instruction_set_features_)); 487020278bce98a0735dc6abcbd33bdf1ed2634f1dDave Allison 49e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom dex_file_count_ = dex_files->size(); 50e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom UpdateChecksum(&dex_file_count_, sizeof(dex_file_count_)); 5181f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstrom 5228db0129e5d7ef642cf8845c86c0e11832817085Brian Carlstrom image_file_location_oat_checksum_ = image_file_location_oat_checksum; 5328db0129e5d7ef642cf8845c86c0e11832817085Brian Carlstrom UpdateChecksum(&image_file_location_oat_checksum_, sizeof(image_file_location_oat_checksum_)); 5428db0129e5d7ef642cf8845c86c0e11832817085Brian Carlstrom 55700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom CHECK(IsAligned<kPageSize>(image_file_location_oat_data_begin)); 56700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom image_file_location_oat_data_begin_ = image_file_location_oat_data_begin; 57700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom UpdateChecksum(&image_file_location_oat_data_begin_, sizeof(image_file_location_oat_data_begin_)); 5881f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstrom 5981f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstrom image_file_location_size_ = image_file_location.size(); 6081f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstrom UpdateChecksum(&image_file_location_size_, sizeof(image_file_location_size_)); 6181f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstrom UpdateChecksum(image_file_location.data(), image_file_location_size_); 6281f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstrom 63e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom executable_offset_ = 0; 64468532ea115657709bc32ee498e701a4c71762d4Ian Rogers interpreter_to_interpreter_bridge_offset_ = 0; 65468532ea115657709bc32ee498e701a4c71762d4Ian Rogers interpreter_to_compiled_code_bridge_offset_ = 0; 66468532ea115657709bc32ee498e701a4c71762d4Ian Rogers jni_dlsym_lookup_offset_ = 0; 6788474b416eb257078e590bf9bc7957cee604a186Jeff Hao portable_imt_conflict_trampoline_offset_ = 0; 680aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao portable_resolution_trampoline_offset_ = 0; 69468532ea115657709bc32ee498e701a4c71762d4Ian Rogers portable_to_interpreter_bridge_offset_ = 0; 702da882315a61072664f7ce3c212307342e907207Andreas Gampe quick_generic_jni_trampoline_offset_ = 0; 7188474b416eb257078e590bf9bc7957cee604a186Jeff Hao quick_imt_conflict_trampoline_offset_ = 0; 720aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao quick_resolution_trampoline_offset_ = 0; 73468532ea115657709bc32ee498e701a4c71762d4Ian Rogers quick_to_interpreter_bridge_offset_ = 0; 74e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom} 75e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 76e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrombool OatHeader::IsValid() const { 77f852fb2921128d3b71a76e6b17c78d10fb7085e2Brian Carlstrom if (memcmp(magic_, kOatMagic, sizeof(kOatMagic)) != 0) { 78e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom return false; 79e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom } 80f852fb2921128d3b71a76e6b17c78d10fb7085e2Brian Carlstrom if (memcmp(version_, kOatVersion, sizeof(kOatVersion)) != 0) { 81e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom return false; 82e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom } 83e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom return true; 84e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom} 85e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 86e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstromconst char* OatHeader::GetMagic() const { 87e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom CHECK(IsValid()); 88e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom return reinterpret_cast<const char*>(magic_); 89e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom} 90e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 91e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstromuint32_t OatHeader::GetChecksum() const { 92e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom CHECK(IsValid()); 93e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom return adler32_checksum_; 94e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom} 95e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 96e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstromvoid OatHeader::UpdateChecksum(const void* data, size_t length) { 97e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom DCHECK(IsValid()); 98e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom const uint8_t* bytes = reinterpret_cast<const uint8_t*>(data); 99e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom adler32_checksum_ = adler32(adler32_checksum_, bytes, length); 100e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom} 101e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 102a72ec820f8cb8e04b0ba87a62e36b05a2c92ef36Elliott HughesInstructionSet OatHeader::GetInstructionSet() const { 103a72ec820f8cb8e04b0ba87a62e36b05a2c92ef36Elliott Hughes CHECK(IsValid()); 104a72ec820f8cb8e04b0ba87a62e36b05a2c92ef36Elliott Hughes return instruction_set_; 105a72ec820f8cb8e04b0ba87a62e36b05a2c92ef36Elliott Hughes} 106a72ec820f8cb8e04b0ba87a62e36b05a2c92ef36Elliott Hughes 1077020278bce98a0735dc6abcbd33bdf1ed2634f1dDave Allisonconst InstructionSetFeatures& OatHeader::GetInstructionSetFeatures() const { 1087020278bce98a0735dc6abcbd33bdf1ed2634f1dDave Allison CHECK(IsValid()); 1097020278bce98a0735dc6abcbd33bdf1ed2634f1dDave Allison return instruction_set_features_; 1107020278bce98a0735dc6abcbd33bdf1ed2634f1dDave Allison} 1117020278bce98a0735dc6abcbd33bdf1ed2634f1dDave Allison 112e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstromuint32_t OatHeader::GetExecutableOffset() const { 113e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom DCHECK(IsValid()); 11406b37d91bb3d543002b1aee9829691f5e8bebc7eElliott Hughes DCHECK_ALIGNED(executable_offset_, kPageSize); 115e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom CHECK_GT(executable_offset_, sizeof(OatHeader)); 116e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom return executable_offset_; 117e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom} 118e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom 1190aba0ba155bef7346bde19e53581200b89ae8a7aJeff Haovoid OatHeader::SetExecutableOffset(uint32_t executable_offset) { 1200aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao DCHECK_ALIGNED(executable_offset, kPageSize); 1210aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao CHECK_GT(executable_offset, sizeof(OatHeader)); 1220aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao DCHECK(IsValid()); 1230aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao DCHECK_EQ(executable_offset_, 0U); 1240aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao 1250aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao executable_offset_ = executable_offset; 1260aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao UpdateChecksum(&executable_offset_, sizeof(executable_offset)); 1270aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao} 1280aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao 129468532ea115657709bc32ee498e701a4c71762d4Ian Rogersconst void* OatHeader::GetInterpreterToInterpreterBridge() const { 130468532ea115657709bc32ee498e701a4c71762d4Ian Rogers return reinterpret_cast<const uint8_t*>(this) + GetInterpreterToInterpreterBridgeOffset(); 1310aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao} 1320aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao 133468532ea115657709bc32ee498e701a4c71762d4Ian Rogersuint32_t OatHeader::GetInterpreterToInterpreterBridgeOffset() const { 1340aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao DCHECK(IsValid()); 135c6104ae36351591157fa09c482796256f82daddcDave Allison CHECK(interpreter_to_interpreter_bridge_offset_ == 0 || 136c6104ae36351591157fa09c482796256f82daddcDave Allison interpreter_to_interpreter_bridge_offset_ >= executable_offset_); 137468532ea115657709bc32ee498e701a4c71762d4Ian Rogers return interpreter_to_interpreter_bridge_offset_; 1380aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao} 1390aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao 140468532ea115657709bc32ee498e701a4c71762d4Ian Rogersvoid OatHeader::SetInterpreterToInterpreterBridgeOffset(uint32_t offset) { 1410aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao CHECK(offset == 0 || offset >= executable_offset_); 1420aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao DCHECK(IsValid()); 143468532ea115657709bc32ee498e701a4c71762d4Ian Rogers DCHECK_EQ(interpreter_to_interpreter_bridge_offset_, 0U) << offset; 1440aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao 145468532ea115657709bc32ee498e701a4c71762d4Ian Rogers interpreter_to_interpreter_bridge_offset_ = offset; 146468532ea115657709bc32ee498e701a4c71762d4Ian Rogers UpdateChecksum(&interpreter_to_interpreter_bridge_offset_, sizeof(offset)); 1470aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao} 1480aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao 149468532ea115657709bc32ee498e701a4c71762d4Ian Rogersconst void* OatHeader::GetInterpreterToCompiledCodeBridge() const { 150468532ea115657709bc32ee498e701a4c71762d4Ian Rogers return reinterpret_cast<const uint8_t*>(this) + GetInterpreterToCompiledCodeBridgeOffset(); 1510aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao} 1520aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao 153468532ea115657709bc32ee498e701a4c71762d4Ian Rogersuint32_t OatHeader::GetInterpreterToCompiledCodeBridgeOffset() const { 1540aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao DCHECK(IsValid()); 155468532ea115657709bc32ee498e701a4c71762d4Ian Rogers CHECK_GE(interpreter_to_compiled_code_bridge_offset_, interpreter_to_interpreter_bridge_offset_); 156468532ea115657709bc32ee498e701a4c71762d4Ian Rogers return interpreter_to_compiled_code_bridge_offset_; 1570aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao} 1580aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao 159468532ea115657709bc32ee498e701a4c71762d4Ian Rogersvoid OatHeader::SetInterpreterToCompiledCodeBridgeOffset(uint32_t offset) { 160468532ea115657709bc32ee498e701a4c71762d4Ian Rogers CHECK(offset == 0 || offset >= interpreter_to_interpreter_bridge_offset_); 1610aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao DCHECK(IsValid()); 162468532ea115657709bc32ee498e701a4c71762d4Ian Rogers DCHECK_EQ(interpreter_to_compiled_code_bridge_offset_, 0U) << offset; 1630aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao 164468532ea115657709bc32ee498e701a4c71762d4Ian Rogers interpreter_to_compiled_code_bridge_offset_ = offset; 165468532ea115657709bc32ee498e701a4c71762d4Ian Rogers UpdateChecksum(&interpreter_to_compiled_code_bridge_offset_, sizeof(offset)); 166468532ea115657709bc32ee498e701a4c71762d4Ian Rogers} 167468532ea115657709bc32ee498e701a4c71762d4Ian Rogers 168468532ea115657709bc32ee498e701a4c71762d4Ian Rogersconst void* OatHeader::GetJniDlsymLookup() const { 169468532ea115657709bc32ee498e701a4c71762d4Ian Rogers return reinterpret_cast<const uint8_t*>(this) + GetJniDlsymLookupOffset(); 170468532ea115657709bc32ee498e701a4c71762d4Ian Rogers} 171468532ea115657709bc32ee498e701a4c71762d4Ian Rogers 172468532ea115657709bc32ee498e701a4c71762d4Ian Rogersuint32_t OatHeader::GetJniDlsymLookupOffset() const { 173468532ea115657709bc32ee498e701a4c71762d4Ian Rogers DCHECK(IsValid()); 174468532ea115657709bc32ee498e701a4c71762d4Ian Rogers CHECK_GE(jni_dlsym_lookup_offset_, interpreter_to_compiled_code_bridge_offset_); 175468532ea115657709bc32ee498e701a4c71762d4Ian Rogers return jni_dlsym_lookup_offset_; 176468532ea115657709bc32ee498e701a4c71762d4Ian Rogers} 177468532ea115657709bc32ee498e701a4c71762d4Ian Rogers 178468532ea115657709bc32ee498e701a4c71762d4Ian Rogersvoid OatHeader::SetJniDlsymLookupOffset(uint32_t offset) { 179468532ea115657709bc32ee498e701a4c71762d4Ian Rogers CHECK(offset == 0 || offset >= interpreter_to_compiled_code_bridge_offset_); 180468532ea115657709bc32ee498e701a4c71762d4Ian Rogers DCHECK(IsValid()); 181468532ea115657709bc32ee498e701a4c71762d4Ian Rogers DCHECK_EQ(jni_dlsym_lookup_offset_, 0U) << offset; 182468532ea115657709bc32ee498e701a4c71762d4Ian Rogers 183468532ea115657709bc32ee498e701a4c71762d4Ian Rogers jni_dlsym_lookup_offset_ = offset; 184468532ea115657709bc32ee498e701a4c71762d4Ian Rogers UpdateChecksum(&jni_dlsym_lookup_offset_, sizeof(offset)); 1850aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao} 1860aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao 18788474b416eb257078e590bf9bc7957cee604a186Jeff Haoconst void* OatHeader::GetPortableImtConflictTrampoline() const { 18888474b416eb257078e590bf9bc7957cee604a186Jeff Hao return reinterpret_cast<const uint8_t*>(this) + GetPortableImtConflictTrampolineOffset(); 18988474b416eb257078e590bf9bc7957cee604a186Jeff Hao} 19088474b416eb257078e590bf9bc7957cee604a186Jeff Hao 19188474b416eb257078e590bf9bc7957cee604a186Jeff Haouint32_t OatHeader::GetPortableImtConflictTrampolineOffset() const { 19288474b416eb257078e590bf9bc7957cee604a186Jeff Hao DCHECK(IsValid()); 19388474b416eb257078e590bf9bc7957cee604a186Jeff Hao CHECK_GE(portable_imt_conflict_trampoline_offset_, jni_dlsym_lookup_offset_); 19488474b416eb257078e590bf9bc7957cee604a186Jeff Hao return portable_imt_conflict_trampoline_offset_; 19588474b416eb257078e590bf9bc7957cee604a186Jeff Hao} 19688474b416eb257078e590bf9bc7957cee604a186Jeff Hao 19788474b416eb257078e590bf9bc7957cee604a186Jeff Haovoid OatHeader::SetPortableImtConflictTrampolineOffset(uint32_t offset) { 19888474b416eb257078e590bf9bc7957cee604a186Jeff Hao CHECK(offset == 0 || offset >= jni_dlsym_lookup_offset_); 19988474b416eb257078e590bf9bc7957cee604a186Jeff Hao DCHECK(IsValid()); 20088474b416eb257078e590bf9bc7957cee604a186Jeff Hao DCHECK_EQ(portable_imt_conflict_trampoline_offset_, 0U) << offset; 20188474b416eb257078e590bf9bc7957cee604a186Jeff Hao 20288474b416eb257078e590bf9bc7957cee604a186Jeff Hao portable_imt_conflict_trampoline_offset_ = offset; 20388474b416eb257078e590bf9bc7957cee604a186Jeff Hao UpdateChecksum(&portable_imt_conflict_trampoline_offset_, sizeof(offset)); 20488474b416eb257078e590bf9bc7957cee604a186Jeff Hao} 20588474b416eb257078e590bf9bc7957cee604a186Jeff Hao 2060aba0ba155bef7346bde19e53581200b89ae8a7aJeff Haoconst void* OatHeader::GetPortableResolutionTrampoline() const { 2070aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao return reinterpret_cast<const uint8_t*>(this) + GetPortableResolutionTrampolineOffset(); 2080aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao} 2090aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao 2100aba0ba155bef7346bde19e53581200b89ae8a7aJeff Haouint32_t OatHeader::GetPortableResolutionTrampolineOffset() const { 2110aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao DCHECK(IsValid()); 21288474b416eb257078e590bf9bc7957cee604a186Jeff Hao CHECK_GE(portable_resolution_trampoline_offset_, portable_imt_conflict_trampoline_offset_); 2130aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao return portable_resolution_trampoline_offset_; 2140aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao} 2150aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao 2160aba0ba155bef7346bde19e53581200b89ae8a7aJeff Haovoid OatHeader::SetPortableResolutionTrampolineOffset(uint32_t offset) { 21788474b416eb257078e590bf9bc7957cee604a186Jeff Hao CHECK(offset == 0 || offset >= portable_imt_conflict_trampoline_offset_); 2180aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao DCHECK(IsValid()); 2190aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao DCHECK_EQ(portable_resolution_trampoline_offset_, 0U) << offset; 2200aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao 2210aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao portable_resolution_trampoline_offset_ = offset; 2220aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao UpdateChecksum(&portable_resolution_trampoline_offset_, sizeof(offset)); 2230aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao} 2240aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao 225468532ea115657709bc32ee498e701a4c71762d4Ian Rogersconst void* OatHeader::GetPortableToInterpreterBridge() const { 226468532ea115657709bc32ee498e701a4c71762d4Ian Rogers return reinterpret_cast<const uint8_t*>(this) + GetPortableToInterpreterBridgeOffset(); 227468532ea115657709bc32ee498e701a4c71762d4Ian Rogers} 228468532ea115657709bc32ee498e701a4c71762d4Ian Rogers 229468532ea115657709bc32ee498e701a4c71762d4Ian Rogersuint32_t OatHeader::GetPortableToInterpreterBridgeOffset() const { 230468532ea115657709bc32ee498e701a4c71762d4Ian Rogers DCHECK(IsValid()); 231468532ea115657709bc32ee498e701a4c71762d4Ian Rogers CHECK_GE(portable_to_interpreter_bridge_offset_, portable_resolution_trampoline_offset_); 232468532ea115657709bc32ee498e701a4c71762d4Ian Rogers return portable_to_interpreter_bridge_offset_; 233468532ea115657709bc32ee498e701a4c71762d4Ian Rogers} 234468532ea115657709bc32ee498e701a4c71762d4Ian Rogers 235468532ea115657709bc32ee498e701a4c71762d4Ian Rogersvoid OatHeader::SetPortableToInterpreterBridgeOffset(uint32_t offset) { 236468532ea115657709bc32ee498e701a4c71762d4Ian Rogers CHECK(offset == 0 || offset >= portable_resolution_trampoline_offset_); 237468532ea115657709bc32ee498e701a4c71762d4Ian Rogers DCHECK(IsValid()); 238468532ea115657709bc32ee498e701a4c71762d4Ian Rogers DCHECK_EQ(portable_to_interpreter_bridge_offset_, 0U) << offset; 239468532ea115657709bc32ee498e701a4c71762d4Ian Rogers 240468532ea115657709bc32ee498e701a4c71762d4Ian Rogers portable_to_interpreter_bridge_offset_ = offset; 241468532ea115657709bc32ee498e701a4c71762d4Ian Rogers UpdateChecksum(&portable_to_interpreter_bridge_offset_, sizeof(offset)); 242468532ea115657709bc32ee498e701a4c71762d4Ian Rogers} 243468532ea115657709bc32ee498e701a4c71762d4Ian Rogers 2442da882315a61072664f7ce3c212307342e907207Andreas Gampeconst void* OatHeader::GetQuickGenericJniTrampoline() const { 2452da882315a61072664f7ce3c212307342e907207Andreas Gampe return reinterpret_cast<const uint8_t*>(this) + GetQuickGenericJniTrampolineOffset(); 2462da882315a61072664f7ce3c212307342e907207Andreas Gampe} 2472da882315a61072664f7ce3c212307342e907207Andreas Gampe 2482da882315a61072664f7ce3c212307342e907207Andreas Gampeuint32_t OatHeader::GetQuickGenericJniTrampolineOffset() const { 2492da882315a61072664f7ce3c212307342e907207Andreas Gampe DCHECK(IsValid()); 2502da882315a61072664f7ce3c212307342e907207Andreas Gampe CHECK_GE(quick_generic_jni_trampoline_offset_, portable_to_interpreter_bridge_offset_); 2512da882315a61072664f7ce3c212307342e907207Andreas Gampe return quick_generic_jni_trampoline_offset_; 2522da882315a61072664f7ce3c212307342e907207Andreas Gampe} 2532da882315a61072664f7ce3c212307342e907207Andreas Gampe 2542da882315a61072664f7ce3c212307342e907207Andreas Gampevoid OatHeader::SetQuickGenericJniTrampolineOffset(uint32_t offset) { 2552da882315a61072664f7ce3c212307342e907207Andreas Gampe CHECK(offset == 0 || offset >= portable_to_interpreter_bridge_offset_); 2562da882315a61072664f7ce3c212307342e907207Andreas Gampe DCHECK(IsValid()); 2572da882315a61072664f7ce3c212307342e907207Andreas Gampe DCHECK_EQ(quick_generic_jni_trampoline_offset_, 0U) << offset; 2582da882315a61072664f7ce3c212307342e907207Andreas Gampe 2592da882315a61072664f7ce3c212307342e907207Andreas Gampe quick_generic_jni_trampoline_offset_ = offset; 2602da882315a61072664f7ce3c212307342e907207Andreas Gampe UpdateChecksum(&quick_generic_jni_trampoline_offset_, sizeof(offset)); 2612da882315a61072664f7ce3c212307342e907207Andreas Gampe} 2622da882315a61072664f7ce3c212307342e907207Andreas Gampe 26388474b416eb257078e590bf9bc7957cee604a186Jeff Haoconst void* OatHeader::GetQuickImtConflictTrampoline() const { 26488474b416eb257078e590bf9bc7957cee604a186Jeff Hao return reinterpret_cast<const uint8_t*>(this) + GetQuickImtConflictTrampolineOffset(); 26588474b416eb257078e590bf9bc7957cee604a186Jeff Hao} 26688474b416eb257078e590bf9bc7957cee604a186Jeff Hao 26788474b416eb257078e590bf9bc7957cee604a186Jeff Haouint32_t OatHeader::GetQuickImtConflictTrampolineOffset() const { 26888474b416eb257078e590bf9bc7957cee604a186Jeff Hao DCHECK(IsValid()); 2692da882315a61072664f7ce3c212307342e907207Andreas Gampe CHECK_GE(quick_imt_conflict_trampoline_offset_, quick_generic_jni_trampoline_offset_); 27088474b416eb257078e590bf9bc7957cee604a186Jeff Hao return quick_imt_conflict_trampoline_offset_; 27188474b416eb257078e590bf9bc7957cee604a186Jeff Hao} 27288474b416eb257078e590bf9bc7957cee604a186Jeff Hao 27388474b416eb257078e590bf9bc7957cee604a186Jeff Haovoid OatHeader::SetQuickImtConflictTrampolineOffset(uint32_t offset) { 2742da882315a61072664f7ce3c212307342e907207Andreas Gampe CHECK(offset == 0 || offset >= quick_generic_jni_trampoline_offset_); 27588474b416eb257078e590bf9bc7957cee604a186Jeff Hao DCHECK(IsValid()); 27688474b416eb257078e590bf9bc7957cee604a186Jeff Hao DCHECK_EQ(quick_imt_conflict_trampoline_offset_, 0U) << offset; 27788474b416eb257078e590bf9bc7957cee604a186Jeff Hao 27888474b416eb257078e590bf9bc7957cee604a186Jeff Hao quick_imt_conflict_trampoline_offset_ = offset; 27988474b416eb257078e590bf9bc7957cee604a186Jeff Hao UpdateChecksum(&quick_imt_conflict_trampoline_offset_, sizeof(offset)); 28088474b416eb257078e590bf9bc7957cee604a186Jeff Hao} 28188474b416eb257078e590bf9bc7957cee604a186Jeff Hao 2820aba0ba155bef7346bde19e53581200b89ae8a7aJeff Haoconst void* OatHeader::GetQuickResolutionTrampoline() const { 2830aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao return reinterpret_cast<const uint8_t*>(this) + GetQuickResolutionTrampolineOffset(); 2840aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao} 2850aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao 2860aba0ba155bef7346bde19e53581200b89ae8a7aJeff Haouint32_t OatHeader::GetQuickResolutionTrampolineOffset() const { 2870aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao DCHECK(IsValid()); 28888474b416eb257078e590bf9bc7957cee604a186Jeff Hao CHECK_GE(quick_resolution_trampoline_offset_, quick_imt_conflict_trampoline_offset_); 2890aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao return quick_resolution_trampoline_offset_; 2900aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao} 2910aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao 2920aba0ba155bef7346bde19e53581200b89ae8a7aJeff Haovoid OatHeader::SetQuickResolutionTrampolineOffset(uint32_t offset) { 29388474b416eb257078e590bf9bc7957cee604a186Jeff Hao CHECK(offset == 0 || offset >= quick_imt_conflict_trampoline_offset_); 2940aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao DCHECK(IsValid()); 2950aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao DCHECK_EQ(quick_resolution_trampoline_offset_, 0U) << offset; 2960aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao 2970aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao quick_resolution_trampoline_offset_ = offset; 2980aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao UpdateChecksum(&quick_resolution_trampoline_offset_, sizeof(offset)); 2990aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao} 3000aba0ba155bef7346bde19e53581200b89ae8a7aJeff Hao 301468532ea115657709bc32ee498e701a4c71762d4Ian Rogersconst void* OatHeader::GetQuickToInterpreterBridge() const { 302468532ea115657709bc32ee498e701a4c71762d4Ian Rogers return reinterpret_cast<const uint8_t*>(this) + GetQuickToInterpreterBridgeOffset(); 303468532ea115657709bc32ee498e701a4c71762d4Ian Rogers} 304468532ea115657709bc32ee498e701a4c71762d4Ian Rogers 305468532ea115657709bc32ee498e701a4c71762d4Ian Rogersuint32_t OatHeader::GetQuickToInterpreterBridgeOffset() const { 306468532ea115657709bc32ee498e701a4c71762d4Ian Rogers DCHECK(IsValid()); 307468532ea115657709bc32ee498e701a4c71762d4Ian Rogers CHECK_GE(quick_to_interpreter_bridge_offset_, quick_resolution_trampoline_offset_); 308468532ea115657709bc32ee498e701a4c71762d4Ian Rogers return quick_to_interpreter_bridge_offset_; 309468532ea115657709bc32ee498e701a4c71762d4Ian Rogers} 310468532ea115657709bc32ee498e701a4c71762d4Ian Rogers 311468532ea115657709bc32ee498e701a4c71762d4Ian Rogersvoid OatHeader::SetQuickToInterpreterBridgeOffset(uint32_t offset) { 312468532ea115657709bc32ee498e701a4c71762d4Ian Rogers CHECK(offset == 0 || offset >= quick_resolution_trampoline_offset_); 313468532ea115657709bc32ee498e701a4c71762d4Ian Rogers DCHECK(IsValid()); 314468532ea115657709bc32ee498e701a4c71762d4Ian Rogers DCHECK_EQ(quick_to_interpreter_bridge_offset_, 0U) << offset; 315468532ea115657709bc32ee498e701a4c71762d4Ian Rogers 316468532ea115657709bc32ee498e701a4c71762d4Ian Rogers quick_to_interpreter_bridge_offset_ = offset; 317468532ea115657709bc32ee498e701a4c71762d4Ian Rogers UpdateChecksum(&quick_to_interpreter_bridge_offset_, sizeof(offset)); 318468532ea115657709bc32ee498e701a4c71762d4Ian Rogers} 319468532ea115657709bc32ee498e701a4c71762d4Ian Rogers 32028db0129e5d7ef642cf8845c86c0e11832817085Brian Carlstromuint32_t OatHeader::GetImageFileLocationOatChecksum() const { 32128db0129e5d7ef642cf8845c86c0e11832817085Brian Carlstrom CHECK(IsValid()); 32228db0129e5d7ef642cf8845c86c0e11832817085Brian Carlstrom return image_file_location_oat_checksum_; 32328db0129e5d7ef642cf8845c86c0e11832817085Brian Carlstrom} 32428db0129e5d7ef642cf8845c86c0e11832817085Brian Carlstrom 325700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstromuint32_t OatHeader::GetImageFileLocationOatDataBegin() const { 32681f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstrom CHECK(IsValid()); 327700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom return image_file_location_oat_data_begin_; 32881f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstrom} 32981f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstrom 33081f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstromuint32_t OatHeader::GetImageFileLocationSize() const { 33181f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstrom CHECK(IsValid()); 33281f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstrom return image_file_location_size_; 33381f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstrom} 33481f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstrom 33581f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstromconst uint8_t* OatHeader::GetImageFileLocationData() const { 33681f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstrom CHECK(IsValid()); 33781f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstrom return image_file_location_data_; 33881f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstrom} 33981f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstrom 34081f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstromstd::string OatHeader::GetImageFileLocation() const { 34181f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstrom CHECK(IsValid()); 34281f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstrom return std::string(reinterpret_cast<const char*>(GetImageFileLocationData()), 34381f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstrom GetImageFileLocationSize()); 34481f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstrom} 34581f3ca17e9e8d360cc4a1b6c3155cf01ba3be3bcBrian Carlstrom 3463320cf46afd082398aa401b246e6f301cebdf64dBrian CarlstromOatMethodOffsets::OatMethodOffsets() 347362f9bc807169bcfc8761dde067bbfb79b5ad0fdElliott Hughes : code_offset_(0), 34874180cad94848107cf297d37e72437c5a6eecf1bJeff Hao gc_map_offset_(0) 349ccb7bf1271560783adccddb2ab74c53d0efd3fd1Logan Chien{} 3503320cf46afd082398aa401b246e6f301cebdf64dBrian Carlstrom 3513320cf46afd082398aa401b246e6f301cebdf64dBrian CarlstromOatMethodOffsets::OatMethodOffsets(uint32_t code_offset, 35274180cad94848107cf297d37e72437c5a6eecf1bJeff Hao uint32_t gc_map_offset 353ccb7bf1271560783adccddb2ab74c53d0efd3fd1Logan Chien ) 354362f9bc807169bcfc8761dde067bbfb79b5ad0fdElliott Hughes : code_offset_(code_offset), 35574180cad94848107cf297d37e72437c5a6eecf1bJeff Hao gc_map_offset_(gc_map_offset) 356ccb7bf1271560783adccddb2ab74c53d0efd3fd1Logan Chien{} 3573320cf46afd082398aa401b246e6f301cebdf64dBrian Carlstrom 3583320cf46afd082398aa401b246e6f301cebdf64dBrian CarlstromOatMethodOffsets::~OatMethodOffsets() {} 3593320cf46afd082398aa401b246e6f301cebdf64dBrian Carlstrom 3607624d25dad2d1ba25969ae704fccf68649103ae5Vladimir MarkoOatQuickMethodHeader::OatQuickMethodHeader() 3618a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko : mapping_table_offset_(0), 3628a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko vmap_table_offset_(0), 3637624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko frame_info_(0, 0, 0), 3648a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko code_size_(0) 36596c6ab93336b972a38bd2448bcccf19188b8389bVladimir Marko{} 36696c6ab93336b972a38bd2448bcccf19188b8389bVladimir Marko 3677624d25dad2d1ba25969ae704fccf68649103ae5Vladimir MarkoOatQuickMethodHeader::OatQuickMethodHeader( 3687624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko uint32_t mapping_table_offset, uint32_t vmap_table_offset, uint32_t frame_size_in_bytes, 3697624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko uint32_t core_spill_mask, uint32_t fp_spill_mask, uint32_t code_size) 3708a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko : mapping_table_offset_(mapping_table_offset), 3718a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko vmap_table_offset_(vmap_table_offset), 3727624d25dad2d1ba25969ae704fccf68649103ae5Vladimir Marko frame_info_(frame_size_in_bytes, core_spill_mask, fp_spill_mask), 3738a630577ed2d9e9571c3434c505e5de223b23c07Vladimir Marko code_size_(code_size) 37496c6ab93336b972a38bd2448bcccf19188b8389bVladimir Marko{} 37596c6ab93336b972a38bd2448bcccf19188b8389bVladimir Marko 3767624d25dad2d1ba25969ae704fccf68649103ae5Vladimir MarkoOatQuickMethodHeader::~OatQuickMethodHeader() {} 37796c6ab93336b972a38bd2448bcccf19188b8389bVladimir Marko 378e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom} // namespace art 379