Split shadow stack from SIRT.

(cherry picked from commit 4455f868a9a6553827ccbe1d25e29cf528a74422)

Change-Id: I4f467cf5be812c600dc5fdb56a9236fe144bd380
diff --git a/src/thread.h b/src/thread.h
index 8a0c1af..6f91b31 100644
--- a/src/thread.h
+++ b/src/thread.h
@@ -50,6 +50,7 @@
 class Monitor;
 class Object;
 class Runtime;
+class ShadowFrame;
 class StackIndirectReferenceTable;
 class StackTraceElement;
 class StaticStorageBase;
@@ -272,6 +273,8 @@
 
   void SirtVisitRoots(Heap::RootVisitor* visitor, void* arg);
 
+  void ShadowFrameVisitRoots(Heap::RootVisitor* visitor, void* arg);
+
   // Convert a jobject into a Object*
   Object* DecodeJObject(jobject obj);
 
@@ -405,6 +408,9 @@
     return ThreadOffset(OFFSETOF_MEMBER(Thread, top_of_managed_stack_pc_));
   }
 
+  void PushShadowFrame(ShadowFrame* frame);
+  ShadowFrame* PopShadowFrame();
+
   void PushSirt(StackIndirectReferenceTable* sirt);
   StackIndirectReferenceTable* PopSirt();
 
@@ -539,6 +545,10 @@
   // Top of linked list of stack indirect reference tables or NULL for none
   StackIndirectReferenceTable* top_sirt_;
 
+  // Top of linked list of shadow stack or NULL for none
+  // Some backend may require shadow frame to ease the GC work.
+  ShadowFrame* top_shadow_frame_;
+
   // Every thread may have an associated JNI environment
   JNIEnvExt* jni_env_;