oat.h revision 88474b416eb257078e590bf9bc7957cee604a186
1/* 2 * Copyright (C) 2011 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17#ifndef ART_RUNTIME_OAT_H_ 18#define ART_RUNTIME_OAT_H_ 19 20#include <vector> 21 22#include "base/macros.h" 23#include "dex_file.h" 24#include "instruction_set.h" 25 26namespace art { 27 28class PACKED(4) OatHeader { 29 public: 30 static const uint8_t kOatMagic[4]; 31 static const uint8_t kOatVersion[4]; 32 33 OatHeader(); 34 OatHeader(InstructionSet instruction_set, 35 const std::vector<const DexFile*>* dex_files, 36 uint32_t image_file_location_oat_checksum, 37 uint32_t image_file_location_oat_data_begin, 38 const std::string& image_file_location); 39 40 bool IsValid() const; 41 const char* GetMagic() const; 42 uint32_t GetChecksum() const; 43 void UpdateChecksum(const void* data, size_t length); 44 uint32_t GetDexFileCount() const { 45 DCHECK(IsValid()); 46 return dex_file_count_; 47 } 48 uint32_t GetExecutableOffset() const; 49 void SetExecutableOffset(uint32_t executable_offset); 50 51 const void* GetInterpreterToInterpreterBridge() const; 52 uint32_t GetInterpreterToInterpreterBridgeOffset() const; 53 void SetInterpreterToInterpreterBridgeOffset(uint32_t offset); 54 const void* GetInterpreterToCompiledCodeBridge() const; 55 uint32_t GetInterpreterToCompiledCodeBridgeOffset() const; 56 void SetInterpreterToCompiledCodeBridgeOffset(uint32_t offset); 57 58 const void* GetJniDlsymLookup() const; 59 uint32_t GetJniDlsymLookupOffset() const; 60 void SetJniDlsymLookupOffset(uint32_t offset); 61 62 const void* GetPortableResolutionTrampoline() const; 63 uint32_t GetPortableResolutionTrampolineOffset() const; 64 void SetPortableResolutionTrampolineOffset(uint32_t offset); 65 const void* GetPortableImtConflictTrampoline() const; 66 uint32_t GetPortableImtConflictTrampolineOffset() const; 67 void SetPortableImtConflictTrampolineOffset(uint32_t offset); 68 const void* GetPortableToInterpreterBridge() const; 69 uint32_t GetPortableToInterpreterBridgeOffset() const; 70 void SetPortableToInterpreterBridgeOffset(uint32_t offset); 71 72 const void* GetQuickResolutionTrampoline() const; 73 uint32_t GetQuickResolutionTrampolineOffset() const; 74 void SetQuickResolutionTrampolineOffset(uint32_t offset); 75 const void* GetQuickImtConflictTrampoline() const; 76 uint32_t GetQuickImtConflictTrampolineOffset() const; 77 void SetQuickImtConflictTrampolineOffset(uint32_t offset); 78 const void* GetQuickToInterpreterBridge() const; 79 uint32_t GetQuickToInterpreterBridgeOffset() const; 80 void SetQuickToInterpreterBridgeOffset(uint32_t offset); 81 82 InstructionSet GetInstructionSet() const; 83 uint32_t GetImageFileLocationOatChecksum() const; 84 uint32_t GetImageFileLocationOatDataBegin() const; 85 uint32_t GetImageFileLocationSize() const; 86 const uint8_t* GetImageFileLocationData() const; 87 std::string GetImageFileLocation() const; 88 89 private: 90 uint8_t magic_[4]; 91 uint8_t version_[4]; 92 uint32_t adler32_checksum_; 93 94 InstructionSet instruction_set_; 95 uint32_t dex_file_count_; 96 uint32_t executable_offset_; 97 uint32_t interpreter_to_interpreter_bridge_offset_; 98 uint32_t interpreter_to_compiled_code_bridge_offset_; 99 uint32_t jni_dlsym_lookup_offset_; 100 uint32_t portable_imt_conflict_trampoline_offset_; 101 uint32_t portable_resolution_trampoline_offset_; 102 uint32_t portable_to_interpreter_bridge_offset_; 103 uint32_t quick_imt_conflict_trampoline_offset_; 104 uint32_t quick_resolution_trampoline_offset_; 105 uint32_t quick_to_interpreter_bridge_offset_; 106 107 uint32_t image_file_location_oat_checksum_; 108 uint32_t image_file_location_oat_data_begin_; 109 uint32_t image_file_location_size_; 110 uint8_t image_file_location_data_[0]; // note variable width data at end 111 112 DISALLOW_COPY_AND_ASSIGN(OatHeader); 113}; 114 115// OatMethodOffsets are currently 7x32-bits=224-bits long, so if we can 116// save even one OatMethodOffsets struct, the more complicated encoding 117// using a bitmap pays for itself since few classes will have 224 118// methods. 119enum OatClassType { 120 kOatClassAllCompiled = 0, // OatClass is followed by an OatMethodOffsets for each method. 121 kOatClassSomeCompiled = 1, // A bitmap of which OatMethodOffsets are present follows the OatClass. 122 kOatClassNoneCompiled = 2, // All methods are interpretted so no OatMethodOffsets are necessary. 123 kOatClassMax = 3, 124}; 125 126std::ostream& operator<<(std::ostream& os, const OatClassType& rhs); 127 128class PACKED(4) OatMethodOffsets { 129 public: 130 OatMethodOffsets(); 131 132 OatMethodOffsets(uint32_t code_offset, 133 uint32_t frame_size_in_bytes, 134 uint32_t core_spill_mask, 135 uint32_t fp_spill_mask, 136 uint32_t mapping_table_offset, 137 uint32_t vmap_table_offset, 138 uint32_t gc_map_offset); 139 140 ~OatMethodOffsets(); 141 142 uint32_t code_offset_; 143 uint32_t frame_size_in_bytes_; 144 uint32_t core_spill_mask_; 145 uint32_t fp_spill_mask_; 146 uint32_t mapping_table_offset_; 147 uint32_t vmap_table_offset_; 148 uint32_t gc_map_offset_; 149}; 150 151} // namespace art 152 153#endif // ART_RUNTIME_OAT_H_ 154