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