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 */
164a289ed61242964b921434de7d375f46480472a1Brian Carlstrom
17fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#ifndef ART_RUNTIME_IMAGE_H_
18fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#define ART_RUNTIME_IMAGE_H_
194a289ed61242964b921434de7d375f46480472a1Brian Carlstrom
204a289ed61242964b921434de7d375f46480472a1Brian Carlstrom#include <string.h>
214a289ed61242964b921434de7d375f46480472a1Brian Carlstrom
224a289ed61242964b921434de7d375f46480472a1Brian Carlstrom#include "globals.h"
232dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers#include "mirror/object.h"
244a289ed61242964b921434de7d375f46480472a1Brian Carlstrom
254a289ed61242964b921434de7d375f46480472a1Brian Carlstromnamespace art {
264a289ed61242964b921434de7d375f46480472a1Brian Carlstrom
2754d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartierclass ArtField;
2854d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartierclass ArtMethod;
2954d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier
3054d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartierclass ArtMethodVisitor {
3154d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier public:
3254d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier  virtual ~ArtMethodVisitor() {}
3354d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier
3454d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier  virtual void Visit(ArtMethod* method) = 0;
3554d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier};
3654d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier
3754d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartierclass ArtFieldVisitor {
3854d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier public:
3954d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier  virtual ~ArtFieldVisitor() {}
4054d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier
4154d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier  virtual void Visit(ArtField* method) = 0;
4254d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier};
4354d220eb9cc51215d75b9e0fe921b94bebbb3fd6Mathieu Chartier
44e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartierclass PACKED(4) ImageSection {
45e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier public:
46e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  ImageSection() : offset_(0), size_(0) { }
47e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  ImageSection(uint32_t offset, uint32_t size) : offset_(offset), size_(size) { }
48e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  ImageSection(const ImageSection& section) = default;
49e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  ImageSection& operator=(const ImageSection& section) = default;
50e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier
51e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  uint32_t Offset() const {
52e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier    return offset_;
53e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  }
54e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier
55e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  uint32_t Size() const {
56e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier    return size_;
57e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  }
58e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier
59e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  uint32_t End() const {
60e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier    return Offset() + Size();
61e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  }
62e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier
63e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  bool Contains(uint64_t offset) const {
64e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier    return offset - offset_ < size_;
65e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  }
66e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier
67e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier private:
68e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  uint32_t offset_;
69e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  uint32_t size_;
70e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier};
71e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier
724a289ed61242964b921434de7d375f46480472a1Brian Carlstrom// header of image files written by ImageWriter, read and validated by Space.
73df1ce91ba97bc79a0637e5504b39318fb1c9f577Ian Rogersclass PACKED(4) ImageHeader {
744a289ed61242964b921434de7d375f46480472a1Brian Carlstrom public:
75ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier  enum StorageMode : uint32_t {
76ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier    kStorageModeUncompressed,
77ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier    kStorageModeLZ4,
78167e638ffd46186ef4fa26d1c0b6c7e00ed51ccbMathieu Chartier    kStorageModeLZ4HC,
79ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier    kStorageModeCount,  // Number of elements in enum.
80ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier  };
81ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier  static constexpr StorageMode kDefaultStorageMode = kStorageModeUncompressed;
82ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier
83aa50d3a01a4137cd89c152be5487fed23683d0ffSebastien Hertz  ImageHeader()
84ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier      : image_begin_(0U),
85ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier        image_size_(0U),
86ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier        oat_checksum_(0U),
87ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier        oat_file_begin_(0U),
88ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier        oat_data_begin_(0U),
89ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier        oat_data_end_(0U),
90ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier        oat_file_end_(0U),
91fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier        boot_image_begin_(0U),
92fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier        boot_image_size_(0U),
93fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier        boot_oat_begin_(0U),
94fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier        boot_oat_size_(0U),
95ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier        patch_delta_(0),
96ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier        image_roots_(0U),
97ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier        pointer_size_(0U),
98ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier        compile_pic_(0),
99fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier        is_pic_(0),
100ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier        storage_mode_(kDefaultStorageMode),
101ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier        data_size_(0) {}
1024a289ed61242964b921434de7d375f46480472a1Brian Carlstrom
10330fab40ee5a07af6b8c3b6b0e9438071695a57f4Ian Rogers  ImageHeader(uint32_t image_begin,
104763a31ed7a2bfad22a9cb07f5301a71c0f97ca49Mathieu Chartier              uint32_t image_size,
105e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier              ImageSection* sections,
106e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom              uint32_t image_roots,
107e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom              uint32_t oat_checksum,
108700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom              uint32_t oat_file_begin,
109700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom              uint32_t oat_data_begin,
110700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom              uint32_t oat_data_end,
11146774767fcf7780d1455e755729198648d08742eIgor Murashkin              uint32_t oat_file_end,
112fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier              uint32_t boot_image_begin,
113fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier              uint32_t boot_image_size,
114fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier              uint32_t boot_oat_begin,
115fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier              uint32_t boot_oat_size,
116e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier              uint32_t pointer_size,
117ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier              bool compile_pic,
118fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier              bool is_pic,
119ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier              StorageMode storage_mode,
120ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier              size_t data_size);
1214a289ed61242964b921434de7d375f46480472a1Brian Carlstrom
12268708f536d11f8824d881b640f3902093075c0a6Brian Carlstrom  bool IsValid() const;
12368708f536d11f8824d881b640f3902093075c0a6Brian Carlstrom  const char* GetMagic() const;
12478128a63b2615744760b7f8ab83df9764a5d4a95Brian Carlstrom
12513735955f39b3b304c37d2b2840663c131262c18Ian Rogers  uint8_t* GetImageBegin() const {
12613735955f39b3b304c37d2b2840663c131262c18Ian Rogers    return reinterpret_cast<uint8_t*>(image_begin_);
127e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom  }
128e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom
12931e8925781c2302f1d1a9b39e216ba415bfe0d7eMathieu Chartier  size_t GetImageSize() const {
13031e8925781c2302f1d1a9b39e216ba415bfe0d7eMathieu Chartier    return static_cast<uint32_t>(image_size_);
13131e8925781c2302f1d1a9b39e216ba415bfe0d7eMathieu Chartier  }
13231e8925781c2302f1d1a9b39e216ba415bfe0d7eMathieu Chartier
133e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom  uint32_t GetOatChecksum() const {
134e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom    return oat_checksum_;
135e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom  }
136e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom
137a85b8376740641f13dc078aea6be94d15a800803Brian Carlstrom  void SetOatChecksum(uint32_t oat_checksum) {
138a85b8376740641f13dc078aea6be94d15a800803Brian Carlstrom    oat_checksum_ = oat_checksum;
139a85b8376740641f13dc078aea6be94d15a800803Brian Carlstrom  }
140a85b8376740641f13dc078aea6be94d15a800803Brian Carlstrom
141df0a8275abadc96a6363b59f31c64981571d6ed9Mathieu Chartier  // The location that the oat file was expected to be when the image was created. The actual
142df0a8275abadc96a6363b59f31c64981571d6ed9Mathieu Chartier  // oat file may be at a different location for application images.
14313735955f39b3b304c37d2b2840663c131262c18Ian Rogers  uint8_t* GetOatFileBegin() const {
14413735955f39b3b304c37d2b2840663c131262c18Ian Rogers    return reinterpret_cast<uint8_t*>(oat_file_begin_);
145e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom  }
146e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom
14713735955f39b3b304c37d2b2840663c131262c18Ian Rogers  uint8_t* GetOatDataBegin() const {
14813735955f39b3b304c37d2b2840663c131262c18Ian Rogers    return reinterpret_cast<uint8_t*>(oat_data_begin_);
149700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom  }
150700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom
15113735955f39b3b304c37d2b2840663c131262c18Ian Rogers  uint8_t* GetOatDataEnd() const {
15213735955f39b3b304c37d2b2840663c131262c18Ian Rogers    return reinterpret_cast<uint8_t*>(oat_data_end_);
153700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom  }
154700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom
15513735955f39b3b304c37d2b2840663c131262c18Ian Rogers  uint8_t* GetOatFileEnd() const {
15613735955f39b3b304c37d2b2840663c131262c18Ian Rogers    return reinterpret_cast<uint8_t*>(oat_file_end_);
1574a289ed61242964b921434de7d375f46480472a1Brian Carlstrom  }
1584a289ed61242964b921434de7d375f46480472a1Brian Carlstrom
159e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  uint32_t GetPointerSize() const {
160e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier    return pointer_size_;
161e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  }
162e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier
16353cb16b98acf3cf6f3a1e2204ad4958ecf1b5a3cAlex Light  off_t GetPatchDelta() const {
16453cb16b98acf3cf6f3a1e2204ad4958ecf1b5a3cAlex Light    return patch_delta_;
16553cb16b98acf3cf6f3a1e2204ad4958ecf1b5a3cAlex Light  }
16653cb16b98acf3cf6f3a1e2204ad4958ecf1b5a3cAlex Light
1679583fbcf597eff6d0b3c5359b8e8d5f70ed82c40Nicolas Geoffray  static std::string GetOatLocationFromImageLocation(const std::string& image) {
1689583fbcf597eff6d0b3c5359b8e8d5f70ed82c40Nicolas Geoffray    std::string oat_filename = image;
1699583fbcf597eff6d0b3c5359b8e8d5f70ed82c40Nicolas Geoffray    if (oat_filename.length() <= 3) {
170b9beb2e2efb6a204a69ca660d478b45f851e8f09Ian Rogers      oat_filename += ".oat";
1719583fbcf597eff6d0b3c5359b8e8d5f70ed82c40Nicolas Geoffray    } else {
1729583fbcf597eff6d0b3c5359b8e8d5f70ed82c40Nicolas Geoffray      oat_filename.replace(oat_filename.length() - 3, 3, "oat");
1739583fbcf597eff6d0b3c5359b8e8d5f70ed82c40Nicolas Geoffray    }
1749583fbcf597eff6d0b3c5359b8e8d5f70ed82c40Nicolas Geoffray    return oat_filename;
1759583fbcf597eff6d0b3c5359b8e8d5f70ed82c40Nicolas Geoffray  }
1769583fbcf597eff6d0b3c5359b8e8d5f70ed82c40Nicolas Geoffray
177e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  enum ImageMethod {
1781984651929744dd603fd082e23eacd877b9bc177Ian Rogers    kResolutionMethod,
17988474b416eb257078e590bf9bc7957cee604a186Jeff Hao    kImtConflictMethod,
1802d2621a1463d2f3f03fa73503fa42e43657cdcfcMathieu Chartier    kImtUnimplementedMethod,
181ff1ed4770bf7ff024a807b9f909b1a26abb78341Ian Rogers    kCalleeSaveMethod,
1824f0d07c783afef89703dce32c94440fc8621a29bIan Rogers    kRefsOnlySaveMethod,
1834f0d07c783afef89703dce32c94440fc8621a29bIan Rogers    kRefsAndArgsSaveMethod,
184e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier    kImageMethodsCount,  // Number of elements in enum.
185e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  };
186e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier
187e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  enum ImageRoot {
18858ae9416e197ae68ed12ed43d87407d4dfb15093Brian Carlstrom    kDexCaches,
18934f426c49ac2de8cea70acef6b9ecdd8e62209d2Brian Carlstrom    kClassRoots,
190161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom    kImageRootsMax,
191161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom  };
192161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom
193e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  enum ImageSections {
194e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier    kSectionObjects,
195e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier    kSectionArtFields,
196e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier    kSectionArtMethods,
197cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier    kSectionRuntimeMethods,
198df2d4f22d5e89692c90b443da82fe2930518418bArtem Udovichenko    kSectionImTables,
199cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier    kSectionIMTConflictTables,
20005792b98980741111b4d0a24d68cff2a8e070a3aVladimir Marko    kSectionDexCacheArrays,
201d39645e22b8db1767cf64dc1200a9e4b2f939ed2Mathieu Chartier    kSectionInternedStrings,
202208a5cb383dd9dcd3461f89b74af5df67dc8d794Mathieu Chartier    kSectionClassTable,
203e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier    kSectionImageBitmap,
204e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier    kSectionCount,  // Number of elements in enum.
205e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  };
206e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier
207e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  ArtMethod* GetImageMethod(ImageMethod index) const;
208e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  void SetImageMethod(ImageMethod index, ArtMethod* method);
209e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier
210e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  const ImageSection& GetImageSection(ImageSections index) const;
211cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier
212e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  const ImageSection& GetMethodsSection() const {
213e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier    return GetImageSection(kSectionArtMethods);
214e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  }
215e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier
216cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier  const ImageSection& GetRuntimeMethodsSection() const {
217cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier    return GetImageSection(kSectionRuntimeMethods);
218cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier  }
219cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier
220cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier  const ImageSection& GetFieldsSection() const {
221cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier    return GetImageSection(ImageHeader::kSectionArtFields);
222cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier  }
223cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier
2244a26f17b055cadc949c3e9fdfa637fe5656339d9Mathieu Chartier  template <ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
2252dd0e2cea360bc9206eb88ecc40d259e796c239dIan Rogers  mirror::Object* GetImageRoot(ImageRoot image_root) const
22690443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      SHARED_REQUIRES(Locks::mutator_lock_);
2274a26f17b055cadc949c3e9fdfa637fe5656339d9Mathieu Chartier
2284a26f17b055cadc949c3e9fdfa637fe5656339d9Mathieu Chartier  template <ReadBarrierOption kReadBarrierOption = kWithReadBarrier>
2292cd334ae2d4287216523882f0d298cf3901b7ab1Hiroshi Yamauchi  mirror::ObjectArray<mirror::Object>* GetImageRoots() const
23090443477f9a0061581c420775ce3b7eeae7468bcMathieu Chartier      SHARED_REQUIRES(Locks::mutator_lock_);
231aded5f7ab991f3c1132851599d3bc60ff6707eedBrian Carlstrom
23253cb16b98acf3cf6f3a1e2204ad4958ecf1b5a3cAlex Light  void RelocateImage(off_t delta);
233fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier  void RelocateImageMethods(off_t delta);
234fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier  void RelocateImageObjects(off_t delta);
23553cb16b98acf3cf6f3a1e2204ad4958ecf1b5a3cAlex Light
23646774767fcf7780d1455e755729198648d08742eIgor Murashkin  bool CompilePic() const {
23746774767fcf7780d1455e755729198648d08742eIgor Murashkin    return compile_pic_ != 0;
23846774767fcf7780d1455e755729198648d08742eIgor Murashkin  }
23946774767fcf7780d1455e755729198648d08742eIgor Murashkin
240fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier  bool IsPic() const {
241fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier    return is_pic_ != 0;
242fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier  }
243fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier
244fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier  uint32_t GetBootImageBegin() const {
245fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier    return boot_image_begin_;
246fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier  }
247fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier
248fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier  uint32_t GetBootImageSize() const {
249fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier    return boot_image_size_;
250fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier  }
251fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier
252fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier  uint32_t GetBootOatBegin() const {
253fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier    return boot_oat_begin_;
254fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier  }
255fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier
256fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier  uint32_t GetBootOatSize() const {
257fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier    return boot_oat_size_;
258fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier  }
259fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier
260ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier  StorageMode GetStorageMode() const {
261ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier    return storage_mode_;
262ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier  }
263ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier
264ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier  uint64_t GetDataSize() const {
265ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier    return data_size_;
266ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier  }
267ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier
268fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier  bool IsAppImage() const {
269fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier    // App images currently require a boot image, if the size is non zero then it is an app image
270fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier    // header.
271fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier    return boot_image_size_ != 0u;
272fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier  }
273fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier
274cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier  // Visit ArtMethods in the section starting at base. Includes runtime methods.
275cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier  // TODO: Delete base parameter if it is always equal to GetImageBegin.
276cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier  void VisitPackedArtMethods(ArtMethodVisitor* visitor, uint8_t* base, size_t pointer_size) const;
277cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier
278cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier  // Visit ArtMethods in the section starting at base.
279cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier  // TODO: Delete base parameter if it is always equal to GetImageBegin.
280cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier  void VisitPackedArtFields(ArtFieldVisitor* visitor, uint8_t* base) const;
281cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier
282cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier  template <typename Visitor>
283df2d4f22d5e89692c90b443da82fe2930518418bArtem Udovichenko  void VisitPackedImTables(const Visitor& visitor,
284df2d4f22d5e89692c90b443da82fe2930518418bArtem Udovichenko                           uint8_t* base,
285df2d4f22d5e89692c90b443da82fe2930518418bArtem Udovichenko                           size_t pointer_size) const;
286df2d4f22d5e89692c90b443da82fe2930518418bArtem Udovichenko
287df2d4f22d5e89692c90b443da82fe2930518418bArtem Udovichenko  template <typename Visitor>
288cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier  void VisitPackedImtConflictTables(const Visitor& visitor,
289cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier                                    uint8_t* base,
290cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier                                    size_t pointer_size) const;
291cdca476bf3394ce9d97a369e84e701b427009318Mathieu Chartier
29253cb16b98acf3cf6f3a1e2204ad4958ecf1b5a3cAlex Light private:
29313735955f39b3b304c37d2b2840663c131262c18Ian Rogers  static const uint8_t kImageMagic[4];
29413735955f39b3b304c37d2b2840663c131262c18Ian Rogers  static const uint8_t kImageVersion[4];
2954a289ed61242964b921434de7d375f46480472a1Brian Carlstrom
29613735955f39b3b304c37d2b2840663c131262c18Ian Rogers  uint8_t magic_[4];
29713735955f39b3b304c37d2b2840663c131262c18Ian Rogers  uint8_t version_[4];
298a663ea5de4c9ab6b1510fdebd6d8eca77ba699aeBrian Carlstrom
299700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom  // Required base address for mapping the image.
30030fab40ee5a07af6b8c3b6b0e9438071695a57f4Ian Rogers  uint32_t image_begin_;
301e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom
30231e8925781c2302f1d1a9b39e216ba415bfe0d7eMathieu Chartier  // Image size, not page aligned.
30331e8925781c2302f1d1a9b39e216ba415bfe0d7eMathieu Chartier  uint32_t image_size_;
30431e8925781c2302f1d1a9b39e216ba415bfe0d7eMathieu Chartier
305700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom  // Checksum of the oat file we link to for load time sanity check.
306e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom  uint32_t oat_checksum_;
307e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom
308700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom  // Start address for oat file. Will be before oat_data_begin_ for .so files.
309700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom  uint32_t oat_file_begin_;
310700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom
311700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom  // Required oat address expected by image Method::GetCode() pointers.
312700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom  uint32_t oat_data_begin_;
313700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom
314700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom  // End of oat data address range for this image file.
315700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom  uint32_t oat_data_end_;
316e24fa61603a60ade3797e4a0c8b3fccb346cb048Brian Carlstrom
317700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom  // End of oat file address range. will be after oat_data_end_ for
318700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom  // .so files. Used for positioning a following alloc spaces.
319700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom  uint32_t oat_file_end_;
320161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom
321fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier  // Boot image begin and end (app image headers only).
322fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier  uint32_t boot_image_begin_;
323fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier  uint32_t boot_image_size_;
324fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier
325fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier  // Boot oat begin and end (app image headers only).
326fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier  uint32_t boot_oat_begin_;
327fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier  uint32_t boot_oat_size_;
328fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier
329fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier  // TODO: We should probably insert a boot image checksum for app images.
330fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier
33153cb16b98acf3cf6f3a1e2204ad4958ecf1b5a3cAlex Light  // The total delta that this image has been patched.
33253cb16b98acf3cf6f3a1e2204ad4958ecf1b5a3cAlex Light  int32_t patch_delta_;
33353cb16b98acf3cf6f3a1e2204ad4958ecf1b5a3cAlex Light
334700c8d31733534a3d978b75a03f6f7e177dc7e81Brian Carlstrom  // Absolute address of an Object[] of objects needed to reinitialize from an image.
335161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom  uint32_t image_roots_;
336161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom
337e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  // Pointer size, this affects the size of the ArtMethods.
338e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  uint32_t pointer_size_;
339e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier
34046774767fcf7780d1455e755729198648d08742eIgor Murashkin  // Boolean (0 or 1) to denote if the image was compiled with --compile-pic option
34146774767fcf7780d1455e755729198648d08742eIgor Murashkin  const uint32_t compile_pic_;
34246774767fcf7780d1455e755729198648d08742eIgor Murashkin
343fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier  // Boolean (0 or 1) to denote if the image can be mapped at a random address, this only refers to
344fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier  // the .art file. Currently, app oat files do not depend on their app image. There are no pointers
345fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier  // from the app oat code to the app image.
346fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier  const uint32_t is_pic_;
347fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier
34867ad20e2834ed2b821503d0d9ab1b3a34e55b7d4Mathieu Chartier  // Image section sizes/offsets correspond to the uncompressed form.
349e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  ImageSection sections_[kSectionCount];
350e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier
351fbc31087932a65e036a153afab3049dc5298656aMathieu Chartier  // Image methods, may be inside of the boot image for app images.
352e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier  uint64_t image_methods_[kImageMethodsCount];
353e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier
354ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier  // Storage method for the image, the image may be compressed.
355ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier  StorageMode storage_mode_;
356ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier
357ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier  // Data size for the image data excluding the bitmap and the header. For compressed images, this
358ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier  // is the compressed size in the file.
359ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier  uint32_t data_size_;
360ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartier
361161928613d3f097108319de60494fab1aab8d48aBrian Carlstrom  friend class ImageWriter;
3624a289ed61242964b921434de7d375f46480472a1Brian Carlstrom};
3634a289ed61242964b921434de7d375f46480472a1Brian Carlstrom
364e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartierstd::ostream& operator<<(std::ostream& os, const ImageHeader::ImageMethod& policy);
365e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartierstd::ostream& operator<<(std::ostream& os, const ImageHeader::ImageRoot& policy);
366e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartierstd::ostream& operator<<(std::ostream& os, const ImageHeader::ImageSections& section);
367e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartierstd::ostream& operator<<(std::ostream& os, const ImageSection& section);
368ceb07b3285eaab350a8cd12f7d74be3e40a255ddMathieu Chartierstd::ostream& operator<<(std::ostream& os, const ImageHeader::StorageMode& mode);
369e401d146407d61eeb99f8d6176b2ac13c4df1e33Mathieu Chartier
3704a289ed61242964b921434de7d375f46480472a1Brian Carlstrom}  // namespace art
3714a289ed61242964b921434de7d375f46480472a1Brian Carlstrom
372fc0e3219edc9a5bf81b166e82fd5db2796eb6a0dBrian Carlstrom#endif  // ART_RUNTIME_IMAGE_H_
373