diff options
author | Alexey Samsonov <vonosmas@gmail.com> | 2014-05-27 23:09:50 +0000 |
---|---|---|
committer | Alexey Samsonov <vonosmas@gmail.com> | 2014-05-27 23:09:50 +0000 |
commit | a807d6783a88310e48b1194948bf45c52a2ada15 (patch) | |
tree | 38d28df01a5c86f48f378986decf08398a6e0f0f /lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.h | |
parent | f9e42bc162e351f8eeb973beeb0a090ff2019502 (diff) | |
download | llvm-a807d6783a88310e48b1194948bf45c52a2ada15.tar.gz llvm-a807d6783a88310e48b1194948bf45c52a2ada15.tar.bz2 llvm-a807d6783a88310e48b1194948bf45c52a2ada15.tar.xz |
Change representation of instruction ranges where variable is accessible.
Use more straightforward way to represent the set of instruction
ranges where the location of a user variable is defined - vector of pairs
of instructions (defining start/end of each range),
instead of a flattened vector of instructions where some instructions
are supposed to start the range, and the rest are supposed to "clobber" it.
Simplify the code which generates actual .debug_loc entries.
No functionality change.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@209698 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.h')
-rw-r--r-- | lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.h | 31 |
1 files changed, 25 insertions, 6 deletions
diff --git a/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.h b/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.h index db5116df1b..b9177f0595 100644 --- a/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.h +++ b/lib/CodeGen/AsmPrinter/DbgValueHistoryCalculator.h @@ -20,12 +20,31 @@ class MachineInstr; class MDNode; class TargetRegisterInfo; -// For each user variable, keep a list of DBG_VALUE instructions for it -// in the order of appearance. The list can also contain another -// instructions, which are assumed to clobber the previous DBG_VALUE. -// The variables are listed in order of appearance. -typedef MapVector<const MDNode *, SmallVector<const MachineInstr *, 4>> -DbgValueHistoryMap; +// For each user variable, keep a list of instruction ranges where this variable +// is accessible. The variables are listed in order of appearance. +class DbgValueHistoryMap { + // Each instruction range starts with a DBG_VALUE instruction, specifying the + // location of a variable, which is assumed to be valid until the end of the + // range. If end is not specified, location is valid until the start + // instruction of the next instruction range, or until the end of the + // function. + typedef std::pair<const MachineInstr *, const MachineInstr *> InstrRange; + typedef SmallVector<InstrRange, 4> InstrRanges; + typedef MapVector<const MDNode *, InstrRanges> InstrRangesMap; + InstrRangesMap VarInstrRanges; + +public: + void startInstrRange(const MDNode *Var, const MachineInstr &MI); + void endInstrRange(const MDNode *Var, const MachineInstr &MI); + // Returns register currently describing @Var. If @Var is currently + // unaccessible or is not described by a register, returns 0. + unsigned getRegisterForVar(const MDNode *Var) const; + + bool empty() const { return VarInstrRanges.empty(); } + void clear() { VarInstrRanges.clear(); } + InstrRangesMap::const_iterator begin() const { return VarInstrRanges.begin(); } + InstrRangesMap::const_iterator end() const { return VarInstrRanges.end(); } +}; void calculateDbgValueHistory(const MachineFunction *MF, const TargetRegisterInfo *TRI, |