Got the EmulateInstruction CFI code a lot closer to producing CFI data.

Switch the EmulateInstruction to use the standard RegisterInfo structure
that is defined in the lldb private types intead of passing the reg kind and
reg num everywhere. EmulateInstruction subclasses also need to provide
RegisterInfo structs given a reg kind and reg num. This eliminates the need
for the GetRegisterName() virtual function and allows more complete information
to be passed around in the read/write register callbacks. Subclasses should
always provide RegiterInfo structs with the generic register info filled in as
well as at least one kind of register number in the RegisterInfo.kinds[] array.



git-svn-id: https://llvm.org/svn/llvm-project/llvdb/trunk@130256 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp b/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp
index e445687..c791414 100644
--- a/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp
+++ b/source/Plugins/Instruction/ARM/EmulateInstructionARM.cpp
@@ -16,6 +16,7 @@
 #include "lldb/Core/ConstString.h"
 #include "lldb/Core/PluginManager.h"
 #include "lldb/Core/Stream.h"
+#include "lldb/Symbol/UnwindPlan.h"
 
 #include "Plugins/Process/Utility/ARMDefines.h"
 #include "Plugins/Process/Utility/ARMUtils.h"
@@ -252,6 +253,27 @@
     return true;
 }
 
+bool
+EmulateInstructionARM::GetRegisterInfo (uint32_t reg_kind, uint32_t reg_num, RegisterInfo &reg_info)
+{
+    if (reg_kind == eRegisterKindGeneric)
+    {
+        switch (reg_num)
+        {
+            case LLDB_REGNUM_GENERIC_PC:    reg_kind = eRegisterKindDWARF; reg_num = dwarf_pc; break;
+            case LLDB_REGNUM_GENERIC_SP:    reg_kind = eRegisterKindDWARF; reg_num = dwarf_sp; break;
+            case LLDB_REGNUM_GENERIC_FP:    reg_kind = eRegisterKindDWARF; reg_num = dwarf_r7; break;
+            case LLDB_REGNUM_GENERIC_RA:    reg_kind = eRegisterKindDWARF; reg_num = dwarf_lr; break;
+            case LLDB_REGNUM_GENERIC_FLAGS: reg_kind = eRegisterKindDWARF; reg_num = dwarf_cpsr; break;
+            default: return false;
+        }
+    }
+    
+    if (reg_kind == eRegisterKindDWARF)
+        return GetARMDWARFRegisterInfo(reg_num, reg_info);
+    return false;
+}
+
 // Push Multiple Registers stores multiple registers to the stack, storing to
 // consecutive memory locations ending just below the address in SP, and updates
 // SP to point to the start of the stored data.
@@ -340,16 +362,15 @@
         
         EmulateInstruction::Context context;
         context.type = EmulateInstruction::eContextPushRegisterOnStack;
-        Register dwarf_reg;
-        dwarf_reg.SetRegister (eRegisterKindDWARF, 0);
-        Register sp_reg;
-        sp_reg.SetRegister (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP);
+        RegisterInfo reg_info;
+        RegisterInfo sp_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_sp, sp_reg);
         for (i=0; i<15; ++i)
         {
             if (BitIsSet (registers, i))
             {
-                dwarf_reg.num = dwarf_r0 + i;
-                context.SetRegisterToRegisterPlusOffset (dwarf_reg, sp_reg, addr - sp);
+                GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + i, reg_info);
+                context.SetRegisterToRegisterPlusOffset (reg_info, sp_reg, addr - sp);
                 uint32_t reg_value = ReadCoreReg(i, &success);
                 if (!success)
                     return false;
@@ -361,8 +382,8 @@
         
         if (BitIsSet (registers, 15))
         {
-            dwarf_reg.num = dwarf_pc;
-            context.SetRegisterPlusOffset (dwarf_reg, addr - sp);
+            GetRegisterInfo (eRegisterKindDWARF, dwarf_pc, reg_info);
+            context.SetRegisterPlusOffset (reg_info, addr - sp);
             const uint32_t pc = ReadCoreReg(PC_REG, &success);
             if (!success)
                 return false;
@@ -393,7 +414,7 @@
         address = SP;
         for i = 0 to 14
             if registers<i> == '1' then
-                R[i} = if UnalignedAllowed then MemU[address,4] else MemA[address,4]; address = address + 4;
+                R[i] = if UnalignedAllowed then MemU[address,4] else MemA[address,4]; address = address + 4;
         if registers<15> == '1' then
             if UnalignedAllowed then
                 LoadWritePC(MemU[address,4]);
@@ -406,8 +427,7 @@
 
     bool success = false;
 
-    if (ConditionPassed(opcode))
-    {
+    if (ConditionPassed(opcode))    {
         const uint32_t addr_byte_size = GetAddressByteSize();
         const addr_t sp = ReadCoreReg (SP_REG, &success);
         if (!success)
@@ -469,20 +489,21 @@
         
         EmulateInstruction::Context context;
         context.type = EmulateInstruction::eContextPopRegisterOffStack;
-        Register dwarf_reg;
-        dwarf_reg.SetRegister (eRegisterKindDWARF, 0);
-        Register sp_reg;
-        sp_reg.SetRegister (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP);
+        
+        RegisterInfo sp_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_sp, sp_reg);
+
         for (i=0; i<15; ++i)
         {
             if (BitIsSet (registers, i))
             {
-                dwarf_reg.num = dwarf_r0 + i;
                 context.SetRegisterPlusOffset (sp_reg, addr - sp);
                 data = MemARead(context, addr, 4, 0, &success);
                 if (!success)
                     return false;    
-                if (!WriteRegisterUnsigned(context, eRegisterKindDWARF, dwarf_reg.num, data))
+                RegisterInfo reg_info;
+                GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + i, reg_info);
+                if (!WriteRegisterUnsigned(context, reg_info, data))
                     return false;
                 addr += addr_byte_size;
             }
@@ -490,7 +511,6 @@
         
         if (BitIsSet (registers, 15))
         {
-            dwarf_reg.num = dwarf_pc;
             context.SetRegisterPlusOffset (sp_reg, addr - sp);
             data = MemARead(context, addr, 4, 0, &success);
             if (!success)
@@ -559,8 +579,8 @@
         
         EmulateInstruction::Context context;
         context.type = EmulateInstruction::eContextAdjustStackPointer;
-        Register sp_reg;
-        sp_reg.SetRegister (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP);
+        RegisterInfo sp_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_sp, sp_reg);
         context.SetRegisterPlusOffset (sp_reg, sp_offset);
     
         if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, dwarf_r0 + Rd, addr))
@@ -613,8 +633,8 @@
                   
         EmulateInstruction::Context context;
         context.type = EmulateInstruction::eContextRegisterPlusOffset;
-        Register sp_reg;
-        sp_reg.SetRegister (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP);
+        RegisterInfo sp_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_sp, sp_reg);
         context.SetRegisterPlusOffset (sp_reg, 0);
     
         if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, dwarf_r0 + Rd, sp))
