diff options
Diffstat (limited to 'lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp')
| -rw-r--r-- | lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp | 29 | 
1 files changed, 26 insertions, 3 deletions
diff --git a/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp b/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp index 82e14dc13cb16..551cd36d19843 100644 --- a/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp +++ b/lib/CodeGen/AsmPrinter/DebugHandlerBase.cpp @@ -12,7 +12,7 @@  //  //===----------------------------------------------------------------------===// -#include "DebugHandlerBase.h" +#include "llvm/CodeGen/DebugHandlerBase.h"  #include "llvm/ADT/Optional.h"  #include "llvm/ADT/Twine.h"  #include "llvm/CodeGen/AsmPrinter.h" @@ -125,6 +125,21 @@ MCSymbol *DebugHandlerBase::getLabelAfterInsn(const MachineInstr *MI) {    return LabelsAfterInsn.lookup(MI);  } +// Return the function-local offset of an instruction. +const MCExpr * +DebugHandlerBase::getFunctionLocalOffsetAfterInsn(const MachineInstr *MI) { +  MCContext &MC = Asm->OutContext; + +  MCSymbol *Start = Asm->getFunctionBegin(); +  const auto *StartRef = MCSymbolRefExpr::create(Start, MC); + +  MCSymbol *AfterInsn = getLabelAfterInsn(MI); +  assert(AfterInsn && "Expected label after instruction"); +  const auto *AfterRef = MCSymbolRefExpr::create(AfterInsn, MC); + +  return MCBinaryExpr::createSub(AfterRef, StartRef, MC); +} +  /// If this type is derived from a base type then return base type size.  uint64_t DebugHandlerBase::getBaseTypeSize(const DITypeRef TyRef) {    DIType *Ty = TyRef.resolve(); @@ -190,8 +205,9 @@ void DebugHandlerBase::beginFunction(const MachineFunction *MF) {    // Calculate history for local variables.    assert(DbgValues.empty() && "DbgValues map wasn't cleaned!"); -  calculateDbgValueHistory(MF, Asm->MF->getSubtarget().getRegisterInfo(), -                           DbgValues); +  assert(DbgLabels.empty() && "DbgLabels map wasn't cleaned!"); +  calculateDbgEntityHistory(MF, Asm->MF->getSubtarget().getRegisterInfo(), +                            DbgValues, DbgLabels);    LLVM_DEBUG(DbgValues.dump());    // Request labels for the full history. @@ -229,6 +245,12 @@ void DebugHandlerBase::beginFunction(const MachineFunction *MF) {      }    } +  // Ensure there is a symbol before DBG_LABEL. +  for (const auto &I : DbgLabels) { +    const MachineInstr *MI = I.second; +    requestLabelBeforeInsn(MI); +  } +    PrevInstLoc = DebugLoc();    PrevLabel = Asm->getFunctionBegin();    beginFunctionImpl(MF); @@ -296,6 +318,7 @@ void DebugHandlerBase::endFunction(const MachineFunction *MF) {    if (hasDebugInfo(MMI, MF))      endFunctionImpl(MF);    DbgValues.clear(); +  DbgLabels.clear();    LabelsBeforeInsn.clear();    LabelsAfterInsn.clear();  }  | 
