2 * Copyright (C) 2008 The Android Open Source Project
4 * Licensed under the Apache License, Version 2.0 (the "License");
5 * you may not use this file except in compliance with the License.
6 * You may obtain a copy of the License at
8 * http://www.apache.org/licenses/LICENSE-2.0
10 * Unless required by applicable law or agreed to in writing, software
11 * distributed under the License is distributed on an "AS IS" BASIS,
12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13 * See the License for the specific language governing permissions and
14 * limitations under the License.
18 * DEX optimization declarations.
20 #ifndef _DALVIK_DEXOPTIMIZE
21 #define _DALVIK_DEXOPTIMIZE
24 * Global DEX optimizer control. Determines the circumstances in which we
25 * try to rewrite instructions in the DEX file.
27 typedef enum DexOptimizerMode {
28 OPTIMIZE_MODE_UNKNOWN = 0,
29 OPTIMIZE_MODE_NONE, /* never optimize */
30 OPTIMIZE_MODE_VERIFIED, /* only optimize verified classes (default) */
31 OPTIMIZE_MODE_ALL /* optimize all classes */
34 /* some additional bit flags for dexopt */
36 DEXOPT_GEN_REGISTER_MAPS = 1, /* generate register maps during verify */
40 * An enumeration of problems that can turn up during verification.
42 typedef enum VerifyError {
43 VERIFY_ERROR_NONE = 0, /* no error; must be zero */
44 VERIFY_ERROR_GENERIC, /* VerifyError */
46 VERIFY_ERROR_NO_CLASS, /* NoClassDefFoundError */
47 VERIFY_ERROR_NO_FIELD, /* NoSuchFieldError */
48 VERIFY_ERROR_NO_METHOD, /* NoSuchMethodError */
49 VERIFY_ERROR_ACCESS_CLASS, /* IllegalAccessError */
50 VERIFY_ERROR_ACCESS_FIELD, /* IllegalAccessError */
51 VERIFY_ERROR_ACCESS_METHOD, /* IllegalAccessError */
52 VERIFY_ERROR_CLASS_CHANGE, /* IncompatibleClassChangeError */
53 VERIFY_ERROR_INSTANTIATION, /* InstantiationError */
57 * Identifies the type of reference in the instruction that generated the
58 * verify error (e.g. VERIFY_ERROR_ACCESS_CLASS could come from a method,
59 * field, or class reference).
61 * This must fit in two bits.
63 typedef enum VerifyErrorRefType {
64 VERIFY_ERROR_REF_CLASS = 0,
65 VERIFY_ERROR_REF_FIELD = 1,
66 VERIFY_ERROR_REF_METHOD = 2,
69 #define kVerifyErrorRefTypeShift 6
71 #define VERIFY_OK(_failure) ((_failure) == VERIFY_ERROR_NONE)
74 * Given the full path to a DEX or Jar file, and (if appropriate) the name
75 * within the Jar, open the optimized version from the cache.
77 * If "*pNewFile" is set, a new file has been created with only a stub
78 * "opt" header, and the caller is expected to fill in the blanks.
80 * Returns the file descriptor, locked and seeked past the "opt" header.
82 int dvmOpenCachedDexFile(const char* fileName, const char* cachedFile,
83 u4 modWhen, u4 crc, bool isBootstrap, bool* pNewFile, bool createIfMissing);
86 * Unlock the specified file descriptor. Use in conjunction with
87 * dvmOpenCachedDexFile().
89 * Returns true on success.
91 bool dvmUnlockCachedDexFile(int fd);
94 * Verify the contents of the "opt" header, and check the DEX file's
95 * dependencies on its source zip (if available).
97 bool dvmCheckOptHeaderAndDependencies(int fd, bool sourceAvail, u4 modWhen,
98 u4 crc, bool expectVerify, bool expectOpt);
101 * Optimize a DEX file. The file must start with the "opt" header, followed
102 * by the plain DEX data. It must be mmap()able.
104 * "fileName" is only used for debug output.
106 bool dvmOptimizeDexFile(int fd, off_t dexOffset, long dexLen,
107 const char* fileName, u4 modWhen, u4 crc, bool isBootstrap);
110 * Continue the optimization process on the other side of a fork/exec.
112 bool dvmContinueOptimization(int fd, off_t dexOffset, long dexLength,
113 const char* fileName, u4 modWhen, u4 crc, bool isBootstrap);
116 * Abbreviated resolution functions, for use by optimization and verification
119 ClassObject* dvmOptResolveClass(ClassObject* referrer, u4 classIdx,
120 VerifyError* pFailure);
121 Method* dvmOptResolveMethod(ClassObject* referrer, u4 methodIdx,
122 MethodType methodType, VerifyError* pFailure);
123 Method* dvmOptResolveInterfaceMethod(ClassObject* referrer, u4 methodIdx);
124 InstField* dvmOptResolveInstField(ClassObject* referrer, u4 ifieldIdx,
125 VerifyError* pFailure);
126 StaticField* dvmOptResolveStaticField(ClassObject* referrer, u4 sfieldIdx,
127 VerifyError* pFailure);
129 #endif /*_DALVIK_DEXOPTIMIZE*/