@@ -706,8 +726,8 @@
         // The context specifies that Rm is to be moved into Rd.
         EmulateInstruction::Context context;
         context.type = EmulateInstruction::eContextRegisterLoad;
-        Register dwarf_reg;
-        dwarf_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + Rm);
+        RegisterInfo dwarf_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + Rm, dwarf_reg);
         context.SetRegister (dwarf_reg);
 
         if (!WriteCoreRegOptionalFlags(context, result, Rd, setflags))
@@ -922,13 +942,13 @@
         uint64_t result = operand1 * operand2;
                   
         // R[d] = result<31:0>; 
-        Register op1_reg;
-        Register op2_reg;
-        op1_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
-        op2_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + m);
+        RegisterInfo op1_reg;
+        RegisterInfo op2_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, op1_reg);
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + m, op2_reg);
                   
         EmulateInstruction::Context context;
-        context.type = eContextMultiplication;
+        context.type = eContextArithmetic;
         context.SetRegisterRegisterOperands (op1_reg, op2_reg);
                   
         if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, dwarf_r0 + d, (0x0000ffff & result)))
@@ -1129,8 +1149,8 @@
         // PC relative immediate load context
         EmulateInstruction::Context context;
         context.type = EmulateInstruction::eContextRegisterPlusOffset;
-        Register pc_reg;
-        pc_reg.SetRegister (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC);
+        RegisterInfo pc_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_pc, pc_reg);
         context.SetRegisterPlusOffset (pc_reg, 0);                             
                                                
         uint32_t Rt;    // the destination register
@@ -1249,8 +1269,8 @@
         
         EmulateInstruction::Context context;
         context.type = EmulateInstruction::eContextAdjustStackPointer;
-        Register sp_reg;
-        sp_reg.SetRegister (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP);
+        RegisterInfo sp_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_sp, sp_reg);
         context.SetRegisterPlusOffset (sp_reg, sp_offset);
     
         if (d == 15)
@@ -1313,11 +1333,12 @@
         addr_t addr = (int32_t)sp + reg_value; // the adjusted stack pointer value
         
         EmulateInstruction::Context context;
-        context.type = EmulateInstruction::eContextAddition;
-        Register sp_reg;
-        sp_reg.SetRegister (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP);
-        Register other_reg;
-        other_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + Rm);
+        context.type = eContextArithmetic;
+        RegisterInfo sp_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_sp, sp_reg);
+        
+        RegisterInfo other_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + Rm, other_reg);
         context.SetRegisterRegisterOperands (sp_reg, other_reg);
     
         if (!WriteRegisterUnsigned (context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, addr))
@@ -1377,7 +1398,7 @@
             uint32_t imm25 = (S << 24) | (I1 << 23) | (I2 << 22) | (imm10 << 12) | (imm11 << 1);
             imm32 = llvm::SignExtend32<25>(imm25);
             target = pc + imm32;
-            context.SetModeAndImmediateSigned (eModeThumb, 4 + imm32);
+            context.SetISAAndImmediateSigned (eModeThumb, 4 + imm32);
             if (InITBlock() && !LastInITBlock())
                 return false;
             break;
@@ -1395,7 +1416,7 @@
             uint32_t imm25 = (S << 24) | (I1 << 23) | (I2 << 22) | (imm10H << 12) | (imm10L << 2);
             imm32 = llvm::SignExtend32<25>(imm25);
             target = Align(pc, 4) + imm32;
-            context.SetModeAndImmediateSigned (eModeARM, 4 + imm32);
+            context.SetISAAndImmediateSigned (eModeARM, 4 + imm32);
             if (InITBlock() && !LastInITBlock())
                 return false;
             break;
@@ -1404,13 +1425,13 @@
             lr = pc - 4; // return address
             imm32 = llvm::SignExtend32<26>(Bits32(opcode, 23, 0) << 2);
             target = Align(pc, 4) + imm32;
-            context.SetModeAndImmediateSigned (eModeARM, 8 + imm32);
+            context.SetISAAndImmediateSigned (eModeARM, 8 + imm32);
             break;
         case eEncodingA2:
             lr = pc - 4; // return address
             imm32 = llvm::SignExtend32<26>(Bits32(opcode, 23, 0) << 2 | Bits32(opcode, 24, 24) << 1);
             target = pc + imm32;
-            context.SetModeAndImmediateSigned (eModeThumb, 8 + imm32);
+            context.SetISAAndImmediateSigned (eModeThumb, 8 + imm32);
             break;
         default:
             return false;
@@ -1479,8 +1500,8 @@
         addr_t target = ReadCoreReg (Rm, &success);
         if (!success)
             return false;
-        Register dwarf_reg;
-        dwarf_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + Rm);
+        RegisterInfo dwarf_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + Rm, dwarf_reg);
         context.SetRegister (dwarf_reg);
         if (!WriteRegisterUnsigned (context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_RA, lr))
             return false;
@@ -1524,9 +1545,9 @@
         addr_t target = ReadCoreReg (Rm, &success);
         if (!success)
             return false;
-                  
-        Register dwarf_reg;
-        dwarf_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + Rm);
+
+        RegisterInfo dwarf_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + Rm, dwarf_reg);
         context.SetRegister (dwarf_reg);
         if (!BXWritePC(context, target))
             return false;
@@ -1583,8 +1604,8 @@
         if (!success)
             return false;
                   
-        Register dwarf_reg;
-        dwarf_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + Rm);
+        RegisterInfo dwarf_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + Rm, dwarf_reg);
         context.SetRegister (dwarf_reg);
         if (!BXWritePC(context, target))
             return false;
@@ -1634,8 +1655,8 @@
         
         EmulateInstruction::Context context;
         context.type = EmulateInstruction::eContextRegisterPlusOffset;
