9#ifndef LLVM_LIB_CODEGEN_ASMPRINTER_DEBUGLOCENTRY_H
10#define LLVM_LIB_CODEGEN_ASMPRINTER_DEBUGLOCENTRY_H
13#include "llvm/Config/llvm-config.h"
50 enum EntryType EntryKind;
76 : EntryKind(E_TargetIndexLocation),
TIL(
Loc) {}
78 bool isLocation()
const {
return EntryKind == E_Location; }
80 return EntryKind == E_Location &&
Loc.isIndirect();
83 return EntryKind == E_TargetIndexLocation;
85 bool isInt()
const {
return EntryKind == E_Integer; }
88 int64_t
getInt()
const {
return Constant.Int; }
94#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
102 Constant.CIP->dump();
104 Constant.CFP->dump();
121 : Expression(Expr), ValueLocEntries(Locs), IsVariadic(
true) {}
125 : Expression(Expr), ValueLocEntries(Locs), IsVariadic(IsVariadic) {
128 !
any_of(Locs, [](
auto LE) {
return LE.isLocation(); }));
130 assert(ValueLocEntries.size() == 1);
136 : Expression(Expr), ValueLocEntries(1,
Loc), IsVariadic(
false) {
138 "DBG_VALUE with a machine location must have a valid expression.");
146 if (ValueLocEntries.size() !=
Other.ValueLocEntries.size())
148 bool ThisIsIndirect =
149 !IsVariadic && ValueLocEntries[0].isIndirectLocation();
150 bool OtherIsIndirect =
151 !
Other.IsVariadic &&
Other.ValueLocEntries[0].isIndirectLocation();
154 Other.Expression, OtherIsIndirect))
158 if (ThisIsIndirect || OtherIsIndirect) {
165 return ValueLocEntries ==
Other.ValueLocEntries;
171#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
198 : Begin(Begin), End(End) {
208 if (End !=
Next.Begin)
210 if (Values.size() !=
Next.Values.size())
212 for (
unsigned EntryIdx = 0; EntryIdx < Values.size(); ++EntryIdx)
213 if (!Values[EntryIdx].isEquivalent(
Next.Values[EntryIdx]))
223 Values.append(Vals.
begin(), Vals.
end());
226 return V.isFragment();
227 })) &&
"must either have a single value or multiple pieces");
236 if (Values.size() == 1)
241 return A.getExpression() ==
B.getExpression();
255 if (
A.EntryKind !=
B.EntryKind)
258 switch (
A.EntryKind) {
259 case DbgValueLocEntry::E_Location:
260 return A.Loc ==
B.Loc;
261 case DbgValueLocEntry::E_TargetIndexLocation:
262 return A.TIL ==
B.TIL;
263 case DbgValueLocEntry::E_Integer:
264 return A.Constant.Int ==
B.Constant.Int;
265 case DbgValueLocEntry::E_ConstantFP:
266 return A.Constant.CFP ==
B.Constant.CFP;
267 case DbgValueLocEntry::E_ConstantInt:
268 return A.Constant.CIP ==
B.Constant.CIP;
275 return A.ValueLocEntries ==
B.ValueLocEntries &&
276 A.Expression ==
B.Expression &&
A.IsVariadic ==
B.IsVariadic;
282 return A.getExpression()->getFragmentInfo()->OffsetInBits <
283 B.getExpression()->getFragmentInfo()->OffsetInBits;
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
static GCRegistry::Add< ErlangGC > A("erlang", "erlang-compatible garbage collector")
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
This file contains the declarations for the subclasses of Constant, which represent the different fla...
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
This class is intended to be used as a driving class for all asm writers.
ConstantFP - Floating Point Values [float, double].
This is the shared class of boolean and integer constants.
This is an important base class in LLVM.
Basic type, like 'int' or 'float'.
LLVM_ABI bool isEntryValue() const
Check if the expression consists of exactly one entry value operand.
bool isFragment() const
Return whether this is a piece of an aggregate variable.
static LLVM_ABI bool isEqualExpression(const DIExpression *FirstExpr, bool FirstIndirect, const DIExpression *SecondExpr, bool SecondIndirect)
Determines whether two debug values should produce equivalent DWARF expressions, using their DIExpres...
LLVM_ABI bool isValid() const
A single location or constant within a variable location description, with either a single entry (wit...
DbgValueLocEntry(const ConstantFP *CFP)
TargetIndexLocation getTargetIndexLocation() const
MachineLocation Loc
Or a location in the machine frame.
const ConstantFP * getConstantFP() const
friend bool operator==(const DbgValueLocEntry &, const DbgValueLocEntry &)
Compare two DbgValueLocEntries for equality.
bool isConstantFP() const
DbgValueLocEntry(MachineLocation Loc)
DbgValueLocEntry(int64_t i)
bool isConstantInt() const
TargetIndexLocation TIL
Or a location from target specific location.
bool isIndirectLocation() const
const ConstantInt * getConstantInt() const
LLVM_DUMP_METHOD void dump() const
bool isTargetIndexLocation() const
MachineLocation getLoc() const
DbgValueLocEntry(const ConstantInt *CIP)
DbgValueLocEntry(TargetIndexLocation Loc)
The location of a single variable, composed of an expression and 0 or more DbgValueLocEntries.
DbgValueLoc(const DIExpression *Expr, DbgValueLocEntry Loc)
DbgValueLoc(const DIExpression *Expr, ArrayRef< DbgValueLocEntry > Locs, bool IsVariadic)
friend bool operator==(const DbgValueLoc &, const DbgValueLoc &)
Compare two DbgValueLocs for equality.
ArrayRef< DbgValueLocEntry > getLocEntries() const
DbgValueLoc(const DIExpression *Expr, ArrayRef< DbgValueLocEntry > Locs)
const DIExpression * getExpression() const
LLVM_DUMP_METHOD void dump() const
bool isEquivalent(const DbgValueLoc &Other) const
friend bool operator<(const DbgValueLoc &, const DbgValueLoc &)
Compare two fragments based on their offset.
DebugLocEntry(const MCSymbol *Begin, const MCSymbol *End, ArrayRef< DbgValueLoc > Vals)
Create a location list entry for the range [Begin, End).
void addValues(ArrayRef< DbgValueLoc > Vals)
ArrayRef< DbgValueLoc > getValues() const
const MCSymbol * getBeginSym() const
const MCSymbol * getEndSym() const
bool MergeRanges(const DebugLocEntry &Next)
Attempt to merge this DebugLocEntry with Next and return true if the merge was successful.
Builder for DebugLocStream lists.
MCSymbol - Instances of this class represent a symbol name in the MC file, and MCSymbols are created ...
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
#define llvm_unreachable(msg)
Marks that the current location is not supposed to be reachable.
This is an optimization pass for GlobalISel generic memory operations.
bool operator<(int64_t V1, const APSInt &V2)
bool all_of(R &&range, UnaryPredicate P)
Provide wrappers to std::all_of which take ranges instead of having to pass begin/end explicitly.
auto unique(Range &&R, Predicate P)
bool operator==(const AddressRangeValuePair &LHS, const AddressRangeValuePair &RHS)
bool any_of(R &&range, UnaryPredicate P)
Provide wrappers to std::any_of which take ranges instead of having to pass begin/end explicitly.
void sort(IteratorTy Start, IteratorTy End)
LLVM_ABI raw_ostream & dbgs()
dbgs() - This returns a reference to a raw_ostream for debugging messages.
FunctionAddr VTableAddr Next
This struct describes target specific location.
TargetIndexLocation()=default
bool operator==(const TargetIndexLocation &Other) const
TargetIndexLocation(unsigned Idx, int64_t Offset)