diff options
Diffstat (limited to 'lib/CodeGen/AsmPrinter/DwarfExpression.cpp')
| -rw-r--r-- | lib/CodeGen/AsmPrinter/DwarfExpression.cpp | 29 | 
1 files changed, 24 insertions, 5 deletions
diff --git a/lib/CodeGen/AsmPrinter/DwarfExpression.cpp b/lib/CodeGen/AsmPrinter/DwarfExpression.cpp index 68d25fe37b433..d8d1a5e8f8411 100644 --- a/lib/CodeGen/AsmPrinter/DwarfExpression.cpp +++ b/lib/CodeGen/AsmPrinter/DwarfExpression.cpp @@ -123,7 +123,10 @@ bool DwarfExpression::addMachineReg(const TargetRegisterInfo &TRI,    const TargetRegisterClass *RC = TRI.getMinimalPhysRegClass(MachineReg);    unsigned RegSize = TRI.getRegSizeInBits(*RC);    // Keep track of the bits in the register we already emitted, so we -  // can avoid emitting redundant aliasing subregs. +  // can avoid emitting redundant aliasing subregs. Because this is +  // just doing a greedy scan of all subregisters, it is possible that +  // this doesn't find a combination of subregisters that fully cover +  // the register (even though one may exist).    SmallBitVector Coverage(RegSize, false);    for (MCSubRegIterator SR(MachineReg, &TRI); SR.isValid(); ++SR) {      unsigned Idx = TRI.getSubRegIndex(MachineReg, *SR); @@ -143,7 +146,7 @@ bool DwarfExpression::addMachineReg(const TargetRegisterInfo &TRI,      if (CurSubReg.test(Coverage)) {        // Emit a piece for any gap in the coverage.        if (Offset > CurPos) -        DwarfRegs.push_back({-1, Offset - CurPos, nullptr}); +        DwarfRegs.push_back({-1, Offset - CurPos, "no DWARF register encoding"});        DwarfRegs.push_back(            {Reg, std::min<unsigned>(Size, MaxSize - Offset), "sub-register"});        if (Offset >= MaxSize) @@ -154,8 +157,13 @@ bool DwarfExpression::addMachineReg(const TargetRegisterInfo &TRI,        CurPos = Offset + Size;      }    } - -  return CurPos; +  // Failed to find any DWARF encoding. +  if (CurPos == 0) +    return false; +  // Found a partial or complete DWARF encoding. +  if (CurPos < RegSize) +    DwarfRegs.push_back({-1, RegSize - CurPos, "no DWARF register encoding"}); +  return true;  }  void DwarfExpression::addStackValue() { @@ -341,11 +349,22 @@ void DwarfExpression::addExpression(DIExpressionCursor &&ExprCursor,      case dwarf::DW_OP_plus:      case dwarf::DW_OP_minus:      case dwarf::DW_OP_mul: +    case dwarf::DW_OP_div: +    case dwarf::DW_OP_mod: +    case dwarf::DW_OP_or: +    case dwarf::DW_OP_and: +    case dwarf::DW_OP_xor: +    case dwarf::DW_OP_shl: +    case dwarf::DW_OP_shr: +    case dwarf::DW_OP_shra: +    case dwarf::DW_OP_lit0: +    case dwarf::DW_OP_not: +    case dwarf::DW_OP_dup:        emitOp(Op->getOp());        break;      case dwarf::DW_OP_deref:        assert(LocationKind != Register); -      if (LocationKind != Memory && isMemoryLocation(ExprCursor)) +      if (LocationKind != Memory && ::isMemoryLocation(ExprCursor))          // Turning this into a memory location description makes the deref          // implicit.          LocationKind = Memory;  | 