-        Register dwarf_reg;
-        dwarf_reg.SetRegister (eRegisterKindDWARF, dwarf_r12);
+        RegisterInfo dwarf_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r12, dwarf_reg);
         context.SetRegisterPlusOffset (dwarf_reg, -ip_offset);                             
     
         if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, dwarf_r7, addr))
@@ -1686,8 +1707,8 @@
         
         EmulateInstruction::Context context;
         context.type = EmulateInstruction::eContextRegisterPlusOffset;
-        Register dwarf_reg;
-        dwarf_reg.SetRegister (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP);
+        RegisterInfo dwarf_reg;
+        GetRegisterInfo (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP, dwarf_reg);
         context.SetRegisterPlusOffset (dwarf_reg, -sp_offset);
     
         if (!WriteRegisterUnsigned (context, eRegisterKindDWARF, dwarf_r12, addr))
@@ -1851,8 +1872,8 @@
         
         EmulateInstruction::Context context;
         context.type = EmulateInstruction::eContextPushRegisterOnStack;
-        Register sp_reg;
-        sp_reg.SetRegister (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP);
+        RegisterInfo sp_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_sp, sp_reg);
         context.SetRegisterPlusOffset (sp_reg, addr - sp);
         if (Rt != 15)
         {
@@ -1952,16 +1973,15 @@
         
         EmulateInstruction::Context context;
         context.type = EmulateInstruction::eContextPushRegisterOnStack;
-        Register dwarf_reg;
-        dwarf_reg.SetRegister (eRegisterKindDWARF, 0);
-        Register sp_reg;
-        sp_reg.SetRegister (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP);
+        RegisterInfo dwarf_reg;
+        RegisterInfo sp_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_sp, sp_reg);
         for (i=0; i<regs; ++i)
         {
-            dwarf_reg.num = start_reg + d + i;
+            GetRegisterInfo (eRegisterKindDWARF, start_reg + d + i, dwarf_reg);
             context.SetRegisterToRegisterPlusOffset ( dwarf_reg, sp_reg, addr - sp);
             // uint64_t to accommodate 64-bit registers.
-            uint64_t reg_value = ReadRegisterUnsigned(eRegisterKindDWARF, dwarf_reg.num, 0, &success);
+            uint64_t reg_value = ReadRegisterUnsigned(dwarf_reg, 0, &success);
             if (!success)
                 return false;
             if (!MemAWrite (context, addr, reg_value, reg_byte_size))
@@ -2047,18 +2067,17 @@
         
         EmulateInstruction::Context context;
         context.type = EmulateInstruction::eContextPopRegisterOffStack;
-        Register dwarf_reg;
-        dwarf_reg.SetRegister (eRegisterKindDWARF, 0);
-        Register sp_reg;
-        sp_reg.SetRegister (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP);
+        RegisterInfo dwarf_reg;
+        RegisterInfo sp_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_sp, sp_reg);
         for (i=0; i<regs; ++i)
         {
-            dwarf_reg.num = start_reg + d + i;
+            GetRegisterInfo (eRegisterKindDWARF, start_reg + d + i, dwarf_reg);
             context.SetRegisterPlusOffset (sp_reg, addr - sp);
             data = MemARead(context, addr, reg_byte_size, 0, &success);
             if (!success)
                 return false;    
-            if (!WriteRegisterUnsigned(context, eRegisterKindDWARF, dwarf_reg.num, data))
+            if (!WriteRegisterUnsigned(context, dwarf_reg, data))
                 return false;
             addr += reg_byte_size;
         }
@@ -2112,7 +2131,7 @@
                   
         EmulateInstruction::Context context;
         context.type = EmulateInstruction::eContextSupervisorCall;
-        context.SetModeAndImmediate (mode, imm32);
+        context.SetISAAndImmediate (mode, imm32);
         if (!WriteRegisterUnsigned (context, eRegisterKindGeneric, LLDB_REGNUM_GENERIC_RA, lr))
             return false;
     }
@@ -2162,12 +2181,12 @@
             // The 'cond' field is handled in EmulateInstructionARM::CurrentCond().
             imm32 = llvm::SignExtend32<9>(Bits32(opcode, 7, 0) << 1);
             target = pc + imm32;
-            context.SetModeAndImmediateSigned (eModeThumb, 4 + imm32);
+            context.SetISAAndImmediateSigned (eModeThumb, 4 + imm32);
             break;
         case eEncodingT2:
             imm32 = llvm::SignExtend32<12>(Bits32(opcode, 10, 0));
             target = pc + imm32;
-            context.SetModeAndImmediateSigned (eModeThumb, 4 + imm32);
+            context.SetISAAndImmediateSigned (eModeThumb, 4 + imm32);
             break;
         case eEncodingT3:
             // The 'cond' field is handled in EmulateInstructionARM::CurrentCond().
@@ -2180,7 +2199,7 @@
             uint32_t imm21 = (S << 20) | (J2 << 19) | (J1 << 18) | (imm6 << 12) | (imm11 << 1);
             imm32 = llvm::SignExtend32<21>(imm21);
             target = pc + imm32;
-            context.SetModeAndImmediateSigned (eModeThumb, 4 + imm32);
+            context.SetISAAndImmediateSigned (eModeThumb, 4 + imm32);
             break;
             }
         case eEncodingT4:
@@ -2195,13 +2214,13 @@
             uint32_t imm25 = (S << 24) | (I1 << 23) | (I2 << 22) | (imm10 << 12) | (imm11 << 1);
             imm32 = llvm::SignExtend32<25>(imm25);
             target = pc + imm32;
-            context.SetModeAndImmediateSigned (eModeThumb, 4 + imm32);
+            context.SetISAAndImmediateSigned (eModeThumb, 4 + imm32);
             break;
             }
         case eEncodingA1:
             imm32 = llvm::SignExtend32<26>(Bits32(opcode, 23, 0) << 2);
             target = pc + imm32;
-            context.SetModeAndImmediateSigned (eModeARM, 8 + imm32);
+            context.SetISAAndImmediateSigned (eModeARM, 8 + imm32);
             break;
         default:
             return false;
@@ -2246,7 +2265,7 @@
         imm32 = Bit32(opcode, 9) << 6 | Bits32(opcode, 7, 3) << 1;
         nonzero = BitIsSet(opcode, 11);
         target = pc + imm32;
-        context.SetModeAndImmediateSigned (eModeThumb, 4 + imm32);
+        context.SetISAAndImmediateSigned (eModeThumb, 4 + imm32);
         break;
     default:
         return false;
