1 /* 2 * Copyright (C) 2008 The Android Open Source Project 3 * 4 * Licensed under the Apache License, Version 2.0 (the "License"); 5 * you may not use this file except in compliance with the License. 6 * You may obtain a copy of the License at 7 * 8 * http://www.apache.org/licenses/LICENSE-2.0 9 * 10 * Unless required by applicable law or agreed to in writing, software 11 * distributed under the License is distributed on an "AS IS" BASIS, 12 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 13 * See the License for the specific language governing permissions and 14 * limitations under the License. 15 */ 16 17 /* 18 * DEX optimization declarations. 19 */ 20 #ifndef _DALVIK_DEXOPTIMIZE 21 #define _DALVIK_DEXOPTIMIZE 22 23 /* 24 * Global DEX optimizer control. Determines the circumstances in which we 25 * try to rewrite instructions in the DEX file. 26 */ 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 */ 32 } DexOptimizerMode; 33 34 /* some additional bit flags for dexopt */ 35 enum DexoptFlags { 36 DEXOPT_GEN_REGISTER_MAPS = 1, /* generate register maps during verify */ 37 }; 38 39 /* 40 * An enumeration of problems that can turn up during verification. 41 */ 42 typedef enum VerifyError { 43 VERIFY_ERROR_NONE = 0, /* no error; must be zero */ 44 VERIFY_ERROR_GENERIC, /* VerifyError */ 45 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 */ 54 } VerifyError; 55 56 /* 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). 60 * 61 * This must fit in two bits. 62 */ 63 typedef enum VerifyErrorRefType { 64 VERIFY_ERROR_REF_CLASS = 0, 65 VERIFY_ERROR_REF_FIELD = 1, 66 VERIFY_ERROR_REF_METHOD = 2, 67 } VerifyErrorRefType; 68 69 #define kVerifyErrorRefTypeShift 6 70 71 #define VERIFY_OK(_failure) ((_failure) == VERIFY_ERROR_NONE) 72 73 /* 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. 76 * 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. 79 * 80 * Returns the file descriptor, locked and seeked past the "opt" header. 81 */ 82 int dvmOpenCachedDexFile(const char* fileName, const char* cachedFile, 83 u4 modWhen, u4 crc, bool isBootstrap, bool* pNewFile, bool createIfMissing); 84 85 /* 86 * Unlock the specified file descriptor. Use in conjunction with 87 * dvmOpenCachedDexFile(). 88 * 89 * Returns true on success. 90 */ 91 bool dvmUnlockCachedDexFile(int fd); 92 93 /* 94 * Verify the contents of the "opt" header, and check the DEX file's 95 * dependencies on its source zip (if available). 96 */ 97 bool dvmCheckOptHeaderAndDependencies(int fd, bool sourceAvail, u4 modWhen, 98 u4 crc, bool expectVerify, bool expectOpt); 99 100 /* 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. 103 * 104 * "fileName" is only used for debug output. 105 */ 106 bool dvmOptimizeDexFile(int fd, off_t dexOffset, long dexLen, 107 const char* fileName, u4 modWhen, u4 crc, bool isBootstrap); 108 109 /* 110 * Continue the optimization process on the other side of a fork/exec. 111 */ 112 bool dvmContinueOptimization(int fd, off_t dexOffset, long dexLength, 113 const char* fileName, u4 modWhen, u4 crc, bool isBootstrap); 114 115 /* 116 * Abbreviated resolution functions, for use by optimization and verification 117 * code. 118 */ 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); 128 129 #endif /*_DALVIK_DEXOPTIMIZE*/ 130