summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAndy McFadden <fadden@android.com>2010-09-30 14:02:54 -0700
committerAndy McFadden <fadden@android.com>2010-09-30 15:15:32 -0700
commitd8b5f50d0c6c9a0ce157e89df4ee1e8eb8b334c3 (patch)
tree6eeec1d0e2739d802fc5f3b8455bb403a240f57e
parentf45b6cbed6ce7cb6a38746b5abe0213263106a71 (diff)
downloadandroid_dalvik-d8b5f50d0c6c9a0ce157e89df4ee1e8eb8b334c3.tar.gz
android_dalvik-d8b5f50d0c6c9a0ce157e89df4ee1e8eb8b334c3.tar.bz2
android_dalvik-d8b5f50d0c6c9a0ce157e89df4ee1e8eb8b334c3.zip
Correct dexopt for uniprocessors.
The SMP flag was defaulting to "true" for dexopt, even on uniprocessors. With this change the VM now has three choices: dexopt for SMP, dexopt for uniprocessor, or dexopt for current system. The last is used for just-in-time dexopt (used by -eng and -userdebug builds on bootstrap DEX files) and installd dexopt (used for apps on all builds). The dexopt used by the build system during -user builds will either be explicitly SMP or explicitly uniprocessor, since "current system" has no meaning when you're cross-dexopting. Also, unified the dexopt control flags into a single enum. (cherry-pick from dalvik-dev) Change-Id: Id1d9c548ca8567585a28ef9ee911cc2ac6b116dd
-rw-r--r--dexopt/OptMain.c23
-rw-r--r--libdex/OptInvocation.h14
-rw-r--r--vm/Init.c9
-rw-r--r--vm/analysis/DexPrepare.c2
-rw-r--r--vm/analysis/DexPrepare.h10
5 files changed, 32 insertions, 26 deletions
diff --git a/dexopt/OptMain.c b/dexopt/OptMain.c
index fbb794790..b8e58893f 100644
--- a/dexopt/OptMain.c
+++ b/dexopt/OptMain.c
@@ -160,9 +160,13 @@ static int extractAndProcessZip(int zipFd, int cacheFd,
dexoptFlags |= DEXOPT_GEN_REGISTER_MAPS;
}
- opc = strstr(dexoptFlagStr, "u=y"); /* uniprocessor target */
+ opc = strstr(dexoptFlagStr, "u="); /* uniprocessor target */
if (opc != NULL) {
- dexoptFlags |= DEXOPT_UNIPROCESSOR;
+ switch (*(opc+2)) {
+ case 'y': dexoptFlags |= DEXOPT_UNIPROCESSOR; break;
+ case 'n': dexoptFlags |= DEXOPT_SMP; break;
+ default: break;
+ }
}
}
@@ -350,6 +354,13 @@ static int preopt(int argc, char* const argv[])
const char* outName = argv[3];
const char* dexoptFlags = argv[4];
+ if (strstr(dexoptFlags, "u=y") == NULL &&
+ strstr(dexoptFlags, "u=n") == NULL)
+ {
+ fprintf(stderr, "Either 'u=y' or 'u=n' must be specified\n");
+ goto bail;
+ }
+
zipFd = open(zipName, O_RDONLY);
if (zipFd < 0) {
perror(argv[0]);
@@ -483,7 +494,6 @@ static int fromDex(int argc, char* const argv[])
bool onlyOptVerifiedDex = false;
DexClassVerifyMode verifyMode;
DexOptimizerMode dexOptMode;
- int dexoptFlags = 0;
/* ugh -- upgrade these to a bit field if they get any more complex */
if ((flags & DEXOPT_VERIFY_ENABLED) != 0) {
@@ -502,13 +512,8 @@ static int fromDex(int argc, char* const argv[])
} else {
dexOptMode = OPTIMIZE_MODE_NONE;
}
- if ((flags & DEXOPT_GEN_REGISTER_MAP) != 0) {
- dexoptFlags |= DEXOPT_GEN_REGISTER_MAPS;
- }
- if (dvmPrepForDexOpt(bootClassPath, dexOptMode, verifyMode,
- dexoptFlags) != 0)
- {
+ if (dvmPrepForDexOpt(bootClassPath, dexOptMode, verifyMode, flags) != 0) {
LOGE("VM init failed\n");
goto bail;
}
diff --git a/libdex/OptInvocation.h b/libdex/OptInvocation.h
index d9708caed..0352eb423 100644
--- a/libdex/OptInvocation.h
+++ b/libdex/OptInvocation.h
@@ -13,20 +13,17 @@
* See the License for the specific language governing permissions and
* limitations under the License.
*/
+
/*
* Utility functions related to "dexopt".
*/
#ifndef _LIBDEX_OPTINVOCATION
#define _LIBDEX_OPTINVOCATION
-#include <stdint.h>
-#include <unistd.h>
-
#ifdef __cplusplus
extern "C" {
#endif
-
/*
* Utility routines, used by the VM.
*/
@@ -34,15 +31,6 @@ char* dexOptGenerateCacheFileName(const char* fileName,
const char* subFileName);
int dexOptCreateEmptyHeader(int fd);
-/* some flags that get passed through to "dexopt" command */
-#define DEXOPT_OPT_ENABLED (1)
-#define DEXOPT_OPT_ALL (1 << 1)
-#define DEXOPT_VERIFY_ENABLED (1 << 2)
-#define DEXOPT_VERIFY_ALL (1 << 3)
-#define DEXOPT_IS_BOOTSTRAP (1 << 4)
-#define DEXOPT_GEN_REGISTER_MAP (1 << 5)
-
-
#ifdef __cplusplus
};
#endif
diff --git a/vm/Init.c b/vm/Init.c
index 7fbce3204..4a2cbed0f 100644
--- a/vm/Init.c
+++ b/vm/Init.c
@@ -1528,7 +1528,14 @@ int dvmPrepForDexOpt(const char* bootClassPath, DexOptimizerMode dexOptMode,
gDvm.dexOptMode = dexOptMode;
gDvm.classVerifyMode = verifyMode;
gDvm.generateRegisterMaps = (dexoptFlags & DEXOPT_GEN_REGISTER_MAPS) != 0;
- gDvm.dexOptForSmp = (dexoptFlags & DEXOPT_UNIPROCESSOR) == 0;
+ if (dexoptFlags & DEXOPT_SMP) {
+ assert((dexoptFlags & DEXOPT_UNIPROCESSOR) == 0);
+ gDvm.dexOptForSmp = true;
+ } else if (dexoptFlags & DEXOPT_UNIPROCESSOR) {
+ gDvm.dexOptForSmp = false;
+ } else {
+ gDvm.dexOptForSmp = (ANDROID_SMP != 0);
+ }
/*
* Initialize the heap, some basic thread control mutexes, and
diff --git a/vm/analysis/DexPrepare.c b/vm/analysis/DexPrepare.c
index 747672d21..c00810c94 100644
--- a/vm/analysis/DexPrepare.c
+++ b/vm/analysis/DexPrepare.c
@@ -398,7 +398,7 @@ bool dvmOptimizeDexFile(int fd, off_t dexOffset, long dexLength,
if (isBootstrap)
flags |= DEXOPT_IS_BOOTSTRAP;
if (gDvm.generateRegisterMaps)
- flags |= DEXOPT_GEN_REGISTER_MAP;
+ flags |= DEXOPT_GEN_REGISTER_MAPS;
sprintf(values[9], "%d", flags);
argv[curArg++] = values[9];
diff --git a/vm/analysis/DexPrepare.h b/vm/analysis/DexPrepare.h
index c014055fe..bfa5fb5c1 100644
--- a/vm/analysis/DexPrepare.h
+++ b/vm/analysis/DexPrepare.h
@@ -33,8 +33,14 @@ typedef enum DexOptimizerMode {
/* some additional bit flags for dexopt */
enum DexoptFlags {
- DEXOPT_GEN_REGISTER_MAPS = 1, /* generate register maps during verify */
- DEXOPT_UNIPROCESSOR = 1 << 1, /* assume a uniprocessor target */
+ 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 */
};
/*