@@ -2326,7 +2345,7 @@
     // target address
     addr_t target = pc + offset;
     context.type = EmulateInstruction::eContextRelativeBranchImmediate;
-    context.SetModeAndImmediateSigned (eModeThumb, 4 + offset);
+    context.SetISAAndImmediateSigned (eModeThumb, 4 + offset);
 
     if (!BranchWritePC(context, target))
         return false;
@@ -2427,11 +2446,11 @@
         //(result, carry, overflow) = AddWithCarry(R[n], imm32, '0'); 
         AddWithCarryResult res = AddWithCarry (Rn, imm32, 0);
         
-        Register reg_n;
-        reg_n.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+        RegisterInfo reg_n;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, reg_n);
         
         EmulateInstruction::Context context;
-        context.type = eContextAddition;
+        context.type = eContextArithmetic;
         context.SetRegisterPlusOffset (reg_n, imm32);
         
         //R[d] = result; 
@@ -2495,9 +2514,9 @@
         AddWithCarryResult res = AddWithCarry(val1, imm32, 0);
 
         EmulateInstruction::Context context;
-        context.type = EmulateInstruction::eContextAddition;
-        Register dwarf_reg;
-        dwarf_reg.SetRegister (eRegisterKindDWARF, Rn);
+        context.type = eContextArithmetic;
+        RegisterInfo dwarf_reg;
+        GetRegisterInfo (eRegisterKindDWARF, Rn, dwarf_reg);
         context.SetRegisterPlusOffset (dwarf_reg, imm32);
 
         if (!WriteCoreRegOptionalFlags(context, res.result, Rd, setflags, res.carry_out, res.overflow))
@@ -2582,11 +2601,11 @@
         AddWithCarryResult res = AddWithCarry(val1, shifted, 0);
 
         EmulateInstruction::Context context;
-        context.type = EmulateInstruction::eContextAddition;
-        Register op1_reg;
-        Register op2_reg;
-        op1_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + Rn);
-        op2_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + Rm);
+        context.type = eContextArithmetic;
+        RegisterInfo op1_reg;
+        RegisterInfo op2_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + Rn, op1_reg);
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + Rm, op2_reg);
         context.SetRegisterRegisterOperands (op1_reg, op2_reg);
 
         if (!WriteCoreRegOptionalFlags(context, res.result, Rd, setflags, res.carry_out, res.overflow))
@@ -3297,8 +3316,8 @@
 
         EmulateInstruction::Context context;
         context.type = EmulateInstruction::eContextRegisterPlusOffset;
-        Register dwarf_reg;
-        dwarf_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+        RegisterInfo dwarf_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, dwarf_reg);
         context.SetRegisterPlusOffset (dwarf_reg, offset);
                   
         for (int i = 0; i < 14; ++i)
@@ -3414,8 +3433,8 @@
                                                         
         EmulateInstruction::Context context;
         context.type = EmulateInstruction::eContextRegisterPlusOffset;
-        Register dwarf_reg;
-        dwarf_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+        RegisterInfo dwarf_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, dwarf_reg);
         context.SetRegisterPlusOffset (dwarf_reg, offset);
                   
         // for i = 0 to 14 
@@ -3551,8 +3570,8 @@
         addr_t address = Rn - (addr_byte_size * BitCount (registers));
         EmulateInstruction::Context context;
         context.type = EmulateInstruction::eContextRegisterPlusOffset;
-        Register dwarf_reg;
-        dwarf_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+        RegisterInfo dwarf_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, dwarf_reg);
         context.SetRegisterPlusOffset (dwarf_reg, Rn - address);
                   
         for (int i = 0; i < 14; ++i)
@@ -3663,8 +3682,8 @@
                   
         EmulateInstruction::Context context;
         context.type = EmulateInstruction::eContextRegisterPlusOffset;
-        Register dwarf_reg;
-        dwarf_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+        RegisterInfo dwarf_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, dwarf_reg);
         context.SetRegisterPlusOffset (dwarf_reg, offset);
 
         for (int i = 0; i < 14; ++i)
@@ -3833,8 +3852,8 @@
 
         address = (index ? offset_addr : base);
 
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + Rn);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + Rn, base_reg);
         if (wback)
         {
             EmulateInstruction::Context ctx;
@@ -3966,8 +3985,8 @@
                   
         EmulateInstruction::Context context;
         context.type = EmulateInstruction::eContextRegisterStore;
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
                   
         // for i = 0 to 14
         int lowest_set_bit = 14;
@@ -3989,8 +4008,8 @@
                       if (!success)
                           return false;
                   
-                      Register data_reg;
-                      data_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + i);
+                      RegisterInfo data_reg;
+                      GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + i, data_reg);
                       context.SetRegisterToRegisterPlusOffset (data_reg, base_reg, offset);
                       if (!MemAWrite (context, address + offset, data, addr_byte_size))
                           return false;
@@ -4005,8 +4024,8 @@
         //     MemA[address,4] = PCStoreValue();
         if (BitIsSet (registers, 15))
         {
-            Register pc_reg;
-            pc_reg.SetRegister (eRegisterKindDWARF, dwarf_pc);
+            RegisterInfo pc_reg;
+            GetRegisterInfo (eRegisterKindDWARF, dwarf_pc, pc_reg);
             context.SetRegisterPlusOffset (pc_reg, 8);
             const uint32_t pc = ReadCoreReg (PC_REG, &success);
             if (!success)
@@ -4091,8 +4110,8 @@
                   
         EmulateInstruction::Context context;
         context.type = EmulateInstruction::eContextRegisterStore;
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
                   
         // for i = 0 to 14 
         int lowest_bit_set = 14;
@@ -4114,8 +4133,8 @@
                     if (!success)
                         return false;
                   
-                    Register data_reg;
-                    data_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + i);
+                    RegisterInfo data_reg;
+                    GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + i, data_reg);
                     context.SetRegisterToRegisterPlusOffset (data_reg, base_reg, Rn - (address + offset));
                     if (!MemAWrite (context, address + offset, data, addr_byte_size))
                         return false;
