Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
14 pmbaty 1
//===- llvm/CodeGen/DbgEntityHistoryCalculator.h ----------------*- C++ -*-===//
2
//
3
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4
// See https://llvm.org/LICENSE.txt for license information.
5
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
6
//
7
//===----------------------------------------------------------------------===//
8
 
9
#ifndef LLVM_CODEGEN_DBGENTITYHISTORYCALCULATOR_H
10
#define LLVM_CODEGEN_DBGENTITYHISTORYCALCULATOR_H
11
 
12
#include "llvm/ADT/MapVector.h"
13
#include "llvm/ADT/PointerIntPair.h"
14
#include "llvm/ADT/SmallVector.h"
15
#include "llvm/CodeGen/MachineInstr.h"
16
#include <utility>
17
 
18
namespace llvm {
19
 
20
class DILocation;
21
class LexicalScopes;
22
class DINode;
23
class MachineFunction;
24
class TargetRegisterInfo;
25
 
26
/// Record instruction ordering so we can query their relative positions within
27
/// a function. Meta instructions are given the same ordinal as the preceding
28
/// non-meta instruction. Class state is invalid if MF is modified after
29
/// calling initialize.
30
class InstructionOrdering {
31
public:
32
  void initialize(const MachineFunction &MF);
33
  void clear() { InstNumberMap.clear(); }
34
 
35
  /// Check if instruction \p A comes before \p B, where \p A and \p B both
36
  /// belong to the MachineFunction passed to initialize().
37
  bool isBefore(const MachineInstr *A, const MachineInstr *B) const;
38
 
39
private:
40
  /// Each instruction is assigned an order number.
41
  DenseMap<const MachineInstr *, unsigned> InstNumberMap;
42
};
43
 
44
/// For each user variable, keep a list of instruction ranges where this
45
/// variable is accessible. The variables are listed in order of appearance.
46
class DbgValueHistoryMap {
47
public:
48
  /// Index in the entry vector.
49
  typedef size_t EntryIndex;
50
 
51
  /// Special value to indicate that an entry is valid until the end of the
52
  /// function.
53
  static const EntryIndex NoEntry = std::numeric_limits<EntryIndex>::max();
54
 
55
  /// Specifies a change in a variable's debug value history.
56
  ///
57
  /// There exist two types of entries:
58
  ///
59
  /// * Debug value entry:
60
  ///
61
  ///   A new debug value becomes live. If the entry's \p EndIndex is \p NoEntry,
62
  ///   the value is valid until the end of the function. For other values, the
63
  ///   index points to the entry in the entry vector that ends this debug
64
  ///   value. The ending entry can either be an overlapping debug value, or
65
  ///   an instruction that clobbers the value.
66
  ///
67
  /// * Clobbering entry:
68
  ///
69
  ///   This entry's instruction clobbers one or more preceding
70
  ///   register-described debug values that have their end index
71
  ///   set to this entry's position in the entry vector.
72
  class Entry {
73
    friend DbgValueHistoryMap;
74
 
75
  public:
76
    enum EntryKind { DbgValue, Clobber };
77
 
78
    Entry(const MachineInstr *Instr, EntryKind Kind)
79
        : Instr(Instr, Kind), EndIndex(NoEntry) {}
80
 
81
    const MachineInstr *getInstr() const { return Instr.getPointer(); }
82
    EntryIndex getEndIndex() const { return EndIndex; }
83
    EntryKind getEntryKind() const { return Instr.getInt(); }
84
 
85
    bool isClobber() const { return getEntryKind() == Clobber; }
86
    bool isDbgValue() const { return getEntryKind() == DbgValue; }
87
    bool isClosed() const { return EndIndex != NoEntry; }
88
 
89
    void endEntry(EntryIndex EndIndex);
90
 
91
  private:
92
    PointerIntPair<const MachineInstr *, 1, EntryKind> Instr;
93
    EntryIndex EndIndex;
94
  };
95
  using Entries = SmallVector<Entry, 4>;
96
  using InlinedEntity = std::pair<const DINode *, const DILocation *>;
97
  using EntriesMap = MapVector<InlinedEntity, Entries>;
98
 
99
private:
100
  EntriesMap VarEntries;
101
 
102
public:
103
  bool startDbgValue(InlinedEntity Var, const MachineInstr &MI,
104
                     EntryIndex &NewIndex);
105
  EntryIndex startClobber(InlinedEntity Var, const MachineInstr &MI);
106
 
107
  Entry &getEntry(InlinedEntity Var, EntryIndex Index) {
108
    auto &Entries = VarEntries[Var];
109
    return Entries[Index];
110
  }
111
 
112
  /// Test whether a vector of entries features any non-empty locations. It
113
  /// could have no entries, or only DBG_VALUE $noreg entries.
114
  bool hasNonEmptyLocation(const Entries &Entries) const;
115
 
116
  /// Drop location ranges which exist entirely outside each variable's scope.
117
  void trimLocationRanges(const MachineFunction &MF, LexicalScopes &LScopes,
118
                          const InstructionOrdering &Ordering);
119
  bool empty() const { return VarEntries.empty(); }
120
  void clear() { VarEntries.clear(); }
121
  EntriesMap::const_iterator begin() const { return VarEntries.begin(); }
122
  EntriesMap::const_iterator end() const { return VarEntries.end(); }
123
 
124
#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
125
  LLVM_DUMP_METHOD void dump() const;
126
#endif
127
};
128
 
129
/// For each inlined instance of a source-level label, keep the corresponding
130
/// DBG_LABEL instruction. The DBG_LABEL instruction could be used to generate
131
/// a temporary (assembler) label before it.
132
class DbgLabelInstrMap {
133
public:
134
  using InlinedEntity = std::pair<const DINode *, const DILocation *>;
135
  using InstrMap = MapVector<InlinedEntity, const MachineInstr *>;
136
 
137
private:
138
  InstrMap LabelInstr;
139
 
140
public:
141
  void  addInstr(InlinedEntity Label, const MachineInstr &MI);
142
 
143
  bool empty() const { return LabelInstr.empty(); }
144
  void clear() { LabelInstr.clear(); }
145
  InstrMap::const_iterator begin() const { return LabelInstr.begin(); }
146
  InstrMap::const_iterator end() const { return LabelInstr.end(); }
147
};
148
 
149
void calculateDbgEntityHistory(const MachineFunction *MF,
150
                               const TargetRegisterInfo *TRI,
151
                               DbgValueHistoryMap &DbgValues,
152
                               DbgLabelInstrMap &DbgLabels);
153
 
154
} // end namespace llvm
155
 
156
#endif // LLVM_CODEGEN_DBGENTITYHISTORYCALCULATOR_H