diff options
Diffstat (limited to 'llvm/lib')
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp | 23 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h | 3 | ||||
| -rw-r--r-- | llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp | 5 | 
3 files changed, 23 insertions, 8 deletions
diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp index 46c8bd8a0ed..4ed452d61d5 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.cpp @@ -892,9 +892,13 @@ void DwarfCompileUnit::constructAbstractSubprogramScopeDIE(      ContextCU->addDIEEntry(*AbsDef, dwarf::DW_AT_object_pointer, *ObjectPointer);  } +/// Whether to use the GNU analog for a DWARF5 tag, attribute, or location atom. +static bool useGNUAnalogForDwarf5Feature(DwarfDebug *DD) { +  return DD->getDwarfVersion() == 4 && DD->tuneForGDB(); +} +  dwarf::Tag DwarfCompileUnit::getDwarf5OrGNUCallSiteTag(dwarf::Tag Tag) const { -  bool ApplyGNUExtensions = DD->getDwarfVersion() == 4 && DD->tuneForGDB(); -  if (!ApplyGNUExtensions) +  if (!useGNUAnalogForDwarf5Feature(DD))      return Tag;    switch (Tag) {    case dwarf::DW_TAG_call_site: @@ -908,8 +912,7 @@ dwarf::Tag DwarfCompileUnit::getDwarf5OrGNUCallSiteTag(dwarf::Tag Tag) const {  dwarf::Attribute  DwarfCompileUnit::getDwarf5OrGNUCallSiteAttr(dwarf::Attribute Attr) const { -  bool ApplyGNUExtensions = DD->getDwarfVersion() == 4 && DD->tuneForGDB(); -  if (!ApplyGNUExtensions) +  if (!useGNUAnalogForDwarf5Feature(DD))      return Attr;    switch (Attr) {    case dwarf::DW_AT_call_all_calls: @@ -929,6 +932,18 @@ DwarfCompileUnit::getDwarf5OrGNUCallSiteAttr(dwarf::Attribute Attr) const {    }  } +dwarf::LocationAtom +DwarfCompileUnit::getDwarf5OrGNULocationAtom(dwarf::LocationAtom Loc) const { +  if (!useGNUAnalogForDwarf5Feature(DD)) +    return Loc; +  switch (Loc) { +  case dwarf::DW_OP_entry_value: +    return dwarf::DW_OP_GNU_entry_value; +  default: +    llvm_unreachable("DWARF5 location atom with no GNU analog"); +  } +} +  DIE &DwarfCompileUnit::constructCallSiteEntryDIE(      DIE &ScopeDIE, const DISubprogram *CalleeSP, bool IsTail,      const MCSymbol *PCAddr, const MCExpr *PCOffset, unsigned CallReg) { diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h index bf643c01007..361bb4c669d 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfCompileUnit.h @@ -234,6 +234,9 @@ public:    /// GNU attribute if needed.    dwarf::Attribute getDwarf5OrGNUCallSiteAttr(dwarf::Attribute Attr) const; +  /// This takes a DWARF 5 location atom and either returns it or a GNU analog. +  dwarf::LocationAtom getDwarf5OrGNULocationAtom(dwarf::LocationAtom Loc) const; +    /// Construct a call site entry DIE describing a call within \p Scope to a    /// callee described by \p CalleeSP.    /// \p IsTail specifies whether the call is a tail call. diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp index 8c767fc8ca7..f7f6b34cc7c 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp @@ -311,10 +311,7 @@ void DwarfExpression::addEntryValueExpression(DIExpressionCursor &ExprCursor) {    assert(!isMemoryLocation() &&           "We don't support entry values of memory locations yet"); -  if (DwarfVersion >= 5) -    emitOp(dwarf::DW_OP_entry_value); -  else -    emitOp(dwarf::DW_OP_GNU_entry_value); +  emitOp(CU.getDwarf5OrGNULocationAtom(dwarf::DW_OP_entry_value));    emitUnsigned(Op->getArg(0));  }  | 

