summaryrefslogtreecommitdiffstats
path: root/llvm/lib/CodeGen/LiveDebugValues.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/CodeGen/LiveDebugValues.cpp')
-rw-r--r--llvm/lib/CodeGen/LiveDebugValues.cpp24
1 files changed, 17 insertions, 7 deletions
diff --git a/llvm/lib/CodeGen/LiveDebugValues.cpp b/llvm/lib/CodeGen/LiveDebugValues.cpp
index 48f361659f1..ac96c738274 100644
--- a/llvm/lib/CodeGen/LiveDebugValues.cpp
+++ b/llvm/lib/CodeGen/LiveDebugValues.cpp
@@ -189,8 +189,16 @@ private:
}
};
+ /// Identity of the variable at this location.
const DebugVariable Var;
- const MachineInstr &MI; ///< Only used for cloning a new DBG_VALUE.
+
+ /// The expression applied to this location.
+ const DIExpression *Expr;
+
+ /// DBG_VALUE to clone var/expr information from if this location
+ /// is moved.
+ const MachineInstr &MI;
+
mutable UserValueScopes UVS;
enum VarLocKind {
InvalidKind = 0,
@@ -212,8 +220,9 @@ private:
} Loc;
VarLoc(const MachineInstr &MI, LexicalScopes &LS,
- VarLocKind K = InvalidKind)
- : Var(MI), MI(MI), UVS(MI.getDebugLoc(), LS){
+ VarLocKind K = InvalidKind)
+ : Var(MI), Expr(MI.getDebugExpression()), MI(MI),
+ UVS(MI.getDebugLoc(), LS) {
static_assert((sizeof(Loc) == sizeof(uint64_t)),
"hash does not cover all members of Loc");
assert(MI.isDebugValue() && "not a DBG_VALUE");
@@ -238,7 +247,8 @@ private:
/// The constructor for spill locations.
VarLoc(const MachineInstr &MI, unsigned SpillBase, int SpillOffset,
LexicalScopes &LS, const MachineInstr &OrigMI)
- : Var(MI), MI(OrigMI), UVS(MI.getDebugLoc(), LS) {
+ : Var(MI), Expr(MI.getDebugExpression()), MI(OrigMI),
+ UVS(MI.getDebugLoc(), LS) {
assert(MI.isDebugValue() && "not a DBG_VALUE");
assert(MI.getNumOperands() == 4 && "malformed DBG_VALUE");
Kind = SpillLocKind;
@@ -266,13 +276,13 @@ private:
bool operator==(const VarLoc &Other) const {
return Kind == Other.Kind && Var == Other.Var &&
- Loc.Hash == Other.Loc.Hash;
+ Loc.Hash == Other.Loc.Hash && Expr == Other.Expr;
}
/// This operator guarantees that VarLocs are sorted by Variable first.
bool operator<(const VarLoc &Other) const {
- return std::tie(Var, Kind, Loc.Hash) <
- std::tie(Other.Var, Other.Kind, Other.Loc.Hash);
+ return std::tie(Var, Kind, Loc.Hash, Expr) <
+ std::tie(Other.Var, Other.Kind, Other.Loc.Hash, Other.Expr);
}
};
OpenPOWER on IntegriCloud