xref: /aosp_15_r20/external/zucchini/disassembler_dex.h (revision a03ca8b91e029cd15055c20c78c2e087c84792e4)
1*a03ca8b9SKrzysztof Kosiński // Copyright 2018 The Chromium Authors. All rights reserved.
2*a03ca8b9SKrzysztof Kosiński // Use of this source code is governed by a BSD-style license that can be
3*a03ca8b9SKrzysztof Kosiński // found in the LICENSE file.
4*a03ca8b9SKrzysztof Kosiński 
5*a03ca8b9SKrzysztof Kosiński #ifndef COMPONENTS_ZUCCHINI_DISASSEMBLER_DEX_H_
6*a03ca8b9SKrzysztof Kosiński #define COMPONENTS_ZUCCHINI_DISASSEMBLER_DEX_H_
7*a03ca8b9SKrzysztof Kosiński 
8*a03ca8b9SKrzysztof Kosiński #include <stdint.h>
9*a03ca8b9SKrzysztof Kosiński 
10*a03ca8b9SKrzysztof Kosiński #include <map>
11*a03ca8b9SKrzysztof Kosiński #include <memory>
12*a03ca8b9SKrzysztof Kosiński #include <string>
13*a03ca8b9SKrzysztof Kosiński #include <vector>
14*a03ca8b9SKrzysztof Kosiński 
15*a03ca8b9SKrzysztof Kosiński #include "components/zucchini/disassembler.h"
16*a03ca8b9SKrzysztof Kosiński #include "components/zucchini/image_utils.h"
17*a03ca8b9SKrzysztof Kosiński #include "components/zucchini/type_dex.h"
18*a03ca8b9SKrzysztof Kosiński 
19*a03ca8b9SKrzysztof Kosiński namespace zucchini {
20*a03ca8b9SKrzysztof Kosiński 
21*a03ca8b9SKrzysztof Kosiński // For consistency, let "canonical order" of DEX data types be the order defined
22*a03ca8b9SKrzysztof Kosiński // in https://source.android.com/devices/tech/dalvik/dex-format "Type Codes"
23*a03ca8b9SKrzysztof Kosiński // section.
24*a03ca8b9SKrzysztof Kosiński 
25*a03ca8b9SKrzysztof Kosiński class DisassemblerDex : public Disassembler {
26*a03ca8b9SKrzysztof Kosiński  public:
27*a03ca8b9SKrzysztof Kosiński   static constexpr uint16_t kVersion = 1;
28*a03ca8b9SKrzysztof Kosiński   // Pools follow canonical order.
29*a03ca8b9SKrzysztof Kosiński   enum ReferencePool : uint8_t {
30*a03ca8b9SKrzysztof Kosiński     kStringId,
31*a03ca8b9SKrzysztof Kosiński     kTypeId,
32*a03ca8b9SKrzysztof Kosiński     kProtoId,
33*a03ca8b9SKrzysztof Kosiński     kFieldId,
34*a03ca8b9SKrzysztof Kosiński     kMethodId,
35*a03ca8b9SKrzysztof Kosiński     // kClassDef,  // Unused
36*a03ca8b9SKrzysztof Kosiński     kCallSiteId,
37*a03ca8b9SKrzysztof Kosiński     kMethodHandle,
38*a03ca8b9SKrzysztof Kosiński     kTypeList,
39*a03ca8b9SKrzysztof Kosiński     kAnnotationSetRefList,
40*a03ca8b9SKrzysztof Kosiński     kAnnotionSet,
41*a03ca8b9SKrzysztof Kosiński     kClassData,
42*a03ca8b9SKrzysztof Kosiński     kCode,
43*a03ca8b9SKrzysztof Kosiński     kStringData,
44*a03ca8b9SKrzysztof Kosiński     kAnnotation,
45*a03ca8b9SKrzysztof Kosiński     kEncodedArray,
46*a03ca8b9SKrzysztof Kosiński     kAnnotationsDirectory,
47*a03ca8b9SKrzysztof Kosiński     kCallSite,
48*a03ca8b9SKrzysztof Kosiński     kNumPools
49*a03ca8b9SKrzysztof Kosiński   };
50*a03ca8b9SKrzysztof Kosiński 
51*a03ca8b9SKrzysztof Kosiński   // Types are grouped and ordered by target ReferencePool. This is required by
52*a03ca8b9SKrzysztof Kosiński   // Zucchini-apply, which visits references by type order and sequentially
53*a03ca8b9SKrzysztof Kosiński   // handles pools in the same order. Type-pool association is established in
54*a03ca8b9SKrzysztof Kosiński   // MakeReferenceGroups(), and verified by a unit test.
55*a03ca8b9SKrzysztof Kosiński   enum ReferenceType : uint8_t {
56*a03ca8b9SKrzysztof Kosiński     kTypeIdToDescriptorStringId,  // kStringId
57*a03ca8b9SKrzysztof Kosiński     kProtoIdToShortyStringId,
58*a03ca8b9SKrzysztof Kosiński     kFieldIdToNameStringId,
59*a03ca8b9SKrzysztof Kosiński     kMethodIdToNameStringId,
60*a03ca8b9SKrzysztof Kosiński     kClassDefToSourceFileStringId,
61*a03ca8b9SKrzysztof Kosiński     kCodeToStringId16,
62*a03ca8b9SKrzysztof Kosiński     kCodeToStringId32,
63*a03ca8b9SKrzysztof Kosiński 
64*a03ca8b9SKrzysztof Kosiński     kProtoIdToReturnTypeId,  // kTypeId
65*a03ca8b9SKrzysztof Kosiński     kFieldIdToClassTypeId,
66*a03ca8b9SKrzysztof Kosiński     kFieldIdToTypeId,
67*a03ca8b9SKrzysztof Kosiński     kMethodIdToClassTypeId,
68*a03ca8b9SKrzysztof Kosiński     kClassDefToClassTypeId,
69*a03ca8b9SKrzysztof Kosiński     kClassDefToSuperClassTypeId,
70*a03ca8b9SKrzysztof Kosiński     kTypeListToTypeId,
71*a03ca8b9SKrzysztof Kosiński     kCodeToTypeId,
72*a03ca8b9SKrzysztof Kosiński 
73*a03ca8b9SKrzysztof Kosiński     kCodeToProtoId,  // kProtoId
74*a03ca8b9SKrzysztof Kosiński     kMethodIdToProtoId,
75*a03ca8b9SKrzysztof Kosiński 
76*a03ca8b9SKrzysztof Kosiński     kCodeToFieldId,  // kFieldId
77*a03ca8b9SKrzysztof Kosiński     kMethodHandleToFieldId,
78*a03ca8b9SKrzysztof Kosiński     kAnnotationsDirectoryToFieldId,
79*a03ca8b9SKrzysztof Kosiński 
80*a03ca8b9SKrzysztof Kosiński     kCodeToMethodId,  // kMethodId
81*a03ca8b9SKrzysztof Kosiński     kMethodHandleToMethodId,
82*a03ca8b9SKrzysztof Kosiński     kAnnotationsDirectoryToMethodId,
83*a03ca8b9SKrzysztof Kosiński     kAnnotationsDirectoryToParameterMethodId,
84*a03ca8b9SKrzysztof Kosiński 
85*a03ca8b9SKrzysztof Kosiński     kCodeToCallSiteId,  // kCallSiteId
86*a03ca8b9SKrzysztof Kosiński 
87*a03ca8b9SKrzysztof Kosiński     kCodeToMethodHandle,  // kMethodHandle
88*a03ca8b9SKrzysztof Kosiński 
89*a03ca8b9SKrzysztof Kosiński     kProtoIdToParametersTypeList,  // kTypeList
90*a03ca8b9SKrzysztof Kosiński     kClassDefToInterfacesTypeList,
91*a03ca8b9SKrzysztof Kosiński 
92*a03ca8b9SKrzysztof Kosiński     kAnnotationsDirectoryToParameterAnnotationSetRef,  // kAnnotationSetRef,
93*a03ca8b9SKrzysztof Kosiński 
94*a03ca8b9SKrzysztof Kosiński     kAnnotationSetRefListToAnnotationSet,  // kAnnotationSet,
95*a03ca8b9SKrzysztof Kosiński     kAnnotationsDirectoryToClassAnnotationSet,
96*a03ca8b9SKrzysztof Kosiński     kAnnotationsDirectoryToFieldAnnotationSet,
97*a03ca8b9SKrzysztof Kosiński     kAnnotationsDirectoryToMethodAnnotationSet,
98*a03ca8b9SKrzysztof Kosiński 
99*a03ca8b9SKrzysztof Kosiński     kClassDefToClassData,  // kClassData
100*a03ca8b9SKrzysztof Kosiński 
101*a03ca8b9SKrzysztof Kosiński     kCodeToRelCode8,  // kCode
102*a03ca8b9SKrzysztof Kosiński     kCodeToRelCode16,
103*a03ca8b9SKrzysztof Kosiński     kCodeToRelCode32,
104*a03ca8b9SKrzysztof Kosiński 
105*a03ca8b9SKrzysztof Kosiński     kStringIdToStringData,  // kStringData
106*a03ca8b9SKrzysztof Kosiński 
107*a03ca8b9SKrzysztof Kosiński     kAnnotationSetToAnnotation,  // kAnnotation
108*a03ca8b9SKrzysztof Kosiński 
109*a03ca8b9SKrzysztof Kosiński     kClassDefToStaticValuesEncodedArray,  // kEncodedArrayItem
110*a03ca8b9SKrzysztof Kosiński 
111*a03ca8b9SKrzysztof Kosiński     kClassDefToAnnotationDirectory,  // kAnnotationsDirectory
112*a03ca8b9SKrzysztof Kosiński 
113*a03ca8b9SKrzysztof Kosiński     kCallSiteIdToCallSite,  // kCallSite
114*a03ca8b9SKrzysztof Kosiński 
115*a03ca8b9SKrzysztof Kosiński     kNumTypes
116*a03ca8b9SKrzysztof Kosiński   };
117*a03ca8b9SKrzysztof Kosiński 
118*a03ca8b9SKrzysztof Kosiński   DisassemblerDex();
119*a03ca8b9SKrzysztof Kosiński   DisassemblerDex(const DisassemblerDex&) = delete;
120*a03ca8b9SKrzysztof Kosiński   const DisassemblerDex& operator=(const DisassemblerDex&) = delete;
121*a03ca8b9SKrzysztof Kosiński   ~DisassemblerDex() override;
122*a03ca8b9SKrzysztof Kosiński 
123*a03ca8b9SKrzysztof Kosiński   // Applies quick checks to determine if |image| *may* point to the start of an
124*a03ca8b9SKrzysztof Kosiński   // executable. Returns true on success.
125*a03ca8b9SKrzysztof Kosiński   static bool QuickDetect(ConstBufferView image);
126*a03ca8b9SKrzysztof Kosiński 
127*a03ca8b9SKrzysztof Kosiński   // Disassembler:
128*a03ca8b9SKrzysztof Kosiński   ExecutableType GetExeType() const override;
129*a03ca8b9SKrzysztof Kosiński   std::string GetExeTypeString() const override;
130*a03ca8b9SKrzysztof Kosiński   std::vector<ReferenceGroup> MakeReferenceGroups() const override;
131*a03ca8b9SKrzysztof Kosiński 
132*a03ca8b9SKrzysztof Kosiński   // Functions that return reference readers. These follow canonical order of
133*a03ca8b9SKrzysztof Kosiński   // *locations* (unlike targets for ReferenceType). This allows functions with
134*a03ca8b9SKrzysztof Kosiński   // similar parsing logic to appear togeter.
135*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadStringIdToStringData(offset_t lo,
136*a03ca8b9SKrzysztof Kosiński                                                                 offset_t hi);
137*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadTypeIdToDescriptorStringId32(
138*a03ca8b9SKrzysztof Kosiński       offset_t lo,
139*a03ca8b9SKrzysztof Kosiński       offset_t hi);
140*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadProtoIdToShortyStringId32(
141*a03ca8b9SKrzysztof Kosiński       offset_t lo,
142*a03ca8b9SKrzysztof Kosiński       offset_t hi);
143*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadProtoIdToReturnTypeId32(offset_t lo,
144*a03ca8b9SKrzysztof Kosiński                                                                    offset_t hi);
145*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadProtoIdToParametersTypeList(
146*a03ca8b9SKrzysztof Kosiński       offset_t lo,
147*a03ca8b9SKrzysztof Kosiński       offset_t hi);
148*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadFieldToClassTypeId16(offset_t lo,
149*a03ca8b9SKrzysztof Kosiński                                                                 offset_t hi);
150*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadFieldToTypeId16(offset_t lo,
151*a03ca8b9SKrzysztof Kosiński                                                            offset_t hi);
152*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadFieldToNameStringId32(offset_t lo,
153*a03ca8b9SKrzysztof Kosiński                                                                  offset_t hi);
154*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadMethodIdToClassTypeId16(offset_t lo,
155*a03ca8b9SKrzysztof Kosiński                                                                    offset_t hi);
156*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadMethodIdToProtoId16(offset_t lo,
157*a03ca8b9SKrzysztof Kosiński                                                                offset_t hi);
158*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadMethodIdToNameStringId32(
159*a03ca8b9SKrzysztof Kosiński       offset_t lo,
160*a03ca8b9SKrzysztof Kosiński       offset_t hi);
161*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadClassDefToClassTypeId32(offset_t lo,
162*a03ca8b9SKrzysztof Kosiński                                                                    offset_t hi);
163*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadClassDefToSuperClassTypeId32(
164*a03ca8b9SKrzysztof Kosiński       offset_t lo,
165*a03ca8b9SKrzysztof Kosiński       offset_t hi);
166*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadClassDefToInterfacesTypeList(
167*a03ca8b9SKrzysztof Kosiński       offset_t lo,
168*a03ca8b9SKrzysztof Kosiński       offset_t hi);
169*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadClassDefToSourceFileStringId32(
170*a03ca8b9SKrzysztof Kosiński       offset_t lo,
171*a03ca8b9SKrzysztof Kosiński       offset_t hi);
172*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadClassDefToAnnotationDirectory(
173*a03ca8b9SKrzysztof Kosiński       offset_t lo,
174*a03ca8b9SKrzysztof Kosiński       offset_t hi);
175*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadClassDefToClassData(offset_t lo,
176*a03ca8b9SKrzysztof Kosiński                                                                offset_t hi);
177*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadClassDefToStaticValuesEncodedArray(
178*a03ca8b9SKrzysztof Kosiński       offset_t lo,
179*a03ca8b9SKrzysztof Kosiński       offset_t hi);
180*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadCallSiteIdToCallSite32(offset_t lo,
181*a03ca8b9SKrzysztof Kosiński                                                                   offset_t hi);
182*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadMethodHandleToFieldId16(offset_t lo,
183*a03ca8b9SKrzysztof Kosiński                                                                    offset_t hi);
184*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadMethodHandleToMethodId16(
185*a03ca8b9SKrzysztof Kosiński       offset_t lo,
186*a03ca8b9SKrzysztof Kosiński       offset_t hi);
187*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadTypeListToTypeId16(offset_t lo,
188*a03ca8b9SKrzysztof Kosiński                                                               offset_t hi);
189*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadAnnotationSetToAnnotation(
190*a03ca8b9SKrzysztof Kosiński       offset_t lo,
191*a03ca8b9SKrzysztof Kosiński       offset_t hi);
192*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadAnnotationSetRefListToAnnotationSet(
193*a03ca8b9SKrzysztof Kosiński       offset_t lo,
194*a03ca8b9SKrzysztof Kosiński       offset_t hi);
195*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader>
196*a03ca8b9SKrzysztof Kosiński   MakeReadAnnotationsDirectoryToClassAnnotationSet(offset_t lo, offset_t hi);
197*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadAnnotationsDirectoryToFieldId32(
198*a03ca8b9SKrzysztof Kosiński       offset_t lo,
199*a03ca8b9SKrzysztof Kosiński       offset_t hi);
200*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader>
201*a03ca8b9SKrzysztof Kosiński   MakeReadAnnotationsDirectoryToFieldAnnotationSet(offset_t lo, offset_t hi);
202*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadAnnotationsDirectoryToMethodId32(
203*a03ca8b9SKrzysztof Kosiński       offset_t lo,
204*a03ca8b9SKrzysztof Kosiński       offset_t hi);
205*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader>
206*a03ca8b9SKrzysztof Kosiński   MakeReadAnnotationsDirectoryToMethodAnnotationSet(offset_t lo, offset_t hi);
207*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader>
208*a03ca8b9SKrzysztof Kosiński   MakeReadAnnotationsDirectoryToParameterMethodId32(offset_t lo, offset_t hi);
209*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader>
210*a03ca8b9SKrzysztof Kosiński   MakeReadAnnotationsDirectoryToParameterAnnotationSetRef(offset_t lo,
211*a03ca8b9SKrzysztof Kosiński                                                           offset_t hi);
212*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadCodeToStringId16(offset_t lo,
213*a03ca8b9SKrzysztof Kosiński                                                             offset_t hi);
214*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadCodeToStringId32(offset_t lo,
215*a03ca8b9SKrzysztof Kosiński                                                             offset_t hi);
216*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadCodeToTypeId16(offset_t lo,
217*a03ca8b9SKrzysztof Kosiński                                                           offset_t hi);
218*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadCodeToProtoId16(offset_t lo,
219*a03ca8b9SKrzysztof Kosiński                                                            offset_t hi);
220*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadCodeToFieldId16(offset_t lo,
221*a03ca8b9SKrzysztof Kosiński                                                            offset_t hi);
222*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadCodeToMethodId16(offset_t lo,
223*a03ca8b9SKrzysztof Kosiński                                                             offset_t hi);
224*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadCodeToCallSiteId16(offset_t lo,
225*a03ca8b9SKrzysztof Kosiński                                                               offset_t hi);
226*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadCodeToMethodHandle16(offset_t lo,
227*a03ca8b9SKrzysztof Kosiński                                                                 offset_t hi);
228*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadCodeToRelCode8(offset_t lo,
229*a03ca8b9SKrzysztof Kosiński                                                           offset_t hi);
230*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadCodeToRelCode16(offset_t lo,
231*a03ca8b9SKrzysztof Kosiński                                                            offset_t hi);
232*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceReader> MakeReadCodeToRelCode32(offset_t lo,
233*a03ca8b9SKrzysztof Kosiński                                                            offset_t hi);
234*a03ca8b9SKrzysztof Kosiński 
235*a03ca8b9SKrzysztof Kosiński   // Functions that return reference writers. Different readers may share a
236*a03ca8b9SKrzysztof Kosiński   // common writer. Therefore these loosely follow canonical order of locations,
237*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceWriter> MakeWriteStringId16(MutableBufferView image);
238*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceWriter> MakeWriteStringId32(MutableBufferView image);
239*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceWriter> MakeWriteTypeId16(MutableBufferView image);
240*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceWriter> MakeWriteTypeId32(MutableBufferView image);
241*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceWriter> MakeWriteProtoId16(MutableBufferView image);
242*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceWriter> MakeWriteFieldId16(MutableBufferView image);
243*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceWriter> MakeWriteFieldId32(MutableBufferView image);
244*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceWriter> MakeWriteMethodId16(MutableBufferView image);
245*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceWriter> MakeWriteMethodId32(MutableBufferView image);
246*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceWriter> MakeWriteCallSiteId16(
247*a03ca8b9SKrzysztof Kosiński       MutableBufferView image);
248*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceWriter> MakeWriteMethodHandle16(
249*a03ca8b9SKrzysztof Kosiński       MutableBufferView image);
250*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceWriter> MakeWriteRelCode8(MutableBufferView image);
251*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceWriter> MakeWriteRelCode16(MutableBufferView image);
252*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceWriter> MakeWriteRelCode32(MutableBufferView image);
253*a03ca8b9SKrzysztof Kosiński   std::unique_ptr<ReferenceWriter> MakeWriteAbs32(MutableBufferView image);
254*a03ca8b9SKrzysztof Kosiński 
255*a03ca8b9SKrzysztof Kosiński  private:
256*a03ca8b9SKrzysztof Kosiński   friend Disassembler;
257*a03ca8b9SKrzysztof Kosiński   using MapItemMap = std::map<uint16_t, const dex::MapItem*>;
258*a03ca8b9SKrzysztof Kosiński 
259*a03ca8b9SKrzysztof Kosiński   // Disassembler:
260*a03ca8b9SKrzysztof Kosiński   bool Parse(ConstBufferView image) override;
261*a03ca8b9SKrzysztof Kosiński 
262*a03ca8b9SKrzysztof Kosiński   bool ParseHeader();
263*a03ca8b9SKrzysztof Kosiński 
264*a03ca8b9SKrzysztof Kosiński   const dex::HeaderItem* header_ = nullptr;
265*a03ca8b9SKrzysztof Kosiński   int dex_version_ = 0;
266*a03ca8b9SKrzysztof Kosiński   MapItemMap map_item_map_ = {};
267*a03ca8b9SKrzysztof Kosiński   dex::MapItem string_map_item_ = {};
268*a03ca8b9SKrzysztof Kosiński   dex::MapItem type_map_item_ = {};
269*a03ca8b9SKrzysztof Kosiński   dex::MapItem proto_map_item_ = {};
270*a03ca8b9SKrzysztof Kosiński   dex::MapItem field_map_item_ = {};
271*a03ca8b9SKrzysztof Kosiński   dex::MapItem method_map_item_ = {};
272*a03ca8b9SKrzysztof Kosiński   dex::MapItem class_def_map_item_ = {};
273*a03ca8b9SKrzysztof Kosiński   dex::MapItem call_site_map_item_ = {};
274*a03ca8b9SKrzysztof Kosiński   dex::MapItem method_handle_map_item_ = {};
275*a03ca8b9SKrzysztof Kosiński   dex::MapItem type_list_map_item_ = {};
276*a03ca8b9SKrzysztof Kosiński   dex::MapItem annotation_set_ref_list_map_item_ = {};
277*a03ca8b9SKrzysztof Kosiński   dex::MapItem annotation_set_map_item_ = {};
278*a03ca8b9SKrzysztof Kosiński   dex::MapItem code_map_item_ = {};
279*a03ca8b9SKrzysztof Kosiński   dex::MapItem annotations_directory_map_item_ = {};
280*a03ca8b9SKrzysztof Kosiński 
281*a03ca8b9SKrzysztof Kosiński   // Sorted list of offsets of parsed items in |image_|.
282*a03ca8b9SKrzysztof Kosiński   std::vector<offset_t> code_item_offsets_;
283*a03ca8b9SKrzysztof Kosiński   std::vector<offset_t> type_list_offsets_;
284*a03ca8b9SKrzysztof Kosiński   std::vector<offset_t> annotation_set_ref_list_offsets_;
285*a03ca8b9SKrzysztof Kosiński   std::vector<offset_t> annotation_set_offsets_;
286*a03ca8b9SKrzysztof Kosiński   std::vector<offset_t> annotations_directory_item_offsets_;
287*a03ca8b9SKrzysztof Kosiński   std::vector<offset_t> annotations_directory_item_field_annotation_offsets_;
288*a03ca8b9SKrzysztof Kosiński   std::vector<offset_t> annotations_directory_item_method_annotation_offsets_;
289*a03ca8b9SKrzysztof Kosiński   std::vector<offset_t>
290*a03ca8b9SKrzysztof Kosiński       annotations_directory_item_parameter_annotation_offsets_;
291*a03ca8b9SKrzysztof Kosiński };
292*a03ca8b9SKrzysztof Kosiński 
293*a03ca8b9SKrzysztof Kosiński }  // namespace zucchini
294*a03ca8b9SKrzysztof Kosiński 
295*a03ca8b9SKrzysztof Kosiński #endif  // COMPONENTS_ZUCCHINI_DISASSEMBLER_DEX_H_
296