Commit f55ab6f9 authored by Adrian Prantl's avatar Adrian Prantl
Browse files

Fix a buffer-size bug when the first DW_OP_piece is undefined

and document the shortcomings of LLDB's partially defined DW_OP_piece
handling.

This would manifest as "DW_OP_piece for offset foo but top of stack is
of size bar".

rdar://problem/46262998

Differential Revision: https://reviews.llvm.org/D72880
parent 7b0d58e3
Loading
Loading
Loading
Loading
+5 −1
Original line number Diff line number Diff line
@@ -2071,6 +2071,10 @@ bool DWARFExpression::Evaluate(
          // not available. Fill with zeros for now by resizing the data and
          // appending it
          curr_piece.ResizeData(piece_byte_size);
          // Note that "0" is not a correct value for the unknown bits.
          // It would be better to also return a mask of valid bits together
          // with the expression result, so the debugger can print missing
          // members as "<optimized out>" or something.
          ::memset(curr_piece.GetBuffer().GetBytes(), 0, piece_byte_size);
          pieces.AppendDataToHostBuffer(curr_piece);
        } else {
@@ -2193,8 +2197,8 @@ bool DWARFExpression::Evaluate(
              return false;
            }
          }
          op_piece_offset += piece_byte_size;
        }
        op_piece_offset += piece_byte_size;
      }
    } break;

+5 −0
Original line number Diff line number Diff line
@@ -355,4 +355,9 @@ TEST(DWARFExpression, DW_OP_piece) {
  EXPECT_THAT_EXPECTED(Evaluate({DW_OP_const2u, 0x11, 0x22, DW_OP_piece, 2,
                                 DW_OP_const2u, 0x33, 0x44, DW_OP_piece, 2}),
                       llvm::HasValue(GetScalar(32, 0x44332211, true)));
  EXPECT_THAT_EXPECTED(
      Evaluate({DW_OP_piece, 1, DW_OP_const1u, 0xff, DW_OP_piece, 1}),
      // Note that the "00" should really be "undef", but we can't
      // represent that yet.
      llvm::HasValue(GetScalar(16, 0xff00, true)));
}