Revert "Refactor DebugLocDWARFExpression so it doesn't require access to the"
[oota-llvm.git] / lib / CodeGen / AsmPrinter / DwarfExpression.cpp
index eb101ca2dcbbeee70ee45ee63f284a560e39d43b..fcab067424e8aa204325726a9e9bc3660040fe27 100644 (file)
@@ -92,6 +92,9 @@ bool DwarfExpression::AddMachineRegPiece(unsigned MachineReg,
                                          unsigned PieceSizeInBits,
                                          unsigned PieceOffsetInBits) {
   const TargetRegisterInfo *TRI = getTRI();
+  if (!TRI->isPhysicalRegister(MachineReg))
+    return false;
+
   int Reg = TRI->getDwarfRegNum(MachineReg, false);
 
   // If this is a valid register number, emit it.
@@ -208,18 +211,17 @@ bool DwarfExpression::AddMachineRegExpression(DIExpression Expr,
 
   bool ValidReg = false;
   switch (*I) {
-  case dwarf::DW_OP_piece: {
-    unsigned SizeOfByte = 8;
-    unsigned OffsetInBits = I.getArg(1) * SizeOfByte;
-    unsigned SizeInBits   = I.getArg(2) * SizeOfByte;
+  case dwarf::DW_OP_bit_piece: {
+    unsigned OffsetInBits = I->getArg(1);
+    unsigned SizeInBits   = I->getArg(2);
     // Piece always comes at the end of the expression.
     return AddMachineRegPiece(MachineReg, SizeInBits,
                getOffsetOrZero(OffsetInBits, PieceOffsetInBits));
   }
   case dwarf::DW_OP_plus:
     // [DW_OP_reg,Offset,DW_OP_plus,DW_OP_deref] --> [DW_OP_breg,Offset].
-    if (*std::next(I) == dwarf::DW_OP_deref) {
-      unsigned Offset = I.getArg(1);
+    if (I->getNext() == dwarf::DW_OP_deref) {
+      unsigned Offset = I->getArg(1);
       ValidReg = AddMachineRegIndirect(MachineReg, Offset);
       std::advance(I, 2);
       break;
@@ -238,24 +240,24 @@ bool DwarfExpression::AddMachineRegExpression(DIExpression Expr,
     return false;
 
   // Emit remaining elements of the expression.
-  AddExpression(I, PieceOffsetInBits);
+  AddExpression(I, Expr.end(), PieceOffsetInBits);
   return true;
 }
 
 void DwarfExpression::AddExpression(DIExpression::iterator I,
+                                    DIExpression::iterator E,
                                     unsigned PieceOffsetInBits) {
for (; I != DIExpression::iterator(); ++I) {
 for (; I != E; ++I) {
     switch (*I) {
-    case dwarf::DW_OP_piece: {
-      unsigned SizeOfByte = 8;
-      unsigned OffsetInBits = I.getArg(1) * SizeOfByte;
-      unsigned SizeInBits   = I.getArg(2) * SizeOfByte;
+    case dwarf::DW_OP_bit_piece: {
+      unsigned OffsetInBits = I->getArg(1);
+      unsigned SizeInBits   = I->getArg(2);
       AddOpPiece(SizeInBits, getOffsetOrZero(OffsetInBits, PieceOffsetInBits));
       break;
     }
     case dwarf::DW_OP_plus:
       EmitOp(dwarf::DW_OP_plus_uconst);
-      EmitUnsigned(I.getArg(1));
+      EmitUnsigned(I->getArg(1));
       break;
     case dwarf::DW_OP_deref:
       EmitOp(dwarf::DW_OP_deref);