1f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
2f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Copyright (C) 2008 The Android Open Source Project
3f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
4f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Licensed under the Apache License, Version 2.0 (the "License");
5f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * you may not use this file except in compliance with the License.
6f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * You may obtain a copy of the License at
7f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
8f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *      http://www.apache.org/licenses/LICENSE-2.0
9f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
10f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Unless required by applicable law or agreed to in writing, software
11f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * distributed under the License is distributed on an "AS IS" BASIS,
12f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * See the License for the specific language governing permissions and
14f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * limitations under the License.
15f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
16e377ef62a40267ab16c2dd20cc5f4c63af6397ccDan Bornstein
17f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
18f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Access .dex (Dalvik Executable Format) files.  The code here assumes that
19f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the DEX file has been rewritten (byte-swapped, word-aligned) and that
20f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * the contents can be directly accessed as a collection of C arrays.  Please
21f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * see docs/dalvik/dex-format.html for a detailed description.
22f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
23f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The structure and field names were chosen to match those in the DEX spec.
24f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
25f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * It's generally assumed that the DEX file will be stored in shared memory,
26f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * obviating the need to copy code and constant pool entries into newly
27f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * allocated storage.  Maintaining local pointers to items in the shared area
28f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is valid and encouraged.
29f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
30f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * All memory-mapped structures are 32-bit aligned unless otherwise noted.
31f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
32e377ef62a40267ab16c2dd20cc5f4c63af6397ccDan Bornstein
33375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#ifndef LIBDEX_DEXFILE_H_
34375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#define LIBDEX_DEXFILE_H_
35f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
36f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "vm/Common.h"      // basic type defs, e.g. u1/u2/u4/u8, and LOG
37f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#include "libdex/SysUtil.h"
38f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
39f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
40f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * gcc-style inline management -- ensures we have a copy of all functions
41f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * in the library, so code that links against us will work whether or not
42f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * it was built with optimizations enabled.
43f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
44f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#ifndef _DEX_GEN_INLINES             /* only defined by DexInlines.c */
45f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define DEX_INLINE extern __inline__
46f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#else
47f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project# define DEX_INLINE
48f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#endif
49f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
50f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* DEX file magic number */
51f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define DEX_MAGIC       "dex\n"
529fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein
539fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein/* current version, encoded in 4 bytes of ASCII */
549fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein#define DEX_MAGIC_VERS  "036\0"
559fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein
569fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein/*
579fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein * older but still-recognized version (corresponding to Android API
589fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein * levels 13 and earlier
599fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein */
609fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein#define DEX_MAGIC_VERS_API_13  "035\0"
61f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
62f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* same, but for optimized DEX header */
63f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define DEX_OPT_MAGIC   "dey\n"
647d18e38e260d79df8144908b28033b800d5d7470Andy McFadden#define DEX_OPT_MAGIC_VERS  "036\0"
65f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
66f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define DEX_DEP_MAGIC   "deps"
67f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
68f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
69f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * 160-bit SHA-1 digest.
70f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
71f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectenum { kSHA1DigestLen = 20,
72f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project       kSHA1DigestOutputLen = kSHA1DigestLen*2 +1 };
73f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
74f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* general constants */
75f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectenum {
76f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexEndianConstant = 0x12345678,    /* the endianness indicator */
77f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexNoIndex = 0xffffffff,           /* not a valid index value */
78f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project};
79f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
80f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
81a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein * Enumeration of all the primitive types.
82a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein */
83bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiroenum PrimitiveType {
84a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    PRIM_NOT        = 0,       /* value is a reference type, not a primitive type */
85a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    PRIM_VOID       = 1,
86a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    PRIM_BOOLEAN    = 2,
87a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    PRIM_BYTE       = 3,
88a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    PRIM_SHORT      = 4,
89a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    PRIM_CHAR       = 5,
90a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    PRIM_INT        = 6,
91a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    PRIM_LONG       = 7,
92a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    PRIM_FLOAT      = 8,
93a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein    PRIM_DOUBLE     = 9,
94bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
95a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein
96a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein/*
97f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * access flags and masks; the "standard" ones are all <= 0x4000
98de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro *
99f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Note: There are related declarations in vm/oo/Object.h in the ClassFlags
100f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * enum.
101f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
102f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectenum {
103f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ACC_PUBLIC       = 0x00000001,       // class, field, method, ic
104f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ACC_PRIVATE      = 0x00000002,       // field, method, ic
105f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ACC_PROTECTED    = 0x00000004,       // field, method, ic
106f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ACC_STATIC       = 0x00000008,       // field, method, ic
107f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ACC_FINAL        = 0x00000010,       // class, field, method, ic
108f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ACC_SYNCHRONIZED = 0x00000020,       // method (only allowed on natives)
109f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ACC_SUPER        = 0x00000020,       // class (not used in Dalvik)
110f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ACC_VOLATILE     = 0x00000040,       // field
111f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ACC_BRIDGE       = 0x00000040,       // method (1.5)
112f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ACC_TRANSIENT    = 0x00000080,       // field
113f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ACC_VARARGS      = 0x00000080,       // method (1.5)
114f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ACC_NATIVE       = 0x00000100,       // method
115f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ACC_INTERFACE    = 0x00000200,       // class, ic
116f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ACC_ABSTRACT     = 0x00000400,       // class, method, ic
117f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ACC_STRICT       = 0x00000800,       // method
118f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ACC_SYNTHETIC    = 0x00001000,       // field, method, ic
119f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ACC_ANNOTATION   = 0x00002000,       // class, ic (1.5)
120f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ACC_ENUM         = 0x00004000,       // class, field, ic (1.5)
121f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ACC_CONSTRUCTOR  = 0x00010000,       // method (Dalvik only)
122f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ACC_DECLARED_SYNCHRONIZED =
123f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                       0x00020000,       // method (Dalvik only)
124de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro    ACC_CLASS_MASK =
125f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        (ACC_PUBLIC | ACC_FINAL | ACC_INTERFACE | ACC_ABSTRACT
126f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                | ACC_SYNTHETIC | ACC_ANNOTATION | ACC_ENUM),
127f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ACC_INNER_CLASS_MASK =
128f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        (ACC_CLASS_MASK | ACC_PRIVATE | ACC_PROTECTED | ACC_STATIC),
129f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ACC_FIELD_MASK =
130f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        (ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED | ACC_STATIC | ACC_FINAL
131f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                | ACC_VOLATILE | ACC_TRANSIENT | ACC_SYNTHETIC | ACC_ENUM),
132f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    ACC_METHOD_MASK =
133f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        (ACC_PUBLIC | ACC_PRIVATE | ACC_PROTECTED | ACC_STATIC | ACC_FINAL
134f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                | ACC_SYNCHRONIZED | ACC_BRIDGE | ACC_VARARGS | ACC_NATIVE
135f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                | ACC_ABSTRACT | ACC_STRICT | ACC_SYNTHETIC | ACC_CONSTRUCTOR
136f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project                | ACC_DECLARED_SYNCHRONIZED),
137f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project};
138f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
139f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* annotation constants */
140f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectenum {
141f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexVisibilityBuild         = 0x00,     /* annotation visibility */
142f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexVisibilityRuntime       = 0x01,
143f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexVisibilitySystem        = 0x02,
144f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
145f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexAnnotationByte          = 0x00,
146f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexAnnotationShort         = 0x02,
147f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexAnnotationChar          = 0x03,
148f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexAnnotationInt           = 0x04,
149f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexAnnotationLong          = 0x06,
150f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexAnnotationFloat         = 0x10,
151f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexAnnotationDouble        = 0x11,
152f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexAnnotationString        = 0x17,
153f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexAnnotationType          = 0x18,
154f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexAnnotationField         = 0x19,
155f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexAnnotationMethod        = 0x1a,
156f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexAnnotationEnum          = 0x1b,
157f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexAnnotationArray         = 0x1c,
158f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexAnnotationAnnotation    = 0x1d,
159f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexAnnotationNull          = 0x1e,
160f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexAnnotationBoolean       = 0x1f,
161f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
162f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexAnnotationValueTypeMask = 0x1f,     /* low 5 bits */
163f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexAnnotationValueArgShift = 5,
164f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project};
165f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
166f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* map item type codes */
167f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectenum {
168f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexTypeHeaderItem               = 0x0000,
169f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexTypeStringIdItem             = 0x0001,
170f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexTypeTypeIdItem               = 0x0002,
171f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexTypeProtoIdItem              = 0x0003,
172f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexTypeFieldIdItem              = 0x0004,
173f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexTypeMethodIdItem             = 0x0005,
174f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexTypeClassDefItem             = 0x0006,
175f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexTypeMapList                  = 0x1000,
176f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexTypeTypeList                 = 0x1001,
177f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexTypeAnnotationSetRefList     = 0x1002,
178f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexTypeAnnotationSetItem        = 0x1003,
179f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexTypeClassDataItem            = 0x2000,
180f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexTypeCodeItem                 = 0x2001,
181f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexTypeStringDataItem           = 0x2002,
182f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexTypeDebugInfoItem            = 0x2003,
183f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexTypeAnnotationItem           = 0x2004,
184f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexTypeEncodedArrayItem         = 0x2005,
185f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexTypeAnnotationsDirectoryItem = 0x2006,
186f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project};
187f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
188f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* auxillary data section chunk codes */
189f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectenum {
190f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexChunkClassLookup            = 0x434c4b50,   /* CLKP */
19199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    kDexChunkRegisterMaps           = 0x524d4150,   /* RMAP */
192f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
193f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexChunkEnd                    = 0x41454e44,   /* AEND */
194f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project};
195f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
196f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* debug info opcodes and constants */
197f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectenum {
198f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    DBG_END_SEQUENCE         = 0x00,
199f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    DBG_ADVANCE_PC           = 0x01,
200f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    DBG_ADVANCE_LINE         = 0x02,
201f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    DBG_START_LOCAL          = 0x03,
202f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    DBG_START_LOCAL_EXTENDED = 0x04,
203f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    DBG_END_LOCAL            = 0x05,
204f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    DBG_RESTART_LOCAL        = 0x06,
205f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    DBG_SET_PROLOGUE_END     = 0x07,
206f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    DBG_SET_EPILOGUE_BEGIN   = 0x08,
207f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    DBG_SET_FILE             = 0x09,
208f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    DBG_FIRST_SPECIAL        = 0x0a,
209f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    DBG_LINE_BASE            = -4,
210f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    DBG_LINE_RANGE           = 15,
211f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project};
212f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
213f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
214f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "header_item" struct.
215f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
216bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexHeader {
217f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u1  magic[8];           /* includes version number */
218f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  checksum;           /* adler32 checksum */
219f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u1  signature[kSHA1DigestLen]; /* SHA-1 hash */
220f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  fileSize;           /* length of entire file */
221f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  headerSize;         /* offset to start of next section */
222f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  endianTag;
223f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  linkSize;
224f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  linkOff;
225f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  mapOff;
226f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  stringIdsSize;
227f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  stringIdsOff;
228f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  typeIdsSize;
229f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  typeIdsOff;
230f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  protoIdsSize;
231f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  protoIdsOff;
232f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  fieldIdsSize;
233f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  fieldIdsOff;
234f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  methodIdsSize;
235f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  methodIdsOff;
236f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  classDefsSize;
237f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  classDefsOff;
238f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  dataSize;
239f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  dataOff;
240bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
241f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
242f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
243f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "map_item".
244f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
245bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexMapItem {
246bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro    u2 type;              /* type code (see kDexType* above) */
247bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro    u2 unused;
248bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro    u4 size;              /* count of items of the indicated type */
249bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro    u4 offset;            /* file offset to the start of data */
250bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
251f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
252f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
253f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "map_list".
254f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
255bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexMapList {
256f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  size;               /* #of entries in list */
257f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    DexMapItem list[1];     /* entries */
258bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
259f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
260f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
261f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "string_id_item".
262f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
263bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexStringId {
264bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro    u4 stringDataOff;      /* file offset to string_data_item */
265bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
266f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
267f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
268f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "type_id_item".
269f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
270bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexTypeId {
271f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  descriptorIdx;      /* index into stringIds list for type descriptor */
272bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
273f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
274f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
275f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "field_id_item".
276f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
277bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexFieldId {
278f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u2  classIdx;           /* index into typeIds list for defining class */
279f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u2  typeIdx;            /* index into typeIds for field type */
280f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  nameIdx;            /* index into stringIds for field name */
281bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
282f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
283f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
284f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "method_id_item".
285f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
286bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexMethodId {
287f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u2  classIdx;           /* index into typeIds list for defining class */
288f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u2  protoIdx;           /* index into protoIds for method prototype */
289f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  nameIdx;            /* index into stringIds for method name */
290bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
291f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
292f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
293f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "proto_id_item".
294f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
295bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexProtoId {
296f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  shortyIdx;          /* index into stringIds for shorty descriptor */
297f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  returnTypeIdx;      /* index into typeIds list for return type */
298f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  parametersOff;      /* file offset to type_list for parameter types */
299bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
300f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
301f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
302f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "class_def_item".
303f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
304bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexClassDef {
305f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  classIdx;           /* index into typeIds for this class */
306f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  accessFlags;
307f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  superclassIdx;      /* index into typeIds for superclass */
308f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  interfacesOff;      /* file offset to DexTypeList */
309f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  sourceFileIdx;      /* index into stringIds for source file name */
310f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  annotationsOff;     /* file offset to annotations_directory_item */
311f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  classDataOff;       /* file offset to class_data_item */
312f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  staticValuesOff;    /* file offset to DexEncodedArray */
313bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
314f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
315f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
316f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "type_item".
317f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
318bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexTypeItem {
319f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u2  typeIdx;            /* index into typeIds */
320bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
321f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
322f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
323f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "type_list".
324f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
325bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexTypeList {
326f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  size;               /* #of entries in list */
327f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    DexTypeItem list[1];    /* entries */
328bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
329f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
330f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
331f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "code_item".
332f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
333f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The "catches" table is used when throwing an exception,
334f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * "debugInfo" is used when displaying an exception stack trace or
335f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * debugging. An offset of zero indicates that there are no entries.
336f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
337bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexCode {
338f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u2  registersSize;
339f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u2  insSize;
340f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u2  outsSize;
341f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u2  triesSize;
342f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  debugInfoOff;       /* file offset to debug info stream */
343f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  insnsSize;          /* size of the insns array, in u2 units */
344f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u2  insns[1];
345f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* followed by optional u2 padding */
346f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* followed by try_item[triesSize] */
347f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* followed by uleb128 handlersSize */
348f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* followed by catch_handler_item[handlersSize] */
349bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
350f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
351f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
352f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "try_item".
353f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
354bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexTry {
355f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  startAddr;          /* start address, in 16-bit code units */
356f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u2  insnCount;          /* instruction count, in 16-bit code units */
357f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u2  handlerOff;         /* offset in encoded handler data to handlers */
358bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
359f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
360f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
361f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Link table.  Currently undefined.
362f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
363bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexLink {
364f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u1  bleargh;
365bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
366f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
367f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
368f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
369f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "annotations_directory_item".
370f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
371bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexAnnotationsDirectoryItem {
372f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  classAnnotationsOff;  /* offset to DexAnnotationSetItem */
373f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  fieldsSize;           /* count of DexFieldAnnotationsItem */
374f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  methodsSize;          /* count of DexMethodAnnotationsItem */
375f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  parametersSize;       /* count of DexParameterAnnotationsItem */
376f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* followed by DexFieldAnnotationsItem[fieldsSize] */
377f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* followed by DexMethodAnnotationsItem[methodsSize] */
378f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* followed by DexParameterAnnotationsItem[parametersSize] */
379bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
380f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
381f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
382f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "field_annotations_item".
383f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
384bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexFieldAnnotationsItem {
385f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  fieldIdx;
386f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  annotationsOff;             /* offset to DexAnnotationSetItem */
387bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
388f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
389f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
390f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "method_annotations_item".
391f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
392bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexMethodAnnotationsItem {
393f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  methodIdx;
394f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  annotationsOff;             /* offset to DexAnnotationSetItem */
395bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
396f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
397f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
398f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "parameter_annotations_item".
399f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
400bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexParameterAnnotationsItem {
401f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  methodIdx;
402f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  annotationsOff;             /* offset to DexAnotationSetRefList */
403bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
404f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
405f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
406f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "annotation_set_ref_item".
407f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
408bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexAnnotationSetRefItem {
409f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  annotationsOff;             /* offset to DexAnnotationSetItem */
410bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
411f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
412f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
413f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "annotation_set_ref_list".
414f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
415bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexAnnotationSetRefList {
416f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  size;
417f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    DexAnnotationSetRefItem list[1];
418bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
419f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
420f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
421c99fe6df38af0e55821d8d98ccf67664ce35231aJesse Wilson * Direct-mapped "annotation_set_item".
422f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
423bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexAnnotationSetItem {
424f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  size;
425f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  entries[1];                 /* offset to DexAnnotationItem */
426bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
427f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
428f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
429f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "annotation_item".
430f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
431f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * NOTE: this structure is byte-aligned.
432f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
433bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexAnnotationItem {
434f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u1  visibility;
435f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u1  annotation[1];              /* data in encoded_annotation format */
436bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
437f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
438f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
439f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Direct-mapped "encoded_array".
440f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
441f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * NOTE: this structure is byte-aligned.
442f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
443bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexEncodedArray {
444f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u1  array[1];                   /* data in encoded_array format */
445bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
446f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
447f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
448f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Lookup table for classes.  It provides a mapping from class name to
449f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * class definition.  Used by dexFindClass().
450f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
451f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * We calculate this at DEX optimization time and embed it in the file so we
452f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * don't need the same hash table in every VM.  This is slightly slower than
453f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * a hash table with direct pointers to the items, but because it's shared
454f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * there's less of a penalty for using a fairly sparse table.
455f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
456bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexClassLookup {
457f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int     size;                       // total size, including "size"
458f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int     numEntries;                 // size of table[]; always power of 2
459f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    struct {
460f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        u4      classDescriptorHash;    // class descriptor hash code
461f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int     classDescriptorOffset;  // in bytes, from start of DEX
462f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        int     classDefOffset;         // in bytes, from start of DEX
463f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    } table[1];
464bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
465f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
466f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
467f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Header added by DEX optimization pass.  Values are always written in
468f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * local byte and structure padding.  The first field (magic + version)
469f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * is guaranteed to be present and directly readable for all expected
470f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * compiler configurations; the rest is version-dependent.
471f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
472f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Try to keep this simple and fixed-size.
473f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
474bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexOptHeader {
475f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u1  magic[8];           /* includes version number */
476f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
477f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  dexOffset;          /* file offset of DEX header */
478f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  dexLength;
479f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  depsOffset;         /* offset of optimized DEX dependency table */
480f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  depsLength;
481e377ef62a40267ab16c2dd20cc5f4c63af6397ccDan Bornstein    u4  optOffset;          /* file offset of optimized data tables */
482e377ef62a40267ab16c2dd20cc5f4c63af6397ccDan Bornstein    u4  optLength;
483f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
484f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4  flags;              /* some info flags */
485e377ef62a40267ab16c2dd20cc5f4c63af6397ccDan Bornstein    u4  checksum;           /* adler32 checksum covering deps/opt */
486f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
4877d18e38e260d79df8144908b28033b800d5d7470Andy McFadden    /* pad for 64-bit alignment if necessary */
488bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
489f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
490f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define DEX_OPT_FLAG_BIG            (1<<1)  /* swapped to big-endian */
491f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
492f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project#define DEX_INTERFACE_CACHE_SIZE    128     /* must be power of 2 */
493f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
494f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
495f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Structure representing a DEX file.
496f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
497f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Code should regard DexFile as opaque, using the API calls provided here
498f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * to access specific structures.
499f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
500bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapirostruct DexFile {
501f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* directly-mapped "opt" header */
502f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexOptHeader* pOptHeader;
503f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
504f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* pointers to directly-mapped structs and arrays in base DEX */
505f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexHeader*    pHeader;
506f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexStringId*  pStringIds;
507f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexTypeId*    pTypeIds;
508f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexFieldId*   pFieldIds;
509f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexMethodId*  pMethodIds;
510f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexProtoId*   pProtoIds;
511f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexClassDef*  pClassDefs;
512f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexLink*      pLinkData;
513f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
51499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    /*
51599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * These are mapped out of the "auxillary" section, and may not be
51699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     * included in the file.
51799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project     */
518f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexClassLookup* pClassLookup;
51999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    const void*         pRegisterMapPool;       // RegisterMapClassPool
520f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
521f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* points to start of DEX file data */
522f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const u1*           baseAddr;
523f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
524f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* track memory overhead for auxillary structures */
525f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    int                 overhead;
526f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
527f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /* additional app-specific data structures associated with the DEX */
528f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    //void*               auxData;
529bfc9799b1a53fd6f6136d07e6278d4538cf70f13Carl Shapiro};
530f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
531f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
532f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Utility function -- rounds up to the nearest power of 2.
533f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
534f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectu4 dexRoundUpPower2(u4 val);
535f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
536f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
537f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Parse an optimized or unoptimized .dex file sitting in memory.
538f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
539f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * On success, return a newly-allocated DexFile.
540f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
541f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDexFile* dexFileParse(const u1* data, size_t length, int flags);
542f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
543f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* bit values for "flags" argument to dexFileParse */
544f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectenum {
545f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexParseDefault            = 0,
546f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexParseVerifyChecksum     = 1,
547f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    kDexParseContinueOnError    = (1 << 1),
548f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project};
549f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
550f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
5514b0750e8df91220690bb417f45d7ae8b7851b220Dan Bornstein * Fix the byte ordering of all fields in the DEX file, and do
5524b0750e8df91220690bb417f45d7ae8b7851b220Dan Bornstein * structural verification. This is only required for code that opens
5534b0750e8df91220690bb417f45d7ae8b7851b220Dan Bornstein * "raw" DEX files, such as the DEX optimizer.
554f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project *
555f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Return 0 on success.
556f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
5574b0750e8df91220690bb417f45d7ae8b7851b220Dan Bornsteinint dexSwapAndVerify(u1* addr, int len);
5584b0750e8df91220690bb417f45d7ae8b7851b220Dan Bornstein
5594b0750e8df91220690bb417f45d7ae8b7851b220Dan Bornstein/*
5604b0750e8df91220690bb417f45d7ae8b7851b220Dan Bornstein * Detect the file type of the given memory buffer via magic number.
5614b0750e8df91220690bb417f45d7ae8b7851b220Dan Bornstein * Call dexSwapAndVerify() on an unoptimized DEX file, do nothing
5624b0750e8df91220690bb417f45d7ae8b7851b220Dan Bornstein * but return successfully on an optimized DEX file, and report an
5634b0750e8df91220690bb417f45d7ae8b7851b220Dan Bornstein * error for all other cases.
5644b0750e8df91220690bb417f45d7ae8b7851b220Dan Bornstein *
5654b0750e8df91220690bb417f45d7ae8b7851b220Dan Bornstein * Return 0 on success.
5664b0750e8df91220690bb417f45d7ae8b7851b220Dan Bornstein */
5674b0750e8df91220690bb417f45d7ae8b7851b220Dan Bornsteinint dexSwapAndVerifyIfNecessary(u1* addr, int len);
568f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
569f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
5709fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein * Check to see if the file magic and format version in the given
5719fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein * header are recognized as valid. Returns true if they are
5729fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein * acceptable.
5739fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein */
5749fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornsteinbool dexHasValidMagic(const DexHeader* pHeader);
5759fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein
5769fdbd91288a237eb58e18e4de9c729c3c268c318Dan Bornstein/*
577f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Compute DEX checksum.
578f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
579f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectu4 dexComputeChecksum(const DexHeader* pHeader);
580f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
581f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
582f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Free a DexFile structure, along with any associated structures.
583f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
584f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dexFileFree(DexFile* pDexFile);
585f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
586f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
587f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Create class lookup table.
588f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
589f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDexClassLookup* dexCreateClassLookup(DexFile* pDexFile);
590f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
591f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
592f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Find a class definition by descriptor.
593f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
594f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectconst DexClassDef* dexFindClass(const DexFile* pFile, const char* descriptor);
595f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
596f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
597f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Set up the basic raw data pointers of a DexFile. This function isn't
598f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * meant for general use.
599f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
600f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectvoid dexFileSetupBasicPointers(DexFile* pDexFile, const u1* data);
601f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
602f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the DexMapList of the file, if any */
603f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexMapList* dexGetMap(const DexFile* pDexFile) {
604f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4 mapOff = pDexFile->pHeader->mapOff;
605f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
606f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (mapOff == 0) {
607f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return NULL;
608f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    } else {
609f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return (const DexMapList*) (pDexFile->baseAddr + mapOff);
610f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
611f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
612f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
613f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the const char* string data referred to by the given string_id */
614f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const char* dexGetStringData(const DexFile* pDexFile,
615f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        const DexStringId* pStringId) {
616f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const u1* ptr = pDexFile->baseAddr + pStringId->stringDataOff;
617f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
618f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // Skip the uleb128 length.
619f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    while (*(ptr++) > 0x7f) /* empty */ ;
620f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
621f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return (const char*) ptr;
622f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
623f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the StringId with the specified index */
624f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexStringId* dexGetStringId(const DexFile* pDexFile, u4 idx) {
625f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(idx < pDexFile->pHeader->stringIdsSize);
626f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return &pDexFile->pStringIds[idx];
627f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
628f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the UTF-8 encoded string with the specified string_id index */
629f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const char* dexStringById(const DexFile* pDexFile, u4 idx) {
630f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexStringId* pStringId = dexGetStringId(pDexFile, idx);
631f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return dexGetStringData(pDexFile, pStringId);
632f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
633f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
634f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Return the UTF-8 encoded string with the specified string_id index,
635f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * also filling in the UTF-16 size (number of 16-bit code points).*/
636f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Projectconst char* dexStringAndSizeById(const DexFile* pDexFile, u4 idx,
637f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        u4* utf16Size);
638f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
639f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the TypeId with the specified index */
640f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexTypeId* dexGetTypeId(const DexFile* pDexFile, u4 idx) {
641f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(idx < pDexFile->pHeader->typeIdsSize);
642f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return &pDexFile->pTypeIds[idx];
643f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
644f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
645f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
646f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the descriptor string associated with a given type index.
647f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * The caller should not free() the returned string.
648f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
649f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const char* dexStringByTypeIdx(const DexFile* pDexFile, u4 idx) {
650f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexTypeId* typeId = dexGetTypeId(pDexFile, idx);
651f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return dexStringById(pDexFile, typeId->descriptorIdx);
652f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
653f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
654f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the MethodId with the specified index */
655f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexMethodId* dexGetMethodId(const DexFile* pDexFile, u4 idx) {
656f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(idx < pDexFile->pHeader->methodIdsSize);
657f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return &pDexFile->pMethodIds[idx];
658f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
659f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
660f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the FieldId with the specified index */
661f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexFieldId* dexGetFieldId(const DexFile* pDexFile, u4 idx) {
662f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(idx < pDexFile->pHeader->fieldIdsSize);
663f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return &pDexFile->pFieldIds[idx];
664f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
665f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
666f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the ProtoId with the specified index */
667f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexProtoId* dexGetProtoId(const DexFile* pDexFile, u4 idx) {
668f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(idx < pDexFile->pHeader->protoIdsSize);
669f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return &pDexFile->pProtoIds[idx];
670f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
671f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
672f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/*
673f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * Get the parameter list from a ProtoId. The returns NULL if the ProtoId
674f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project * does not have a parameter list.
675f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project */
676f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexTypeList* dexGetProtoParameters(
677f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexFile *pDexFile, const DexProtoId* pProtoId) {
678f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (pProtoId->parametersOff == 0) {
679f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return NULL;
680f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
681f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return (const DexTypeList*)
682f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        (pDexFile->baseAddr + pProtoId->parametersOff);
683f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
684f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
685f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the ClassDef with the specified index */
686f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexClassDef* dexGetClassDef(const DexFile* pDexFile, u4 idx) {
687f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(idx < pDexFile->pHeader->classDefsSize);
688f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return &pDexFile->pClassDefs[idx];
689f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
690f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
69199409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project/* given a ClassDef pointer, recover its index */
69299409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source ProjectDEX_INLINE u4 dexGetIndexForClassDef(const DexFile* pDexFile,
69399409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    const DexClassDef* pClassDef)
69499409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project{
69599409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    assert(pClassDef >= pDexFile->pClassDefs &&
69699409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project           pClassDef < pDexFile->pClassDefs + pDexFile->pHeader->classDefsSize);
69799409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project    return pClassDef - pDexFile->pClassDefs;
69899409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project}
69999409883d9c4c0ffb49b070ce307bb33a9dfe9f1The Android Open Source Project
700f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* get the interface list for a DexClass */
701f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexTypeList* dexGetInterfacesList(const DexFile* pDexFile,
702f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexClassDef* pClassDef)
703f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
704f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (pClassDef->interfacesOff == 0)
705f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return NULL;
706f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return (const DexTypeList*)
707f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        (pDexFile->baseAddr + pClassDef->interfacesOff);
708f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
709f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the Nth entry in a DexTypeList. */
710f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexTypeItem* dexGetTypeItem(const DexTypeList* pList,
711f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    u4 idx)
712f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
713f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(idx < pList->size);
714f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return &pList->list[idx];
715f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
716f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the type_idx for the Nth entry in a TypeList */
717f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE u4 dexTypeListGetIdx(const DexTypeList* pList, u4 idx) {
718f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexTypeItem* pItem = dexGetTypeItem(pList, idx);
719f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return pItem->typeIdx;
720f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
721f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
722f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* get the static values list for a DexClass */
723f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexEncodedArray* dexGetStaticValuesList(
724f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexFile* pDexFile, const DexClassDef* pClassDef)
725f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
726f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (pClassDef->staticValuesOff == 0)
727f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return NULL;
728f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return (const DexEncodedArray*)
729f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        (pDexFile->baseAddr + pClassDef->staticValuesOff);
730f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
731f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
732f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* get the annotations directory item for a DexClass */
733f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexAnnotationsDirectoryItem* dexGetAnnotationsDirectoryItem(
734f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexFile* pDexFile, const DexClassDef* pClassDef)
735f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
736f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (pClassDef->annotationsOff == 0)
737f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return NULL;
738f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return (const DexAnnotationsDirectoryItem*)
739f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        (pDexFile->baseAddr + pClassDef->annotationsOff);
740f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
741f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
742f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* get the source file string */
743f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const char* dexGetSourceFile(
744f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexFile* pDexFile, const DexClassDef* pClassDef)
745f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
746f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (pClassDef->sourceFileIdx == 0xffffffff)
747f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return NULL;
748f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return dexStringById(pDexFile, pClassDef->sourceFileIdx);
749f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
750f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
751b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden/* get the size, in bytes, of a DexCode */
752b51ea11c70602918c42764bfafe92a997d3b1803Andy McFaddensize_t dexGetDexCodeSize(const DexCode* pCode);
753b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden
754f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Get the list of "tries" for the given DexCode. */
755f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexTry* dexGetTries(const DexCode* pCode) {
756f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const u2* insnsEnd = &pCode->insns[pCode->insnsSize];
757f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
758f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // Round to four bytes.
759b210a9f9c7ae17e2028a86d9a4e9a3b35472862aSangWook Han    if ((((uintptr_t) insnsEnd) & 3) != 0) {
760f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        insnsEnd++;
761f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
762de75089fb7216d19e9c22cce4dc62a49513477d3Carl Shapiro
763f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return (const DexTry*) insnsEnd;
764f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
765f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
766f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Get the base of the encoded data for the given DexCode. */
767f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const u1* dexGetCatchHandlerData(const DexCode* pCode) {
768f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexTry* pTries = dexGetTries(pCode);
769f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return (const u1*) &pTries[pCode->triesSize];
770f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
771f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
772b51ea11c70602918c42764bfafe92a997d3b1803Andy McFadden/* get a pointer to the start of the debugging data */
773f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const u1* dexGetDebugInfoStream(const DexFile* pDexFile,
774f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexCode* pCode)
775f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
776f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (pCode->debugInfoOff == 0) {
777f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return NULL;
778f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    } else {
779f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return pDexFile->baseAddr + pCode->debugInfoOff;
780f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    }
781f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
782f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
783f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* DexClassDef convenience - get class descriptor */
784f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const char* dexGetClassDescriptor(const DexFile* pDexFile,
785f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexClassDef* pClassDef)
786f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
787f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return dexStringByTypeIdx(pDexFile, pClassDef->classIdx);
788f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
789f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
790f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* DexClassDef convenience - get superclass descriptor */
791f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const char* dexGetSuperClassDescriptor(const DexFile* pDexFile,
792f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexClassDef* pClassDef)
793f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
794f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (pClassDef->superclassIdx == 0)
795f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return NULL;
796f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return dexStringByTypeIdx(pDexFile, pClassDef->superclassIdx);
797f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
798f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
799f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* DexClassDef convenience - get class_data_item pointer */
800f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const u1* dexGetClassData(const DexFile* pDexFile,
801f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexClassDef* pClassDef)
802f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
803f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (pClassDef->classDataOff == 0)
804f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return NULL;
805f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return (const u1*) (pDexFile->baseAddr + pClassDef->classDataOff);
806f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
807f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
808f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* Get an annotation set at a particular offset. */
809f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexAnnotationSetItem* dexGetAnnotationSetItem(
810f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexFile* pDexFile, u4 offset)
811f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
8124f29f302c71d886db8ced57b6ede2d9cf41b30deElliott Hughes    if (offset == 0) {
8134f29f302c71d886db8ced57b6ede2d9cf41b30deElliott Hughes        return NULL;
8144f29f302c71d886db8ced57b6ede2d9cf41b30deElliott Hughes    }
815f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return (const DexAnnotationSetItem*) (pDexFile->baseAddr + offset);
816f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
817f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* get the class' annotation set */
818f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexAnnotationSetItem* dexGetClassAnnotationSet(
819f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexFile* pDexFile, const DexAnnotationsDirectoryItem* pAnnoDir)
820f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
821f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return dexGetAnnotationSetItem(pDexFile, pAnnoDir->classAnnotationsOff);
822f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
823f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
824f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* get the class' field annotation list */
825f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexFieldAnnotationsItem* dexGetFieldAnnotations(
826f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexFile* pDexFile, const DexAnnotationsDirectoryItem* pAnnoDir)
827f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
828f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (pAnnoDir->fieldsSize == 0)
829f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return NULL;
830f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
831f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    // Skip past the header to the start of the field annotations.
832f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return (const DexFieldAnnotationsItem*) &pAnnoDir[1];
833f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
834f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
835f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* get field annotation list size */
836f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE int dexGetFieldAnnotationsSize(const DexFile* pDexFile,
837f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexAnnotationsDirectoryItem* pAnnoDir)
838f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
839f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return pAnnoDir->fieldsSize;
840f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
841f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
842f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return a pointer to the field's annotation set */
843f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexAnnotationSetItem* dexGetFieldAnnotationSetItem(
844f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexFile* pDexFile, const DexFieldAnnotationsItem* pItem)
845f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
846f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return dexGetAnnotationSetItem(pDexFile, pItem->annotationsOff);
847f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
848f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
849f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* get the class' method annotation list */
850f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexMethodAnnotationsItem* dexGetMethodAnnotations(
851f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexFile* pDexFile, const DexAnnotationsDirectoryItem* pAnnoDir)
852f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
853f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (pAnnoDir->methodsSize == 0)
854f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return NULL;
855f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
856f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
857f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Skip past the header and field annotations to the start of the
858f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * method annotations.
859f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
860f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const u1* addr = (const u1*) &pAnnoDir[1];
861f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addr += pAnnoDir->fieldsSize * sizeof (DexFieldAnnotationsItem);
862f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return (const DexMethodAnnotationsItem*) addr;
863f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
864f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
865f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* get method annotation list size */
866f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE int dexGetMethodAnnotationsSize(const DexFile* pDexFile,
867f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexAnnotationsDirectoryItem* pAnnoDir)
868f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
869f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return pAnnoDir->methodsSize;
870f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
871f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
872f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return a pointer to the method's annotation set */
873f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexAnnotationSetItem* dexGetMethodAnnotationSetItem(
874f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexFile* pDexFile, const DexMethodAnnotationsItem* pItem)
875f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
876f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return dexGetAnnotationSetItem(pDexFile, pItem->annotationsOff);
877f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
878f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
879f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* get the class' parameter annotation list */
880f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexParameterAnnotationsItem* dexGetParameterAnnotations(
881f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexFile* pDexFile, const DexAnnotationsDirectoryItem* pAnnoDir)
882f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
883f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    if (pAnnoDir->parametersSize == 0)
884f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return NULL;
885f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
886f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    /*
887f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * Skip past the header, field annotations, and method annotations
888f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     * to the start of the parameter annotations.
889f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project     */
890f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const u1* addr = (const u1*) &pAnnoDir[1];
891f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addr += pAnnoDir->fieldsSize * sizeof (DexFieldAnnotationsItem);
892f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    addr += pAnnoDir->methodsSize * sizeof (DexMethodAnnotationsItem);
893f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return (const DexParameterAnnotationsItem*) addr;
894f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
895f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
896f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* get method annotation list size */
897f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE int dexGetParameterAnnotationsSize(const DexFile* pDexFile,
898f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexAnnotationsDirectoryItem* pAnnoDir)
899f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
900f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return pAnnoDir->parametersSize;
901f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
902f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
903f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the parameter annotation ref list */
904f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexAnnotationSetRefList* dexGetParameterAnnotationSetRefList(
905f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexFile* pDexFile, const DexParameterAnnotationsItem* pItem)
906f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
9074f29f302c71d886db8ced57b6ede2d9cf41b30deElliott Hughes    if (pItem->annotationsOff == 0) {
9084f29f302c71d886db8ced57b6ede2d9cf41b30deElliott Hughes        return NULL;
9094f29f302c71d886db8ced57b6ede2d9cf41b30deElliott Hughes    }
9104f29f302c71d886db8ced57b6ede2d9cf41b30deElliott Hughes    return (const DexAnnotationSetRefList*) (pDexFile->baseAddr + pItem->annotationsOff);
911f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
912f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
913f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* get method annotation list size */
914f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE int dexGetParameterAnnotationSetRefSize(const DexFile* pDexFile,
915f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexParameterAnnotationsItem* pItem)
916f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
9174f29f302c71d886db8ced57b6ede2d9cf41b30deElliott Hughes    if (pItem->annotationsOff == 0) {
918f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project        return 0;
9194f29f302c71d886db8ced57b6ede2d9cf41b30deElliott Hughes    }
920f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return dexGetParameterAnnotationSetRefList(pDexFile, pItem)->size;
921f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
922f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
923f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the Nth entry from an annotation set ref list */
924f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexAnnotationSetRefItem* dexGetParameterAnnotationSetRef(
925f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexAnnotationSetRefList* pList, u4 idx)
926f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
927f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(idx < pList->size);
928f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return &pList->list[idx];
929f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
930f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
931f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* given a DexAnnotationSetRefItem, return the DexAnnotationSetItem */
932f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexAnnotationSetItem* dexGetSetRefItemItem(
933f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexFile* pDexFile, const DexAnnotationSetRefItem* pItem)
934f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
935f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return dexGetAnnotationSetItem(pDexFile, pItem->annotationsOff);
936f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
937f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
938f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the Nth annotation offset from a DexAnnotationSetItem */
939f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE u4 dexGetAnnotationOff(
940f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexAnnotationSetItem* pAnnoSet, u4 idx)
941f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
942f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    assert(idx < pAnnoSet->size);
943f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    return pAnnoSet->entries[idx];
944f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
945f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
946f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project/* return the Nth annotation item from a DexAnnotationSetItem */
947f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source ProjectDEX_INLINE const DexAnnotationItem* dexGetAnnotationItem(
948f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project    const DexFile* pDexFile, const DexAnnotationSetItem* pAnnoSet, u4 idx)
949f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project{
9504f29f302c71d886db8ced57b6ede2d9cf41b30deElliott Hughes    u4 offset = dexGetAnnotationOff(pAnnoSet, idx);
9514f29f302c71d886db8ced57b6ede2d9cf41b30deElliott Hughes    if (offset == 0) {
9524f29f302c71d886db8ced57b6ede2d9cf41b30deElliott Hughes        return NULL;
9534f29f302c71d886db8ced57b6ede2d9cf41b30deElliott Hughes    }
9544f29f302c71d886db8ced57b6ede2d9cf41b30deElliott Hughes    return (const DexAnnotationItem*) (pDexFile->baseAddr + offset);
955f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project}
956f6c387128427e121477c1b32ad35cdcaa5101ba3The Android Open Source Project
957a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein/*
958a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein * Get the type descriptor character associated with a given primitive
959a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein * type. This returns '\0' if the type is invalid.
960a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein */
961a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornsteinchar dexGetPrimitiveTypeDescriptorChar(PrimitiveType type);
962a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein
963a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein/*
964a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein * Get the type descriptor string associated with a given primitive
965a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein * type.
966a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein */
967a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornsteinconst char* dexGetPrimitiveTypeDescriptor(PrimitiveType type);
968a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein
969a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein/*
970a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein * Get the boxed type descriptor string associated with a given
971a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein * primitive type. This returns NULL for an invalid type, including
9721553988115a2ecfce43eedebc488e0a8b8dea847Dan Bornstein * particularly for type "void". In the latter case, even though there
9731553988115a2ecfce43eedebc488e0a8b8dea847Dan Bornstein * is a class Void, there's no such thing as a boxed instance of it.
974a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein */
975a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornsteinconst char* dexGetBoxedTypeDescriptor(PrimitiveType type);
976a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein
977a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein/*
978a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein * Get the primitive type constant from the given descriptor character.
979a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein * This returns PRIM_NOT (note: this is a 0) if the character is invalid
980a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein * as a primitive type descriptor.
981a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein */
982a9c49df6714b3a37b7a7d0522932e622be2b35acDan BornsteinPrimitiveType dexGetPrimitiveTypeFromDescriptorChar(char descriptorChar);
983a9c49df6714b3a37b7a7d0522932e622be2b35acDan Bornstein
984375fb116bcb817b37509ab579dbd55cdbb765cbfCarl Shapiro#endif  // LIBDEX_DEXFILE_H_
985