Changeset View
Changeset View
Standalone View
Standalone View
llvm/lib/IR/DebugInfoMetadata.cpp
Show First 20 Lines • Show All 502 Lines • ▼ Show 20 Lines | |||||
DICompositeType *DICompositeType::getImpl( | DICompositeType *DICompositeType::getImpl( | ||||
LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *File, | LLVMContext &Context, unsigned Tag, MDString *Name, Metadata *File, | ||||
unsigned Line, Metadata *Scope, Metadata *BaseType, uint64_t SizeInBits, | unsigned Line, Metadata *Scope, Metadata *BaseType, uint64_t SizeInBits, | ||||
uint32_t AlignInBits, uint64_t OffsetInBits, DIFlags Flags, | uint32_t AlignInBits, uint64_t OffsetInBits, DIFlags Flags, | ||||
Metadata *Elements, unsigned RuntimeLang, Metadata *VTableHolder, | Metadata *Elements, unsigned RuntimeLang, Metadata *VTableHolder, | ||||
Metadata *TemplateParams, MDString *Identifier, Metadata *Discriminator, | Metadata *TemplateParams, MDString *Identifier, Metadata *Discriminator, | ||||
Metadata *DataLocation, Metadata *Associated, Metadata *Allocated, | Metadata *DataLocation, Metadata *Associated, Metadata *Allocated, | ||||
StorageType Storage, bool ShouldCreate) { | Metadata *Rank, StorageType Storage, bool ShouldCreate) { | ||||
assert(isCanonical(Name) && "Expected canonical MDString"); | assert(isCanonical(Name) && "Expected canonical MDString"); | ||||
// Keep this in sync with buildODRType. | // Keep this in sync with buildODRType. | ||||
DEFINE_GETIMPL_LOOKUP(DICompositeType, | DEFINE_GETIMPL_LOOKUP( | ||||
(Tag, Name, File, Line, Scope, BaseType, SizeInBits, | DICompositeType, | ||||
AlignInBits, OffsetInBits, Flags, Elements, | (Tag, Name, File, Line, Scope, BaseType, SizeInBits, AlignInBits, | ||||
RuntimeLang, VTableHolder, TemplateParams, Identifier, | OffsetInBits, Flags, Elements, RuntimeLang, VTableHolder, TemplateParams, | ||||
Discriminator, DataLocation, Associated, Allocated)); | Identifier, Discriminator, DataLocation, Associated, Allocated, Rank)); | ||||
Metadata *Ops[] = {File, Scope, Name, BaseType, | Metadata *Ops[] = {File, Scope, Name, BaseType, | ||||
Elements, VTableHolder, TemplateParams, Identifier, | Elements, VTableHolder, TemplateParams, Identifier, | ||||
Discriminator, DataLocation, Associated, Allocated}; | Discriminator, DataLocation, Associated, Allocated, | ||||
Rank}; | |||||
DEFINE_GETIMPL_STORE(DICompositeType, (Tag, Line, RuntimeLang, SizeInBits, | DEFINE_GETIMPL_STORE(DICompositeType, (Tag, Line, RuntimeLang, SizeInBits, | ||||
AlignInBits, OffsetInBits, Flags), | AlignInBits, OffsetInBits, Flags), | ||||
Ops); | Ops); | ||||
} | } | ||||
DICompositeType *DICompositeType::buildODRType( | DICompositeType *DICompositeType::buildODRType( | ||||
LLVMContext &Context, MDString &Identifier, unsigned Tag, MDString *Name, | LLVMContext &Context, MDString &Identifier, unsigned Tag, MDString *Name, | ||||
Metadata *File, unsigned Line, Metadata *Scope, Metadata *BaseType, | Metadata *File, unsigned Line, Metadata *Scope, Metadata *BaseType, | ||||
uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, | uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, | ||||
DIFlags Flags, Metadata *Elements, unsigned RuntimeLang, | DIFlags Flags, Metadata *Elements, unsigned RuntimeLang, | ||||
Metadata *VTableHolder, Metadata *TemplateParams, Metadata *Discriminator, | Metadata *VTableHolder, Metadata *TemplateParams, Metadata *Discriminator, | ||||
Metadata *DataLocation, Metadata *Associated, Metadata *Allocated) { | Metadata *DataLocation, Metadata *Associated, Metadata *Allocated, | ||||
Metadata *Rank) { | |||||
assert(!Identifier.getString().empty() && "Expected valid identifier"); | assert(!Identifier.getString().empty() && "Expected valid identifier"); | ||||
if (!Context.isODRUniquingDebugTypes()) | if (!Context.isODRUniquingDebugTypes()) | ||||
return nullptr; | return nullptr; | ||||
auto *&CT = (*Context.pImpl->DITypeMap)[&Identifier]; | auto *&CT = (*Context.pImpl->DITypeMap)[&Identifier]; | ||||
if (!CT) | if (!CT) | ||||
return CT = DICompositeType::getDistinct( | return CT = DICompositeType::getDistinct( | ||||
Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, | Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, | ||||
AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang, | AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang, | ||||
VTableHolder, TemplateParams, &Identifier, Discriminator, | VTableHolder, TemplateParams, &Identifier, Discriminator, | ||||
DataLocation, Associated, Allocated); | DataLocation, Associated, Allocated, Rank); | ||||
// Only mutate CT if it's a forward declaration and the new operands aren't. | // Only mutate CT if it's a forward declaration and the new operands aren't. | ||||
assert(CT->getRawIdentifier() == &Identifier && "Wrong ODR identifier?"); | assert(CT->getRawIdentifier() == &Identifier && "Wrong ODR identifier?"); | ||||
if (!CT->isForwardDecl() || (Flags & DINode::FlagFwdDecl)) | if (!CT->isForwardDecl() || (Flags & DINode::FlagFwdDecl)) | ||||
return CT; | return CT; | ||||
// Mutate CT in place. Keep this in sync with getImpl. | // Mutate CT in place. Keep this in sync with getImpl. | ||||
CT->mutate(Tag, Line, RuntimeLang, SizeInBits, AlignInBits, OffsetInBits, | CT->mutate(Tag, Line, RuntimeLang, SizeInBits, AlignInBits, OffsetInBits, | ||||
Flags); | Flags); | ||||
Metadata *Ops[] = {File, Scope, Name, BaseType, | Metadata *Ops[] = {File, Scope, Name, BaseType, | ||||
Elements, VTableHolder, TemplateParams, &Identifier, | Elements, VTableHolder, TemplateParams, &Identifier, | ||||
Discriminator, DataLocation, Associated, Allocated}; | Discriminator, DataLocation, Associated, Allocated, | ||||
Rank}; | |||||
assert((std::end(Ops) - std::begin(Ops)) == (int)CT->getNumOperands() && | assert((std::end(Ops) - std::begin(Ops)) == (int)CT->getNumOperands() && | ||||
"Mismatched number of operands"); | "Mismatched number of operands"); | ||||
for (unsigned I = 0, E = CT->getNumOperands(); I != E; ++I) | for (unsigned I = 0, E = CT->getNumOperands(); I != E; ++I) | ||||
if (Ops[I] != CT->getOperand(I)) | if (Ops[I] != CT->getOperand(I)) | ||||
CT->setOperand(I, Ops[I]); | CT->setOperand(I, Ops[I]); | ||||
return CT; | return CT; | ||||
} | } | ||||
DICompositeType *DICompositeType::getODRType( | DICompositeType *DICompositeType::getODRType( | ||||
LLVMContext &Context, MDString &Identifier, unsigned Tag, MDString *Name, | LLVMContext &Context, MDString &Identifier, unsigned Tag, MDString *Name, | ||||
Metadata *File, unsigned Line, Metadata *Scope, Metadata *BaseType, | Metadata *File, unsigned Line, Metadata *Scope, Metadata *BaseType, | ||||
uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, | uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, | ||||
DIFlags Flags, Metadata *Elements, unsigned RuntimeLang, | DIFlags Flags, Metadata *Elements, unsigned RuntimeLang, | ||||
Metadata *VTableHolder, Metadata *TemplateParams, Metadata *Discriminator, | Metadata *VTableHolder, Metadata *TemplateParams, Metadata *Discriminator, | ||||
Metadata *DataLocation, Metadata *Associated, Metadata *Allocated) { | Metadata *DataLocation, Metadata *Associated, Metadata *Allocated, | ||||
Metadata *Rank) { | |||||
assert(!Identifier.getString().empty() && "Expected valid identifier"); | assert(!Identifier.getString().empty() && "Expected valid identifier"); | ||||
if (!Context.isODRUniquingDebugTypes()) | if (!Context.isODRUniquingDebugTypes()) | ||||
return nullptr; | return nullptr; | ||||
auto *&CT = (*Context.pImpl->DITypeMap)[&Identifier]; | auto *&CT = (*Context.pImpl->DITypeMap)[&Identifier]; | ||||
if (!CT) | if (!CT) | ||||
CT = DICompositeType::getDistinct( | CT = DICompositeType::getDistinct( | ||||
Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, | Context, Tag, Name, File, Line, Scope, BaseType, SizeInBits, | ||||
AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang, VTableHolder, | AlignInBits, OffsetInBits, Flags, Elements, RuntimeLang, VTableHolder, | ||||
TemplateParams, &Identifier, Discriminator, DataLocation, Associated, | TemplateParams, &Identifier, Discriminator, DataLocation, Associated, | ||||
Allocated); | Allocated, Rank); | ||||
return CT; | return CT; | ||||
} | } | ||||
DICompositeType *DICompositeType::getODRTypeIfExists(LLVMContext &Context, | DICompositeType *DICompositeType::getODRTypeIfExists(LLVMContext &Context, | ||||
MDString &Identifier) { | MDString &Identifier) { | ||||
assert(!Identifier.getString().empty() && "Expected valid identifier"); | assert(!Identifier.getString().empty() && "Expected valid identifier"); | ||||
if (!Context.isODRUniquingDebugTypes()) | if (!Context.isODRUniquingDebugTypes()) | ||||
return nullptr; | return nullptr; | ||||
▲ Show 20 Lines • Show All 808 Lines • Show Last 20 Lines |