27 DILocation::DILocation(
LLVMContext &
C, StorageType Storage,
unsigned Line,
30 :
MDNode(C, DILocationKind, Storage, MDs) {
32 "Expected a scope and optional inlined-at");
35 assert(Column < (1u << 16) &&
"Expected 16-bit column");
37 SubclassData32 = Line;
38 SubclassData16 = Column;
40 setImplicitCode(ImplicitCode);
45 if (Column >= (1u << 16))
51 Metadata *InlinedAt,
bool ImplicitCode,
52 StorageType Storage,
bool ShouldCreate) {
58 DILocationInfo::KeyTy(Line, Column, Scope,
59 InlinedAt, ImplicitCode)))
64 assert(ShouldCreate &&
"Expected non-uniqued nodes to always be created");
85 for (
DILocation *L = LocA->getInlinedAt(); L; L = L->getInlinedAt())
86 InlinedLocationsA.
insert(L);
91 Locations.
insert(std::make_pair(S, L));
95 L = L->getInlinedAt();
100 L = LocB->getInlinedAt();
102 if (Locations.
count(std::make_pair(S, L)))
107 L = L->getInlinedAt();
113 if (!S || !isa<DILocalScope>(S))
114 S = LocA->getScope();
120 uint64_t RemainingWork = 0U;
126 RemainingWork = std::accumulate(Components.
begin(), Components.
end(), RemainingWork);
130 unsigned NextBitInsertionIndex = 0;
131 while (RemainingWork > 0) {
132 unsigned C = Components[I++];
134 unsigned EC = encodeComponent(C);
135 Ret |= (EC << NextBitInsertionIndex);
136 NextBitInsertionIndex += encodingBits(C);
143 unsigned TBD, TDF, TCI = 0;
145 if (TBD == BD && TDF == DF && TCI == CI)
152 BD = getUnsignedFromPrefixEncoding(D);
153 DF = getUnsignedFromPrefixEncoding(getNextComponentInDiscriminator(D));
154 CI = getUnsignedFromPrefixEncoding(
155 getNextComponentInDiscriminator(getNextComponentInDiscriminator(D)));
162 #include "llvm/IR/DebugInfoFlags.def" 163 .Default(DINode::FlagZero);
168 #define HANDLE_DI_FLAG(ID, NAME) \ 170 return "DIFlag" #NAME; 171 #include "llvm/IR/DebugInfoFlags.def" 181 if (
DIFlags A = Flags & FlagAccessibility) {
182 if (A == FlagPrivate)
184 else if (A == FlagProtected)
190 if (
DIFlags R = Flags & FlagPtrToMemberRep) {
191 if (R == FlagSingleInheritance)
192 SplitFlags.
push_back(FlagSingleInheritance);
193 else if (R == FlagMultipleInheritance)
194 SplitFlags.
push_back(FlagMultipleInheritance);
196 SplitFlags.
push_back(FlagVirtualInheritance);
199 if ((Flags & FlagIndirectVirtualBase) == FlagIndirectVirtualBase) {
200 Flags &= ~FlagIndirectVirtualBase;
201 SplitFlags.
push_back(FlagIndirectVirtualBase);
204 #define HANDLE_DI_FLAG(ID, NAME) \ 205 if (DIFlags Bit = Flags & Flag##NAME) { \ 206 SplitFlags.push_back(Bit); \ 209 #include "llvm/IR/DebugInfoFlags.def" 214 if (
auto *
T = dyn_cast<DIType>(
this))
215 return T->getScope();
217 if (
auto *
SP = dyn_cast<DISubprogram>(
this))
218 return SP->getScope();
220 if (
auto *LB = dyn_cast<DILexicalBlockBase>(
this))
221 return LB->getScope();
223 if (
auto *NS = dyn_cast<DINamespace>(
this))
224 return NS->getScope();
226 if (
auto *M = dyn_cast<DIModule>(
this))
227 return M->getScope();
229 assert((isa<DIFile>(
this) || isa<DICompileUnit>(
this)) &&
230 "Unhandled type of scope.");
235 if (
auto *
T = dyn_cast<DIType>(
this))
237 if (
auto *
SP = dyn_cast<DISubprogram>(
this))
238 return SP->getName();
239 if (
auto *NS = dyn_cast<DINamespace>(
this))
240 return NS->getName();
241 if (
auto *M = dyn_cast<DIModule>(
this))
243 assert((isa<DILexicalBlockBase>(
this) || isa<DIFile>(
this) ||
244 isa<DICompileUnit>(
this)) &&
245 "Unhandled type of scope.");
261 GenericDINodeInfo::KeyTy
Key(Tag, Header, DwarfOps);
266 Hash = Key.getHash();
268 assert(ShouldCreate &&
"Expected non-uniqued nodes to always be created");
275 Context, Storage, Hash, Tag, PreOps, DwarfOps),
279 void GenericDINode::recalculateHash() {
280 setHash(GenericDINodeInfo::KeyTy::calculateHash(
this));
283 #define UNWRAP_ARGS_IMPL(...) __VA_ARGS__ 284 #define UNWRAP_ARGS(ARGS) UNWRAP_ARGS_IMPL ARGS 285 #define DEFINE_GETIMPL_LOOKUP(CLASS, ARGS) \ 287 if (Storage == Uniqued) { \ 288 if (auto *N = getUniqued(Context.pImpl->CLASS##s, \ 289 CLASS##Info::KeyTy(UNWRAP_ARGS(ARGS)))) \ 294 assert(ShouldCreate && \ 295 "Expected non-uniqued nodes to always be created"); \ 298 #define DEFINE_GETIMPL_STORE(CLASS, ARGS, OPS) \ 299 return storeImpl(new (array_lengthof(OPS)) \ 300 CLASS(Context, Storage, UNWRAP_ARGS(ARGS), OPS), \ 301 Storage, Context.pImpl->CLASS##s) 302 #define DEFINE_GETIMPL_STORE_NO_OPS(CLASS, ARGS) \ 303 return storeImpl(new (0u) CLASS(Context, Storage, UNWRAP_ARGS(ARGS)), \ 304 Storage, Context.pImpl->CLASS##s) 305 #define DEFINE_GETIMPL_STORE_NO_CONSTRUCTOR_ARGS(CLASS, OPS) \ 306 return storeImpl(new (array_lengthof(OPS)) CLASS(Context, Storage, OPS), \ 307 Storage, Context.pImpl->CLASS##s) 308 #define DEFINE_GETIMPL_STORE_N(CLASS, ARGS, OPS, NUM_OPS) \ 309 return storeImpl(new (NUM_OPS) \ 310 CLASS(Context, Storage, UNWRAP_ARGS(ARGS), OPS), \ 311 Storage, Context.pImpl->CLASS##s) 317 return getImpl(Context, CountNode, Lo, Storage, ShouldCreate);
338 MDString *Name, uint64_t SizeInBits,
339 uint32_t AlignInBits,
unsigned Encoding,
344 (Tag, Name, SizeInBits, AlignInBits, Encoding, Flags));
345 Metadata *Ops[] = {
nullptr,
nullptr, Name};
351 switch (getEncoding()) {
352 case dwarf::DW_ATE_signed:
353 case dwarf::DW_ATE_signed_char:
355 case dwarf::DW_ATE_unsigned:
356 case dwarf::DW_ATE_unsigned_char:
366 uint32_t AlignInBits, uint64_t OffsetInBits,
371 (Tag, Name, File, Line, Scope, BaseType, SizeInBits,
372 AlignInBits, OffsetInBits, DWARFAddressSpace, Flags,
376 DIDerivedType, (Tag, Line, SizeInBits, AlignInBits, OffsetInBits,
377 DWARFAddressSpace, Flags), Ops);
392 AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang,
393 VTableHolder, TemplateParams, Identifier, Discriminator));
395 Elements, VTableHolder, TemplateParams, Identifier,
398 AlignInBits, OffsetInBits, Flags),
405 uint64_t SizeInBits,
uint32_t AlignInBits, uint64_t OffsetInBits,
414 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits,
415 AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang,
416 VTableHolder, TemplateParams, &Identifier, Discriminator);
419 assert(CT->getRawIdentifier() == &Identifier &&
"Wrong ODR identifier?");
420 if (!CT->isForwardDecl() || (Flags & DINode::FlagFwdDecl))
424 CT->mutate(Tag, Line, RuntimeLang, SizeInBits, AlignInBits, OffsetInBits,
427 Elements, VTableHolder, TemplateParams, &Identifier,
430 "Mismatched number of operands");
431 for (
unsigned I = 0,
E = CT->getNumOperands();
I !=
E; ++
I)
432 if (Ops[
I] != CT->getOperand(
I))
433 CT->setOperand(
I, Ops[
I]);
440 uint64_t SizeInBits,
uint32_t AlignInBits, uint64_t OffsetInBits,
449 Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits,
450 AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang, VTableHolder,
451 TemplateParams, &Identifier, Discriminator);
468 Metadata *Ops[] = {
nullptr,
nullptr,
nullptr, TypeArray};
484 return ChecksumKindName[CSKind - 1];
504 Metadata *Ops[] = {Filename, Directory, CS ? CS->Value :
nullptr,
512 unsigned RuntimeVersion,
MDString *SplitDebugFilename,
515 uint64_t DWOId,
bool SplitDebugInlining,
bool DebugInfoForProfiling,
524 File, Producer, Flags, SplitDebugFilename,
525 EnumTypes, RetainedTypes, GlobalVariables, ImportedEntities,
528 Context, Storage, SourceLanguage, IsOptimized,
529 RuntimeVersion, EmissionKind, DWOId, SplitDebugInlining,
530 DebugInfoForProfiling, NameTableKind, RangesBaseAddress,
538 .Case(
"NoDebug", NoDebug)
539 .
Case(
"FullDebug", FullDebug)
540 .
Case(
"LineTablesOnly", LineTablesOnly)
541 .
Case(
"DebugDirectivesOnly", DebugDirectivesOnly)
556 case NoDebug:
return "NoDebug";
557 case FullDebug:
return "FullDebug";
558 case LineTablesOnly:
return "LineTablesOnly";
559 case DebugDirectivesOnly:
return "DebugDirectivesOnly";
577 if (
auto *Block = dyn_cast<DILexicalBlockBase>(
this))
578 return Block->getScope()->getSubprogram();
579 return const_cast<DISubprogram *
>(cast<DISubprogram>(
this));
583 if (
auto *File = dyn_cast<DILexicalBlockFile>(
this))
584 return File->getScope()->getNonLexicalBlockFileScope();
591 #include "llvm/IR/DebugInfoFlags.def" 592 .Default(SPFlagZero);
598 case SPFlagVirtuality:
600 #define HANDLE_DISP_FLAG(ID, NAME) \ 602 return "DISPFlag" #NAME; 603 #include "llvm/IR/DebugInfoFlags.def" 614 #define HANDLE_DISP_FLAG(ID, NAME) \ 615 if (DISPFlags Bit = Flags & SPFlag##NAME) { \ 616 SplitFlags.push_back(Bit); \ 619 #include "llvm/IR/DebugInfoFlags.def" 626 unsigned ScopeLine,
Metadata *ContainingType,
unsigned VirtualIndex,
633 (Scope, Name, LinkageName, File, Line, Type, ScopeLine,
634 ContainingType, VirtualIndex, ThisAdjustment, Flags,
635 SPFlags, Unit, TemplateParams, Declaration,
636 RetainedNodes, ThrownTypes));
639 Declaration, RetainedNodes, ContainingType, TemplateParams, ThrownTypes};
642 if (!TemplateParams) {
650 (Line, ScopeLine, VirtualIndex, ThisAdjustment, Flags, SPFlags), Ops,
654 bool DISubprogram::describes(
const Function *
F)
const {
655 assert(F &&
"Invalid function");
671 assert(Scope &&
"Expected scope");
679 unsigned Discriminator,
682 assert(Scope &&
"Expected scope");
704 DIModule, (Scope, Name, ConfigurationMacros, IncludePath, ISysRoot));
732 Metadata *Type,
bool IsLocalToUnit,
bool IsDefinition,
733 Metadata *StaticDataMemberDeclaration,
739 Type, IsLocalToUnit, IsDefinition,
740 StaticDataMemberDeclaration,
741 TemplateParams, AlignInBits));
748 StaticDataMemberDeclaration,
751 (Line, IsLocalToUnit, IsDefinition, AlignInBits), Ops);
762 assert(Arg <= UINT16_MAX &&
"Expected argument number to fit in 16-bits");
764 assert(Scope &&
"Expected scope");
767 (Scope, Name, File, Line, Type, Arg, Flags,
775 const Metadata *RawType = getRawType();
778 if (
auto *
T = dyn_cast<DIType>(RawType))
779 if (uint64_t
Size =
T->getSizeInBits())
782 if (
auto *DT = dyn_cast<DIDerivedType>(RawType)) {
784 RawType = DT->getRawBaseType();
800 assert(Scope &&
"Expected scope");
803 (Scope, Name, File, Line));
819 case dwarf::DW_OP_constu:
820 case dwarf::DW_OP_plus_uconst:
828 for (
auto I = expr_op_begin(),
E = expr_op_end();
I !=
E; ++
I) {
830 if (
I->get() +
I->getSize() >
E->get())
834 switch (
I->getOp()) {
839 return I->get() +
I->getSize() ==
E->get();
840 case dwarf::DW_OP_stack_value: {
842 if (
I->get() +
I->getSize() ==
E->get())
849 case dwarf::DW_OP_swap: {
857 if (getNumElements() == 1)
861 case dwarf::DW_OP_constu:
862 case dwarf::DW_OP_plus_uconst:
863 case dwarf::DW_OP_plus:
864 case dwarf::DW_OP_minus:
865 case dwarf::DW_OP_mul:
866 case dwarf::DW_OP_div:
867 case dwarf::DW_OP_mod:
868 case dwarf::DW_OP_or:
869 case dwarf::DW_OP_and:
870 case dwarf::DW_OP_xor:
871 case dwarf::DW_OP_shl:
872 case dwarf::DW_OP_shr:
873 case dwarf::DW_OP_shra:
874 case dwarf::DW_OP_deref:
875 case dwarf::DW_OP_xderef:
876 case dwarf::DW_OP_lit0:
877 case dwarf::DW_OP_not:
878 case dwarf::DW_OP_dup:
887 for (
auto I = Start;
I != End; ++
I)
900 }
else if (Offset < 0) {
908 if (getNumElements() == 0) {
913 if (getNumElements() == 2 && Elements[0] == dwarf::DW_OP_plus_uconst) {
914 Offset = Elements[1];
918 if (getNumElements() == 3 && Elements[0] == dwarf::DW_OP_constu) {
919 if (Elements[2] == dwarf::DW_OP_plus) {
920 Offset = Elements[1];
923 if (Elements[2] == dwarf::DW_OP_minus) {
924 Offset = -Elements[1];
933 int64_t
Offset,
bool DerefAfter,
939 appendOffset(Ops, Offset);
943 return prependOpcodes(Expr, Ops, StackValue);
949 assert(Expr &&
"Can't prepend ops to this expression");
957 if (
Op.getOp() == dwarf::DW_OP_stack_value)
964 Op.appendToVector(Ops);
973 assert(Expr && !Ops.
empty() &&
"Can't append ops to this expression");
979 if (
Op.getOp() == dwarf::DW_OP_stack_value ||
986 Op.appendToVector(NewOps);
989 NewOps.append(Ops.
begin(), Ops.
end());
995 assert(Expr && !Ops.
empty() &&
"Can't append ops to this expression");
998 return Op == dwarf::DW_OP_stack_value ||
1001 "Can't append this op");
1008 unsigned DropUntilStackValue = FI.
hasValue() ? 3 : 0;
1011 bool NeedsDeref = (Expr->
getNumElements() > DropUntilStackValue) &&
1012 (ExprOpsBeforeFragment.
back() != dwarf::DW_OP_stack_value);
1013 bool NeedsStackValue = NeedsDeref || ExprOpsBeforeFragment.
empty();
1021 if (NeedsStackValue)
1022 NewOps.
push_back(dwarf::DW_OP_stack_value);
1027 const DIExpression *Expr,
unsigned OffsetInBits,
unsigned SizeInBits) {
1032 switch (
Op.getOp()) {
1034 case dwarf::DW_OP_plus:
1035 case dwarf::DW_OP_minus:
1044 uint64_t FragmentOffsetInBits =
Op.getArg(0);
1045 uint64_t FragmentSizeInBits =
Op.getArg(1);
1046 (void)FragmentSizeInBits;
1047 assert((OffsetInBits + SizeInBits <= FragmentSizeInBits) &&
1048 "new fragment outside of original fragment");
1049 OffsetInBits += FragmentOffsetInBits;
1053 Op.appendToVector(Ops);
1064 if (getNumElements() != 3 && getNumElements() != 6)
1066 if (getElement(0) != dwarf::DW_OP_constu ||
1067 getElement(2) != dwarf::DW_OP_stack_value)
1077 bool ShouldCreate) {
1079 Metadata *Ops[] = {Variable, Expression};
1091 SetterName, Attributes, Type));
1100 bool ShouldCreate) {
1103 (Tag, Scope, Entity, File, Line, Name));
1120 bool ShouldCreate) {
1122 (MIType, Line, File, Elements));
static void appendOffset(SmallVectorImpl< uint64_t > &Ops, int64_t Offset)
Append Ops with operations to apply the Offset.
const_iterator end(StringRef path)
Get end iterator over path.
ArrayRef< uint64_t > getElements() const
bool isConstant() const
Determine whether this represents a standalone constant value.
static std::string getLinkageName(GlobalValue::LinkageTypes LT)
const T & back() const
back - Get the last element.
const_iterator begin(StringRef path, Style style=Style::native)
Get begin iterator over path.
static DICompositeType * getODRTypeIfExists(LLVMContext &Context, MDString &Identifier)
This class represents lattice values for constants.
static const DILocation * getMergedLocation(const DILocation *LocA, const DILocation *LocB)
When two instructions are combined into a single instruction we also need to combine the original loc...
void push_back(const T &Elt)
constexpr T getValueOr(U &&value) const LLVM_LVALUE_FUNCTION
unsigned getSize() const
Return the size of the operand.
Optional< Signedness > getSignedness() const
Return the signedness of this type, or None if this type is neither signed nor unsigned.
static T * storeImpl(T *N, StorageType Storage, StoreT &Store)
static IntegerType * getInt64Ty(LLVMContext &C)
static Optional< ChecksumKind > getChecksumKind(StringRef CSKindStr)
static DIExpression * prepend(const DIExpression *Expr, bool DerefBefore, int64_t Offset=0, bool DerefAfter=false, bool StackValue=false)
Prepend DIExpr with a deref and offset operation and optionally turn it into a stack value...
static DIExpression * prependOpcodes(const DIExpression *Expr, SmallVectorImpl< uint64_t > &Ops, bool StackValue=false)
Prepend DIExpr with the given opcodes and optionally turn it into a stack value.
amdgpu Simplify well known AMD library false Value Value const Twine & Name
static DISPFlags splitFlags(DISPFlags Flags, SmallVectorImpl< DISPFlags > &SplitFlags)
Split up a flags bitfield for easier printing.
static StringRef getFlagString(DISPFlags Flag)
This class consists of common code factored out of the SmallVector class to reduce code duplication b...
bool none_of(R &&Range, UnaryPredicate P)
Provide wrappers to std::none_of which take ranges instead of having to pass begin/end explicitly...
static StringRef getName(Value *V)
Only used in LLVM metadata.
Holds a subclass of DINode.
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE R Default(T Value)
Holds the characteristics of one fragment of a larger variable.
static DIExpression * append(const DIExpression *Expr, ArrayRef< uint64_t > Ops)
Append the opcodes Ops to DIExpr.
LLVMContext & getContext() const
LLVM_NODISCARD LLVM_ATTRIBUTE_ALWAYS_INLINE bool empty() const
empty - Check if the string is empty.
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory)...
static Optional< FragmentInfo > getFragmentInfo(expr_op_iterator Start, expr_op_iterator End)
Retrieve the details of this fragment expression.
Analysis containing CSE Info
Flag
These should be considered private to the implementation of the MCInstrDesc class.
StringRef getString() const
static StringRef getFlagString(DIFlags Flag)
static MDTuple * get(LLVMContext &Context, ArrayRef< Metadata *> MDs)
A switch()-like statement whose cases are string literals.
static T * getUniqued(DenseSet< T *, InfoT > &Store, const typename InfoT::KeyTy &Key)
A single checksum, represented by a Kind and a Value (a string).
static Optional< unsigned > encodeDiscriminator(unsigned BD, unsigned DF, unsigned CI)
Raw encoding of the discriminator.
The instances of the Type class are immutable: once they are created, they are never changed...
This is an important class for using LLVM in a threaded context.
DISubprogram * getSubprogram() const
Get the attached subprogram.
size_t size() const
size - Get the array size.
static GCRegistry::Add< CoreCLRGC > E("coreclr", "CoreCLR-compatible GC")
LLVM_ATTRIBUTE_ALWAYS_INLINE iterator begin()
static MDTuple * getDistinct(LLVMContext &Context, ArrayRef< Metadata *> MDs)
SmallSet - This maintains a set of unique values, optimizing for the case when the set is small (less...
static const char * nameTableKindString(DebugNameTableKind PK)
std::pair< iterator, bool > insert(PtrType Ptr)
Inserts Ptr if and only if there is no element in the container equal to Ptr.
bool isODRUniquingDebugTypes() const
Whether there is a string map for uniquing debug info identifiers across the context.
A pair of DIGlobalVariable and DIExpression.
static DIExpression * appendToStack(const DIExpression *Expr, ArrayRef< uint64_t > Ops)
Convert DIExpr into a stack value if it isn't one already by appending DW_OP_deref if needed...
Optional< FragmentInfo > getFragmentInfo() const
Retrieve the details of this fragment expression.
std::pair< NoneType, bool > insert(const T &V)
insert - Insert an element into the set if it isn't already there.
DebugNameTableKind getNameTableKind() const
LLVMContextImpl *const pImpl
An imported module (C++ using directive or similar).
DILocalScope * getNonLexicalBlockFileScope() const
Get the first non DILexicalBlockFile scope of this scope.
Base class for scope-like contexts.
iterator_range< expr_op_iterator > expr_ops() const
BaseType
A given derived pointer can have multiple base pointers through phi/selects.
SmallPtrSet - This class implements a set which is optimized for holding SmallSize or less elements...
static DISPFlags getFlag(StringRef Flag)
StringRef getName() const
Optional< uint64_t > getSizeInBits() const
Determines the size of the variable's type.
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small...
constexpr size_t array_lengthof(T(&)[N])
Find the length of an array.
static DIFlags splitFlags(DIFlags Flags, SmallVectorImpl< DIFlags > &SplitFlags)
Split up a flags bitfield.
static GCRegistry::Add< StatepointGC > D("statepoint-example", "an example strategy for statepoint")
static ConstantInt * getSigned(IntegerType *Ty, int64_t V)
Return a ConstantInt with the specified value for the specified type.
ArrayRef< T > drop_back(size_t N=1) const
Drop the last N elements of the array.
DISubprogram * getSubprogram() const
Get the subprogram for this scope.
DebugEmissionKind getEmissionKind() const
static DIFlags getFlag(StringRef Flag)
A (clang) module that has been imported by the compile unit.
unsigned unsigned DILocalScope * Scope
Generic tagged DWARF-like metadata node.
LLVM_ATTRIBUTE_ALWAYS_INLINE StringSwitch & Case(StringLiteral S, T Value)
unsigned getNumElements() const
void append(in_iter in_start, in_iter in_end)
Add the specified range to the end of the SmallVector.
amdgpu Simplify well known AMD library false Value Value * Arg
Type array for a subprogram.
LLVM_ATTRIBUTE_ALWAYS_INLINE iterator end()
LLVM_NODISCARD bool empty() const
StringRef getName() const
Return a constant reference to the value's name.
bool extractIfOffset(int64_t &Offset) const
If this is a constant offset, extract it.
DISPFlags
Debug info subprogram flags.
static DICompositeType * buildODRType(LLVMContext &Context, MDString &Identifier, unsigned Tag, MDString *Name, Metadata *File, unsigned Line, Metadata *Scope, Metadata *BaseType, uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, DIFlags Flags, Metadata *Elements, unsigned RuntimeLang, Metadata *VTableHolder, Metadata *TemplateParams, Metadata *Discriminator)
Build a DICompositeType with the given ODR identifier.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
LLVM Value Representation.
An iterator for expression operands.
StringRef - Represent a constant reference to a string, i.e.
static LazyValueInfoImpl & getImpl(void *&PImpl, AssumptionCache *AC, const DataLayout *DL, DominatorTree *DT=nullptr)
This lazily constructs the LazyValueInfoImpl.
static void decodeDiscriminator(unsigned D, unsigned &BD, unsigned &DF, unsigned &CI)
Raw decoder for values in an encoded discriminator D.
Optional< DenseMap< const MDString *, DICompositeType * > > DITypeMap
static const char * emissionKindString(DebugEmissionKind EK)
bool empty() const
empty - Check if the array is empty.
static Optional< DIExpression * > createFragmentExpression(const DIExpression *Expr, unsigned OffsetInBits, unsigned SizeInBits)
Create a DIExpression to describe one part of an aggregate variable that is fragmented across multipl...
Basic type, like 'int' or 'float'.
DIScopeRef getScope() const
size_type count(const T &V) const
count - Return 1 if the element is in the set, 0 otherwise.