summaryrefslogtreecommitdiffstats
path: root/vm/compiler/codegen/arm/CodegenDriver.cpp
diff options
context:
space:
mode:
authorElliott Hughes <enh@google.com>2012-07-17 16:31:30 -0700
committerElliott Hughes <enh@google.com>2012-07-17 18:01:36 -0700
commit100dbe0d8d5b419bc3727e5b8a07e995351fe129 (patch)
treeeea52a6bad73b0df43bf44ba16a510957542aa8d /vm/compiler/codegen/arm/CodegenDriver.cpp
parent319206f324bd937bc1d661dec2082413e41cf8e5 (diff)
downloadandroid_dalvik-100dbe0d8d5b419bc3727e5b8a07e995351fe129.tar.gz
android_dalvik-100dbe0d8d5b419bc3727e5b8a07e995351fe129.tar.bz2
android_dalvik-100dbe0d8d5b419bc3727e5b8a07e995351fe129.zip
Avoid sign extension in packed-switch.
This code (at least in the ARM version) is trying to assign to r0 and r1 from C by returning a 64-bit result. The mistaken use of signed integers for pointers can lead to sign extension if the JIT code cache is at a sufficiently high address. Bug: 6799823 Bug: 6703991 (cherry-pick from 2d0c1c2dbe44458ebb199c47ce1047f266db5349.) Change-Id: I79e72228b60e195272d11899ac69bb4a76b7402f
Diffstat (limited to 'vm/compiler/codegen/arm/CodegenDriver.cpp')
-rw-r--r--vm/compiler/codegen/arm/CodegenDriver.cpp14
1 files changed, 7 insertions, 7 deletions
diff --git a/vm/compiler/codegen/arm/CodegenDriver.cpp b/vm/compiler/codegen/arm/CodegenDriver.cpp
index d96aa6561..78809dc74 100644
--- a/vm/compiler/codegen/arm/CodegenDriver.cpp
+++ b/vm/compiler/codegen/arm/CodegenDriver.cpp
@@ -2789,16 +2789,16 @@ static bool handleFmt23x(CompilationUnit *cUnit, MIR *mir)
* chaining cell for case default [8 bytes]
* noChain exit
*/
-static s8 findPackedSwitchIndex(const u2* switchData, int testVal, int pc)
+static u8 findPackedSwitchIndex(const u2* switchData, int testVal, uintptr_t pc)
{
int size;
int firstKey;
const int *entries;
int index;
int jumpIndex;
- int caseDPCOffset = 0;
+ uintptr_t caseDPCOffset = 0;
/* In Thumb mode pc is 4 ahead of the "mov r2, pc" instruction */
- int chainingPC = (pc + 4) & ~3;
+ uintptr_t chainingPC = (pc + 4) & ~3;
/*
* Packed switch data format:
@@ -2837,16 +2837,16 @@ static s8 findPackedSwitchIndex(const u2* switchData, int testVal, int pc)
}
chainingPC += jumpIndex * CHAIN_CELL_NORMAL_SIZE;
- return (((s8) caseDPCOffset) << 32) | (u8) chainingPC;
+ return (((u8) caseDPCOffset) << 32) | (u8) chainingPC;
}
/* See comments for findPackedSwitchIndex */
-static s8 findSparseSwitchIndex(const u2* switchData, int testVal, int pc)
+static u8 findSparseSwitchIndex(const u2* switchData, int testVal, uintptr_t pc)
{
int size;
const int *keys;
const int *entries;
- int chainingPC = (pc + 4) & ~3;
+ uintptr_t chainingPC = (pc + 4) & ~3;
int i;
/*
@@ -2888,7 +2888,7 @@ static s8 findSparseSwitchIndex(const u2* switchData, int testVal, int pc)
int jumpIndex = (i < MAX_CHAINED_SWITCH_CASES) ?
i : MAX_CHAINED_SWITCH_CASES + 1;
chainingPC += jumpIndex * CHAIN_CELL_NORMAL_SIZE;
- return (((s8) entries[i]) << 32) | (u8) chainingPC;
+ return (((u8) entries[i]) << 32) | (u8) chainingPC;
} else if (k > testVal) {
break;
}