diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp | 10 | ||||
| -rw-r--r-- | llvm/lib/IR/DebugInfoMetadata.cpp | 18 | 
2 files changed, 27 insertions, 1 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp index 87b45c001de..9d60fff3bcc 100644 --- a/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/CodeViewDebug.cpp @@ -888,13 +888,21 @@ void CodeViewDebug::collectVariableInfoFromMFTable(      if (!Scope)        continue; +    // If the variable has an attached offset expression, extract it. +    // FIXME: Try to handle DW_OP_deref as well. +    int64_t ExprOffset = 0; +    if (VI.Expr) +      if (!VI.Expr->extractIfOffset(ExprOffset)) +        continue; +      // Get the frame register used and the offset.      unsigned FrameReg = 0;      int FrameOffset = TFI->getFrameIndexReference(*Asm->MF, VI.Slot, FrameReg);      uint16_t CVReg = TRI->getCodeViewRegNum(FrameReg);      // Calculate the label ranges. -    LocalVarDefRange DefRange = createDefRangeMem(CVReg, FrameOffset); +    LocalVarDefRange DefRange = +        createDefRangeMem(CVReg, FrameOffset + ExprOffset);      for (const InsnRange &Range : Scope->getRanges()) {        const MCSymbol *Begin = getLabelBeforeInsn(Range.first);        const MCSymbol *End = getLabelAfterInsn(Range.second); diff --git a/llvm/lib/IR/DebugInfoMetadata.cpp b/llvm/lib/IR/DebugInfoMetadata.cpp index cdbe237766a..e6c49cad072 100644 --- a/llvm/lib/IR/DebugInfoMetadata.cpp +++ b/llvm/lib/IR/DebugInfoMetadata.cpp @@ -672,6 +672,24 @@ void DIExpression::appendOffset(SmallVectorImpl<uint64_t> &Ops,    }  } +bool DIExpression::extractIfOffset(int64_t &Offset) const { +  if (getNumElements() == 0) { +    Offset = 0; +    return true; +  } +  if (getNumElements() != 2) +    return false; +  if (Elements[0] == dwarf::DW_OP_plus) { +    Offset = Elements[1]; +    return true; +  } +  if (Elements[0] == dwarf::DW_OP_minus) { +    Offset = -Elements[1]; +    return true; +  } +  return false; +} +  DIExpression *DIExpression::prepend(const DIExpression *Expr, bool Deref,                                      int64_t Offset, bool StackValue) {    SmallVector<uint64_t, 8> Ops;  | 

