Make ShadowFrame fields const when not in portable.

ShadowFrames in quick don't need the HasReferenceArray test as they always have
a reference array. Make the method_ and number_of_vregs_ fields const to aid
G++'s optimization of the interpreter.

Modify the OFFSETOF_MEMBER macro to handle const fields.

Change-Id: I696480789190f7c5190449b9c278d37853903a5e
diff --git a/src/base/macros.h b/src/base/macros.h
index 3a24c08..8579872 100644
--- a/src/base/macros.h
+++ b/src/base/macros.h
@@ -120,7 +120,7 @@
 #define SIZEOF_MEMBER(t, f) sizeof((reinterpret_cast<t*>(4096))->f)
 
 #define OFFSETOF_MEMBER(t, f) \
-  (reinterpret_cast<char*>(&reinterpret_cast<t*>(16)->f) - reinterpret_cast<char*>(16)) // NOLINT
+  (reinterpret_cast<const char*>(&reinterpret_cast<t*>(16)->f) - reinterpret_cast<const char*>(16)) // NOLINT
 
 #define OFFSETOF_VOLATILE_MEMBER(t, f) \
   (reinterpret_cast<volatile char*>(&reinterpret_cast<t*>(16)->f) - reinterpret_cast<volatile char*>(16)) // NOLINT
diff --git a/src/stack.h b/src/stack.h
index eb187b2..e2148a3 100644
--- a/src/stack.h
+++ b/src/stack.h
@@ -71,15 +71,28 @@
   ~ShadowFrame() {}
 
   bool HasReferenceArray() const {
+#if defined(ART_USE_PORTABLE_COMPILER)
     return (number_of_vregs_ & kHasReferenceArray) != 0;
+#else
+    return true;
+#endif
   }
 
   uint32_t NumberOfVRegs() const {
+#if defined(ART_USE_PORTABLE_COMPILER)
     return number_of_vregs_ & ~kHasReferenceArray;
+#else
+    return number_of_vregs_;
+#endif
   }
 
   void SetNumberOfVRegs(uint32_t number_of_vregs) {
+#if defined(ART_USE_PORTABLE_COMPILER)
     number_of_vregs_ = number_of_vregs | (number_of_vregs_ & kHasReferenceArray);
+#else
+    UNUSED(number_of_vregs);
+    UNIMPLEMENTED(FATAL) << "Should only be called when portable is enabled";
+#endif
   }
 
   uint32_t GetDexPC() const {
@@ -173,8 +186,13 @@
   ThrowLocation GetCurrentLocationForThrow() const SHARED_LOCKS_REQUIRED(Locks::mutator_lock_);
 
   void SetMethod(mirror::AbstractMethod* method) {
+#if defined(ART_USE_PORTABLE_COMPILER)
     DCHECK_NE(method, static_cast<void*>(NULL));
     method_ = method;
+#else
+    UNUSED(method);
+    UNIMPLEMENTED(FATAL) << "Should only be called when portable is enabled";
+#endif
   }
 
   bool Contains(mirror::Object** shadow_frame_entry_obj) const {
@@ -212,9 +230,11 @@
   ShadowFrame(uint32_t num_vregs, ShadowFrame* link, mirror::AbstractMethod* method,
               uint32_t dex_pc, bool has_reference_array)
       : number_of_vregs_(num_vregs), link_(link), method_(method), dex_pc_(dex_pc) {
-    CHECK_LT(num_vregs, static_cast<uint32_t>(kHasReferenceArray));
     if (has_reference_array) {
+#if defined(ART_USE_PORTABLE_COMPILER)
+      CHECK_LT(num_vregs, static_cast<uint32_t>(kHasReferenceArray));
       number_of_vregs_ |= kHasReferenceArray;
+#endif
       for (size_t i = 0; i < num_vregs; ++i) {
         SetVRegReference(i, NULL);
       }
@@ -235,14 +255,23 @@
     return const_cast<mirror::Object**>(const_cast<const ShadowFrame*>(this)->References());
   }
 
+#if defined(ART_USE_PORTABLE_COMPILER)
   enum ShadowFrameFlag {
     kHasReferenceArray = 1ul << 31
   };
-  // TODO: make the majority of these fields const.
+  // TODO: make const in the portable case.
   uint32_t number_of_vregs_;
+#else
+  const uint32_t number_of_vregs_;
+#endif
   // Link to previous shadow frame or NULL.
   ShadowFrame* link_;
+#if defined(ART_USE_PORTABLE_COMPILER)
+  // TODO: make const in the portable case.
   mirror::AbstractMethod* method_;
+#else
+  mirror::AbstractMethod* const method_;
+#endif
   uint32_t dex_pc_;
   uint32_t vregs_[0];