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