#include "llvm/IR/DIBuilder.h"
#include "LLVMContextImpl.h"
#include "llvm/ADT/APInt.h"
#include "llvm/ADT/APSInt.h"
#include "llvm/BinaryFormat/Dwarf.h"
#include "llvm/IR/Constants.h"
#include "llvm/IR/DebugInfo.h"
#include "llvm/IR/IRBuilder.h"
#include "llvm/IR/Module.h"
#include "llvm/Support/CommandLine.h"
#include <optional>
usingnamespacellvm;
usingnamespacellvm::dwarf;
DIBuilder::DIBuilder(Module &m, bool AllowUnresolvedNodes, DICompileUnit *CU)
: … { … }
void DIBuilder::trackIfUnresolved(MDNode *N) { … }
void DIBuilder::finalizeSubprogram(DISubprogram *SP) { … }
void DIBuilder::finalize() { … }
static DIScope *getNonCompileUnitScope(DIScope *N) { … }
DICompileUnit *DIBuilder::createCompileUnit(
unsigned Lang, DIFile *File, StringRef Producer, bool isOptimized,
StringRef Flags, unsigned RunTimeVer, StringRef SplitName,
DICompileUnit::DebugEmissionKind Kind, uint64_t DWOId,
bool SplitDebugInlining, bool DebugInfoForProfiling,
DICompileUnit::DebugNameTableKind NameTableKind, bool RangesBaseAddress,
StringRef SysRoot, StringRef SDK) { … }
static DIImportedEntity *
createImportedModule(LLVMContext &C, dwarf::Tag Tag, DIScope *Context,
Metadata *NS, DIFile *File, unsigned Line, StringRef Name,
DINodeArray Elements,
SmallVectorImpl<TrackingMDNodeRef> &ImportedModules) { … }
DIImportedEntity *DIBuilder::createImportedModule(DIScope *Context,
DINamespace *NS, DIFile *File,
unsigned Line,
DINodeArray Elements) { … }
DIImportedEntity *DIBuilder::createImportedModule(DIScope *Context,
DIImportedEntity *NS,
DIFile *File, unsigned Line,
DINodeArray Elements) { … }
DIImportedEntity *DIBuilder::createImportedModule(DIScope *Context, DIModule *M,
DIFile *File, unsigned Line,
DINodeArray Elements) { … }
DIImportedEntity *
DIBuilder::createImportedDeclaration(DIScope *Context, DINode *Decl,
DIFile *File, unsigned Line,
StringRef Name, DINodeArray Elements) { … }
DIFile *DIBuilder::createFile(StringRef Filename, StringRef Directory,
std::optional<DIFile::ChecksumInfo<StringRef>> CS,
std::optional<StringRef> Source) { … }
DIMacro *DIBuilder::createMacro(DIMacroFile *Parent, unsigned LineNumber,
unsigned MacroType, StringRef Name,
StringRef Value) { … }
DIMacroFile *DIBuilder::createTempMacroFile(DIMacroFile *Parent,
unsigned LineNumber, DIFile *File) { … }
DIEnumerator *DIBuilder::createEnumerator(StringRef Name, uint64_t Val,
bool IsUnsigned) { … }
DIEnumerator *DIBuilder::createEnumerator(StringRef Name, const APSInt &Value) { … }
DIBasicType *DIBuilder::createUnspecifiedType(StringRef Name) { … }
DIBasicType *DIBuilder::createNullPtrType() { … }
DIBasicType *DIBuilder::createBasicType(StringRef Name, uint64_t SizeInBits,
unsigned Encoding,
DINode::DIFlags Flags) { … }
DIStringType *DIBuilder::createStringType(StringRef Name, uint64_t SizeInBits) { … }
DIStringType *DIBuilder::createStringType(StringRef Name,
DIVariable *StringLength,
DIExpression *StrLocationExp) { … }
DIStringType *DIBuilder::createStringType(StringRef Name,
DIExpression *StringLengthExp,
DIExpression *StrLocationExp) { … }
DIDerivedType *DIBuilder::createQualifiedType(unsigned Tag, DIType *FromTy) { … }
DIDerivedType *DIBuilder::createPtrAuthQualifiedType(
DIType *FromTy, unsigned Key, bool IsAddressDiscriminated,
unsigned ExtraDiscriminator, bool IsaPointer,
bool AuthenticatesNullValues) { … }
DIDerivedType *
DIBuilder::createPointerType(DIType *PointeeTy, uint64_t SizeInBits,
uint32_t AlignInBits,
std::optional<unsigned> DWARFAddressSpace,
StringRef Name, DINodeArray Annotations) { … }
DIDerivedType *DIBuilder::createMemberPointerType(DIType *PointeeTy,
DIType *Base,
uint64_t SizeInBits,
uint32_t AlignInBits,
DINode::DIFlags Flags) { … }
DIDerivedType *
DIBuilder::createReferenceType(unsigned Tag, DIType *RTy, uint64_t SizeInBits,
uint32_t AlignInBits,
std::optional<unsigned> DWARFAddressSpace) { … }
DIDerivedType *DIBuilder::createTypedef(DIType *Ty, StringRef Name,
DIFile *File, unsigned LineNo,
DIScope *Context, uint32_t AlignInBits,
DINode::DIFlags Flags,
DINodeArray Annotations) { … }
DIDerivedType *
DIBuilder::createTemplateAlias(DIType *Ty, StringRef Name, DIFile *File,
unsigned LineNo, DIScope *Context,
DINodeArray TParams, uint32_t AlignInBits,
DINode::DIFlags Flags, DINodeArray Annotations) { … }
DIDerivedType *DIBuilder::createFriend(DIType *Ty, DIType *FriendTy) { … }
DIDerivedType *DIBuilder::createInheritance(DIType *Ty, DIType *BaseTy,
uint64_t BaseOffset,
uint32_t VBPtrOffset,
DINode::DIFlags Flags) { … }
DIDerivedType *DIBuilder::createMemberType(
DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,
uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits,
DINode::DIFlags Flags, DIType *Ty, DINodeArray Annotations) { … }
static ConstantAsMetadata *getConstantOrNull(Constant *C) { … }
DIDerivedType *DIBuilder::createVariantMemberType(
DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,
uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits,
Constant *Discriminant, DINode::DIFlags Flags, DIType *Ty) { … }
DIDerivedType *DIBuilder::createBitFieldMemberType(
DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,
uint64_t SizeInBits, uint64_t OffsetInBits, uint64_t StorageOffsetInBits,
DINode::DIFlags Flags, DIType *Ty, DINodeArray Annotations) { … }
DIDerivedType *
DIBuilder::createStaticMemberType(DIScope *Scope, StringRef Name, DIFile *File,
unsigned LineNumber, DIType *Ty,
DINode::DIFlags Flags, llvm::Constant *Val,
unsigned Tag, uint32_t AlignInBits) { … }
DIDerivedType *
DIBuilder::createObjCIVar(StringRef Name, DIFile *File, unsigned LineNumber,
uint64_t SizeInBits, uint32_t AlignInBits,
uint64_t OffsetInBits, DINode::DIFlags Flags,
DIType *Ty, MDNode *PropertyNode) { … }
DIObjCProperty *
DIBuilder::createObjCProperty(StringRef Name, DIFile *File, unsigned LineNumber,
StringRef GetterName, StringRef SetterName,
unsigned PropertyAttributes, DIType *Ty) { … }
DITemplateTypeParameter *
DIBuilder::createTemplateTypeParameter(DIScope *Context, StringRef Name,
DIType *Ty, bool isDefault) { … }
static DITemplateValueParameter *
createTemplateValueParameterHelper(LLVMContext &VMContext, unsigned Tag,
DIScope *Context, StringRef Name, DIType *Ty,
bool IsDefault, Metadata *MD) { … }
DITemplateValueParameter *
DIBuilder::createTemplateValueParameter(DIScope *Context, StringRef Name,
DIType *Ty, bool isDefault,
Constant *Val) { … }
DITemplateValueParameter *
DIBuilder::createTemplateTemplateParameter(DIScope *Context, StringRef Name,
DIType *Ty, StringRef Val,
bool IsDefault) { … }
DITemplateValueParameter *
DIBuilder::createTemplateParameterPack(DIScope *Context, StringRef Name,
DIType *Ty, DINodeArray Val) { … }
DICompositeType *DIBuilder::createClassType(
DIScope *Context, StringRef Name, DIFile *File, unsigned LineNumber,
uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits,
DINode::DIFlags Flags, DIType *DerivedFrom, DINodeArray Elements,
unsigned RunTimeLang, DIType *VTableHolder, MDNode *TemplateParams,
StringRef UniqueIdentifier) { … }
DICompositeType *DIBuilder::createStructType(
DIScope *Context, StringRef Name, DIFile *File, unsigned LineNumber,
uint64_t SizeInBits, uint32_t AlignInBits, DINode::DIFlags Flags,
DIType *DerivedFrom, DINodeArray Elements, unsigned RunTimeLang,
DIType *VTableHolder, StringRef UniqueIdentifier) { … }
DICompositeType *DIBuilder::createUnionType(
DIScope *Scope, StringRef Name, DIFile *File, unsigned LineNumber,
uint64_t SizeInBits, uint32_t AlignInBits, DINode::DIFlags Flags,
DINodeArray Elements, unsigned RunTimeLang, StringRef UniqueIdentifier) { … }
DICompositeType *
DIBuilder::createVariantPart(DIScope *Scope, StringRef Name, DIFile *File,
unsigned LineNumber, uint64_t SizeInBits,
uint32_t AlignInBits, DINode::DIFlags Flags,
DIDerivedType *Discriminator, DINodeArray Elements,
StringRef UniqueIdentifier) { … }
DISubroutineType *DIBuilder::createSubroutineType(DITypeRefArray ParameterTypes,
DINode::DIFlags Flags,
unsigned CC) { … }
DICompositeType *
DIBuilder::createEnumerationType(DIScope *Scope, StringRef Name, DIFile *File,
unsigned LineNumber, uint64_t SizeInBits,
uint32_t AlignInBits, DINodeArray Elements,
DIType *UnderlyingType, unsigned RunTimeLang,
StringRef UniqueIdentifier, bool IsScoped) { … }
DIDerivedType *DIBuilder::createSetType(DIScope *Scope, StringRef Name,
DIFile *File, unsigned LineNo,
uint64_t SizeInBits,
uint32_t AlignInBits, DIType *Ty) { … }
DICompositeType *
DIBuilder::createArrayType(uint64_t Size, uint32_t AlignInBits, DIType *Ty,
DINodeArray Subscripts,
PointerUnion<DIExpression *, DIVariable *> DL,
PointerUnion<DIExpression *, DIVariable *> AS,
PointerUnion<DIExpression *, DIVariable *> AL,
PointerUnion<DIExpression *, DIVariable *> RK) { … }
DICompositeType *DIBuilder::createVectorType(uint64_t Size,
uint32_t AlignInBits, DIType *Ty,
DINodeArray Subscripts) { … }
DISubprogram *DIBuilder::createArtificialSubprogram(DISubprogram *SP) { … }
static DIType *createTypeWithFlags(const DIType *Ty,
DINode::DIFlags FlagsToSet) { … }
DIType *DIBuilder::createArtificialType(DIType *Ty) { … }
DIType *DIBuilder::createObjectPointerType(DIType *Ty) { … }
void DIBuilder::retainType(DIScope *T) { … }
DIBasicType *DIBuilder::createUnspecifiedParameter() { … }
DICompositeType *
DIBuilder::createForwardDecl(unsigned Tag, StringRef Name, DIScope *Scope,
DIFile *F, unsigned Line, unsigned RuntimeLang,
uint64_t SizeInBits, uint32_t AlignInBits,
StringRef UniqueIdentifier) { … }
DICompositeType *DIBuilder::createReplaceableCompositeType(
unsigned Tag, StringRef Name, DIScope *Scope, DIFile *F, unsigned Line,
unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits,
DINode::DIFlags Flags, StringRef UniqueIdentifier,
DINodeArray Annotations) { … }
DINodeArray DIBuilder::getOrCreateArray(ArrayRef<Metadata *> Elements) { … }
DIMacroNodeArray
DIBuilder::getOrCreateMacroArray(ArrayRef<Metadata *> Elements) { … }
DITypeRefArray DIBuilder::getOrCreateTypeArray(ArrayRef<Metadata *> Elements) { … }
DISubrange *DIBuilder::getOrCreateSubrange(int64_t Lo, int64_t Count) { … }
DISubrange *DIBuilder::getOrCreateSubrange(int64_t Lo, Metadata *CountNode) { … }
DISubrange *DIBuilder::getOrCreateSubrange(Metadata *CountNode, Metadata *LB,
Metadata *UB, Metadata *Stride) { … }
DIGenericSubrange *DIBuilder::getOrCreateGenericSubrange(
DIGenericSubrange::BoundType CountNode, DIGenericSubrange::BoundType LB,
DIGenericSubrange::BoundType UB, DIGenericSubrange::BoundType Stride) { … }
static void checkGlobalVariableScope(DIScope *Context) { … }
DIGlobalVariableExpression *DIBuilder::createGlobalVariableExpression(
DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *F,
unsigned LineNumber, DIType *Ty, bool IsLocalToUnit, bool isDefined,
DIExpression *Expr, MDNode *Decl, MDTuple *TemplateParams,
uint32_t AlignInBits, DINodeArray Annotations) { … }
DIGlobalVariable *DIBuilder::createTempGlobalVariableFwdDecl(
DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *F,
unsigned LineNumber, DIType *Ty, bool IsLocalToUnit, MDNode *Decl,
MDTuple *TemplateParams, uint32_t AlignInBits) { … }
static DILocalVariable *createLocalVariable(
LLVMContext &VMContext,
SmallVectorImpl<TrackingMDNodeRef> &PreservedNodes,
DIScope *Context, StringRef Name, unsigned ArgNo, DIFile *File,
unsigned LineNo, DIType *Ty, bool AlwaysPreserve, DINode::DIFlags Flags,
uint32_t AlignInBits, DINodeArray Annotations = nullptr) { … }
DILocalVariable *DIBuilder::createAutoVariable(DIScope *Scope, StringRef Name,
DIFile *File, unsigned LineNo,
DIType *Ty, bool AlwaysPreserve,
DINode::DIFlags Flags,
uint32_t AlignInBits) { … }
DILocalVariable *DIBuilder::createParameterVariable(
DIScope *Scope, StringRef Name, unsigned ArgNo, DIFile *File,
unsigned LineNo, DIType *Ty, bool AlwaysPreserve, DINode::DIFlags Flags,
DINodeArray Annotations) { … }
DILabel *DIBuilder::createLabel(DIScope *Context, StringRef Name, DIFile *File,
unsigned LineNo, bool AlwaysPreserve) { … }
DIExpression *DIBuilder::createExpression(ArrayRef<uint64_t> Addr) { … }
template <class... Ts>
static DISubprogram *getSubprogram(bool IsDistinct, Ts &&...Args) { … }
DISubprogram *DIBuilder::createFunction(
DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *File,
unsigned LineNo, DISubroutineType *Ty, unsigned ScopeLine,
DINode::DIFlags Flags, DISubprogram::DISPFlags SPFlags,
DITemplateParameterArray TParams, DISubprogram *Decl,
DITypeArray ThrownTypes, DINodeArray Annotations,
StringRef TargetFuncName) { … }
DISubprogram *DIBuilder::createTempFunctionFwdDecl(
DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *File,
unsigned LineNo, DISubroutineType *Ty, unsigned ScopeLine,
DINode::DIFlags Flags, DISubprogram::DISPFlags SPFlags,
DITemplateParameterArray TParams, DISubprogram *Decl,
DITypeArray ThrownTypes) { … }
DISubprogram *DIBuilder::createMethod(
DIScope *Context, StringRef Name, StringRef LinkageName, DIFile *F,
unsigned LineNo, DISubroutineType *Ty, unsigned VIndex, int ThisAdjustment,
DIType *VTableHolder, DINode::DIFlags Flags,
DISubprogram::DISPFlags SPFlags, DITemplateParameterArray TParams,
DITypeArray ThrownTypes) { … }
DICommonBlock *DIBuilder::createCommonBlock(DIScope *Scope,
DIGlobalVariable *Decl,
StringRef Name, DIFile *File,
unsigned LineNo) { … }
DINamespace *DIBuilder::createNameSpace(DIScope *Scope, StringRef Name,
bool ExportSymbols) { … }
DIModule *DIBuilder::createModule(DIScope *Scope, StringRef Name,
StringRef ConfigurationMacros,
StringRef IncludePath, StringRef APINotesFile,
DIFile *File, unsigned LineNo, bool IsDecl) { … }
DILexicalBlockFile *DIBuilder::createLexicalBlockFile(DIScope *Scope,
DIFile *File,
unsigned Discriminator) { … }
DILexicalBlock *DIBuilder::createLexicalBlock(DIScope *Scope, DIFile *File,
unsigned Line, unsigned Col) { … }
DbgInstPtr DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo,
DIExpression *Expr, const DILocation *DL,
Instruction *InsertBefore) { … }
DbgInstPtr DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo,
DIExpression *Expr, const DILocation *DL,
BasicBlock *InsertAtEnd) { … }
DbgInstPtr DIBuilder::insertDbgAssign(Instruction *LinkedInstr, Value *Val,
DILocalVariable *SrcVar,
DIExpression *ValExpr, Value *Addr,
DIExpression *AddrExpr,
const DILocation *DL) { … }
DbgInstPtr DIBuilder::insertLabel(DILabel *LabelInfo, const DILocation *DL,
Instruction *InsertBefore) { … }
DbgInstPtr DIBuilder::insertLabel(DILabel *LabelInfo, const DILocation *DL,
BasicBlock *InsertAtEnd) { … }
DbgInstPtr DIBuilder::insertDbgValueIntrinsic(Value *V,
DILocalVariable *VarInfo,
DIExpression *Expr,
const DILocation *DL,
Instruction *InsertBefore) { … }
DbgInstPtr DIBuilder::insertDbgValueIntrinsic(Value *V,
DILocalVariable *VarInfo,
DIExpression *Expr,
const DILocation *DL,
BasicBlock *InsertAtEnd) { … }
static void initIRBuilder(IRBuilder<> &Builder, const DILocation *DL,
BasicBlock *InsertBB, Instruction *InsertBefore) { … }
static Value *getDbgIntrinsicValueImpl(LLVMContext &VMContext, Value *V) { … }
static Function *getDeclareIntrin(Module &M) { … }
DbgInstPtr DIBuilder::insertDbgValueIntrinsic(
llvm::Value *Val, DILocalVariable *VarInfo, DIExpression *Expr,
const DILocation *DL, BasicBlock *InsertBB, Instruction *InsertBefore) { … }
DbgInstPtr DIBuilder::insertDeclare(Value *Storage, DILocalVariable *VarInfo,
DIExpression *Expr, const DILocation *DL,
BasicBlock *InsertBB,
Instruction *InsertBefore) { … }
void DIBuilder::insertDbgVariableRecord(DbgVariableRecord *DVR,
BasicBlock *InsertBB,
Instruction *InsertBefore,
bool InsertAtHead) { … }
Instruction *DIBuilder::insertDbgIntrinsic(llvm::Function *IntrinsicFn,
Value *V, DILocalVariable *VarInfo,
DIExpression *Expr,
const DILocation *DL,
BasicBlock *InsertBB,
Instruction *InsertBefore) { … }
DbgInstPtr DIBuilder::insertLabel(DILabel *LabelInfo, const DILocation *DL,
BasicBlock *InsertBB,
Instruction *InsertBefore) { … }
void DIBuilder::replaceVTableHolder(DICompositeType *&T, DIType *VTableHolder) { … }
void DIBuilder::replaceArrays(DICompositeType *&T, DINodeArray Elements,
DINodeArray TParams) { … }