Updating the compiler to use the new-world model

New compiler is integrated and passes first test (Fibonacci).

Change-Id: Ic5448ab89ebd22baa30fafc3d1300324687d1fc2
diff --git a/src/compiler/codegen/arm/Thumb2/Gen.cc b/src/compiler/codegen/arm/Thumb2/Gen.cc
index c9d72f7..1a126e4 100644
--- a/src/compiler/codegen/arm/Thumb2/Gen.cc
+++ b/src/compiler/codegen/arm/Thumb2/Gen.cc
@@ -356,7 +356,7 @@
     int regCardBase = oatAllocTemp(cUnit);
     int regCardNo = oatAllocTemp(cUnit);
     ArmLIR* branchOver = genCmpImmBranch(cUnit, kArmCondEq, valReg, 0);
-    loadWordDisp(cUnit, rSELF, offsetof(Thread, cardTable),
+    loadWordDisp(cUnit, rSELF, Thread::CardTableOffset().Int32Value(),
                  regCardBase);
     opRegRegImm(cUnit, kOpLsr, regCardNo, tgtAddrReg, GC_CARD_SHIFT);
     storeBaseIndexed(cUnit, regCardBase, regCardNo, regCardBase, 0,
@@ -371,8 +371,8 @@
 static void genIGetX(CompilationUnit* cUnit, MIR* mir, OpSize size,
                      RegLocation rlDest, RegLocation rlObj)
 {
-    Field* fieldPtr =
-        cUnit->method->clazz->pDvmDex->pResFields[mir->dalvikInsn.vC];
+    Field* fieldPtr = cUnit->method->GetDeclaringClass()->GetDexCache()->
+        GetResolvedField(mir->dalvikInsn.vC);
     if (fieldPtr == NULL) {
         /*
          * With current scheme, we should never be in a situation
@@ -387,7 +387,7 @@
 #else
     bool isVolatile = false;
 #endif
-    int fieldOffset = ((InstField *)fieldPtr)->byteOffset;
+    int fieldOffset = fieldPtr->GetOffset();
     RegLocation rlResult;
     RegisterClass regClass = oatRegClassBySize(size);
     rlObj = loadValue(cUnit, rlObj, kCoreReg);
@@ -406,8 +406,8 @@
 static void genIPutX(CompilationUnit* cUnit, MIR* mir, OpSize size,
                     RegLocation rlSrc, RegLocation rlObj, bool isObject)
 {
-    Field* fieldPtr =
-        cUnit->method->clazz->pDvmDex->pResFields[mir->dalvikInsn.vC];
+    Field* fieldPtr = cUnit->method->GetDeclaringClass()->GetDexCache()->
+        GetResolvedField(mir->dalvikInsn.vC);
     if (fieldPtr == NULL) {
         /*
          * With current scheme, we should never be in a situation
@@ -422,7 +422,7 @@
 #else
     bool isVolatile = false;
 #endif
-    int fieldOffset = ((InstField *)fieldPtr)->byteOffset;
+    int fieldOffset = fieldPtr->GetOffset();
     RegisterClass regClass = oatRegClassBySize(size);
     rlObj = loadValue(cUnit, rlObj, kCoreReg);
     rlSrc = loadValue(cUnit, rlSrc, regClass);
@@ -442,8 +442,8 @@
 static void genIGetWideX(CompilationUnit* cUnit, MIR* mir, RegLocation rlDest,
                         RegLocation rlObj)
 {
-   Field* fieldPtr =
-       cUnit->method->clazz->pDvmDex->pResFields[mir->dalvikInsn.vC];
+    Field* fieldPtr = cUnit->method->GetDeclaringClass()->GetDexCache()->
+        GetResolvedField(mir->dalvikInsn.vC);
     if (fieldPtr == NULL) {
         /*
          * With current scheme, we should never be in a situation
@@ -458,7 +458,7 @@
 #else
     bool isVolatile = false;
 #endif
-    int fieldOffset = ((InstField *)fieldPtr)->byteOffset;
+    int fieldOffset = fieldPtr->GetOffset();
     RegLocation rlResult;
     rlObj = loadValue(cUnit, rlObj, kCoreReg);
     int regPtr = oatAllocTemp(cUnit);
@@ -483,8 +483,8 @@
 static void genIPutWideX(CompilationUnit* cUnit, MIR* mir, RegLocation rlSrc,
                         RegLocation rlObj)
 {
-   Field* fieldPtr =
-        cUnit->method->clazz->pDvmDex->pResFields[mir->dalvikInsn.vC];
+    Field* fieldPtr = cUnit->method->GetDeclaringClass()->GetDexCache()->
+        GetResolvedField(mir->dalvikInsn.vC);
     if (fieldPtr == NULL) {
         /*
          * With current scheme, we should never be in a situation
@@ -499,7 +499,7 @@
 #else
     bool isVolatile = false;
 #endif
-    int fieldOffset = ((InstField *)fieldPtr)->byteOffset;
+    int fieldOffset = fieldPtr->GetOffset();
 
     rlObj = loadValue(cUnit, rlObj, kCoreReg);
     int regPtr;
@@ -520,13 +520,14 @@
 static void genConstClass(CompilationUnit* cUnit, MIR* mir,
                           RegLocation rlDest, RegLocation rlSrc)
 {
-    void* classPtr = (void*)
-      (cUnit->method->clazz->pDvmDex->pResClasses[mir->dalvikInsn.vB]);
+    Class* classPtr = cUnit->method->GetDeclaringClass()->GetDexCache()->
+        GetResolvedClass(mir->dalvikInsn.vB);
 
     if (classPtr == NULL) {
         LOG(FATAL) << "Unexpected null class pointer";
     }
 
+    UNIMPLEMENTED(WARNING) << "Not position independent.  Fix";
     RegLocation rlResult = oatEvalLoc(cUnit, rlDest, kCoreReg, true);
     loadConstantNoClobber(cUnit, rlResult.lowReg, (int) classPtr );
     storeValue(cUnit, rlDest, rlResult);
@@ -535,14 +536,15 @@
 static void genConstString(CompilationUnit* cUnit, MIR* mir,
                            RegLocation rlDest, RegLocation rlSrc)
 {
-    void* strPtr = (void*)
-      (cUnit->method->clazz->pDvmDex->pResStrings[mir->dalvikInsn.vB]);
+    String* strPtr = cUnit->method->GetDeclaringClass()->GetDexCache()->
+        GetResolvedString(mir->dalvikInsn.vB);
 
     if (strPtr == NULL) {
         /* Shouldn't happen */
         LOG(FATAL) << "Unexpected null const string pointer";
     }
 
+    UNIMPLEMENTED(WARNING) << "Not position indendent.  Fix";
     RegLocation rlResult = oatEvalLoc(cUnit, rlDest, kCoreReg, true);
     loadConstantNoClobber(cUnit, rlResult.lowReg, (int) strPtr );
     storeValue(cUnit, rlDest, rlResult);
@@ -551,8 +553,8 @@
 static void genNewInstance(CompilationUnit* cUnit, MIR* mir,
                            RegLocation rlDest)
 {
-    ClassObject* classPtr = (ClassObject *)
-      (cUnit->method->clazz->pDvmDex->pResClasses[mir->dalvikInsn.vB]);
+    Class* classPtr = cUnit->method->GetDeclaringClass()->GetDexCache()->
+        GetResolvedClass(mir->dalvikInsn.vB);
 
     if (classPtr == NULL) {
         /* Shouldn't happen */
@@ -560,12 +562,13 @@
     }
 
     // Verifier should have already rejected abstract/interface
-    assert((classPtr->accessFlags & (ACC_INTERFACE|ACC_ABSTRACT)) == 0);
+    assert((classPtr->access_flags_ &
+           (art::kAccInterface|art::kAccAbstract)) == 0);
     oatFlushAllRegs(cUnit);   /* Everything to home location */
     loadWordDisp(cUnit, rSELF,
                  OFFSETOF_MEMBER(Thread, pArtAllocObjectNoThrow), rLR);
     loadConstant(cUnit, r0, (int) classPtr);
-    loadConstant(cUnit, r1, ALLOC_DONT_TRACK);
+    UNIMPLEMENTED(WARNING) << "Need NewWorld dvmAllocObject";
     opReg(cUnit, kOpBlx, rLR);
     oatClobberCallRegs(cUnit);
     RegLocation rlResult = oatGetReturn(cUnit);
@@ -586,8 +589,8 @@
 {
    // May generate a call - use explicit registers
     RegLocation rlResult;
-    ClassObject* classPtr =
-      (cUnit->method->clazz->pDvmDex->pResClasses[mir->dalvikInsn.vC]);
+    Class* classPtr = cUnit->method->GetDeclaringClass()->GetDexCache()->
+        GetResolvedClass(mir->dalvikInsn.vC);
     if (classPtr == NULL) {
         /* Shouldn't happen */
         LOG(FATAL) << "Unexpected null class pointer";
@@ -598,7 +601,8 @@
     /* When taken r0 has NULL which can be used for store directly */
     ArmLIR* branch1 = genCmpImmBranch(cUnit, kArmCondEq, r0, 0);
     /* r1 now contains object->clazz */
-    loadWordDisp(cUnit, r0, offsetof(Object, clazz), r1);
+    assert(OFFSETOF_MEMBER(Object, klass_) == 0);
+    loadWordDisp(cUnit, r0, OFFSETOF_MEMBER(Object, klass_), r1);
     /* r1 now contains object->clazz */
     loadWordDisp(cUnit, rSELF,
                  OFFSETOF_MEMBER(Thread, pArtInstanceofNonTrivial), rLR);
@@ -620,8 +624,8 @@
 
 static void genCheckCast(CompilationUnit* cUnit, MIR* mir, RegLocation rlSrc)
 {
-   ClassObject* classPtr =
-      (cUnit->method->clazz->pDvmDex->pResClasses[mir->dalvikInsn.vB]);
+    Class* classPtr = cUnit->method->GetDeclaringClass()->GetDexCache()->
+        GetResolvedClass(mir->dalvikInsn.vB);
     if (classPtr == NULL) {
         /* Shouldn't happen with our current model */
         LOG(FATAL) << "Unexpected null class pointer";
@@ -639,7 +643,7 @@
      *  with clazz.
      */
     /* r0 now contains object->clazz */
-    loadWordDisp(cUnit, rlSrc.lowReg, offsetof(Object, clazz), r0);
+    loadWordDisp(cUnit, rlSrc.lowReg, OFFSETOF_MEMBER(Object, klass_), r0);
     loadWordDisp(cUnit, rSELF,
                  OFFSETOF_MEMBER(Thread, pArtInstanceofNonTrivialNoThrow), rLR);
     opRegReg(cUnit, kOpCmp, r0, r1);
@@ -783,20 +787,23 @@
     ArmLIR* hopBranch;
 
     oatFlushAllRegs(cUnit);
-    assert(LW_SHAPE_THIN == 0);
+    assert(art::Monitor::kLwShapeThin == 0);
     loadValueDirectFixed(cUnit, rlSrc, r1);  // Get obj
     oatLockAllTemps(cUnit);  // Prepare for explicit register usage
     genNullCheck(cUnit, rlSrc.sRegLow, r1, mir->offset, NULL);
-    loadWordDisp(cUnit, rSELF, offsetof(Thread, threadId), r3); // Get threadId
+    loadWordDisp(cUnit, rSELF, Thread::IdOffset().Int32Value(), r3);
     newLIR3(cUnit, kThumb2Ldrex, r2, r1,
-            offsetof(Object, lock) >> 2); // Get object->lock
-    opRegImm(cUnit, kOpLsl, r3, LW_LOCK_OWNER_SHIFT); // Align owner
+            OFFSETOF_MEMBER(Object, monitor_) >> 2); // Get object->lock
+    // Align owner
+    opRegImm(cUnit, kOpLsl, r3, art::Monitor::kLwLockOwnerShift);
     // Is lock unheld on lock or held by us (==threadId) on unlock?
-    newLIR4(cUnit, kThumb2Bfi, r3, r2, 0, LW_LOCK_OWNER_SHIFT - 1);
-    newLIR3(cUnit, kThumb2Bfc, r2, LW_HASH_STATE_SHIFT,
-            LW_LOCK_OWNER_SHIFT - 1);
+    newLIR4(cUnit, kThumb2Bfi, r3, r2, 0, art::Monitor::kLwLockOwnerShift
+            - 1);
+    newLIR3(cUnit, kThumb2Bfc, r2, art::Monitor::kLwHashStateShift,
+            art::Monitor::kLwLockOwnerShift - 1);
     hopBranch = newLIR2(cUnit, kThumb2Cbnz, r2, 0);
-    newLIR4(cUnit, kThumb2Strex, r2, r3, r1, offsetof(Object, lock) >> 2);
+    newLIR4(cUnit, kThumb2Strex, r2, r3, r1,
+            OFFSETOF_MEMBER(Object, monitor_) >> 2);
     oatGenMemBarrier(cUnit, kSY);
     branch = newLIR2(cUnit, kThumb2Cbz, r2, 0);
 
@@ -830,23 +837,24 @@
     ArmLIR* hopTarget;
     ArmLIR* hopBranch;
 
-    assert(LW_SHAPE_THIN == 0);
+    assert(art::Monitor::kLwShapeThin == 0);
     oatFlushAllRegs(cUnit);
     loadValueDirectFixed(cUnit, rlSrc, r1);  // Get obj
     oatLockAllTemps(cUnit);  // Prepare for explicit register usage
     genNullCheck(cUnit, rlSrc.sRegLow, r1, mir->offset, NULL);
-    loadWordDisp(cUnit, r1, offsetof(Object, lock), r2); // Get object->lock
-    loadWordDisp(cUnit, rSELF, offsetof(Thread, threadId), r3); // Get threadId
+    loadWordDisp(cUnit, r1, OFFSETOF_MEMBER(Object, monitor_), r2); // Get lock
+    loadWordDisp(cUnit, rSELF, Thread::IdOffset().Int32Value(), r3);
     // Is lock unheld on lock or held by us (==threadId) on unlock?
-    opRegRegImm(cUnit, kOpAnd, r12, r2,
-                (LW_HASH_STATE_MASK << LW_HASH_STATE_SHIFT));
-    opRegImm(cUnit, kOpLsl, r3, LW_LOCK_OWNER_SHIFT); // Align owner
-    newLIR3(cUnit, kThumb2Bfc, r2, LW_HASH_STATE_SHIFT,
-            LW_LOCK_OWNER_SHIFT - 1);
+    opRegRegImm(cUnit, kOpAnd, r12, r2, (art::Monitor::kLwHashStateMask <<
+                art::Monitor::kLwHashStateShift));
+    // Align owner
+    opRegImm(cUnit, kOpLsl, r3, art::Monitor::kLwLockOwnerShift);
+    newLIR3(cUnit, kThumb2Bfc, r2, art::Monitor::kLwHashStateShift,
+            art::Monitor::kLwLockOwnerShift - 1);
     opRegReg(cUnit, kOpSub, r2, r3);
     hopBranch = opCondBranch(cUnit, kArmCondNe);
     oatGenMemBarrier(cUnit, kSY);
-    storeWordDisp(cUnit, r1, offsetof(Object, lock), r12);
+    storeWordDisp(cUnit, r1, OFFSETOF_MEMBER(Object, monitor_), r12);
     branch = opNone(cUnit, kOpUncondBr);
 
     hopTarget = newLIR0(cUnit, kArmPseudoTargetLabel);
@@ -1116,13 +1124,13 @@
  * Generate array store
  *
  */
-static void genArrayObjectPut(CompilationUnit* cUnit, MIR* mir,
+static void genArrayPut(CompilationUnit* cUnit, MIR* mir,
                               RegLocation rlArray, RegLocation rlIndex,
                               RegLocation rlSrc, int scale)
 {
     RegisterClass regClass = oatRegClassBySize(kWord);
-    int lenOffset = OFFSETOF_MEMBER(ArrayObject, length);
-    int dataOffset = OFFSETOF_MEMBER(ArrayObject, contents);
+    int lenOffset = Array::LengthOffset().Int32Value();
+    int dataOffset = Array::DataOffset().Int32Value();
 
     /* Make sure it's a legal object Put. Use direct regs at first */
     loadValueDirectFixed(cUnit, rlArray, r1);
@@ -1138,9 +1146,9 @@
     loadWordDisp(cUnit, rSELF,
                  OFFSETOF_MEMBER(Thread, pArtCanPutArrayElementNoThrow), rLR);
     /* Get the array's clazz */
-    loadWordDisp(cUnit, r1, offsetof(Object, clazz), r1);
+    loadWordDisp(cUnit, r1, OFFSETOF_MEMBER(Object, klass_), r1);
     /* Get the object's clazz */
-    loadWordDisp(cUnit, r0, offsetof(Object, clazz), r0);
+    loadWordDisp(cUnit, r0, OFFSETOF_MEMBER(Object, klass_), r0);
     opReg(cUnit, kOpBlx, rLR);
     oatClobberCallRegs(cUnit);
 
@@ -1186,8 +1194,8 @@
                         RegLocation rlDest, int scale)
 {
     RegisterClass regClass = oatRegClassBySize(size);
-    int lenOffset = OFFSETOF_MEMBER(ArrayObject, length);
-    int dataOffset = OFFSETOF_MEMBER(ArrayObject, contents);
+    int lenOffset = Array::LengthOffset().Int32Value();
+    int dataOffset = Array::DataOffset().Int32Value();
     RegLocation rlResult;
     rlArray = loadValue(cUnit, rlArray, kCoreReg);
     rlIndex = loadValue(cUnit, rlIndex, kCoreReg);
@@ -1251,8 +1259,8 @@
                         RegLocation rlSrc, int scale)
 {
     RegisterClass regClass = oatRegClassBySize(size);
-    int lenOffset = OFFSETOF_MEMBER(ArrayObject, length);
-    int dataOffset = OFFSETOF_MEMBER(ArrayObject, contents);
+    int lenOffset = Array::LengthOffset().Int32Value();
+    int dataOffset = Array::DataOffset().Int32Value();
 
     int regPtr;
     rlArray = loadValue(cUnit, rlArray, kCoreReg);