blob: fd7e78f19f5e9e8f28b0997bf7aaa4d1c61331e9 [file] [log] [blame]
Mathieu Chartier7b074bf2017-09-25 16:22:36 -07001/*
2 * Copyright (C) 2017 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
David Sehr334b9d72018-02-12 18:27:56 -080017#ifndef ART_LIBDEXFILE_DEX_STANDARD_DEX_FILE_H_
18#define ART_LIBDEXFILE_DEX_STANDARD_DEX_FILE_H_
Mathieu Chartier7b074bf2017-09-25 16:22:36 -070019
20#include <iosfwd>
21
22#include "dex_file.h"
23
24namespace art {
25
26class OatDexFile;
27
Mathieu Chartier292567e2017-10-12 13:24:38 -070028// Standard dex file. This is the format that is packaged in APKs and produced by tools.
29class StandardDexFile : public DexFile {
Mathieu Chartier7b074bf2017-09-25 16:22:36 -070030 public:
Mathieu Chartierf95a75e2017-11-03 15:25:52 -070031 class Header : public DexFile::Header {
32 // Same for now.
33 };
34
Mathieu Chartier69147f12017-11-06 20:02:24 -080035 struct CodeItem : public DexFile::CodeItem {
Mathieu Chartierfa3db3d2018-01-12 14:42:18 -080036 static constexpr size_t kAlignment = 4;
37
Mathieu Chartier69147f12017-11-06 20:02:24 -080038 private:
Mathieu Chartier8892c6b2018-01-09 15:10:17 -080039 CodeItem() = default;
40
41 uint16_t registers_size_; // the number of registers used by this code
42 // (locals + parameters)
43 uint16_t ins_size_; // the number of words of incoming arguments to the method
44 // that this code is for
45 uint16_t outs_size_; // the number of words of outgoing argument space required
46 // by this code for method invocation
47 uint16_t tries_size_; // the number of try_items for this instance. If non-zero,
48 // then these appear as the tries array just after the
49 // insns in this instance.
50 uint32_t debug_info_off_; // Holds file offset to debug info stream.
51
52 uint32_t insns_size_in_code_units_; // size of the insns array, in 2 byte code units
53 uint16_t insns_[1]; // actual array of bytecode.
54
55 ART_FRIEND_TEST(CodeItemAccessorsTest, TestDexInstructionsAccessor);
56 friend class CodeItemDataAccessor;
57 friend class CodeItemDebugInfoAccessor;
58 friend class CodeItemInstructionAccessor;
59 friend class DexWriter;
Mathieu Chartier6238c832018-01-04 09:55:13 -080060 friend class StandardDexFile;
Mathieu Chartier69147f12017-11-06 20:02:24 -080061 DISALLOW_COPY_AND_ASSIGN(CodeItem);
62 };
63
64 // Write the standard dex specific magic.
65 static void WriteMagic(uint8_t* magic);
66
67 // Write the current version, note that the input is the address of the magic.
68 static void WriteCurrentVersion(uint8_t* magic);
69
Mathieu Chartier7b074bf2017-09-25 16:22:36 -070070 static const uint8_t kDexMagic[kDexMagicSize];
71 static constexpr size_t kNumDexVersions = 4;
72 static const uint8_t kDexMagicVersions[kNumDexVersions][kDexVersionLen];
73
74 // Returns true if the byte string points to the magic value.
75 static bool IsMagicValid(const uint8_t* magic);
Roland Levillainf73caca2018-08-24 17:19:07 +010076 bool IsMagicValid() const override;
Mathieu Chartier7b074bf2017-09-25 16:22:36 -070077
78 // Returns true if the byte string after the magic is the correct value.
79 static bool IsVersionValid(const uint8_t* magic);
Roland Levillainf73caca2018-08-24 17:19:07 +010080 bool IsVersionValid() const override;
Mathieu Chartier7b074bf2017-09-25 16:22:36 -070081
Roland Levillainf73caca2018-08-24 17:19:07 +010082 bool SupportsDefaultMethods() const override;
Mathieu Chartierf6e31472017-12-28 13:32:08 -080083
Roland Levillainbbc6e7e2018-08-24 16:58:47 +010084 uint32_t GetCodeItemSize(const DexFile::CodeItem& item) const override;
Mathieu Chartier6238c832018-01-04 09:55:13 -080085
Roland Levillainf73caca2018-08-24 17:19:07 +010086 size_t GetDequickenedSize() const override {
Alex Lightca97ada2018-02-02 09:25:31 -080087 return Size();
88 }
89
Mathieu Chartier7b074bf2017-09-25 16:22:36 -070090 private:
David Sehr0b426772018-07-03 23:03:42 +000091 StandardDexFile(const uint8_t* base,
92 size_t size,
Mathieu Chartier292567e2017-10-12 13:24:38 -070093 const std::string& location,
94 uint32_t location_checksum,
David Sehr0b426772018-07-03 23:03:42 +000095 const OatDexFile* oat_dex_file,
96 std::unique_ptr<DexFileContainer> container)
97 : DexFile(base,
98 size,
99 /*data_begin*/ base,
100 /*data_size*/ size,
Mathieu Chartier69147f12017-11-06 20:02:24 -0800101 location,
102 location_checksum,
103 oat_dex_file,
David Sehr0b426772018-07-03 23:03:42 +0000104 std::move(container),
Mathieu Chartier69147f12017-11-06 20:02:24 -0800105 /*is_compact_dex*/ false) {}
Mathieu Chartier7b074bf2017-09-25 16:22:36 -0700106
Mathieu Chartier79c87da2017-10-10 11:54:29 -0700107 friend class DexFileLoader;
Mathieu Chartier7b074bf2017-09-25 16:22:36 -0700108 friend class DexFileVerifierTest;
109
110 ART_FRIEND_TEST(ClassLinkerTest, RegisterDexFileName); // for constructor
Mathieu Chartierfa3db3d2018-01-12 14:42:18 -0800111 friend class OptimizingUnitTestHelper; // for constructor
Mathieu Chartier7b074bf2017-09-25 16:22:36 -0700112
Mathieu Chartier292567e2017-10-12 13:24:38 -0700113 DISALLOW_COPY_AND_ASSIGN(StandardDexFile);
Mathieu Chartier7b074bf2017-09-25 16:22:36 -0700114};
115
116} // namespace art
117
David Sehr334b9d72018-02-12 18:27:56 -0800118#endif // ART_LIBDEXFILE_DEX_STANDARD_DEX_FILE_H_