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);
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();
}
// Emit the entry value's DWARF block operand.
commitTemporaryBuffer();
+ LocationKind = SavedLocationKind;
IsEmittingEntryValue = false;
}
assert(getTemporaryBufferSize() == 0 &&
"Began emitting entry value block before cancelling entry value");
+ LocationKind = SavedLocationKind;
IsEmittingEntryValue = false;
}
enum { EntryValue = 1 << 0, Indirect = 1 << 1, CallSiteParamValue = 1 << 2 };
unsigned LocationKind : 3;
+ unsigned SavedLocationKind : 3;
unsigned LocationFlags : 3;
unsigned DwarfVersion : 4;
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();