/* * Copyright (C) 2008 The Android Open Source Project * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ /* * DEX preparation declarations. */ #ifndef DALVIK_DEXPREPARE_H_ #define DALVIK_DEXPREPARE_H_ /* * Global DEX optimizer control. Determines the circumstances in which we * try to rewrite instructions in the DEX file. * * Optimizing is performed ahead-of-time by dexopt and, in some cases, at * load time by the VM. */ enum DexOptimizerMode { OPTIMIZE_MODE_UNKNOWN = 0, OPTIMIZE_MODE_NONE, /* never optimize (except "essential") */ OPTIMIZE_MODE_VERIFIED, /* only optimize verified classes (default) */ OPTIMIZE_MODE_ALL, /* optimize verified & unverified (risky) */ OPTIMIZE_MODE_FULL /* fully opt verified classes at load time */ }; /* some additional bit flags for dexopt */ enum DexoptFlags { DEXOPT_OPT_ENABLED = 1, /* optimizations enabled? */ DEXOPT_OPT_ALL = 1 << 1, /* optimize when verify fails? */ DEXOPT_VERIFY_ENABLED = 1 << 2, /* verification enabled? */ DEXOPT_VERIFY_ALL = 1 << 3, /* verify bootstrap classes? */ DEXOPT_IS_BOOTSTRAP = 1 << 4, /* is dex in bootstrap class path? */ DEXOPT_GEN_REGISTER_MAPS = 1 << 5, /* generate register maps during vfy */ DEXOPT_UNIPROCESSOR = 1 << 6, /* specify uniprocessor target */ DEXOPT_SMP = 1 << 7 /* specify SMP target */ }; /* * An enumeration of problems that can turn up during verification. */ enum VerifyError { VERIFY_ERROR_NONE = 0, /* no error; must be zero */ VERIFY_ERROR_GENERIC, /* VerifyError */ VERIFY_ERROR_NO_CLASS, /* NoClassDefFoundError */ VERIFY_ERROR_NO_FIELD, /* NoSuchFieldError */ VERIFY_ERROR_NO_METHOD, /* NoSuchMethodError */ VERIFY_ERROR_ACCESS_CLASS, /* IllegalAccessError */ VERIFY_ERROR_ACCESS_FIELD, /* IllegalAccessError */ VERIFY_ERROR_ACCESS_METHOD, /* IllegalAccessError */ VERIFY_ERROR_CLASS_CHANGE, /* IncompatibleClassChangeError */ VERIFY_ERROR_INSTANTIATION, /* InstantiationError */ }; /* * Identifies the type of reference in the instruction that generated the * verify error (e.g. VERIFY_ERROR_ACCESS_CLASS could come from a method, * field, or class reference). * * This must fit in two bits. */ enum VerifyErrorRefType { VERIFY_ERROR_REF_CLASS = 0, VERIFY_ERROR_REF_FIELD = 1, VERIFY_ERROR_REF_METHOD = 2, }; #define kVerifyErrorRefTypeShift 6 #define VERIFY_OK(_failure) ((_failure) == VERIFY_ERROR_NONE) /* * Given the full path to a DEX or Jar file, and (if appropriate) the name * within the Jar, open the optimized version from the cache. * * If "*pNewFile" is set, a new file has been created with only a stub * "opt" header, and the caller is expected to fill in the blanks. * * Returns the file descriptor, locked and seeked past the "opt" header. */ int dvmOpenCachedDexFile(const char* fileName, const char* cachedFile, u4 modWhen, u4 crc, bool isBootstrap, bool* pNewFile, bool createIfMissing); /* * Unlock the specified file descriptor. Use in conjunction with * dvmOpenCachedDexFile(). * * Returns true on success. */ bool dvmUnlockCachedDexFile(int fd); /* * Verify the contents of the "opt" header, and check the DEX file's * dependencies on its source zip (if available). */ bool dvmCheckOptHeaderAndDependencies(int fd, bool sourceAvail, u4 modWhen, u4 crc, bool expectVerify, bool expectOpt); /* * Optimize a DEX file. The file must start with the "opt" header, followed * by the plain DEX data. It must be mmap()able. * * "fileName" is only used for debug output. */ bool dvmOptimizeDexFile(int fd, off_t dexOffset, long dexLen, const char* fileName, u4 modWhen, u4 crc, bool isBootstrap); /* * Continue the optimization process on the other side of a fork/exec. */ bool dvmContinueOptimization(int fd, off_t dexOffset, long dexLength, const char* fileName, u4 modWhen, u4 crc, bool isBootstrap); /* * Prepare DEX data that is only available to the VM as in-memory data. */ bool dvmPrepareDexInMemory(u1* addr, size_t len, DvmDex** ppDvmDex); /* * Prep data structures. */ bool dvmCreateInlineSubsTable(void); void dvmFreeInlineSubsTable(void); #endif // DALVIK_DEXPREPARE_H_