@@ -4130,8 +4149,8 @@
         //    MemA[address,4] = PCStoreValue();
         if (BitIsSet (registers, 15))
         {
-            Register pc_reg;
-            pc_reg.SetRegister (eRegisterKindDWARF, dwarf_pc);
+            RegisterInfo pc_reg;
+            GetRegisterInfo (eRegisterKindDWARF, dwarf_pc, pc_reg);
             context.SetRegisterPlusOffset (pc_reg, 8);
             const uint32_t pc = ReadCoreReg (PC_REG, &success);
             if (!success)
@@ -4242,8 +4261,8 @@
                   
         EmulateInstruction::Context context;
         context.type = EmulateInstruction::eContextRegisterStore;
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
                   
         // for i = 0 to 14
         uint32_t lowest_set_bit = 14;
@@ -4265,8 +4284,8 @@
                     if (!success)
                         return false;
                   
-                    Register data_reg;
-                    data_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + i);
+                    RegisterInfo data_reg;
+                    GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + i, data_reg);
                     context.SetRegisterToRegisterPlusOffset (data_reg, base_reg, Rn - (address + offset));
                     if (!MemAWrite (context, address + offset, data, addr_byte_size))
                         return false;
@@ -4281,8 +4300,8 @@
         //     MemA[address,4] = PCStoreValue();
         if (BitIsSet (registers, 15))
         {
-            Register pc_reg;
-            pc_reg.SetRegister (eRegisterKindDWARF, dwarf_pc);
+            RegisterInfo pc_reg;
+            GetRegisterInfo (eRegisterKindDWARF, dwarf_pc, pc_reg);
             context.SetRegisterPlusOffset (pc_reg, 8);
             const uint32_t pc = ReadCoreReg (PC_REG, &success);
             if (!success)
@@ -4367,8 +4386,8 @@
                   
         EmulateInstruction::Context context;
         context.type = EmulateInstruction::eContextRegisterStore;
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
                 
         uint32_t lowest_set_bit = 14;
         // for i = 0 to 14
@@ -4391,8 +4410,8 @@
                     if (!success)
                         return false;
                   
-                    Register data_reg;
-                    data_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + i);
+                    RegisterInfo data_reg;
+                    GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + i, data_reg);
                     context.SetRegisterToRegisterPlusOffset (data_reg, base_reg, offset + addr_byte_size);
                     if (!MemAWrite (context, address + offset, data, addr_byte_size))
                         return false;
@@ -4407,8 +4426,8 @@
             // MemA[address,4] = PCStoreValue();
         if (BitIsSet (registers, 15))
         {
-            Register pc_reg;
-            pc_reg.SetRegister (eRegisterKindDWARF, dwarf_pc);
+            RegisterInfo pc_reg;
+            GetRegisterInfo (eRegisterKindDWARF, dwarf_pc, pc_reg);
             context.SetRegisterPlusOffset (pc_reg, 8);
             const uint32_t pc = ReadCoreReg (PC_REG, &success);
             if (!success)
@@ -4556,8 +4575,8 @@
                   
         EmulateInstruction::Context context;
         context.type = eContextRegisterStore;
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 +  n);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
                   
         // if UnalignedSupport() || address<1:0> == '00' then
         if (UnalignedSupport () || (BitIsClear (address, 1) && BitIsClear (address, 0)))
@@ -4567,8 +4586,8 @@
             if (!success)
                 return false;
                   
-            Register data_reg;
-            data_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + t);
+            RegisterInfo data_reg;
+            GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + t, data_reg);
             int32_t offset = address - base_address;
             context.SetRegisterToRegisterPlusOffset (data_reg, base_reg, offset);
             if (!MemUWrite (context, address, data, addr_byte_size))
@@ -4754,11 +4773,11 @@
         {
             // MemU[address,4] = data; 
             
-            Register base_reg;
-            base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 +  n);
+            RegisterInfo base_reg;
+            GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 +  n, base_reg);
             
-            Register data_reg;
-            data_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + t);
+            RegisterInfo data_reg;
+            GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + t, data_reg);
             
             context.SetRegisterToRegisterPlusOffset (data_reg, base_reg, address - base_address);
             if (!MemUWrite (context, address, data, addr_byte_size))
@@ -4884,11 +4903,11 @@
             address = base_address;
                   
         // MemU[address,1] = R[t]<7:0>
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
                   
-        Register data_reg;
-        data_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + t);
+        RegisterInfo data_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + t, data_reg);
                   
         EmulateInstruction::Context context;
         context.type = eContextRegisterStore;
@@ -5050,10 +5069,10 @@
             
         EmulateInstruction::Context context;
         context.type = eContextRegisterStore;
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
-        Register offset_reg;
-        offset_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + m);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
+        RegisterInfo offset_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + m, offset_reg);
 
         // if UnalignedSupport() || address<0> == '0' then
         if (UnalignedSupport() || BitIsClear (address, 0))
@@ -5065,12 +5084,12 @@
              
             EmulateInstruction::Context context;
             context.type = eContextRegisterStore;
-            Register base_reg;
-            base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
-            Register offset_reg;
-            offset_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + m);
-            Register data_reg;
-            data_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + t);
+            RegisterInfo base_reg;
+            GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
+            RegisterInfo offset_reg;
+            GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + m, offset_reg);
+            RegisterInfo data_reg;
+            GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + t, data_reg);
             context.SetRegisterToRegisterPlusIndirectOffset (base_reg, offset_reg, data_reg);
             
             if (!MemUWrite (context, address, Bits32 (Rt, 15, 0), 2))
@@ -5713,8 +5732,8 @@
                   
         // data = MemU[address,4]; 
                   
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
                  
         EmulateInstruction::Context context;
         context.type = eContextRegisterLoad;
@@ -5916,8 +5935,8 @@
                 address = Rn;
                   
         // data = MemU[address,4]; 
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
                   
         EmulateInstruction::Context context;
         context.type = eContextRegisterLoad;
@@ -6087,10 +6106,10 @@
             address = Rn;
                   
         // R[t] = ZeroExtend(MemU[address,1], 32); 
-        Register base_reg;
-        Register data_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
-        data_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + t);
+        RegisterInfo base_reg;
+        RegisterInfo data_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + t, data_reg);
                   
         EmulateInstruction::Context context;
         context.type = eContextRegisterLoad;
@@ -6323,8 +6342,8 @@
             address = Rn;
                   
         // R[t] = ZeroExtend(MemU[address,1],32); 
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
         
         EmulateInstruction::Context context;
         context.type = eContextRegisterLoad;
@@ -6461,8 +6480,8 @@
             address = Rn;
                   
         // data = MemU[address,2]; 
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
                   
         EmulateInstruction::Context context;
         context.type = eContextRegisterLoad;
