Home | History | Annotate | Download | only in runtime
      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 
     26 namespace art {
     27 
     28 class 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* GetPortableToInterpreterBridge() const;
     66   uint32_t GetPortableToInterpreterBridgeOffset() const;
     67   void SetPortableToInterpreterBridgeOffset(uint32_t offset);
     68 
     69   const void* GetQuickResolutionTrampoline() const;
     70   uint32_t GetQuickResolutionTrampolineOffset() const;
     71   void SetQuickResolutionTrampolineOffset(uint32_t offset);
     72   const void* GetQuickToInterpreterBridge() const;
     73   uint32_t GetQuickToInterpreterBridgeOffset() const;
     74   void SetQuickToInterpreterBridgeOffset(uint32_t offset);
     75 
     76   InstructionSet GetInstructionSet() const;
     77   uint32_t GetImageFileLocationOatChecksum() const;
     78   uint32_t GetImageFileLocationOatDataBegin() const;
     79   uint32_t GetImageFileLocationSize() const;
     80   const uint8_t* GetImageFileLocationData() const;
     81   std::string GetImageFileLocation() const;
     82 
     83  private:
     84   uint8_t magic_[4];
     85   uint8_t version_[4];
     86   uint32_t adler32_checksum_;
     87 
     88   InstructionSet instruction_set_;
     89   uint32_t dex_file_count_;
     90   uint32_t executable_offset_;
     91   uint32_t interpreter_to_interpreter_bridge_offset_;
     92   uint32_t interpreter_to_compiled_code_bridge_offset_;
     93   uint32_t jni_dlsym_lookup_offset_;
     94   uint32_t portable_resolution_trampoline_offset_;
     95   uint32_t portable_to_interpreter_bridge_offset_;
     96   uint32_t quick_resolution_trampoline_offset_;
     97   uint32_t quick_to_interpreter_bridge_offset_;
     98 
     99   uint32_t image_file_location_oat_checksum_;
    100   uint32_t image_file_location_oat_data_begin_;
    101   uint32_t image_file_location_size_;
    102   uint8_t image_file_location_data_[0];  // note variable width data at end
    103 
    104   DISALLOW_COPY_AND_ASSIGN(OatHeader);
    105 };
    106 
    107 class PACKED(4) OatMethodOffsets {
    108  public:
    109   OatMethodOffsets();
    110 
    111   OatMethodOffsets(uint32_t code_offset,
    112                    uint32_t frame_size_in_bytes,
    113                    uint32_t core_spill_mask,
    114                    uint32_t fp_spill_mask,
    115                    uint32_t mapping_table_offset,
    116                    uint32_t vmap_table_offset,
    117                    uint32_t gc_map_offset);
    118 
    119   ~OatMethodOffsets();
    120 
    121   uint32_t code_offset_;
    122   uint32_t frame_size_in_bytes_;
    123   uint32_t core_spill_mask_;
    124   uint32_t fp_spill_mask_;
    125   uint32_t mapping_table_offset_;
    126   uint32_t vmap_table_offset_;
    127   uint32_t gc_map_offset_;
    128 };
    129 
    130 }  // namespace art
    131 
    132 #endif  // ART_RUNTIME_OAT_H_
    133