Home | History | Annotate | Download | only in analysis
      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