@@ -6575,8 +6594,8 @@
             address = base - imm32;
                   
         // data = MemU[address,2]; 
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC, base_reg);
                   
         EmulateInstruction::Context context;
         context.type = eContextRegisterLoad;
@@ -6740,10 +6759,10 @@
             address = Rn;
                   
         // data = MemU[address,2]; 
-        Register base_reg;
-        Register offset_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
-        offset_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + m);
+        RegisterInfo base_reg;
+        RegisterInfo offset_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + m, offset_reg);
                   
         EmulateInstruction::Context context;
         context.type = eContextRegisterLoad;
@@ -6901,8 +6920,8 @@
             address = Rn;
         
         // R[t] = SignExtend(MemU[address,1], 32);
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
                   
         EmulateInstruction::Context context;
         context.type = eContextRegisterLoad;
@@ -7000,8 +7019,8 @@
             address = base - imm32;
                   
         // R[t] = SignExtend(MemU[address,1], 32);
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC, base_reg);
             
         EmulateInstruction::Context context;
         context.type = eContextRegisterLoad;
@@ -7145,10 +7164,10 @@
             address = Rn;
                   
         // R[t] = SignExtend(MemU[address,1], 32); 
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
-        Register offset_reg;
-        offset_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + m);          
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
+        RegisterInfo offset_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + m, offset_reg);
                   
         EmulateInstruction::Context context;
         context.type = eContextRegisterLoad;
@@ -7296,8 +7315,8 @@
             address = Rn;
                   
         // data = MemU[address,2]; 
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
                   
         EmulateInstruction::Context context;
         context.type = eContextRegisterLoad;
@@ -7410,8 +7429,8 @@
             address = base - imm32;
                   
         // data = MemU[address,2]; 
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC, base_reg);
                   
         EmulateInstruction::Context context;
         context.type = eContextRegisterLoad;
@@ -7572,11 +7591,11 @@
             address = Rn;
                   
         // data = MemU[address,2]; 
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
                   
-        Register offset_reg;
-        offset_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + m);
+        RegisterInfo offset_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + m, offset_reg);
                   
         EmulateInstruction::Context context;
         context.type = eContextRegisterLoad;
@@ -7684,8 +7703,8 @@
         // R[d] = SignExtend(rotated<7:0>, 32);
         int64_t data = llvm::SignExtend64<8>(rotated);
                   
-        Register source_reg;
-        source_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + m);
+        RegisterInfo source_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + m, source_reg);
                   
         EmulateInstruction::Context context;
         context.type = eContextRegisterLoad;
@@ -7764,8 +7783,8 @@
         uint64_t rotated = ROR (Rm, rotation);
                   
         // R[d] = SignExtend(rotated<15:0>, 32);
-        Register source_reg;
-        source_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + m);
+        RegisterInfo source_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + m, source_reg);
                   
         EmulateInstruction::Context context;
         context.type = eContextRegisterLoad;
@@ -7846,8 +7865,8 @@
         uint64_t rotated = ROR (Rm, rotation);
                   
         // R[d] = ZeroExtend(rotated<7:0>, 32);
-        Register source_reg;
-        source_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + m);
+        RegisterInfo source_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + m, source_reg);
                   
         EmulateInstruction::Context context;
         context.type = eContextRegisterLoad;
@@ -7925,8 +7944,8 @@
         uint64_t rotated = ROR (Rm, rotation);
                   
         // R[d] = ZeroExtend(rotated<15:0>, 32);
-        Register source_reg;
-        source_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + m);
+        RegisterInfo source_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + m, source_reg);
                   
         EmulateInstruction::Context context;
         context.type = eContextRegisterLoad;
@@ -8043,8 +8062,8 @@
                 address = address + 4;
                   
             // CPSRWriteByInstr(MemA[address+4,4], '1111', TRUE);
-            Register base_reg;
-            base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+            RegisterInfo base_reg;
+            GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
                   
             EmulateInstruction::Context context;
             context.type = eContextReturnFromException;
@@ -9331,11 +9350,11 @@
         AddWithCarryResult res = AddWithCarry (sp_val, ~shifted, 1);
 
         EmulateInstruction::Context context;
-        context.type = eContextSubtraction;
-        Register sp_reg;
-        sp_reg.SetRegister (eRegisterKindGeneric, LLDB_REGNUM_GENERIC_SP);
-        Register dwarf_reg;
-        dwarf_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + m);
+        context.type = eContextArithmetic;
+        RegisterInfo sp_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_sp, sp_reg);
+        RegisterInfo dwarf_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + m, dwarf_reg);
         context.SetRegisterRegisterOperands (sp_reg, dwarf_reg);
 
         if (!WriteCoreRegOptionalFlags(context, res.result, dwarf_r0 + d, setflags, res.carry_out, res.overflow))
@@ -9419,11 +9438,11 @@
                   
         // R[d] = result;
         EmulateInstruction::Context context;
-        context.type = eContextAddition;
-        Register reg_n;
-        reg_n.SetRegister (eRegisterKindDWARF, dwarf_r0 +n);
-        Register reg_m;
-        reg_m.SetRegister (eRegisterKindDWARF, dwarf_r0 + m);
+        context.type = eContextArithmetic;
+        RegisterInfo reg_n;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, reg_n);
+        RegisterInfo reg_m;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + m, reg_m);
             
         context.SetRegisterRegisterOperands (reg_n, reg_m);
         
@@ -9551,11 +9570,11 @@
                 // APSR.V = overflow;
                   
         EmulateInstruction::Context context;
-        context.type = eContextSubtraction;
-        Register reg_n;
-        reg_n.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
-        Register reg_m;
-        reg_m.SetRegister (eRegisterKindDWARF, dwarf_r0 + m);
+        context.type = eContextArithmetic;
+        RegisterInfo reg_n;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, reg_n);
+        RegisterInfo reg_m;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + m, reg_m);
         context.SetRegisterRegisterOperands (reg_n, reg_m);
                   
         if (!WriteCoreRegOptionalFlags (context, res.result, dwarf_r0 + d, setflags, res.carry_out, res.overflow))
@@ -9638,10 +9657,10 @@
                   
         addr_t address = Rn + imm32;
                   
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
-        Register data_reg;
-        data_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + t);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
+        RegisterInfo data_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + t, data_reg);
         EmulateInstruction::Context context;
         context.type = eContextRegisterStore;
         context.SetRegisterToRegisterPlusOffset (data_reg, base_reg, imm32);
