blob: c458ea3a9f934c73a54c05a01cb6b6ba0004ec8b [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());
Elliott Hughes06b37d92011-10-16 11:51:29 -070054 DCHECK_ALIGNED(executable_offset_, kPageSize);
Brian Carlstrome24fa612011-09-29 00:53:55 -070055 CHECK_GT(executable_offset_, sizeof(OatHeader));
56 return executable_offset_;
57}
58
59void OatHeader::SetExecutableOffset(uint32_t executable_offset) {
Elliott Hughes06b37d92011-10-16 11:51:29 -070060 DCHECK_ALIGNED(executable_offset, kPageSize);
Brian Carlstrome24fa612011-09-29 00:53:55 -070061 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()
Elliott Hughes362f9bc2011-10-17 18:56:41 -070069 : code_offset_(0),
70 frame_size_in_bytes_(0),
Elliott Hughes362f9bc2011-10-17 18:56:41 -070071 core_spill_mask_(0),
72 fp_spill_mask_(0),
73 mapping_table_offset_(0),
74 vmap_table_offset_(0),
Brian Carlstrome7d856b2012-01-11 18:10:55 -080075 gc_map_offset_(0),
Elliott Hughes362f9bc2011-10-17 18:56:41 -070076 invoke_stub_offset_(0) {}
Brian Carlstrom3320cf42011-10-04 14:58:28 -070077
78OatMethodOffsets::OatMethodOffsets(uint32_t code_offset,
79 uint32_t frame_size_in_bytes,
Brian Carlstrom3320cf42011-10-04 14:58:28 -070080 uint32_t core_spill_mask,
81 uint32_t fp_spill_mask,
82 uint32_t mapping_table_offset,
83 uint32_t vmap_table_offset,
Brian Carlstrome7d856b2012-01-11 18:10:55 -080084 uint32_t gc_map_offset,
Brian Carlstrom3320cf42011-10-04 14:58:28 -070085 uint32_t invoke_stub_offset)
Elliott Hughes362f9bc2011-10-17 18:56:41 -070086 : code_offset_(code_offset),
87 frame_size_in_bytes_(frame_size_in_bytes),
Elliott Hughes362f9bc2011-10-17 18:56:41 -070088 core_spill_mask_(core_spill_mask),
89 fp_spill_mask_(fp_spill_mask),
90 mapping_table_offset_(mapping_table_offset),
91 vmap_table_offset_(vmap_table_offset),
Brian Carlstrome7d856b2012-01-11 18:10:55 -080092 gc_map_offset_(gc_map_offset),
Elliott Hughes362f9bc2011-10-17 18:56:41 -070093 invoke_stub_offset_(invoke_stub_offset) {}
Brian Carlstrom3320cf42011-10-04 14:58:28 -070094
95OatMethodOffsets::~OatMethodOffsets() {}
96
Brian Carlstrome24fa612011-09-29 00:53:55 -070097} // namespace art