blob: 8ae2af5d8bbcee92f719fbcdd8dec11a71941c43 [file] [log] [blame]
The Android Open Source Projectf6c38712009-03-03 19:28:47 -08001/*
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 */
The Android Open Source Project99409882009-03-18 22:20:24 -070016
The Android Open Source Projectf6c38712009-03-03 19:28:47 -080017/*
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 */
27typedef 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 */
35enum DexoptFlags {
36 DEXOPT_GEN_REGISTER_MAPS = 1, /* generate register maps during verify */
37};
38
39/*
Andy McFadden62a75162009-04-17 17:23:37 -070040 * An enumeration of problems that can turn up during verification.
41 */
42typedef enum VerifyError {
43 VERIFY_ERROR_NONE = 0, /* no error; must be zero */
Andy McFadden3a1aedb2009-05-07 13:30:23 -070044 VERIFY_ERROR_GENERIC, /* VerifyError */
Andy McFadden62a75162009-04-17 17:23:37 -070045
Andy McFaddenb51ea112009-05-08 16:50:17 -070046 VERIFY_ERROR_NO_CLASS, /* NoClassDefFoundError (ref=class) */
47 VERIFY_ERROR_NO_FIELD, /* NoSuchFieldError (ref=field) */
48 VERIFY_ERROR_NO_METHOD, /* NoSuchMethodError (ref=method) */
49 VERIFY_ERROR_ACCESS_CLASS, /* IllegalAccessError (ref=class) */
50 VERIFY_ERROR_ACCESS_FIELD, /* IllegalAccessError (ref=field) */
51 VERIFY_ERROR_ACCESS_METHOD, /* IllegalAccessError (ref=method) */
52 VERIFY_ERROR_CLASS_CHANGE, /* IncompatibleClassChangeError (ref=class) */
53 VERIFY_ERROR_INSTANTIATION, /* InstantiationError (ref=class) */
Andy McFadden62a75162009-04-17 17:23:37 -070054} VerifyError;
55
56#define VERIFY_OK(_failure) ((_failure) == VERIFY_ERROR_NONE)
57
58/*
The Android Open Source Projectf6c38712009-03-03 19:28:47 -080059 * Given the full path to a DEX or Jar file, and (if appropriate) the name
60 * within the Jar, open the optimized version from the cache.
61 *
62 * If "*pNewFile" is set, a new file has been created with only a stub
63 * "opt" header, and the caller is expected to fill in the blanks.
64 *
65 * Returns the file descriptor, locked and seeked past the "opt" header.
66 */
67int dvmOpenCachedDexFile(const char* fileName, const char* cachedFile,
68 u4 modWhen, u4 crc, bool isBootstrap, bool* pNewFile, bool createIfMissing);
69
70/*
71 * Unlock the specified file descriptor. Use in conjunction with
72 * dvmOpenCachedDexFile().
73 *
74 * Returns true on success.
75 */
76bool dvmUnlockCachedDexFile(int fd);
77
78/*
79 * Verify the contents of the "opt" header, and check the DEX file's
80 * dependencies on its source zip (if available).
81 */
82bool dvmCheckOptHeaderAndDependencies(int fd, bool sourceAvail, u4 modWhen,
83 u4 crc, bool expectVerify, bool expectOpt);
84
85/*
86 * Optimize a DEX file. The file must start with the "opt" header, followed
87 * by the plain DEX data. It must be mmap()able.
88 *
89 * "fileName" is only used for debug output.
90 */
91bool dvmOptimizeDexFile(int fd, off_t dexOffset, long dexLen,
92 const char* fileName, u4 modWhen, u4 crc, bool isBootstrap);
93
94/*
95 * Continue the optimization process on the other side of a fork/exec.
96 */
97bool dvmContinueOptimization(int fd, off_t dexOffset, long dexLength,
98 const char* fileName, u4 modWhen, u4 crc, bool isBootstrap);
99
100/*
101 * Abbreviated resolution functions, for use by optimization and verification
102 * code.
103 */
Andy McFadden62a75162009-04-17 17:23:37 -0700104ClassObject* dvmOptResolveClass(ClassObject* referrer, u4 classIdx,
105 VerifyError* pFailure);
The Android Open Source Projectf6c38712009-03-03 19:28:47 -0800106Method* dvmOptResolveMethod(ClassObject* referrer, u4 methodIdx,
Andy McFadden62a75162009-04-17 17:23:37 -0700107 MethodType methodType, VerifyError* pFailure);
The Android Open Source Projectf6c38712009-03-03 19:28:47 -0800108Method* dvmOptResolveInterfaceMethod(ClassObject* referrer, u4 methodIdx);
Andy McFadden62a75162009-04-17 17:23:37 -0700109InstField* dvmOptResolveInstField(ClassObject* referrer, u4 ifieldIdx,
110 VerifyError* pFailure);
111StaticField* dvmOptResolveStaticField(ClassObject* referrer, u4 sfieldIdx,
112 VerifyError* pFailure);
The Android Open Source Projectf6c38712009-03-03 19:28:47 -0800113
114#endif /*_DALVIK_DEXOPTIMIZE*/