@@ -9748,10 +9767,10 @@
         if (!success)
             return false;
                   
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
-        Register data_reg;
-        data_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + t);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
+        RegisterInfo data_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + t, data_reg);
         EmulateInstruction::Context context;
         context.type = eContextRegisterStore;
         context.SetRegisterToRegisterPlusOffset (data_reg, base_reg, address - Rn);
@@ -9838,10 +9857,10 @@
         else
             address = Rn;
                   
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
-        Register data_reg;
-        data_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + t);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
+        RegisterInfo data_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + t, data_reg);
         EmulateInstruction::Context context;
         context.type = eContextRegisterStore;
         context.SetRegisterToRegisterPlusOffset (data_reg, base_reg, address - Rn);
@@ -9986,8 +10005,8 @@
             address = Rn;
                   
         //R[t] = MemA[address,4];
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
                   
         EmulateInstruction::Context context;
         context.type = eContextRegisterLoad;
@@ -10093,14 +10112,14 @@
         uint32_t Rn = ReadCoreReg (n, &success);
         if (!success)
             return false;
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
                   
         uint32_t Rm = ReadCoreReg (m, &success);
         if (!success)
             return false;
-        Register offset_reg;
-        offset_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + m);
+        RegisterInfo offset_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + m, offset_reg);
                   
         // offset_addr = if add then (R[n] + R[m]) else (R[n] - R[m]);
         addr_t offset_addr;
@@ -10238,8 +10257,8 @@
                 return false;
         }
                   
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
         
         uint32_t Rn = ReadCoreReg (n, &success);
         if (!success)
@@ -10260,8 +10279,8 @@
             address = Rn;
                   
         //MemA[address,4] = R[t];
-        Register data_reg;
-        data_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + t);
+        RegisterInfo data_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + t, data_reg);
                   
         uint32_t data = ReadCoreReg (t, &success);
         if (!success)
@@ -10277,7 +10296,7 @@
             return false;
 
         //MemA[address+4,4] = R[t2];
-        data_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + t2);
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + t2, data_reg);
         context.SetRegisterToRegisterPlusOffset (data_reg, base_reg, (address + 4) - Rn);
                   
         data = ReadCoreReg (t2, &success);
@@ -10367,12 +10386,11 @@
                 return false;
         }
                   
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
-        Register offset_reg;
-        offset_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + m);
-        Register data_reg;
-        data_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + t);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
+        RegisterInfo offset_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + m, offset_reg);
+        RegisterInfo data_reg;
                   
         uint32_t Rn = ReadCoreReg (n, &success);
         if (!success)
@@ -10402,6 +10420,7 @@
                   
         EmulateInstruction::Context context;
         context.type = eContextRegisterStore;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + t, data_reg);
         context.SetRegisterToRegisterPlusIndirectOffset (base_reg, offset_reg, data_reg);
                   
         const uint32_t addr_byte_size = GetAddressByteSize();
@@ -10414,7 +10433,7 @@
         if (!success)
             return false;
                   
-        data_reg.num = dwarf_r0 + t2;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + t2, data_reg);
                 
         context.SetRegisterToRegisterPlusIndirectOffset (base_reg, offset_reg, data_reg);
             
@@ -10445,7 +10464,7 @@
     if ConditionPassed() then
         EncodingSpecificOperations(); CheckVFPEnabled(TRUE); NullCheckIfThumbEE(n);
         address = if add then R[n] else R[n]-imm32;
-        if wback then R[n] = if add then R[n}+imm32 else R[n]-imm32;
+        if wback then R[n] = if add then R[n]+imm32 else R[n]-imm32;
         for r = 0 to regs-1
             if single_regs then
                 S[d+r] = MemA[address,4]; address = address+4;
@@ -10536,8 +10555,8 @@
                 return false;
         }
                                            
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
                                            
         uint32_t Rn = ReadCoreReg (n, &success);
         if (!success)
@@ -10550,7 +10569,7 @@
         else
             address = Rn - imm32;
                                            
-        // if wback then R[n] = if add then R[n}+imm32 else R[n]-imm32;
+        // if wback then R[n] = if add then R[n]+imm32 else R[n]-imm32;
         EmulateInstruction::Context context;
                                            
         if (wback)
@@ -10636,7 +10655,7 @@
     if ConditionPassed() then
         EncodingSpecificOperations(); CheckVFPEnabled(TRUE); NullCheckIfThumbEE(n);
         address = if add then R[n] else R[n]-imm32;
-        if wback then R[n] = if add then R[n}+imm32 else R[n]-imm32;
+        if wback then R[n] = if add then R[n]+imm32 else R[n]-imm32;
         for r = 0 to regs-1
             if single_regs then
                 MemA[address,4] = S[d+r]; address = address+4;
@@ -10729,8 +10748,8 @@
                 return false;
         }
         
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
         
         uint32_t Rn = ReadCoreReg (n, &success);
         if (!success)
@@ -10744,7 +10763,7 @@
             address = Rn - imm32;
             
         EmulateInstruction::Context context;
