Implement CFI for Optimizing.

CFI is necessary for stack unwinding in gdb, lldb, and libunwind.

Change-Id: I1a3480e3a4a99f48bf7e6e63c4e83a80cfee40a2
diff --git a/compiler/dex/quick/lazy_debug_frame_opcode_writer.h b/compiler/dex/quick/lazy_debug_frame_opcode_writer.h
index d71a87d..94ffd7f 100644
--- a/compiler/dex/quick/lazy_debug_frame_opcode_writer.h
+++ b/compiler/dex/quick/lazy_debug_frame_opcode_writer.h
@@ -28,7 +28,7 @@
 // When we are generating the CFI code, we do not know the instuction offsets,
 // this class stores the LIR references and patches the instruction stream later.
 class LazyDebugFrameOpCodeWriter FINAL
-    : private DebugFrameOpCodeWriter<ArenaAllocatorAdapter<uint8_t>> {
+    : public DebugFrameOpCodeWriter<ArenaAllocatorAdapter<uint8_t>> {
   typedef DebugFrameOpCodeWriter<ArenaAllocatorAdapter<uint8_t>> Base;
  public:
   // This method is implicitely called the by opcode writers.
@@ -38,72 +38,12 @@
     advances_.push_back({this->data()->size(), *last_lir_insn_});
   }
 
-  // The register was unspilled.
-  void Restore(Reg reg) {
-    if (enable_writes_) {
-      Base::Restore(reg);
-    }
-  }
-
-  // Custom alias - unspill many registers based on bitmask.
-  void RestoreMany(Reg reg_base, uint32_t reg_mask) {
-    if (enable_writes_) {
-      Base::RestoreMany(reg_base, reg_mask);
-    }
-  }
-
-  // Remember the state of register spills.
-  void RememberState() {
-    if (enable_writes_) {
-      Base::RememberState();
-    }
-  }
-
-  // Restore the state of register spills.
-  void RestoreState() {
-    if (enable_writes_) {
-      Base::RestoreState();
-    }
-  }
-
-  // Set the frame pointer (CFA) to (stack_pointer + offset).
-  void DefCFAOffset(int offset) {
-    if (enable_writes_) {
-      Base::DefCFAOffset(offset);
-    }
-    this->current_cfa_offset_ = offset;
-  }
-
-  // The stack size was increased by given delta.
-  void AdjustCFAOffset(int delta) {
-    DefCFAOffset(this->current_cfa_offset_ + delta);
-  }
-
-  // The register was spilled to (stack_pointer + offset).
-  void RelOffset(Reg reg, int offset) {
-    if (enable_writes_) {
-      Base::RelOffset(reg, offset);
-    }
-  }
-
-  // Custom alias - spill many registers based on bitmask.
-  void RelOffsetForMany(Reg reg_base, int offset, uint32_t reg_mask, int reg_size) {
-    if (enable_writes_) {
-      Base::RelOffsetForMany(reg_base, offset, reg_mask, reg_size);
-    }
-  }
-
-  using Base::GetCurrentCFAOffset;
-  using Base::SetCurrentCFAOffset;
-  using Base::GetCurrentPC;
-
   const ArenaVector<uint8_t>* Patch(size_t code_size);
 
   explicit LazyDebugFrameOpCodeWriter(LIR** last_lir_insn, bool enable_writes,
                                       ArenaAllocator* allocator)
-    : Base(allocator->Adapter()),
+    : Base(enable_writes, allocator->Adapter()),
       last_lir_insn_(last_lir_insn),
-      enable_writes_(enable_writes),
       advances_(allocator->Adapter()),
       patched_(false) {
   }
@@ -114,8 +54,9 @@
     LIR* last_lir_insn;
   } Advance;
 
+  using Base::data;  // Hidden. Use Patch method instead.
+
   LIR** last_lir_insn_;
-  bool enable_writes_;
   ArenaVector<Advance> advances_;
   bool patched_;