From 982b891905349e9d6b82f8d89d325b6f2e838435 Mon Sep 17 00:00:00 2001 From: Adrian Prantl Date: Thu, 11 Feb 2021 15:38:49 -0800 Subject: [PATCH] Store the LocationKind of an entry value buffer independently from the main LocationKind (NFC) This patch hides the logic for setting the location kind of an entry value inside the begin/finalize/cancel functions. This way we get rid the strange workaround that is currently in setLocation(). In the future, this will allow us to set the location kind of the entry value independently from the location kind of the main expression. Differential Revision: https://reviews.llvm.org/D96554 --- llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp | 12 +++++------- llvm/lib/CodeGen/AsmPrinter/DwarfExpression.h | 5 +++-- 2 files changed, 8 insertions(+), 9 deletions(-) diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp b/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp index ae52c174d7c1..aee0f4cedc00 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.cpp @@ -365,11 +365,7 @@ void DwarfExpression::setEntryValueFlags(const MachineLocation &Loc) { 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 @@ void DwarfExpression::beginEntryValueExpression( 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,7 @@ void DwarfExpression::finalizeEntryValue() { // Emit the entry value's DWARF block operand. commitTemporaryBuffer(); + LocationKind = SavedLocationKind; IsEmittingEntryValue = false; } @@ -415,6 +412,7 @@ void DwarfExpression::cancelEntryValue() { assert(getTemporaryBufferSize() == 0 && "Began emitting entry value block before cancelling entry value"); + LocationKind = SavedLocationKind; IsEmittingEntryValue = false; } diff --git a/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.h b/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.h index 8fca9f5a630b..0d55144f9827 100644 --- a/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.h +++ b/llvm/lib/CodeGen/AsmPrinter/DwarfExpression.h @@ -148,6 +148,7 @@ protected: 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 @@ protected: 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();