-        // if wback then R[n] = if add then R[n}+imm32 else R[n]-imm32;
+        // if wback then R[n] = if add then R[n]+imm32 else R[n]-imm32;
         if (wback)
         {
             uint32_t value;
@@ -10767,16 +10786,16 @@
         // for r = 0 to regs-1
         for (int r = 0; r < regs; ++r)
         {
-            Register data_reg;
-            data_reg.SetRegister (eRegisterKindDWARF, 0);
+            
             if (single_regs)
             {
                 // MemA[address,4] = S[d+r]; address = address+4;
                 uint32_t data = ReadRegisterUnsigned (eRegisterKindDWARF, start_reg + d + r, 0, &success);
                 if (!success)
                     return false;
-                
-                data_reg.num = start_reg + d + r;
+            
+                RegisterInfo data_reg;
+                GetRegisterInfo (eRegisterKindDWARF, start_reg + d + r, data_reg);
                 context.SetRegisterToRegisterPlusOffset (data_reg, base_reg, address - Rn);
                 if (!MemAWrite (context, address, data, addr_byte_size))
                     return false;
@@ -10792,7 +10811,8 @@
                 if (!success)
                     return false;
                     
-                data_reg.num = start_reg + d + r;
+                RegisterInfo data_reg;
+                GetRegisterInfo (eRegisterKindDWARF, start_reg + d + r, data_reg);
                 
                 if (GetByteOrder() == eByteOrderBig)
                 {
@@ -10882,8 +10902,8 @@
             default:
                 return false;
         }
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
         
         uint32_t Rn = ReadCoreReg (n, &success);
         if (!success)
@@ -11020,8 +11040,8 @@
                 return false;
         }
         
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
         
         uint32_t Rn = ReadCoreReg (n, &success);
         if (!success)
@@ -11037,8 +11057,8 @@
         const uint32_t addr_byte_size = GetAddressByteSize();
         uint32_t start_reg = single_reg ? dwarf_s0 : dwarf_d0;
 
-        Register data_reg;
-        data_reg.SetRegister (eRegisterKindDWARF, start_reg + d);
+        RegisterInfo data_reg;
+        GetRegisterInfo (eRegisterKindDWARF, start_reg + d, data_reg);
         EmulateInstruction::Context context;
         context.type = eContextRegisterStore;
         context.SetRegisterToRegisterPlusOffset (data_reg, base_reg, address - Rn);
@@ -11191,8 +11211,8 @@
                 return false;
         }
         
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
         
         uint32_t Rn = ReadCoreReg (n, &success);
         if (!success)
@@ -11359,8 +11379,8 @@
                 return false;
         }
         
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
         
         uint32_t Rn = ReadCoreReg (n, &success);
         if (!success)
@@ -11526,8 +11546,8 @@
                 return false;
         }
         
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
         
         uint32_t Rn = ReadCoreReg (n, &success);
         if (!success)
@@ -11559,13 +11579,12 @@
                 return false;
         }
         
+        RegisterInfo data_reg;
         context.type = eContextRegisterStore;
-        Register data_reg;
-        data_reg.SetRegister (eRegisterKindDWARF, 0);
         // for r = 0 to regs-1
         for (int r = 0; r < regs; ++r)
         {
-            data_reg.num = dwarf_d0 + d + r;
+            GetRegisterInfo (eRegisterKindDWARF, dwarf_d0 + d + r, data_reg);
             uint64_t register_data = ReadRegisterUnsigned (eRegisterKindDWARF, dwarf_d0 + d + r, 0, &success);
             if (!success)
                 return false;
@@ -11695,8 +11714,8 @@
                 return false;
         }
         
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 + n);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
         
         uint32_t Rn = ReadCoreReg (n, &success);
         if (!success)
@@ -11735,8 +11754,8 @@
             
         uint64_t word = Bits64 (register_data, ((index + 1) * esize) - 1,  index * esize);
         
-        Register data_reg;
-        data_reg.SetRegister (eRegisterKindDWARF, dwarf_d0 + d);
+        RegisterInfo data_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_d0 + d, data_reg);
         context.type = eContextRegisterStore;
         context.SetRegisterToRegisterPlusOffset (data_reg, base_reg, address - Rn);
         
@@ -11821,8 +11840,8 @@
                 break;
         }
         
-        Register base_reg;
-        base_reg.SetRegister (eRegisterKindDWARF, dwarf_r0 +n);
+        RegisterInfo base_reg;
+        GetRegisterInfo (eRegisterKindDWARF, dwarf_r0 + n, base_reg);
         
         uint32_t Rn = ReadCoreReg (n, &success);
         if (!success)
@@ -12958,7 +12977,7 @@
             cpsr_changed = true;
         }
         target = addr & 0xfffffffe;
-        context.SetMode (eModeThumb);
+        context.SetISA (eModeThumb);
     }
     else if (BitIsClear(addr, 1))
     {
@@ -12968,7 +12987,7 @@
             cpsr_changed = true;
         }
         target = addr & 0xfffffffc;
-        context.SetMode (eModeARM);
+        context.SetISA (eModeARM);
     }
     else
         return false; // address<1:0> == '10' => UNPREDICTABLE
@@ -13369,27 +13388,52 @@
         
     return success;
 }
-
-                                           
-const char *
-EmulateInstructionARM::GetRegisterName (uint32_t reg_kind, uint32_t reg_num)
+//
+//                                           
+//const char *
+//EmulateInstructionARM::GetRegisterName (uint32_t reg_kind, uint32_t reg_num)
+//{
+//    if (reg_kind == eRegisterKindGeneric)
+//    {
+//        switch (reg_num)
+//        {
+//        case LLDB_REGNUM_GENERIC_PC:    return "pc";
+//        case LLDB_REGNUM_GENERIC_SP:    return "sp";
+//        case LLDB_REGNUM_GENERIC_FP:    return "fp";
+//        case LLDB_REGNUM_GENERIC_RA:    return "lr";
+//        case LLDB_REGNUM_GENERIC_FLAGS: return "cpsr";
+//        default: return NULL;
+//        }
+//    }
+//    else if (reg_kind == eRegisterKindDWARF)
+//    {
+//        return GetARMDWARFRegisterName (reg_num);
+//    }
+//    return NULL;
+//}
+//
+bool
+EmulateInstructionARM::CreateFunctionEntryUnwind (UnwindPlan &unwind_plan)
 {
-    if (reg_kind == eRegisterKindGeneric)
-    {
-        switch (reg_num)
-        {
-        case LLDB_REGNUM_GENERIC_PC:    return "pc";
-        case LLDB_REGNUM_GENERIC_SP:    return "sp";
-        case LLDB_REGNUM_GENERIC_FP:    return "fp";
-        case LLDB_REGNUM_GENERIC_RA:    return "lr";
-        case LLDB_REGNUM_GENERIC_FLAGS: return "cpsr";
-        default: return NULL;
-        }
-    }
-    else if (reg_kind == eRegisterKindDWARF)
-    {
-        return GetARMDWARFRegisterName (reg_num);
-    }
-    return NULL;
+    unwind_plan.SetRegisterKind (eRegisterKindDWARF);
+
+    UnwindPlan::Row row;
+    UnwindPlan::Row::RegisterLocation regloc;
+
+    // Our previous Call Frame Address is the stack pointer
+    row.SetCFARegister (dwarf_sp);
+    
+    // Our previous PC is in the LR
+    regloc.SetInRegister(dwarf_lr);
+    row.SetRegisterInfo (dwarf_pc, regloc);
+    unwind_plan.AppendRow (row);
+
+    // All other registers are the same.
+    
+    unwind_plan.SetSourceName ("EmulateInstructionARM");
+    return true;
 }
 
+
+
+