Index: llvm/lib/CodeGen/AsmPrinter/DwarfExpression.h =================================================================== --- llvm/lib/CodeGen/AsmPrinter/DwarfExpression.h +++ llvm/lib/CodeGen/AsmPrinter/DwarfExpression.h @@ -148,6 +148,7 @@ enum { EntryValue = 1 << 0, Indirect = 1 << 1, CallSiteParamValue = 1 << 2 }; unsigned LocationKind : 3; + unsigned SavedLocationKind : 3; unsigned LocationFlags : 3; unsigned DwarfVersion : 4; @@ -284,8 +285,8 @@ public: DwarfExpression(unsigned DwarfVersion, DwarfCompileUnit &CU) : CU(CU), SubRegisterSizeInBits(0), SubRegisterOffsetInBits(0), - LocationKind(Unknown), LocationFlags(Unknown), - DwarfVersion(DwarfVersion) {} + LocationKind(Unknown), SavedLocationKind(Unknown), + LocationFlags(Unknown), DwarfVersion(DwarfVersion) {} /// This needs to be called last to commit any pending changes. void finalize(); Index: llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp =================================================================== --- llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp +++ llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp @@ -365,11 +365,7 @@ void DwarfExpression::setLocation(const MachineLocation &Loc, const DIExpression *DIExpr) { if (Loc.isIndirect()) - // Do not treat entry value descriptions of indirect parameters as memory - // locations. This allows DwarfExpression::addReg() to add DW_OP_regN to an - // entry value description. - if (!DIExpr->isEntryValue()) - setMemoryLocationKind(); + setMemoryLocationKind(); if (DIExpr->isEntryValue()) setEntryValueFlags(Loc); @@ -380,12 +376,12 @@ auto Op = ExprCursor.take(); (void)Op; assert(Op && Op->getOp() == dwarf::DW_OP_LLVM_entry_value); - assert(!isMemoryLocation() && - "We don't support entry values of memory locations yet"); assert(!IsEmittingEntryValue && "Already emitting entry value?"); assert(Op->getArg(0) == 1 && "Can currently only emit entry values covering a single operation"); + SavedLocationKind = LocationKind; + LocationKind = Register; IsEmittingEntryValue = true; enableTemporaryBuffer(); } @@ -403,6 +399,8 @@ // Emit the entry value's DWARF block operand. commitTemporaryBuffer(); + LocationKind = SavedLocationKind; + IsEmittingEntryValue = true; IsEmittingEntryValue = false; } @@ -415,6 +413,7 @@ assert(getTemporaryBufferSize() == 0 && "Began emitting entry value block before cancelling entry value"); + LocationKind = SavedLocationKind; IsEmittingEntryValue = false; }