Merge "Make valgrind happier and stop us leaking so much we can can't run the tests on a device." into dalvik-dev
diff --git a/src/compiler/codegen/RallocUtil.cc b/src/compiler/codegen/RallocUtil.cc
index 3b222f6..492c79a 100644
--- a/src/compiler/codegen/RallocUtil.cc
+++ b/src/compiler/codegen/RallocUtil.cc
@@ -717,7 +717,8 @@
 {
     int i;
     for (i=0; i< cUnit->regPool->numCoreRegs; i++) {
-        oatLockTemp(cUnit, cUnit->regPool->coreRegs[i].reg);
+        if (cUnit->regPool->coreRegs[i].isTemp)
+            oatLockTemp(cUnit, cUnit->regPool->coreRegs[i].reg);
     }
 }
 
diff --git a/src/compiler/codegen/arm/MethodCodegenDriver.cc b/src/compiler/codegen/arm/MethodCodegenDriver.cc
index 673aaba..49529e1 100644
--- a/src/compiler/codegen/arm/MethodCodegenDriver.cc
+++ b/src/compiler/codegen/arm/MethodCodegenDriver.cc
@@ -331,6 +331,45 @@
     return state + 1;
 }
 
+// Slow path static & direct invoke launch sequence
+static int nextSDCallInsnSP(CompilationUnit* cUnit, MIR* mir,
+                            DecodedInstruction* dInsn, int state)
+{
+    switch(state) {
+        case 0:  // Get the current Method* [sets r0]
+            loadBaseDisp(cUnit, mir, rSP, 0, r0, kWord, INVALID_SREG);
+            break;
+        case 1:  // Get the current Method->DeclaringClass() [sets r0]
+            loadBaseDisp(cUnit, mir, r0,
+                         OFFSETOF_MEMBER(art::Method, declaring_class_),
+                         r0, kWord, INVALID_SREG);
+            break;
+        case 2:  // Method->DeclaringClass()->GetDexCache() [sets r0]
+            loadBaseDisp(cUnit, mir, r0,
+                         OFFSETOF_MEMBER(art::Class, dex_cache_), r0, kWord,
+                         INVALID_SREG);
+            break;
+        case 3:  // Method->DeclaringClass()->GetDexCache()->methodsObjectArr
+            loadBaseDisp(cUnit, mir, r0, art::DexCache::MethodsOffset(),
+                         r0, kWord, INVALID_SREG);
+            break;
+        case 4: // Skip past the object header
+            opRegImm(cUnit, kOpAdd, r0, art::Array::DataOffset().Int32Value());
+            break;
+        case 5: // Get the target Method* [uses r0, sets r0]
+            loadBaseDisp(cUnit, mir, r0, dInsn->vB * 4, r0,
+                         kWord, INVALID_SREG);
+            break;
+        case 6: // Get the target compiled code address [uses r0, sets rLR]
+            loadBaseDisp(cUnit, mir, r0, art::Method::GetCodeOffset(), rLR,
+                         kWord, INVALID_SREG);
+            break;
+        default:
+            return -1;
+    }
+    return state + 1;
+}
+
 /*
  * Bit of a hack here - in leiu of a real scheduling pass,
  * emit the next instruction in a virtual invoke sequence.
@@ -662,16 +701,26 @@
 {
     DecodedInstruction* dInsn = &mir->dalvikInsn;
     int callState = 0;
+    /*
+     * TODO: check for/force resolution of target method
+     * note to bdc: you can find the method index in
+     * dInsn->vB.  If you need it, the calling method's
+     * Method* is cUnit->method.
+     */
+    int fastPath = false;  // TODO: set based on resolution results
+
+    NextCallInsn nextCallInsn = fastPath ? nextSDCallInsn : nextSDCallInsnSP;
+
     if (mir->dalvikInsn.opcode == OP_INVOKE_STATIC) {
         callState = genDalvikArgsNoRange(cUnit, mir, dInsn, callState, NULL,
-                                         false, nextSDCallInsn);
+                                         false, nextCallInsn);
     } else {
         callState = genDalvikArgsRange(cUnit, mir, dInsn, callState, NULL,
-                                       nextSDCallInsn);
+                                       nextCallInsn);
     }
     // Finish up any of the call sequence not interleaved in arg loading
     while (callState >= 0) {
-        callState = nextSDCallInsn(cUnit, mir, dInsn, callState);
+        callState = nextCallInsn(cUnit, mir, dInsn, callState);
     }
     newLIR1(cUnit, kThumbBlxR, rLR);
 }
