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 preparation declarations. 19 */ 20 #ifndef _DALVIK_DEXPREPARE 21 #define _DALVIK_DEXPREPARE 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_OPT_ENABLED = 1, /* optimizations enabled? */ 37 DEXOPT_OPT_ALL = 1 << 1, /* optimize when verify fails? */ 38 DEXOPT_VERIFY_ENABLED = 1 << 2, /* verification enabled? */ 39 DEXOPT_VERIFY_ALL = 1 << 3, /* verify bootstrap classes? */ 40 DEXOPT_IS_BOOTSTRAP = 1 << 4, /* is dex in bootstrap class path? */ 41 DEXOPT_GEN_REGISTER_MAPS = 1 << 5, /* generate register maps during vfy */ 42 DEXOPT_UNIPROCESSOR = 1 << 6, /* specify uniprocessor target */ 43 DEXOPT_SMP = 1 << 7 /* specify SMP target */ 44 }; 45 46 /* 47 * An enumeration of problems that can turn up during verification. 48 */ 49 typedef enum VerifyError { 50 VERIFY_ERROR_NONE = 0, /* no error; must be zero */ 51 VERIFY_ERROR_GENERIC, /* VerifyError */ 52 53 VERIFY_ERROR_NO_CLASS, /* NoClassDefFoundError */ 54 VERIFY_ERROR_NO_FIELD, /* NoSuchFieldError */ 55 VERIFY_ERROR_NO_METHOD, /* NoSuchMethodError */ 56 VERIFY_ERROR_ACCESS_CLASS, /* IllegalAccessError */ 57 VERIFY_ERROR_ACCESS_FIELD, /* IllegalAccessError */ 58 VERIFY_ERROR_ACCESS_METHOD, /* IllegalAccessError */ 59 VERIFY_ERROR_CLASS_CHANGE, /* IncompatibleClassChangeError */ 60 VERIFY_ERROR_INSTANTIATION, /* InstantiationError */ 61 } VerifyError; 62 63 /* 64 * Identifies the type of reference in the instruction that generated the 65 * verify error (e.g. VERIFY_ERROR_ACCESS_CLASS could come from a method, 66 * field, or class reference). 67 * 68 * This must fit in two bits. 69 */ 70 typedef enum VerifyErrorRefType { 71 VERIFY_ERROR_REF_CLASS = 0, 72 VERIFY_ERROR_REF_FIELD = 1, 73 VERIFY_ERROR_REF_METHOD = 2, 74 } VerifyErrorRefType; 75 76 #define kVerifyErrorRefTypeShift 6 77 78 #define VERIFY_OK(_failure) ((_failure) == VERIFY_ERROR_NONE) 79 80 /* 81 * Given the full path to a DEX or Jar file, and (if appropriate) the name 82 * within the Jar, open the optimized version from the cache. 83 * 84 * If "*pNewFile" is set, a new file has been created with only a stub 85 * "opt" header, and the caller is expected to fill in the blanks. 86 * 87 * Returns the file descriptor, locked and seeked past the "opt" header. 88 */ 89 int dvmOpenCachedDexFile(const char* fileName, const char* cachedFile, 90 u4 modWhen, u4 crc, bool isBootstrap, bool* pNewFile, bool createIfMissing); 91 92 /* 93 * Unlock the specified file descriptor. Use in conjunction with 94 * dvmOpenCachedDexFile(). 95 * 96 * Returns true on success. 97 */ 98 bool dvmUnlockCachedDexFile(int fd); 99 100 /* 101 * Verify the contents of the "opt" header, and check the DEX file's 102 * dependencies on its source zip (if available). 103 */ 104 bool dvmCheckOptHeaderAndDependencies(int fd, bool sourceAvail, u4 modWhen, 105 u4 crc, bool expectVerify, bool expectOpt); 106 107 /* 108 * Optimize a DEX file. The file must start with the "opt" header, followed 109 * by the plain DEX data. It must be mmap()able. 110 * 111 * "fileName" is only used for debug output. 112 */ 113 bool dvmOptimizeDexFile(int fd, off_t dexOffset, long dexLen, 114 const char* fileName, u4 modWhen, u4 crc, bool isBootstrap); 115 116 /* 117 * Continue the optimization process on the other side of a fork/exec. 118 */ 119 bool dvmContinueOptimization(int fd, off_t dexOffset, long dexLength, 120 const char* fileName, u4 modWhen, u4 crc, bool isBootstrap); 121 122 #endif /*_DALVIK_DEXPREPARE*/ 123