|
LLVM 24.0.0git
|
Subprogram description. Uses SubclassData1. More...
#include "llvm/IR/DebugInfoMetadata.h"
Public Types | |
| enum | DISPFlags : uint32_t { SPFlagNonvirtual = SPFlagZero , SPFlagVirtuality = SPFlagVirtual | SPFlagPureVirtual } |
| Debug info subprogram flags. More... | |
| Public Types inherited from llvm::DINode | |
| enum | DIFlags : uint32_t { FlagAccessibility = FlagPrivate | FlagProtected | FlagPublic , FlagPtrToMemberRep } |
| Debug info flags. More... | |
| Public Types inherited from llvm::MDNode | |
| using | op_iterator = const MDOperand * |
| using | op_range = iterator_range<op_iterator> |
| Public Types inherited from llvm::Metadata | |
| enum | MetadataKind |
Public Member Functions | |
| DEFINE_MDNODE_GET (DISubprogram,(DIScope *Scope, StringRef Name, StringRef LinkageName, DIFile *File, unsigned Line, DISubroutineType *Type, unsigned ScopeLine, DIType *ContainingType, unsigned VirtualIndex, int ThisAdjustment, DIFlags Flags, DISPFlags SPFlags, DICompileUnit *Unit, DITemplateParameterArray TemplateParams=nullptr, DISubprogram *Declaration=nullptr, MDNodeArray RetainedNodes=nullptr, DITypeArray ThrownTypes=nullptr, DINodeArray Annotations=nullptr, StringRef TargetFuncName="", bool UsesKeyInstructions=false),(Scope, Name, LinkageName, File, Line, Type, ScopeLine, ContainingType, VirtualIndex, ThisAdjustment, Flags, SPFlags, Unit, TemplateParams, Declaration, RetainedNodes, ThrownTypes, Annotations, TargetFuncName, UsesKeyInstructions)) DEFINE_MDNODE_GET(DISubprogram | |
| template<typename FuncLVT, typename FuncLabelT, typename FuncImportedEntityT, typename FuncTypeT, typename FuncGVET> | |
| void | forEachRetainedNode (FuncLVT &&FuncLV, FuncLabelT &&FuncLabel, FuncImportedEntityT &&FuncIE, FuncTypeT &&FuncType, FuncGVET &&FuncGVE) |
| For each retained node, applies one of the given functions depending on the type of a node. | |
| LLVM_ABI void | cleanupRetainedNodes () |
| When IR modules are merged, typically during LTO, the merged module may contain several types having the same linkageName. | |
| template<typename T> | |
| void | cleanupRetainedNodesIf (T &&Pred) |
| LLVM_ABI bool | describes (const Function *F) const |
| Check if this subprogram describes the given function. | |
| Public Member Functions inherited from llvm::DILocalScope | |
| LLVM_ABI DISubprogram * | getSubprogram () const |
| Get the subprogram for this scope. | |
| LLVM_ABI DILocalScope * | getNonLexicalBlockFileScope () const |
| Get the first non DILexicalBlockFile scope of this scope. | |
| Public Member Functions inherited from llvm::DIScope | |
| DIFile * | getFile () const |
| StringRef | getFilename () const |
| StringRef | getDirectory () const |
| std::optional< StringRef > | getSource () const |
| LLVM_ABI StringRef | getName () const |
| LLVM_ABI DIScope * | getScope () const |
| Metadata * | getRawFile () const |
| Return the raw underlying file. | |
| Public Member Functions inherited from llvm::DINode | |
| LLVM_ABI dwarf::Tag | getTag () const |
| Public Member Functions inherited from llvm::MDNode | |
| MDNode (const MDNode &)=delete | |
| void | operator= (const MDNode &)=delete |
| void * | operator new (size_t)=delete |
| LLVM_ABI TempMDNode | clone () const |
| Create a (temporary) clone of this. | |
| LLVMContext & | getContext () const |
| LLVM_ABI void | replaceOperandWith (unsigned I, Metadata *New) |
| Replace a specific operand. | |
| bool | isResolved () const |
| Check if node is fully resolved. | |
| bool | isUniqued () const |
| bool | isDistinct () const |
| bool | isTemporary () const |
| bool | isReplaceable () const |
| unsigned | getNumTemporaryUses () const |
| void | replaceAllUsesWith (Metadata *MD) |
| RAUW a temporary. | |
| LLVM_ABI void | resolveCycles () |
| Resolve cycles. | |
| LLVM_ABI void | resolve () |
| Resolve a unique, unresolved node. | |
| op_iterator | op_begin () const |
| op_iterator | op_end () const |
| ArrayRef< MDOperand > | operands () const |
| const MDOperand & | getOperand (unsigned I) const |
| unsigned | getNumOperands () const |
| Return number of MDNode operands. | |
| LLVM_ABI bool | isTBAAVtableAccess () const |
| Check whether MDNode is a vtable access. | |
| LLVM_ABI void | printTree (raw_ostream &OS, const Module *M=nullptr) const |
| Print in tree shape. | |
| LLVM_ABI void | printTree (raw_ostream &OS, ModuleSlotTracker &MST, const Module *M=nullptr) const |
| LLVM_ABI void | dumpTree () const |
| User-friendly dump in tree shape. | |
| LLVM_ABI void | dumpTree (const Module *M) const |
| Public Member Functions inherited from llvm::Metadata | |
| unsigned | getMetadataID () const |
| LLVM_ABI void | dump () const |
| User-friendly dump. | |
| LLVM_ABI void | dump (const Module *M) const |
| LLVM_ABI void | print (raw_ostream &OS, const Module *M=nullptr, bool IsForDebug=false) const |
| Print. | |
| LLVM_ABI void | print (raw_ostream &OS, ModuleSlotTracker &MST, const Module *M=nullptr, bool IsForDebug=false) const |
| LLVM_ABI void | printAsOperand (raw_ostream &OS, const Module *M=nullptr) const |
| Print as operand. | |
| LLVM_ABI void | printAsOperand (raw_ostream &OS, ModuleSlotTracker &MST, const Module *M=nullptr) const |
Static Public Member Functions | |
| static LLVM_ABI DISPFlags | getFlag (StringRef Flag) |
| static LLVM_ABI StringRef | getFlagString (DISPFlags Flag) |
| static LLVM_ABI DISPFlags | splitFlags (DISPFlags Flags, SmallVectorImpl< DISPFlags > &SplitFlags) |
| Split up a flags bitfield for easier printing. | |
| static LLVM_ABI DISPFlags | toSPFlags (bool IsLocalToUnit, bool IsDefinition, bool IsOptimized, unsigned Virtuality=SPFlagNonvirtual, bool IsMainSubprogram=false) |
| static LLVM_ABI DILocalScope * | getRetainedNodeScope (MDNode *N) |
| static LLVM_ABI const DIScope * | getRawRetainedNodeScope (const MDNode *N) |
| static LLVM_ABI DIScope * | getRawRetainedNodeScope (MDNode *N) |
| template<typename RangeT> | |
| static void | cleanupRetainedNodes (const RangeT &NewDistinctSPs) |
| Calls SP->cleanupRetainedNodes() for a range of DISubprograms. | |
| static bool | classof (const Metadata *MD) |
| Static Public Member Functions inherited from llvm::DILocalScope | |
| static LLVM_ABI DILocalScope * | cloneScopeForSubprogram (DILocalScope &RootScope, DISubprogram &NewSP, LLVMContext &Ctx, DenseMap< const MDNode *, MDNode * > &Cache) |
| Traverses the scope chain rooted at RootScope until it hits a Subprogram, recreating the chain with "NewSP" instead. | |
| static bool | classof (const Metadata *MD) |
| Static Public Member Functions inherited from llvm::DIScope | |
| static bool | classof (const Metadata *MD) |
| Static Public Member Functions inherited from llvm::DINode | |
| static LLVM_ABI DIFlags | getFlag (StringRef Flag) |
| static LLVM_ABI StringRef | getFlagString (DIFlags Flag) |
| static LLVM_ABI DIFlags | splitFlags (DIFlags Flags, SmallVectorImpl< DIFlags > &SplitFlags) |
| Split up a flags bitfield. | |
| static bool | classof (const Metadata *MD) |
| Static Public Member Functions inherited from llvm::MDNode | |
| static MDTuple * | get (LLVMContext &Context, ArrayRef< Metadata * > MDs) |
| static MDTuple * | getIfExists (LLVMContext &Context, ArrayRef< Metadata * > MDs) |
| static MDTuple * | getDistinct (LLVMContext &Context, ArrayRef< Metadata * > MDs) |
| static TempMDTuple | getTemporary (LLVMContext &Context, ArrayRef< Metadata * > MDs) |
| static LLVM_ABI void | deleteTemporary (MDNode *N) |
| Deallocate a node created by getTemporary. | |
| template<class T> | |
| static std::enable_if_t< std::is_base_of< MDNode, T >::value, T * > | replaceWithPermanent (std::unique_ptr< T, TempMDNodeDeleter > N) |
| Replace a temporary node with a permanent one. | |
| template<class T> | |
| static std::enable_if_t< std::is_base_of< MDNode, T >::value, T * > | replaceWithUniqued (std::unique_ptr< T, TempMDNodeDeleter > N) |
| Replace a temporary node with a uniqued one. | |
| template<class T> | |
| static std::enable_if_t< std::is_base_of< MDNode, T >::value, T * > | replaceWithDistinct (std::unique_ptr< T, TempMDNodeDeleter > N) |
| Replace a temporary node with a distinct one. | |
| static bool | classof (const Metadata *MD) |
| Methods for support type inquiry through isa, cast, and dyn_cast: | |
| static LLVM_ABI MDNode * | concatenate (MDNode *A, MDNode *B) |
| Methods for metadata merging. | |
| static LLVM_ABI MDNode * | intersect (MDNode *A, MDNode *B) |
| static LLVM_ABI MDNode * | getMostGenericTBAA (MDNode *A, MDNode *B) |
| static LLVM_ABI MDNode * | getMostGenericFPMath (MDNode *A, MDNode *B) |
| static LLVM_ABI MDNode * | getMostGenericRange (MDNode *A, MDNode *B) |
| static LLVM_ABI MDNode * | getMostGenericNoaliasAddrspace (MDNode *A, MDNode *B) |
| static LLVM_ABI MDNode * | getMostGenericAliasScope (MDNode *A, MDNode *B) |
| static LLVM_ABI MDNode * | getMostGenericAlignmentOrDereferenceable (MDNode *A, MDNode *B) |
| static LLVM_ABI MDNode * | getMostGenericNoFPClass (MDNode *A, MDNode *B) |
| static LLVM_ABI MDNode * | getMergedProfMetadata (MDNode *A, MDNode *B, const Instruction *AInstr, const Instruction *BInstr) |
| Merge !prof metadata from two instructions. | |
| static LLVM_ABI MDNode * | getMergedMemProfMetadata (MDNode *A, MDNode *B) |
| static LLVM_ABI MDNode * | getMergedCallsiteMetadata (MDNode *A, MDNode *B) |
| static LLVM_ABI MDNode * | getMergedCalleeTypeMetadata (const MDNode *A, const MDNode *B) |
| static LLVM_ABI MDNode * | getMergedAllocTokenMetadata (const MDNode *A, const MDNode *B) |
| static LLVM_ABI CaptureComponents | toCaptureComponents (const MDNode *MD) |
| Convert !captures metadata to CaptureComponents. MD may be nullptr. | |
| static LLVM_ABI MDNode * | fromCaptureComponents (LLVMContext &Ctx, CaptureComponents CC) |
| Convert CaptureComponents to !captures metadata. | |
Friends | |
| class | LLVMContextImpl |
| class | MDNode |
Additional Inherited Members | |
| Static Public Attributes inherited from llvm::Metadata | |
| static constexpr const unsigned | PoisonGeneratingIDs [] |
| Metadata IDs that may generate poison. | |
| Protected Types inherited from llvm::MDNode | |
| using | mutable_op_range = iterator_range<MDOperand *> |
| Protected Types inherited from llvm::Metadata | |
| enum | StorageType { Uniqued , Distinct , Temporary } |
| Active type of storage. More... | |
| Protected Member Functions inherited from llvm::DILocalScope | |
| DILocalScope (LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, ArrayRef< Metadata * > Ops) | |
| ~DILocalScope ()=default | |
| Protected Member Functions inherited from llvm::DIScope | |
| DIScope (LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, ArrayRef< Metadata * > Ops) | |
| ~DIScope ()=default | |
| Protected Member Functions inherited from llvm::DINode | |
| DINode (LLVMContext &C, unsigned ID, StorageType Storage, unsigned Tag, ArrayRef< Metadata * > Ops1, ArrayRef< Metadata * > Ops2={}) | |
| ~DINode ()=default | |
| template<class Ty> | |
| Ty * | getOperandAs (unsigned I) const |
| StringRef | getStringOperand (unsigned I) const |
| void | setTag (unsigned Tag) |
| Allow subclasses to mutate the tag. | |
| Protected Member Functions inherited from llvm::MDNode | |
| LLVM_ABI | MDNode (LLVMContext &Context, unsigned ID, StorageType Storage, ArrayRef< Metadata * > Ops1, ArrayRef< Metadata * > Ops2={}) |
| ~MDNode ()=default | |
| LLVM_ABI void * | operator new (size_t Size, size_t NumOps, StorageType Storage) |
| LLVM_ABI void | operator delete (void *Mem) |
| void | operator delete (void *, unsigned) |
| Required by std, but never called. | |
| void | operator delete (void *, unsigned, bool) |
| Required by std, but never called. | |
| LLVM_ABI void | dropAllReferences () |
| MDOperand * | mutable_begin () |
| MDOperand * | mutable_end () |
| mutable_op_range | mutable_operands () |
| LLVM_ABI void | setOperand (unsigned I, Metadata *New) |
| Set an operand. | |
| unsigned | getNumUnresolved () const |
| void | setNumUnresolved (unsigned N) |
| LLVM_ABI void | storeDistinctInContext () |
| void | resize (size_t NumOps) |
| Resize the node to hold NumOps operands. | |
| Protected Member Functions inherited from llvm::Metadata | |
| Metadata (unsigned ID, StorageType Storage) | |
| ~Metadata ()=default | |
| void | handleChangedOperand (void *, Metadata *) |
| Default handling of a changed operand, which asserts. | |
| Static Protected Member Functions inherited from llvm::DINode | |
| static MDString * | getCanonicalMDString (LLVMContext &Context, StringRef S) |
| Static Protected Member Functions inherited from llvm::MDNode | |
| template<class T, class StoreT> | |
| static T * | storeImpl (T *N, StorageType Storage, StoreT &Store) |
| template<class T> | |
| static T * | storeImpl (T *N, StorageType Storage) |
| Protected Attributes inherited from llvm::Metadata | |
| unsigned char | Storage: 7 |
| Storage flag for non-uniqued, otherwise unowned, metadata. | |
| unsigned char | SubclassData1: 1 |
| unsigned short | SubclassData16 = 0 |
| unsigned | SubclassData32 = 0 |
Subprogram description. Uses SubclassData1.
Definition at line 2294 of file DebugInfoMetadata.h.
Debug info subprogram flags.
| Enumerator | |
|---|---|
| SPFlagNonvirtual | |
| SPFlagVirtuality | |
Definition at line 2309 of file DebugInfoMetadata.h.
Definition at line 2665 of file DebugInfoMetadata.h.
References llvm::Metadata::getMetadataID().
| void DISubprogram::cleanupRetainedNodes | ( | ) |
When IR modules are merged, typically during LTO, the merged module may contain several types having the same linkageName.
They are supposed to represent the same type included by multiple source code files from a single header file.
DebugTypeODRUniquing feature uniques (deduplicates) such types based on their linkageName during metadata loading, to speed up compilation and reduce debug info size.
However, since function-local types are tracked in DISubprogram's retainedNodes field, a single local type may be referenced by multiple DISubprograms via retainedNodes as the result of DebugTypeODRUniquing. But retainedNodes field of a DISubprogram is meant to hold only subprogram's own local entities, therefore such references may cause crashes.
To address this problem, this method is called for each new subprogram after module loading. It removes references to types belonging to other DISubprograms from a subprogram's retainedNodes list. If a corresponding IR function refers to local scopes from another subprogram, emitted debug info (e.g. DWARF) should rely on cross-subprogram references (and cross-CU references, as subprograms may belong to different compile units). This is also a drawback: when a subprogram refers to types that are local to another subprogram, it is more complicated for debugger to properly discover local types of a current scope for expression evaluation.
Definition at line 1476 of file DebugInfoMetadata.cpp.
References cleanupRetainedNodesIf(), llvm::dyn_cast_or_null(), N, and T.
Referenced by llvm::LLParser::parseMetadataDefinitions().
|
inlinestatic |
Calls SP->cleanupRetainedNodes() for a range of DISubprograms.
Definition at line 2655 of file DebugInfoMetadata.h.
Definition at line 2642 of file DebugInfoMetadata.h.
References llvm::dyn_cast_or_null(), RetainedNodes, and T.
Referenced by cleanupRetainedNodes().
| llvm::DISubprogram::DEFINE_MDNODE_GET | ( | DISubprogram | , |
| (DIScope *Scope, StringRef Name, StringRef LinkageName, DIFile *File, unsigned Line, DISubroutineType *Type, unsigned ScopeLine, DIType *ContainingType, unsigned VirtualIndex, int ThisAdjustment, DIFlags Flags, DISPFlags SPFlags, DICompileUnit *Unit, DITemplateParameterArray TemplateParams=nullptr, DISubprogram *Declaration=nullptr, MDNodeArray RetainedNodes=nullptr, DITypeArray ThrownTypes=nullptr, DINodeArray Annotations=nullptr, StringRef TargetFuncName="", bool UsesKeyInstructions=false) | , | ||
| (Scope, Name, LinkageName, File, Line, Type, ScopeLine, ContainingType, VirtualIndex, ThisAdjustment, Flags, SPFlags, Unit, TemplateParams, Declaration, RetainedNodes, ThrownTypes, Annotations, TargetFuncName, UsesKeyInstructions) | ) |
References Annotations, ContainingType, Declaration, File, LinkageName, Name, RetainedNodes, Scope, TargetFuncName, TemplateParams, ThrownTypes, Type, Unit, and UsesKeyInstructions.
Check if this subprogram describes the given function.
FIXME: Should this be looking through bitcasts?
Definition at line 1447 of file DebugInfoMetadata.cpp.
|
inline |
For each retained node, applies one of the given functions depending on the type of a node.
Definition at line 2605 of file DebugInfoMetadata.h.
References llvm_unreachable, MDNode, and N.
|
static |
Definition at line 1370 of file DebugInfoMetadata.cpp.
References llvm::StringSwitch< T, R >::Default().
Referenced by llvm::LLParser::parseMDField().
Definition at line 1377 of file DebugInfoMetadata.cpp.
References SPFlagVirtuality.
Definition at line 1460 of file DebugInfoMetadata.cpp.
References getRawRetainedNodeScopeInternal(), MDNode, and N.
Referenced by llvm::DIBuilder::finalizeSubprogram(), and getRetainedNodeScope().
Definition at line 1464 of file DebugInfoMetadata.cpp.
References getRawRetainedNodeScopeInternal(), MDNode, and N.
|
static |
Definition at line 1468 of file DebugInfoMetadata.cpp.
References llvm::cast(), llvm::DILocalScope::DILocalScope(), getRawRetainedNodeScope(), MDNode, and N.
Referenced by llvm::CloneFunctionInto(), and getRetainedNodeScope().
|
static |
Split up a flags bitfield for easier printing.
Split Flags into SplitFlags, a vector of its components. Returns any remaining (unrecognized) bits.
Definition at line 1391 of file DebugInfoMetadata.cpp.
|
static |
Definition at line 1316 of file DebugInfoMetadata.cpp.
References SPFlagVirtuality.
Referenced by pack_into_DISPFlags().
|
friend |
Definition at line 2295 of file DebugInfoMetadata.h.
References LLVMContextImpl.
Referenced by LLVMContextImpl.
|
friend |
Definition at line 2296 of file DebugInfoMetadata.h.
References MDNode.
Referenced by forEachRetainedNode(), getRawRetainedNodeScope(), getRawRetainedNodeScope(), getRetainedNodeScope(), and MDNode.
| Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata Metadata Metadata Metadata Metadata Metadata* llvm::DISubprogram::Annotations = nullptr |
Definition at line 2408 of file DebugInfoMetadata.h.
Referenced by DEFINE_MDNODE_GET().
| Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata* llvm::DISubprogram::ContainingType |
Definition at line 2404 of file DebugInfoMetadata.h.
Referenced by DEFINE_MDNODE_GET().
| Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata Metadata Metadata* llvm::DISubprogram::Declaration = nullptr |
Definition at line 2406 of file DebugInfoMetadata.h.
Referenced by DEFINE_MDNODE_GET().
Definition at line 2402 of file DebugInfoMetadata.h.
Referenced by DEFINE_MDNODE_GET().
| Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags llvm::DISubprogram::Flags |
Definition at line 2405 of file DebugInfoMetadata.h.
Definition at line 2403 of file DebugInfoMetadata.h.
Definition at line 2402 of file DebugInfoMetadata.h.
Referenced by DEFINE_MDNODE_GET().
Definition at line 2402 of file DebugInfoMetadata.h.
Referenced by DEFINE_MDNODE_GET().
| Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata Metadata Metadata Metadata* llvm::DISubprogram::RetainedNodes = nullptr |
Definition at line 2407 of file DebugInfoMetadata.h.
Referenced by cleanupRetainedNodesIf(), and DEFINE_MDNODE_GET().
| Metadata* llvm::DISubprogram::Scope |
Definition at line 2402 of file DebugInfoMetadata.h.
Referenced by DEFINE_MDNODE_GET().
Definition at line 2403 of file DebugInfoMetadata.h.
| Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags llvm::DISubprogram::SPFlags |
Definition at line 2405 of file DebugInfoMetadata.h.
| Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata Metadata Metadata Metadata Metadata Metadata MDString* llvm::DISubprogram::TargetFuncName = nullptr |
Definition at line 2408 of file DebugInfoMetadata.h.
Referenced by DEFINE_MDNODE_GET().
| Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata Metadata* llvm::DISubprogram::TemplateParams = nullptr |
Definition at line 2406 of file DebugInfoMetadata.h.
Referenced by DEFINE_MDNODE_GET().
| Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int llvm::DISubprogram::ThisAdjustment |
Definition at line 2404 of file DebugInfoMetadata.h.
| Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata Metadata Metadata Metadata Metadata* llvm::DISubprogram::ThrownTypes = nullptr |
Definition at line 2407 of file DebugInfoMetadata.h.
Referenced by DEFINE_MDNODE_GET().
Definition at line 2403 of file DebugInfoMetadata.h.
Referenced by DEFINE_MDNODE_GET().
| Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata* llvm::DISubprogram::Unit |
Definition at line 2405 of file DebugInfoMetadata.h.
Referenced by DEFINE_MDNODE_GET().
| Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned int DIFlags DISPFlags Metadata Metadata Metadata Metadata Metadata Metadata MDString bool llvm::DISubprogram::UsesKeyInstructions |
Definition at line 2409 of file DebugInfoMetadata.h.
Referenced by DEFINE_MDNODE_GET().
| Metadata MDString MDString Metadata unsigned Metadata unsigned Metadata unsigned llvm::DISubprogram::VirtualIndex |
Definition at line 2404 of file DebugInfoMetadata.h.