diff --git a/src/compiler_test.cc b/src/compiler_test.cc
index 01e98f0..997a4e6 100644
--- a/src/compiler_test.cc
+++ b/src/compiler_test.cc
@@ -53,7 +53,7 @@
 #if defined(__arm__)
     va_list args;
     va_start(args, expected);
-    jint result = env->CallStaticLongMethodV(c, m, args);
+    jlong result = env->CallStaticLongMethodV(c, m, args);
     va_end(args);
     LOG(INFO) << klass << "." << method << "(...) result is " << result;
     EXPECT_EQ(expected, result);
@@ -206,4 +206,12 @@
                                     (1.0/0.0) / (1.0/0.0));
 }
 
+#if 0 // Re-enable when method resolution in place
+TEST_F(CompilerTest, RecursiveFibonacci) {
+  CompileDex(kIntMathDex, "kIntMathDex");
+  AssertStaticIntMethod("IntMath", "fibonacci", "(I)I", 55,
+                        10);
+}
+#endif
+
 }  // namespace art
diff --git a/src/compiler_test.h b/src/compiler_test.h
index a205c5f..57a08e1 100644
--- a/src/compiler_test.h
+++ b/src/compiler_test.h
@@ -19,7 +19,6 @@
 
 namespace art {
 
-
 //class IntMath {
 //
 //    /*
@@ -522,6 +521,15 @@
 //        return res;
 //    }
 //
+//    static int fibonacci(int n) {
+//        if (n == 0) {
+//            return 0;
+//        } else if (n == 1) {
+//            return 1;
+//        } else {
+//            return fibonacci(n - 1) + fibonacci(n - 2);
+//        }
+//    }
 //
 //    public static void main(String[] args) {
 //        int res = unopTest(38);
@@ -613,139 +621,151 @@
 //        } else {
 //            System.out.printf("testDoubleCompare FAILED: %d\n", res);
 //        }
+//
+//        res = fibonacci(10);
+//        if (res == 55) {
+//            System.out.printf("fibonacci PASSED\n");
+//        } else {
+//            System.out.printf("fibonacci FAILED: %d\n", res);
+//        }
 //    }
 //}
 static const char kIntMathDex[] =
-  "ZGV4CjAzNQA6SlSLdo8mIHPp83OcIPmcKOauGDHMXglYHQAAcAAAAHhWNBIAAAAAAAAAALgcAABO"
-  "AAAAcAAAAA8AAACoAQAADQAAAOQBAAABAAAAgAIAABYAAACIAgAAAgAAADgDAADgGQAAeAMAAFoV"
-  "AABiFQAAZRUAAGgVAABrFQAAchUAAHkVAAB9FQAAghUAAIkVAACOFQAAlRUAAKMVAACmFQAAqxUA"
-  "AK8VAAC6FQAAvxUAANYVAADrFQAA/xUAABMWAAAnFgAANBYAADcWAAA7FgAAPxYAAEMWAABYFgAA"
-  "bRYAAHoWAACTFgAAqBYAALIWAADIFgAA2hYAAOcWAAAAFwAAFRcAACMXAAAuFwAAOBcAAEYXAABg"
-  "FwAAdhcAAIUXAACgFwAAtxcAAL0XAADCFwAAyhcAANYXAADuFwAAAhgAAA4YAAAmGAAAOhgAAEYY"
-  "AABeGAAAchgAAIUYAACkGAAAvxgAANEYAADvGAAACRkAABkZAAA1GQAATRkAAF4ZAAB7GQAAlBkA"
-  "AJ4ZAAC0GQAAxhkAANkZAAD4GQAAExoAAAEAAAACAAAAAwAAAAwAAAAPAAAAEQAAABIAAAATAAAA"
-  "FAAAABUAAAAXAAAAGQAAABoAAAAbAAAAHAAAAAMAAAACAAAAAAAAAAQAAAACAAAA/BQAAAUAAAAC"
-  "AAAACBUAAAYAAAACAAAAFBUAAAcAAAACAAAAHBUAAAgAAAACAAAAJBUAAAkAAAACAAAAMBUAAAoA"
-  "AAACAAAAOBUAAA0AAAADAAAARBUAABAAAAAFAAAATBUAAA4AAAAGAAAAFBUAABcAAAAKAAAAAAAA"
-  "ABgAAAAKAAAAVBUAAAkABQAwAAAABAALAAAAAAAEAAAAHQAAAAQAAAAgAAAABAAEACMAAAAEAAQA"
-  "JgAAAAQAAwAnAAAABAADACgAAAAEAAYAKQAAAAQACAAsAAAABAAMAC8AAAAEAAAAMgAAAAQAAAA1"
-  "AAAABAADADgAAAAEAAEAOwAAAAQAAgA+AAAABAAFAEEAAAAEAAcARAAAAAQAAwBHAAAABAAAAEoA"
-  "AAAFAAkAMQAAAAYACgBNAAAABwALAAAAAAAHAAAAAQAAAP////8AAAAAFgAAAAAAAABbHAAAAAAA"
-  "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"
-  "IBMCEACjAgoCwSATAggAowIMAsEgweAYAoh3ZlVEMyIRMQAAAjgABAASEA8AEgAo/gQAAQAAAAAA"
-  "dhsAAJoAAAASEBMB0gQrA0kAAAASYA8AEiAo/hIwKPwSQCj6ElAo+CsDTAAAABQCeFY0EisCTgAA"
-  "ACjuLAJSAAAAEwAOACjoEnAo5hMACAAo4xMACQAo4BMACgAo3RMACwAo2hMADAAo1xMADQAo1CwC"
-  "TgAAABKwLABUAAAAEwATACjKEwAPACjHEwAQACjEEwARACjBEwASACi+ARAovAABBgD/////BAAA"
-  "AAUAAAANAAAABwAAAAkAAAALAAAAAAECAAMAAAAQAAAAEgAAAAABAgB4VjQSBAAAAA8AAAAAAgUA"
-  "+v///wMAAAAWAAAAOQAAAHhWNBIRAAAAFwAAABQAAAAOAAAAGgAAAAACAgD6////AwAAAAoAAAAN"
-  "AAAAAAIDAPv///8AAAAADAAAABIAAAAPAAAADAAAAAoACAAAAAAArRsAAEgAAAATAFwRLwECBD0B"
-  "BAASEA8AMAEEAjsBBAASICj6LwEEAjkBBAASMCj0LwEEBjgBBAASQCjuMAEECDwBBAASUCjoLwEE"
-  "CDoBBAASYCjiMAECCDwBBAAScCjcLwECCDoBBQATAAgAKNUvAQgEOgEFABMACQAozjABCAQ8AQUA"
-  "EwAKACjHLwEICDkBxP8TAAsAKMAGAAQAAAAAANIbAAA+AAAAEwAFDS0BAgM9AQMAEhAuAQMCOwED"
-  "ABIgLQEDAjkBAwASMC0BAwQ4AQMAEkAuAQMFPAEDABJQLQEDBToBAwASYC4BAgU8AQMAEnAtAQIF"
-  "OgEEABMACAAtAQUDOgEEABMACQAuAQUDPAEEABMACgAtAQUFOQEEABMACwAPAAUABAAAAAAA8xsA"
-  "AEEAAAATAFcENyEEABIQDwA0IQQAEiAo/DUSBAASMCj4NhIEABJAKPQzEgQAElAo8DIyBAASYCjs"
-  "MhIHAD0BBwATAAgAKOUScCjjOgEFABMACQAo3jsCBQATAAoAKNk8AgUAEwALACjUOQIFABMADAAo"
-  "zzgEBQATAA0AKMo4BMn/EwAOACjFAAANAAgAAAAAAB4cAABWAAAAFgMBABMArggxAQUJPQEEABIg"
-  "DwAxAQkFOwEEABIwKPoxAQkFOQEEABJAKPSbAQkDMQEJAToBBAASUCjsmwEFAzEBBQE6AQQAEmAo"
-  "5DEBCQU4AQkAMQEJCz0BBwATAAgAKNkScCjXMQELCTsBBQATAAkAKNAxAQsJOQEFABMACgAoyTEB"
-  "BQc7AQUAEwALACjCMQEHBT0BBQATAAwAKLsxAQcFOQG4/xMADQAotAIAAQAAAAAARxwAAAQAAAB7"
-  "EN8AAP8PAAUAAAAAAAAATxwAABcAAAAUAf///w8TBP8PEvONEI8RjkIyMAQAEhAPADIxBAASICj8"
-  "MkIEABIwKPgSACj2AAAEAAAAAAAAAAAAAAAEAAAAAQABAAEAAQABAAAAAgAAAAIAAAACAAIABAAA"
-  "AAIAAgACAAIAAgAAAAMAAwAEAAAAAwADAAMAAwACAAAAAwACAAIAAAAIAA0AAQAAAA4ABjxpbml0"
-  "PgABRAABRgABSQAFSUREREQABUlGRkZGAAJJSQADSUlJAAVJSUlJSQADSUpKAAVJSkpKSgAMSW50"
-  "TWF0aC5qYXZhAAFKAANKSkkAAkxJAAlMSW50TWF0aDsAA0xMTAAVTGphdmEvaW8vUHJpbnRTdHJl"
-  "YW07ABNMamF2YS9sYW5nL0ludGVnZXI7ABJMamF2YS9sYW5nL09iamVjdDsAEkxqYXZhL2xhbmcv"
-  "U3RyaW5nOwASTGphdmEvbGFuZy9TeXN0ZW07AAtPYmplY3QuamF2YQABVgACVkwAAltJAAJbSgAT"
-  "W0xqYXZhL2xhbmcvT2JqZWN0OwATW0xqYXZhL2xhbmcvU3RyaW5nOwALY2hhclN1YlRlc3QAF2No"
-  "YXJTdWJUZXN0IEZBSUxFRDogJWQKABNjaGFyU3ViVGVzdCBQQVNTRUQKAAhjb252VGVzdAAUY29u"
-  "dlRlc3QgRkFJTEVEOiAlZAoAEGNvbnZUZXN0IFBBU1NFRAoAC2ludE9wZXJUZXN0ABdpbnRPcGVy"
-  "VGVzdCBGQUlMRUQ6ICVkCgATaW50T3BlclRlc3QgUEFTU0VECgAMaW50U2hpZnRUZXN0AAlsaXQx"
-  "NlRlc3QACGxpdDhUZXN0AAxsb25nT3BlclRlc3QAGGxvbmdPcGVyVGVzdCBGQUlMRUQ6ICVkCgAU"
-  "bG9uZ09wZXJUZXN0IFBBU1NFRAoADWxvbmdTaGlmdFRlc3QAGWxvbmdTaGlmdFRlc3QgRkFJTEVE"
-  "OiAlZAoAFWxvbmdTaGlmdFRlc3QgUEFTU0VECgAEbWFpbgADb3V0AAZwcmludGYACnNoaWZ0VGVz"
-  "dDEAFnNoaWZ0VGVzdDEgRkFJTEVEOiAlZAoAEnNoaWZ0VGVzdDEgUEFTU0VECgAKc2hpZnRUZXN0"
-  "MgAWc2hpZnRUZXN0MiBGQUlMRUQ6ICVkCgASc2hpZnRUZXN0MiBQQVNTRUQKAApzd2l0Y2hUZXN0"
-  "ABZzd2l0Y2hUZXN0IEZBSUxFRDogJWQKABJzd2l0Y2hUZXN0IFBBU1NFRAoAEXRlc3REb3VibGVD"
-  "b21wYXJlAB10ZXN0RG91YmxlQ29tcGFyZSBGQUlMRUQ6ICVkCgAZdGVzdERvdWJsZUNvbXBhcmUg"
-  "UEFTU0VECgAQdGVzdEZsb2F0Q29tcGFyZQAcdGVzdEZsb2F0Q29tcGFyZSBGQUlMRUQ6ICVkCgAY"
-  "dGVzdEZsb2F0Q29tcGFyZSBQQVNTRUQKAA50ZXN0SW50Q29tcGFyZQAadGVzdEludENvbXBhcmUg"
-  "RkFJTEVEOiAlZAoAFnRlc3RJbnRDb21wYXJlIFBBU1NFRAoAD3Rlc3RMb25nQ29tcGFyZQAbdGVz"
-  "dExvbmdDb21wYXJlIEZBSUxFRDogJWQKABd0ZXN0TG9uZ0NvbXBhcmUgUEFTU0VECgAIdW5vcFRl"
-  "c3QAFHVub3BUZXN0IEZBSUxFRDogJWQKABB1bm9wVGVzdCBQQVNTRUQKABF1bnNpZ25lZFNoaWZ0"
-  "VGVzdAAddW5zaWduZWRTaGlmdFRlc3QgRkFJTEVEOiAlZAoAGXVuc2lnbmVkU2hpZnRUZXN0IFBB"
-  "U1NFRAoAB3ZhbHVlT2YAAwAHDgABAAcOAHAABw4AVAAHDi0eAg53AnQdLR6JWh55Wh54AHgCAAAH"
-  "WU1LS0tLWlpaWmvjLT1bAgwsAnUdlpaWlpZptJbD0wDcAQIAAAdZLUtLS3h7GpaWpQCiAQEAB1lN"
-  "S0tLS0taWlt/AnkdlpaHh5aWwwC+AQEAB1lNS0tLS0taWl1/AnkdlpaHeJaWwwDtAQIAAAcOTVpa"
-  "WlpaaVpaauItSy14AgxZAnUd4eHh4eG08MP/AREPlgCTAgIAAAdZLUtLS3jXAnsd4eHhagD5AwEA"
-  "B3dpS5lLLZlLLZlLLZlLLZlLLZmHLZm0LZm0lppLS5paS5rwS5qHS5qlS5kCq38dAREUAREUAREU"
-  "AREUAREUAREUAREUAREUAREVAREVAREVAREVAREVAA0AB1l9AREPARQPagIOWQJzHXi1ATcXwwJo"
-  "HQAqAAcOLS0tLS0tLS4BIxGlAKICAQAHHS5CAigdAlMdLi0tL0E9T0ECbjstQz88PTw+QR4/AnY7"
-  "PEE9UQJRHQEQF46LARYWqwDaAwQAAAAABw4uSwIXHQJqHUstSy1LLkstSy1LLUs8SzxLPUsAuQME"
-  "AAAAAAcOLkseSx5LHksfSx5LHkseSy1LLUsuSy4A2QIEAAAAAAcOLi0CJR0CXB0tLS0tLS0tLS0v"
-  "Mi03MS08LTwtPC08LT0vAIsDBAAAAAAHLC5LAiIdAl8dSy1LLmktaS9RSwJ7OzJLPEs+SzxLPEsA"
-  "BwEABw4eLQBAAAdoHh4gPxpLTAAAAAEAFYGABPgGAAATAACAgASMBwEIpAcBCLgHAQisCAEInAsB"
-  "CKwMAQioDgEIoBABCJAUAQnYFQEI9B0BCNQgAQjkIQEIqCQBCMglAQjUJgEI6CcBCKQpAQi8KQAN"
-  "AAAAAAAAAAEAAAAAAAAAAQAAAE4AAABwAAAAAgAAAA8AAACoAQAAAwAAAA0AAADkAQAABAAAAAEA"
-  "AACAAgAABQAAABYAAACIAgAABgAAAAIAAAA4AwAAASAAABQAAAB4AwAAARAAAAoAAAD8FAAAAiAA"
-  "AE4AAABaFQAAAyAAABQAAAAcGgAAACAAAAIAAABbHAAAABAAAAEAAAC4HAAA";
+"ZGV4CjAzNQDkd6TZ8pqDxU8AeTvdZuEG1XSONR7DLLU8HgAAcAAAAHhWNBIAAAAAAAAAAJwdAABR"
+"AAAAcAAAAA8AAAC0AQAADQAAAPABAAABAAAAjAIAABcAAACUAgAAAgAAAEwDAACwGgAAjAMAAPIV"
+"AAD6FQAA/RUAAAAWAAADFgAAChYAABEWAAAVFgAAGhYAACEWAAAmFgAALRYAADsWAAA+FgAAQxYA"
+"AEcWAABSFgAAVxYAAG4WAACDFgAAlxYAAKsWAAC/FgAAzBYAAM8WAADTFgAA1xYAANsWAADwFgAA"
+"BRcAABIXAAArFwAAQBcAAEoXAABgFwAAchcAAH0XAACUFwAApxcAALQXAADNFwAA4hcAAPAXAAD7"
+"FwAABRgAABMYAAAtGAAAQxgAAFIYAABtGAAAhBgAAIoYAACPGAAAlxgAAKMYAAC7GAAAzxgAANsY"
+"AADzGAAABxkAABMZAAArGQAAPxkAAFIZAABxGQAAjBkAAJ4ZAAC8GQAA1hkAAOYZAAACGgAAGhoA"
+"ACsaAABIGgAAYRoAAGsaAACBGgAAkxoAAKYaAADFGgAA4BoAAAEAAAACAAAAAwAAAAwAAAAPAAAA"
+"EQAAABIAAAATAAAAFAAAABUAAAAXAAAAGQAAABoAAAAbAAAAHAAAAAMAAAACAAAAAAAAAAQAAAAC"
+"AAAAlBUAAAUAAAACAAAAoBUAAAYAAAACAAAArBUAAAcAAAACAAAAtBUAAAgAAAACAAAAvBUAAAkA"
+"AAACAAAAyBUAAAoAAAACAAAA0BUAAA0AAAADAAAA3BUAABAAAAAFAAAA5BUAAA4AAAAGAAAArBUA"
+"ABcAAAAKAAAAAAAAABgAAAAKAAAA7BUAAAkABQAzAAAABAALAAAAAAAEAAAAHQAAAAQAAAAgAAAA"
+"BAADACMAAAAEAAQAJgAAAAQABAApAAAABAADACoAAAAEAAMAKwAAAAQABgAsAAAABAAIAC8AAAAE"
+"AAwAMgAAAAQAAAA1AAAABAAAADgAAAAEAAMAOwAAAAQAAQA+AAAABAACAEEAAAAEAAUARAAAAAQA"
+"BwBHAAAABAADAEoAAAAEAAAATQAAAAUACQA0AAAABgAKAFAAAAAHAAsAAAAAAAcAAAABAAAA////"
+"/wAAAAAWAAAAAAAAADkdAAAAAAAABAAAAAAAAAAHAAAAAAAAAAsAAAAAAAAAQx0AAAAAAAABAAEA"
+"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"
+"FwAAABQB////DxME/w8S840QjxGOQjIwBAASEA8AMjEEABIgKPwyQgQAEjAo+BIAKPYAAAQAAAAA"
+"AAAAAAAAAAQAAAABAAEAAQABAAEAAAACAAAAAgAAAAIAAgAEAAAAAgACAAIAAgACAAAAAwADAAQA"
+"AAADAAMAAwADAAIAAAADAAIAAgAAAAgADQABAAAADgAGPGluaXQ+AAFEAAFGAAFJAAVJRERERAAF"
+"SUZGRkYAAklJAANJSUkABUlJSUlJAANJSkoABUlKSkpKAAxJbnRNYXRoLmphdmEAAUoAA0pKSQAC"
+"TEkACUxJbnRNYXRoOwADTExMABVMamF2YS9pby9QcmludFN0cmVhbTsAE0xqYXZhL2xhbmcvSW50"
+"ZWdlcjsAEkxqYXZhL2xhbmcvT2JqZWN0OwASTGphdmEvbGFuZy9TdHJpbmc7ABJMamF2YS9sYW5n"
+"L1N5c3RlbTsAC09iamVjdC5qYXZhAAFWAAJWTAACW0kAAltKABNbTGphdmEvbGFuZy9PYmplY3Q7"
+"ABNbTGphdmEvbGFuZy9TdHJpbmc7AAtjaGFyU3ViVGVzdAAXY2hhclN1YlRlc3QgRkFJTEVEOiAl"
+"ZAoAE2NoYXJTdWJUZXN0IFBBU1NFRAoACGNvbnZUZXN0ABRjb252VGVzdCBGQUlMRUQ6ICVkCgAQ"
+"Y29udlRlc3QgUEFTU0VECgAJZmlib25hY2NpABVmaWJvbmFjY2kgRkFJTEVEOiAlZAoAEWZpYm9u"
+"YWNjaSBQQVNTRUQKAAtpbnRPcGVyVGVzdAAXaW50T3BlclRlc3QgRkFJTEVEOiAlZAoAE2ludE9w"
+"ZXJUZXN0IFBBU1NFRAoADGludFNoaWZ0VGVzdAAJbGl0MTZUZXN0AAhsaXQ4VGVzdAAMbG9uZ09w"
+"ZXJUZXN0ABhsb25nT3BlclRlc3QgRkFJTEVEOiAlZAoAFGxvbmdPcGVyVGVzdCBQQVNTRUQKAA1s"
+"b25nU2hpZnRUZXN0ABlsb25nU2hpZnRUZXN0IEZBSUxFRDogJWQKABVsb25nU2hpZnRUZXN0IFBB"
+"U1NFRAoABG1haW4AA291dAAGcHJpbnRmAApzaGlmdFRlc3QxABZzaGlmdFRlc3QxIEZBSUxFRDog"
+"JWQKABJzaGlmdFRlc3QxIFBBU1NFRAoACnNoaWZ0VGVzdDIAFnNoaWZ0VGVzdDIgRkFJTEVEOiAl"
+"ZAoAEnNoaWZ0VGVzdDIgUEFTU0VECgAKc3dpdGNoVGVzdAAWc3dpdGNoVGVzdCBGQUlMRUQ6ICVk"
+"CgASc3dpdGNoVGVzdCBQQVNTRUQKABF0ZXN0RG91YmxlQ29tcGFyZQAddGVzdERvdWJsZUNvbXBh"
+"cmUgRkFJTEVEOiAlZAoAGXRlc3REb3VibGVDb21wYXJlIFBBU1NFRAoAEHRlc3RGbG9hdENvbXBh"
+"cmUAHHRlc3RGbG9hdENvbXBhcmUgRkFJTEVEOiAlZAoAGHRlc3RGbG9hdENvbXBhcmUgUEFTU0VE"
+"CgAOdGVzdEludENvbXBhcmUAGnRlc3RJbnRDb21wYXJlIEZBSUxFRDogJWQKABZ0ZXN0SW50Q29t"
+"cGFyZSBQQVNTRUQKAA90ZXN0TG9uZ0NvbXBhcmUAG3Rlc3RMb25nQ29tcGFyZSBGQUlMRUQ6ICVk"
+"CgAXdGVzdExvbmdDb21wYXJlIFBBU1NFRAoACHVub3BUZXN0ABR1bm9wVGVzdCBGQUlMRUQ6ICVk"
+"CgAQdW5vcFRlc3QgUEFTU0VECgARdW5zaWduZWRTaGlmdFRlc3QAHXVuc2lnbmVkU2hpZnRUZXN0"
+"IEZBSUxFRDogJWQKABl1bnNpZ25lZFNoaWZ0VGVzdCBQQVNTRUQKAAd2YWx1ZU9mAAMABw4AAQAH"
+"DgBwAAcOAFQABw4tHgIOdwJ0HS0eiVoeeVoeeAD4AwEABx0tIRovAHgCAAAHWU1LS0tLWlpaWmvj"
+"LT1bAgwsAnUdlpaWlpZptJbD0wDcAQIAAAdZLUtLS3h7GpaWpQCiAQEAB1lNS0tLS0taWlt/Ankd"
+"lpaHh5aWwwC+AQEAB1lNS0tLS0taWl1/AnkdlpaHeJaWwwDtAQIAAAcOTVpaWlpaaVpaauItSy14"
+"AgxZAnUd4eHh4eG08MP/AREPlgCTAgIAAAdZLUtLS3jXAnsd4eHhagCCBAEAB3dpS5lLLZlLLZlL"
+"LZlLLZlLLZmHLZm0LZm0lppLS5paS5rwS5qHS5qlS5ppS5kCpH8dAREUAREUAREUAREUAREUAREU"
+"AREUAREUAREVAREVAREVAREVAREVAREVAA0AB1l9AREPARQPagIOWQJzHXi1ATcXwwJoHQAqAAcO"
+"LS0tLS0tLS4BIxGlAKICAQAHHS5CAigdAlMdLi0tL0E9T0ECbjstQz88PTw+QR4/AnY7PEE9UQJR"
+"HQEQF46LARYWqwDaAwQAAAAABw4uSwIXHQJqHUstSy1LLkstSy1LLUs8SzxLPUsAuQMEAAAAAAcO"
+"LkseSx5LHksfSx5LHkseSy1LLUsuSy4A2QIEAAAAAAcOLi0CJR0CXB0tLS0tLS0tLS0vMi03MS08"
+"LTwtPC08LT0vAIsDBAAAAAAHLC5LAiIdAl8dSy1LLmktaS9RSwJ7OzJLPEs+SzxLPEsABwEABw4e"
+"LQBAAAdoHh4gPxpLTAAAAAEAFoGABIwHAAAUAACAgASgBwEIuAcBCMwHAQjACAEI/AgBCOwLAQj8"
+"DAEI+A4BCPAQAQjgFAEJqBYBCIwfAQjsIQEI/CIBCMAlAQjgJgEI7CcBCIApAQi8KgEI1CoAAAAN"
+"AAAAAAAAAAEAAAAAAAAAAQAAAFEAAABwAAAAAgAAAA8AAAC0AQAAAwAAAA0AAADwAQAABAAAAAEA"
+"AACMAgAABQAAABcAAACUAgAABgAAAAIAAABMAwAAASAAABUAAACMAwAAARAAAAoAAACUFQAAAiAA"
+"AFEAAADyFQAAAyAAABUAAADpGgAAACAAAAIAAAA5HQAAABAAAAEAAACcHQAA";
+
 }  // namespace art
diff --git a/src/dex_cache.h b/src/dex_cache.h
index 13c900e..fdf179b 100644
--- a/src/dex_cache.h
+++ b/src/dex_cache.h
@@ -38,6 +38,18 @@
     return Get(kLocation)->AsString();
   }
 
+  static size_t StringsOffset() {
+    return kStrings * sizeof(Object*);
+  }
+
+  static size_t FieldsOffset() {
+    return kFields * sizeof(Object*);
+  }
+
+  static size_t MethodsOffset() {
+    return kMethods * sizeof(Object*);
+  }
+
   size_t NumStrings() const {
     return GetStrings()->GetLength();
   }