blob: 8bf8299f9bc6b6063d6522bcfc3f46cde81f4657 [file] [log] [blame]
Brian Carlstrome24fa612011-09-29 00:53:55 -07001// Copyright 2011 Google Inc. All Rights Reserved.
2
3#include "oat.h"
4
5#include <zlib.h>
6
7namespace art {
8
9const uint8_t OatHeader::kOatMagic[] = { 'o', 'a', 't', '\n' };
10const uint8_t OatHeader::kOatVersion[] = { '0', '0', '1', '\0' };
11
12OatHeader::OatHeader(const std::vector<const DexFile*>* dex_files) {
13 memcpy(magic_, kOatMagic, sizeof(kOatMagic));
14 memcpy(version_, kOatVersion, sizeof(kOatVersion));
15 adler32_checksum_ = adler32(0L, Z_NULL, 0);
16 dex_file_count_ = dex_files->size();
17 UpdateChecksum(&dex_file_count_, sizeof(dex_file_count_));
18 executable_offset_ = 0;
19}
20
21bool OatHeader::IsValid() const {
22 if (memcmp(magic_, kOatMagic, sizeof(kOatMagic) != 0)) {
23 return false;
24 }
25 if (memcmp(version_, kOatVersion, sizeof(kOatVersion) != 0)) {
26 return false;
27 }
28 return true;
29}
30
31const char* OatHeader::GetMagic() const {
32 CHECK(IsValid());
33 return reinterpret_cast<const char*>(magic_);
34}
35
36uint32_t OatHeader::GetDexFileCount() const {
37 DCHECK(IsValid());
38 return dex_file_count_;
39}
40
41uint32_t OatHeader::GetChecksum() const {
42 CHECK(IsValid());
43 return adler32_checksum_;
44}
45
46void OatHeader::UpdateChecksum(const void* data, size_t length) {
47 DCHECK(IsValid());
48 const uint8_t* bytes = reinterpret_cast<const uint8_t*>(data);
49 adler32_checksum_ = adler32(adler32_checksum_, bytes, length);
50}
51
52uint32_t OatHeader::GetExecutableOffset() const {
53 DCHECK(IsValid());
54 DCHECK(IsAligned(executable_offset_, kPageSize));
55 CHECK_GT(executable_offset_, sizeof(OatHeader));
56 return executable_offset_;
57}
58
59void OatHeader::SetExecutableOffset(uint32_t executable_offset) {
60 DCHECK(IsAligned(executable_offset, kPageSize));
61 CHECK_GT(executable_offset, sizeof(OatHeader));
62 DCHECK(IsValid());
63 DCHECK_EQ(executable_offset_, 0U);
64 executable_offset_ = executable_offset;
65 UpdateChecksum(&executable_offset_, sizeof(executable_offset));
66}
67
Brian Carlstrom3320cf42011-10-04 14:58:28 -070068OatMethodOffsets::OatMethodOffsets()
69 : code_offset_(0),
70 frame_size_in_bytes_(0),
71 return_pc_offset_in_bytes_(0),
72 core_spill_mask_(0),
73 fp_spill_mask_(0),
74 mapping_table_offset_(0),
75 vmap_table_offset_(0),
76 invoke_stub_offset_(0) {}
77
78OatMethodOffsets::OatMethodOffsets(uint32_t code_offset,
79 uint32_t frame_size_in_bytes,
80 uint32_t return_pc_offset_in_bytes,
81 uint32_t core_spill_mask,
82 uint32_t fp_spill_mask,
83 uint32_t mapping_table_offset,
84 uint32_t vmap_table_offset,
85 uint32_t invoke_stub_offset)
86 : code_offset_(code_offset),
87 frame_size_in_bytes_(frame_size_in_bytes),
88 return_pc_offset_in_bytes_(return_pc_offset_in_bytes),
89 core_spill_mask_(core_spill_mask),
90 fp_spill_mask_(fp_spill_mask),
91 mapping_table_offset_(mapping_table_offset),
92 vmap_table_offset_(vmap_table_offset),
93 invoke_stub_offset_(invoke_stub_offset) {}
94
95OatMethodOffsets::~OatMethodOffsets() {}
96
Brian Carlstrome24fa612011-09-29 00:53:55 -070097} // namespace art