//===------------ DebugInfo.h - LLVM C API Debug Info API -----------------===// // // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. // See https://llvm.org/LICENSE.txt for license information. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception // //===----------------------------------------------------------------------===// /// /// This file declares the C API endpoints for generating DWARF Debug Info /// /// Note: This interface is experimental. It is *NOT* stable, and may be /// changed without warning. /// //===----------------------------------------------------------------------===// #ifndef LLVM_C_DEBUGINFO_H #define LLVM_C_DEBUGINFO_H #include "llvm-c/Core.h" #ifdef __cplusplus extern "C" { #endif /** * Debug info flags. */ typedef enum { LLVMDIFlagZero = 0, LLVMDIFlagPrivate = 1, LLVMDIFlagProtected = 2, LLVMDIFlagPublic = 3, LLVMDIFlagFwdDecl = 1 << 2, LLVMDIFlagAppleBlock = 1 << 3, LLVMDIFlagReservedBit4 = 1 << 4, LLVMDIFlagVirtual = 1 << 5, LLVMDIFlagArtificial = 1 << 6, LLVMDIFlagExplicit = 1 << 7, LLVMDIFlagPrototyped = 1 << 8, LLVMDIFlagObjcClassComplete = 1 << 9, LLVMDIFlagObjectPointer = 1 << 10, LLVMDIFlagVector = 1 << 11, LLVMDIFlagStaticMember = 1 << 12, LLVMDIFlagLValueReference = 1 << 13, LLVMDIFlagRValueReference = 1 << 14, LLVMDIFlagReserved = 1 << 15, LLVMDIFlagSingleInheritance = 1 << 16, LLVMDIFlagMultipleInheritance = 2 << 16, LLVMDIFlagVirtualInheritance = 3 << 16, LLVMDIFlagIntroducedVirtual = 1 << 18, LLVMDIFlagBitField = 1 << 19, LLVMDIFlagNoReturn = 1 << 20, LLVMDIFlagTypePassByValue = 1 << 22, LLVMDIFlagTypePassByReference = 1 << 23, LLVMDIFlagEnumClass = 1 << 24, LLVMDIFlagFixedEnum = LLVMDIFlagEnumClass, // Deprecated. LLVMDIFlagThunk = 1 << 25, LLVMDIFlagNonTrivial = 1 << 26, LLVMDIFlagBigEndian = 1 << 27, LLVMDIFlagLittleEndian = 1 << 28, LLVMDIFlagIndirectVirtualBase = (1 << 2) | (1 << 5), LLVMDIFlagAccessibility = LLVMDIFlagPrivate | LLVMDIFlagProtected | LLVMDIFlagPublic, LLVMDIFlagPtrToMemberRep = LLVMDIFlagSingleInheritance | LLVMDIFlagMultipleInheritance | LLVMDIFlagVirtualInheritance } LLVMDIFlags; /** * Source languages known by DWARF. */ typedef enum { LLVMDWARFSourceLanguageC89, LLVMDWARFSourceLanguageC, LLVMDWARFSourceLanguageAda83, LLVMDWARFSourceLanguageC_plus_plus, LLVMDWARFSourceLanguageCobol74, LLVMDWARFSourceLanguageCobol85, LLVMDWARFSourceLanguageFortran77, LLVMDWARFSourceLanguageFortran90, LLVMDWARFSourceLanguagePascal83, LLVMDWARFSourceLanguageModula2, // New in DWARF v3: LLVMDWARFSourceLanguageJava, LLVMDWARFSourceLanguageC99, LLVMDWARFSourceLanguageAda95, LLVMDWARFSourceLanguageFortran95, LLVMDWARFSourceLanguagePLI, LLVMDWARFSourceLanguageObjC, LLVMDWARFSourceLanguageObjC_plus_plus, LLVMDWARFSourceLanguageUPC, LLVMDWARFSourceLanguageD, // New in DWARF v4: LLVMDWARFSourceLanguagePython, // New in DWARF v5: LLVMDWARFSourceLanguageOpenCL, LLVMDWARFSourceLanguageGo, LLVMDWARFSourceLanguageModula3, LLVMDWARFSourceLanguageHaskell, LLVMDWARFSourceLanguageC_plus_plus_03, LLVMDWARFSourceLanguageC_plus_plus_11, LLVMDWARFSourceLanguageOCaml, LLVMDWARFSourceLanguageRust, LLVMDWARFSourceLanguageC11, LLVMDWARFSourceLanguageSwift, LLVMDWARFSourceLanguageJulia, LLVMDWARFSourceLanguageDylan, LLVMDWARFSourceLanguageC_plus_plus_14, LLVMDWARFSourceLanguageFortran03, LLVMDWARFSourceLanguageFortran08, LLVMDWARFSourceLanguageRenderScript, LLVMDWARFSourceLanguageBLISS, // Vendor extensions: LLVMDWARFSourceLanguageMips_Assembler, LLVMDWARFSourceLanguageGOOGLE_RenderScript, LLVMDWARFSourceLanguageBORLAND_Delphi } LLVMDWARFSourceLanguage; /** * The amount of debug information to emit. */ typedef enum { LLVMDWARFEmissionNone = 0, LLVMDWARFEmissionFull, LLVMDWARFEmissionLineTablesOnly } LLVMDWARFEmissionKind; /** * The kind of metadata nodes. */ enum { LLVMMDStringMetadataKind, LLVMConstantAsMetadataMetadataKind, LLVMLocalAsMetadataMetadataKind, LLVMDistinctMDOperandPlaceholderMetadataKind, LLVMMDTupleMetadataKind, LLVMDILocationMetadataKind, LLVMDIExpressionMetadataKind, LLVMDIGlobalVariableExpressionMetadataKind, LLVMGenericDINodeMetadataKind, LLVMDISubrangeMetadataKind, LLVMDIEnumeratorMetadataKind, LLVMDIBasicTypeMetadataKind, LLVMDIDerivedTypeMetadataKind, LLVMDICompositeTypeMetadataKind, LLVMDISubroutineTypeMetadataKind, LLVMDIFileMetadataKind, LLVMDICompileUnitMetadataKind, LLVMDISubprogramMetadataKind, LLVMDILexicalBlockMetadataKind, LLVMDILexicalBlockFileMetadataKind, LLVMDINamespaceMetadataKind, LLVMDIModuleMetadataKind, LLVMDITemplateTypeParameterMetadataKind, LLVMDITemplateValueParameterMetadataKind, LLVMDIGlobalVariableMetadataKind, LLVMDILocalVariableMetadataKind, LLVMDILabelMetadataKind, LLVMDIObjCPropertyMetadataKind, LLVMDIImportedEntityMetadataKind, LLVMDIMacroMetadataKind, LLVMDIMacroFileMetadataKind, LLVMDICommonBlockMetadataKind }; typedef unsigned LLVMMetadataKind; /** * An LLVM DWARF type encoding. */ typedef unsigned LLVMDWARFTypeEncoding; /** * Describes the kind of macro declaration used for LLVMDIBuilderCreateMacro. * @see llvm::dwarf::MacinfoRecordType * @note Values are from DW_MACINFO_* constants in the DWARF specification. */ typedef enum { LLVMDWARFMacinfoRecordTypeDefine = 0x01, LLVMDWARFMacinfoRecordTypeMacro = 0x02, LLVMDWARFMacinfoRecordTypeStartFile = 0x03, LLVMDWARFMacinfoRecordTypeEndFile = 0x04, LLVMDWARFMacinfoRecordTypeVendorExt = 0xff } LLVMDWARFMacinfoRecordType; /** * The current debug metadata version number. */ unsigned LLVMDebugMetadataVersion(void); /** * The version of debug metadata that's present in the provided \c Module. */ unsigned LLVMGetModuleDebugMetadataVersion(LLVMModuleRef Module); /** * Strip debug info in the module if it exists. * To do this, we remove all calls to the debugger intrinsics and any named * metadata for debugging. We also remove debug locations for instructions. * Return true if module is modified. */ LLVMBool LLVMStripModuleDebugInfo(LLVMModuleRef Module); /** * Construct a builder for a module, and do not allow for unresolved nodes * attached to the module. */ LLVMDIBuilderRef LLVMCreateDIBuilderDisallowUnresolved(LLVMModuleRef M); /** * Construct a builder for a module and collect unresolved nodes attached * to the module in order to resolve cycles during a call to * \c LLVMDIBuilderFinalize. */ LLVMDIBuilderRef LLVMCreateDIBuilder(LLVMModuleRef M); /** * Deallocates the \c DIBuilder and everything it owns. * @note You must call \c LLVMDIBuilderFinalize before this */ void LLVMDisposeDIBuilder(LLVMDIBuilderRef Builder); /** * Construct any deferred debug info descriptors. */ void LLVMDIBuilderFinalize(LLVMDIBuilderRef Builder); /** * A CompileUnit provides an anchor for all debugging * information generated during this instance of compilation. * \param Lang Source programming language, eg. * \c LLVMDWARFSourceLanguageC99 * \param FileRef File info. * \param Producer Identify the producer of debugging information * and code. Usually this is a compiler * version string. * \param ProducerLen The length of the C string passed to \c Producer. * \param isOptimized A boolean flag which indicates whether optimization * is enabled or not. * \param Flags This string lists command line options. This * string is directly embedded in debug info * output which may be used by a tool * analyzing generated debugging information. * \param FlagsLen The length of the C string passed to \c Flags. * \param RuntimeVer This indicates runtime version for languages like * Objective-C. * \param SplitName The name of the file that we'll split debug info * out into. * \param SplitNameLen The length of the C string passed to \c SplitName. * \param Kind The kind of debug information to generate. * \param DWOId The DWOId if this is a split skeleton compile unit. * \param SplitDebugInlining Whether to emit inline debug info. * \param DebugInfoForProfiling Whether to emit extra debug info for * profile collection. */ LLVMMetadataRef LLVMDIBuilderCreateCompileUnit( LLVMDIBuilderRef Builder, LLVMDWARFSourceLanguage Lang, LLVMMetadataRef FileRef, const char *Producer, size_t ProducerLen, LLVMBool isOptimized, const char *Flags, size_t FlagsLen, unsigned RuntimeVer, const char *SplitName, size_t SplitNameLen, LLVMDWARFEmissionKind Kind, unsigned DWOId, LLVMBool SplitDebugInlining, LLVMBool DebugInfoForProfiling); /** * Create a file descriptor to hold debugging information for a file. * \param Builder The \c DIBuilder. * \param Filename File name. * \param FilenameLen The length of the C string passed to \c Filename. * \param Directory Directory. * \param DirectoryLen The length of the C string passed to \c Directory. */ LLVMMetadataRef LLVMDIBuilderCreateFile(LLVMDIBuilderRef Builder, const char *Filename, size_t FilenameLen, const char *Directory, size_t DirectoryLen); /** * Creates a new descriptor for a module with the specified parent scope. * \param Builder The \c DIBuilder. * \param ParentScope The parent scope containing this module declaration. * \param Name Module name. * \param NameLen The length of the C string passed to \c Name. * \param ConfigMacros A space-separated shell-quoted list of -D macro definitions as they would appear on a command line. * \param ConfigMacrosLen The length of the C string passed to \c ConfigMacros. * \param IncludePath The path to the module map file. * \param IncludePathLen The length of the C string passed to \c IncludePath. * \param ISysRoot The Clang system root (value of -isysroot). * \param ISysRootLen The length of the C string passed to \c ISysRoot. */ LLVMMetadataRef LLVMDIBuilderCreateModule(LLVMDIBuilderRef Builder, LLVMMetadataRef ParentScope, const char *Name, size_t NameLen, const char *ConfigMacros, size_t ConfigMacrosLen, const char *IncludePath, size_t IncludePathLen, const char *ISysRoot, size_t ISysRootLen); /** * Creates a new descriptor for a namespace with the specified parent scope. * \param Builder The \c DIBuilder. * \param ParentScope The parent scope containing this module declaration. * \param Name NameSpace name. * \param NameLen The length of the C string passed to \c Name. * \param ExportSymbols Whether or not the namespace exports symbols, e.g. * this is true of C++ inline namespaces. */ LLVMMetadataRef LLVMDIBuilderCreateNameSpace(LLVMDIBuilderRef Builder, LLVMMetadataRef ParentScope, const char *Name, size_t NameLen, LLVMBool ExportSymbols); /** * Create a new descriptor for the specified subprogram. * \param Builder The \c DIBuilder. * \param Scope Function scope. * \param Name Function name. * \param NameLen Length of enumeration name. * \param LinkageName Mangled function name. * \param LinkageNameLen Length of linkage name. * \param File File where this variable is defined. * \param LineNo Line number. * \param Ty Function type. * \param IsLocalToUnit True if this function is not externally visible. * \param IsDefinition True if this is a function definition. * \param ScopeLine Set to the beginning of the scope this starts * \param Flags E.g.: \c LLVMDIFlagLValueReference. These flags are * used to emit dwarf attributes. * \param IsOptimized True if optimization is ON. */ LLVMMetadataRef LLVMDIBuilderCreateFunction( LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, const char *LinkageName, size_t LinkageNameLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty, LLVMBool IsLocalToUnit, LLVMBool IsDefinition, unsigned ScopeLine, LLVMDIFlags Flags, LLVMBool IsOptimized); /** * Create a descriptor for a lexical block with the specified parent context. * \param Builder The \c DIBuilder. * \param Scope Parent lexical block. * \param File Source file. * \param Line The line in the source file. * \param Column The column in the source file. */ LLVMMetadataRef LLVMDIBuilderCreateLexicalBlock( LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line, unsigned Column); /** * Create a descriptor for a lexical block with a new file attached. * \param Builder The \c DIBuilder. * \param Scope Lexical block. * \param File Source file. * \param Discriminator DWARF path discriminator value. */ LLVMMetadataRef LLVMDIBuilderCreateLexicalBlockFile(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Discriminator); /** * Create a descriptor for an imported namespace. Suitable for e.g. C++ * using declarations. * \param Builder The \c DIBuilder. * \param Scope The scope this module is imported into * \param File File where the declaration is located. * \param Line Line number of the declaration. */ LLVMMetadataRef LLVMDIBuilderCreateImportedModuleFromNamespace(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef NS, LLVMMetadataRef File, unsigned Line); /** * Create a descriptor for an imported module that aliases another * imported entity descriptor. * \param Builder The \c DIBuilder. * \param Scope The scope this module is imported into * \param ImportedEntity Previous imported entity to alias. * \param File File where the declaration is located. * \param Line Line number of the declaration. */ LLVMMetadataRef LLVMDIBuilderCreateImportedModuleFromAlias(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef ImportedEntity, LLVMMetadataRef File, unsigned Line); /** * Create a descriptor for an imported module. * \param Builder The \c DIBuilder. * \param Scope The scope this module is imported into * \param M The module being imported here * \param File File where the declaration is located. * \param Line Line number of the declaration. */ LLVMMetadataRef LLVMDIBuilderCreateImportedModuleFromModule(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef M, LLVMMetadataRef File, unsigned Line); /** * Create a descriptor for an imported function, type, or variable. Suitable * for e.g. FORTRAN-style USE declarations. * \param Builder The DIBuilder. * \param Scope The scope this module is imported into. * \param Decl The declaration (or definition) of a function, type, or variable. * \param File File where the declaration is located. * \param Line Line number of the declaration. * \param Name A name that uniquely identifies this imported declaration. * \param NameLen The length of the C string passed to \c Name. */ LLVMMetadataRef LLVMDIBuilderCreateImportedDeclaration(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, LLVMMetadataRef Decl, LLVMMetadataRef File, unsigned Line, const char *Name, size_t NameLen); /** * Creates a new DebugLocation that describes a source location. * \param Line The line in the source file. * \param Column The column in the source file. * \param Scope The scope in which the location resides. * \param InlinedAt The scope where this location was inlined, if at all. * (optional). * \note If the item to which this location is attached cannot be * attributed to a source line, pass 0 for the line and column. */ LLVMMetadataRef LLVMDIBuilderCreateDebugLocation(LLVMContextRef Ctx, unsigned Line, unsigned Column, LLVMMetadataRef Scope, LLVMMetadataRef InlinedAt); /** * Get the line number of this debug location. * \param Location The debug location. * * @see DILocation::getLine() */ unsigned LLVMDILocationGetLine(LLVMMetadataRef Location); /** * Get the column number of this debug location. * \param Location The debug location. * * @see DILocation::getColumn() */ unsigned LLVMDILocationGetColumn(LLVMMetadataRef Location); /** * Get the local scope associated with this debug location. * \param Location The debug location. * * @see DILocation::getScope() */ LLVMMetadataRef LLVMDILocationGetScope(LLVMMetadataRef Location); /** * Get the "inline at" location associated with this debug location. * \param Location The debug location. * * @see DILocation::getInlinedAt() */ LLVMMetadataRef LLVMDILocationGetInlinedAt(LLVMMetadataRef Location); /** * Get the metadata of the file associated with a given scope. * \param Scope The scope object. * * @see DIScope::getFile() */ LLVMMetadataRef LLVMDIScopeGetFile(LLVMMetadataRef Scope); /** * Get the directory of a given file. * \param File The file object. * \param Len The length of the returned string. * * @see DIFile::getDirectory() */ const char *LLVMDIFileGetDirectory(LLVMMetadataRef File, unsigned *Len); /** * Get the name of a given file. * \param File The file object. * \param Len The length of the returned string. * * @see DIFile::getFilename() */ const char *LLVMDIFileGetFilename(LLVMMetadataRef File, unsigned *Len); /** * Get the source of a given file. * \param File The file object. * \param Len The length of the returned string. * * @see DIFile::getSource() */ const char *LLVMDIFileGetSource(LLVMMetadataRef File, unsigned *Len); /** * Create a type array. * \param Builder The DIBuilder. * \param Data The type elements. * \param NumElements Number of type elements. */ LLVMMetadataRef LLVMDIBuilderGetOrCreateTypeArray(LLVMDIBuilderRef Builder, LLVMMetadataRef *Data, size_t NumElements); /** * Create subroutine type. * \param Builder The DIBuilder. * \param File The file in which the subroutine resides. * \param ParameterTypes An array of subroutine parameter types. This * includes return type at 0th index. * \param NumParameterTypes The number of parameter types in \c ParameterTypes * \param Flags E.g.: \c LLVMDIFlagLValueReference. * These flags are used to emit dwarf attributes. */ LLVMMetadataRef LLVMDIBuilderCreateSubroutineType(LLVMDIBuilderRef Builder, LLVMMetadataRef File, LLVMMetadataRef *ParameterTypes, unsigned NumParameterTypes, LLVMDIFlags Flags); /** * Create debugging information entry for a macro. * @param Builder The DIBuilder. * @param ParentMacroFile Macro parent (could be NULL). * @param Line Source line number where the macro is defined. * @param RecordType DW_MACINFO_define or DW_MACINFO_undef. * @param Name Macro name. * @param NameLen Macro name length. * @param Value Macro value. * @param ValueLen Macro value length. */ LLVMMetadataRef LLVMDIBuilderCreateMacro(LLVMDIBuilderRef Builder, LLVMMetadataRef ParentMacroFile, unsigned Line, LLVMDWARFMacinfoRecordType RecordType, const char *Name, size_t NameLen, const char *Value, size_t ValueLen); /** * Create debugging information temporary entry for a macro file. * List of macro node direct children will be calculated by DIBuilder, * using the \p ParentMacroFile relationship. * @param Builder The DIBuilder. * @param ParentMacroFile Macro parent (could be NULL). * @param Line Source line number where the macro file is included. * @param File File descriptor containing the name of the macro file. */ LLVMMetadataRef LLVMDIBuilderCreateTempMacroFile(LLVMDIBuilderRef Builder, LLVMMetadataRef ParentMacroFile, unsigned Line, LLVMMetadataRef File); /** * Create debugging information entry for an enumerator. * @param Builder The DIBuilder. * @param Name Enumerator name. * @param NameLen Length of enumerator name. * @param Value Enumerator value. * @param IsUnsigned True if the value is unsigned. */ LLVMMetadataRef LLVMDIBuilderCreateEnumerator(LLVMDIBuilderRef Builder, const char *Name, size_t NameLen, int64_t Value, LLVMBool IsUnsigned); /** * Create debugging information entry for an enumeration. * \param Builder The DIBuilder. * \param Scope Scope in which this enumeration is defined. * \param Name Enumeration name. * \param NameLen Length of enumeration name. * \param File File where this member is defined. * \param LineNumber Line number. * \param SizeInBits Member size. * \param AlignInBits Member alignment. * \param Elements Enumeration elements. * \param NumElements Number of enumeration elements. * \param ClassTy Underlying type of a C++11/ObjC fixed enum. */ LLVMMetadataRef LLVMDIBuilderCreateEnumerationType( LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits, uint32_t AlignInBits, LLVMMetadataRef *Elements, unsigned NumElements, LLVMMetadataRef ClassTy); /** * Create debugging information entry for a union. * \param Builder The DIBuilder. * \param Scope Scope in which this union is defined. * \param Name Union name. * \param NameLen Length of union name. * \param File File where this member is defined. * \param LineNumber Line number. * \param SizeInBits Member size. * \param AlignInBits Member alignment. * \param Flags Flags to encode member attribute, e.g. private * \param Elements Union elements. * \param NumElements Number of union elements. * \param RunTimeLang Optional parameter, Objective-C runtime version. * \param UniqueId A unique identifier for the union. * \param UniqueIdLen Length of unique identifier. */ LLVMMetadataRef LLVMDIBuilderCreateUnionType( LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags, LLVMMetadataRef *Elements, unsigned NumElements, unsigned RunTimeLang, const char *UniqueId, size_t UniqueIdLen); /** * Create debugging information entry for an array. * \param Builder The DIBuilder. * \param Size Array size. * \param AlignInBits Alignment. * \param Ty Element type. * \param Subscripts Subscripts. * \param NumSubscripts Number of subscripts. */ LLVMMetadataRef LLVMDIBuilderCreateArrayType(LLVMDIBuilderRef Builder, uint64_t Size, uint32_t AlignInBits, LLVMMetadataRef Ty, LLVMMetadataRef *Subscripts, unsigned NumSubscripts); /** * Create debugging information entry for a vector type. * \param Builder The DIBuilder. * \param Size Vector size. * \param AlignInBits Alignment. * \param Ty Element type. * \param Subscripts Subscripts. * \param NumSubscripts Number of subscripts. */ LLVMMetadataRef LLVMDIBuilderCreateVectorType(LLVMDIBuilderRef Builder, uint64_t Size, uint32_t AlignInBits, LLVMMetadataRef Ty, LLVMMetadataRef *Subscripts, unsigned NumSubscripts); /** * Create a DWARF unspecified type. * \param Builder The DIBuilder. * \param Name The unspecified type's name. * \param NameLen Length of type name. */ LLVMMetadataRef LLVMDIBuilderCreateUnspecifiedType(LLVMDIBuilderRef Builder, const char *Name, size_t NameLen); /** * Create debugging information entry for a basic * type. * \param Builder The DIBuilder. * \param Name Type name. * \param NameLen Length of type name. * \param SizeInBits Size of the type. * \param Encoding DWARF encoding code, e.g. \c LLVMDWARFTypeEncoding_float. * \param Flags Flags to encode optional attribute like endianity */ LLVMMetadataRef LLVMDIBuilderCreateBasicType(LLVMDIBuilderRef Builder, const char *Name, size_t NameLen, uint64_t SizeInBits, LLVMDWARFTypeEncoding Encoding, LLVMDIFlags Flags); /** * Create debugging information entry for a pointer. * \param Builder The DIBuilder. * \param PointeeTy Type pointed by this pointer. * \param SizeInBits Size. * \param AlignInBits Alignment. (optional, pass 0 to ignore) * \param AddressSpace DWARF address space. (optional, pass 0 to ignore) * \param Name Pointer type name. (optional) * \param NameLen Length of pointer type name. (optional) */ LLVMMetadataRef LLVMDIBuilderCreatePointerType( LLVMDIBuilderRef Builder, LLVMMetadataRef PointeeTy, uint64_t SizeInBits, uint32_t AlignInBits, unsigned AddressSpace, const char *Name, size_t NameLen); /** * Create debugging information entry for a struct. * \param Builder The DIBuilder. * \param Scope Scope in which this struct is defined. * \param Name Struct name. * \param NameLen Struct name length. * \param File File where this member is defined. * \param LineNumber Line number. * \param SizeInBits Member size. * \param AlignInBits Member alignment. * \param Flags Flags to encode member attribute, e.g. private * \param Elements Struct elements. * \param NumElements Number of struct elements. * \param RunTimeLang Optional parameter, Objective-C runtime version. * \param VTableHolder The object containing the vtable for the struct. * \param UniqueId A unique identifier for the struct. * \param UniqueIdLen Length of the unique identifier for the struct. */ LLVMMetadataRef LLVMDIBuilderCreateStructType( LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags, LLVMMetadataRef DerivedFrom, LLVMMetadataRef *Elements, unsigned NumElements, unsigned RunTimeLang, LLVMMetadataRef VTableHolder, const char *UniqueId, size_t UniqueIdLen); /** * Create debugging information entry for a member. * \param Builder The DIBuilder. * \param Scope Member scope. * \param Name Member name. * \param NameLen Length of member name. * \param File File where this member is defined. * \param LineNo Line number. * \param SizeInBits Member size. * \param AlignInBits Member alignment. * \param OffsetInBits Member offset. * \param Flags Flags to encode member attribute, e.g. private * \param Ty Parent type. */ LLVMMetadataRef LLVMDIBuilderCreateMemberType( LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNo, uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags, LLVMMetadataRef Ty); /** * Create debugging information entry for a * C++ static data member. * \param Builder The DIBuilder. * \param Scope Member scope. * \param Name Member name. * \param NameLen Length of member name. * \param File File where this member is declared. * \param LineNumber Line number. * \param Type Type of the static member. * \param Flags Flags to encode member attribute, e.g. private. * \param ConstantVal Const initializer of the member. * \param AlignInBits Member alignment. */ LLVMMetadataRef LLVMDIBuilderCreateStaticMemberType( LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, LLVMMetadataRef Type, LLVMDIFlags Flags, LLVMValueRef ConstantVal, uint32_t AlignInBits); /** * Create debugging information entry for a pointer to member. * \param Builder The DIBuilder. * \param PointeeType Type pointed to by this pointer. * \param ClassType Type for which this pointer points to members of. * \param SizeInBits Size. * \param AlignInBits Alignment. * \param Flags Flags. */ LLVMMetadataRef LLVMDIBuilderCreateMemberPointerType(LLVMDIBuilderRef Builder, LLVMMetadataRef PointeeType, LLVMMetadataRef ClassType, uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags); /** * Create debugging information entry for Objective-C instance variable. * \param Builder The DIBuilder. * \param Name Member name. * \param NameLen The length of the C string passed to \c Name. * \param File File where this member is defined. * \param LineNo Line number. * \param SizeInBits Member size. * \param AlignInBits Member alignment. * \param OffsetInBits Member offset. * \param Flags Flags to encode member attribute, e.g. private * \param Ty Parent type. * \param PropertyNode Property associated with this ivar. */ LLVMMetadataRef LLVMDIBuilderCreateObjCIVar(LLVMDIBuilderRef Builder, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNo, uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags, LLVMMetadataRef Ty, LLVMMetadataRef PropertyNode); /** * Create debugging information entry for Objective-C property. * \param Builder The DIBuilder. * \param Name Property name. * \param NameLen The length of the C string passed to \c Name. * \param File File where this property is defined. * \param LineNo Line number. * \param GetterName Name of the Objective C property getter selector. * \param GetterNameLen The length of the C string passed to \c GetterName. * \param SetterName Name of the Objective C property setter selector. * \param SetterNameLen The length of the C string passed to \c SetterName. * \param PropertyAttributes Objective C property attributes. * \param Ty Type. */ LLVMMetadataRef LLVMDIBuilderCreateObjCProperty(LLVMDIBuilderRef Builder, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNo, const char *GetterName, size_t GetterNameLen, const char *SetterName, size_t SetterNameLen, unsigned PropertyAttributes, LLVMMetadataRef Ty); /** * Create a uniqued DIType* clone with FlagObjectPointer and FlagArtificial set. * \param Builder The DIBuilder. * \param Type The underlying type to which this pointer points. */ LLVMMetadataRef LLVMDIBuilderCreateObjectPointerType(LLVMDIBuilderRef Builder, LLVMMetadataRef Type); /** * Create debugging information entry for a qualified * type, e.g. 'const int'. * \param Builder The DIBuilder. * \param Tag Tag identifying type, * e.g. LLVMDWARFTypeQualifier_volatile_type * \param Type Base Type. */ LLVMMetadataRef LLVMDIBuilderCreateQualifiedType(LLVMDIBuilderRef Builder, unsigned Tag, LLVMMetadataRef Type); /** * Create debugging information entry for a c++ * style reference or rvalue reference type. * \param Builder The DIBuilder. * \param Tag Tag identifying type, * \param Type Base Type. */ LLVMMetadataRef LLVMDIBuilderCreateReferenceType(LLVMDIBuilderRef Builder, unsigned Tag, LLVMMetadataRef Type); /** * Create C++11 nullptr type. * \param Builder The DIBuilder. */ LLVMMetadataRef LLVMDIBuilderCreateNullPtrType(LLVMDIBuilderRef Builder); /** * Create debugging information entry for a typedef. * \param Builder The DIBuilder. * \param Type Original type. * \param Name Typedef name. * \param File File where this type is defined. * \param LineNo Line number. * \param Scope The surrounding context for the typedef. */ LLVMMetadataRef LLVMDIBuilderCreateTypedef(LLVMDIBuilderRef Builder, LLVMMetadataRef Type, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Scope); /** * Create debugging information entry to establish inheritance relationship * between two types. * \param Builder The DIBuilder. * \param Ty Original type. * \param BaseTy Base type. Ty is inherits from base. * \param BaseOffset Base offset. * \param VBPtrOffset Virtual base pointer offset. * \param Flags Flags to describe inheritance attribute, e.g. private */ LLVMMetadataRef LLVMDIBuilderCreateInheritance(LLVMDIBuilderRef Builder, LLVMMetadataRef Ty, LLVMMetadataRef BaseTy, uint64_t BaseOffset, uint32_t VBPtrOffset, LLVMDIFlags Flags); /** * Create a permanent forward-declared type. * \param Builder The DIBuilder. * \param Tag A unique tag for this type. * \param Name Type name. * \param NameLen Length of type name. * \param Scope Type scope. * \param File File where this type is defined. * \param Line Line number where this type is defined. * \param RuntimeLang Indicates runtime version for languages like * Objective-C. * \param SizeInBits Member size. * \param AlignInBits Member alignment. * \param UniqueIdentifier A unique identifier for the type. * \param UniqueIdentifierLen Length of the unique identifier. */ LLVMMetadataRef LLVMDIBuilderCreateForwardDecl( LLVMDIBuilderRef Builder, unsigned Tag, const char *Name, size_t NameLen, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line, unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits, const char *UniqueIdentifier, size_t UniqueIdentifierLen); /** * Create a temporary forward-declared type. * \param Builder The DIBuilder. * \param Tag A unique tag for this type. * \param Name Type name. * \param NameLen Length of type name. * \param Scope Type scope. * \param File File where this type is defined. * \param Line Line number where this type is defined. * \param RuntimeLang Indicates runtime version for languages like * Objective-C. * \param SizeInBits Member size. * \param AlignInBits Member alignment. * \param Flags Flags. * \param UniqueIdentifier A unique identifier for the type. * \param UniqueIdentifierLen Length of the unique identifier. */ LLVMMetadataRef LLVMDIBuilderCreateReplaceableCompositeType( LLVMDIBuilderRef Builder, unsigned Tag, const char *Name, size_t NameLen, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line, unsigned RuntimeLang, uint64_t SizeInBits, uint32_t AlignInBits, LLVMDIFlags Flags, const char *UniqueIdentifier, size_t UniqueIdentifierLen); /** * Create debugging information entry for a bit field member. * \param Builder The DIBuilder. * \param Scope Member scope. * \param Name Member name. * \param NameLen Length of member name. * \param File File where this member is defined. * \param LineNumber Line number. * \param SizeInBits Member size. * \param OffsetInBits Member offset. * \param StorageOffsetInBits Member storage offset. * \param Flags Flags to encode member attribute. * \param Type Parent type. */ LLVMMetadataRef LLVMDIBuilderCreateBitFieldMemberType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits, uint64_t OffsetInBits, uint64_t StorageOffsetInBits, LLVMDIFlags Flags, LLVMMetadataRef Type); /** * Create debugging information entry for a class. * \param Scope Scope in which this class is defined. * \param Name Class name. * \param NameLen The length of the C string passed to \c Name. * \param File File where this member is defined. * \param LineNumber Line number. * \param SizeInBits Member size. * \param AlignInBits Member alignment. * \param OffsetInBits Member offset. * \param Flags Flags to encode member attribute, e.g. private. * \param DerivedFrom Debug info of the base class of this type. * \param Elements Class members. * \param NumElements Number of class elements. * \param VTableHolder Debug info of the base class that contains vtable * for this type. This is used in * DW_AT_containing_type. See DWARF documentation * for more info. * \param TemplateParamsNode Template type parameters. * \param UniqueIdentifier A unique identifier for the type. * \param UniqueIdentifierLen Length of the unique identifier. */ LLVMMetadataRef LLVMDIBuilderCreateClassType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, uint64_t SizeInBits, uint32_t AlignInBits, uint64_t OffsetInBits, LLVMDIFlags Flags, LLVMMetadataRef DerivedFrom, LLVMMetadataRef *Elements, unsigned NumElements, LLVMMetadataRef VTableHolder, LLVMMetadataRef TemplateParamsNode, const char *UniqueIdentifier, size_t UniqueIdentifierLen); /** * Create a uniqued DIType* clone with FlagArtificial set. * \param Builder The DIBuilder. * \param Type The underlying type. */ LLVMMetadataRef LLVMDIBuilderCreateArtificialType(LLVMDIBuilderRef Builder, LLVMMetadataRef Type); /** * Get the name of this DIType. * \param DType The DIType. * \param Length The length of the returned string. * * @see DIType::getName() */ const char *LLVMDITypeGetName(LLVMMetadataRef DType, size_t *Length); /** * Get the size of this DIType in bits. * \param DType The DIType. * * @see DIType::getSizeInBits() */ uint64_t LLVMDITypeGetSizeInBits(LLVMMetadataRef DType); /** * Get the offset of this DIType in bits. * \param DType The DIType. * * @see DIType::getOffsetInBits() */ uint64_t LLVMDITypeGetOffsetInBits(LLVMMetadataRef DType); /** * Get the alignment of this DIType in bits. * \param DType The DIType. * * @see DIType::getAlignInBits() */ uint32_t LLVMDITypeGetAlignInBits(LLVMMetadataRef DType); /** * Get the source line where this DIType is declared. * \param DType The DIType. * * @see DIType::getLine() */ unsigned LLVMDITypeGetLine(LLVMMetadataRef DType); /** * Get the flags associated with this DIType. * \param DType The DIType. * * @see DIType::getFlags() */ LLVMDIFlags LLVMDITypeGetFlags(LLVMMetadataRef DType); /** * Create a descriptor for a value range. * \param Builder The DIBuilder. * \param LowerBound Lower bound of the subrange, e.g. 0 for C, 1 for Fortran. * \param Count Count of elements in the subrange. */ LLVMMetadataRef LLVMDIBuilderGetOrCreateSubrange(LLVMDIBuilderRef Builder, int64_t LowerBound, int64_t Count); /** * Create an array of DI Nodes. * \param Builder The DIBuilder. * \param Data The DI Node elements. * \param NumElements Number of DI Node elements. */ LLVMMetadataRef LLVMDIBuilderGetOrCreateArray(LLVMDIBuilderRef Builder, LLVMMetadataRef *Data, size_t NumElements); /** * Create a new descriptor for the specified variable which has a complex * address expression for its address. * \param Builder The DIBuilder. * \param Addr An array of complex address operations. * \param Length Length of the address operation array. */ LLVMMetadataRef LLVMDIBuilderCreateExpression(LLVMDIBuilderRef Builder, int64_t *Addr, size_t Length); /** * Create a new descriptor for the specified variable that does not have an * address, but does have a constant value. * \param Builder The DIBuilder. * \param Value The constant value. */ LLVMMetadataRef LLVMDIBuilderCreateConstantValueExpression(LLVMDIBuilderRef Builder, int64_t Value); /** * Create a new descriptor for the specified variable. * \param Scope Variable scope. * \param Name Name of the variable. * \param NameLen The length of the C string passed to \c Name. * \param Linkage Mangled name of the variable. * \param LinkLen The length of the C string passed to \c Linkage. * \param File File where this variable is defined. * \param LineNo Line number. * \param Ty Variable Type. * \param LocalToUnit Boolean flag indicate whether this variable is * externally visible or not. * \param Expr The location of the global relative to the attached * GlobalVariable. * \param Decl Reference to the corresponding declaration. * variables. * \param AlignInBits Variable alignment(or 0 if no alignment attr was * specified) */ LLVMMetadataRef LLVMDIBuilderCreateGlobalVariableExpression( LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, const char *Linkage, size_t LinkLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty, LLVMBool LocalToUnit, LLVMMetadataRef Expr, LLVMMetadataRef Decl, uint32_t AlignInBits); /** * Retrieves the \c DIVariable associated with this global variable expression. * \param GVE The global variable expression. * * @see llvm::DIGlobalVariableExpression::getVariable() */ LLVMMetadataRef LLVMDIGlobalVariableExpressionGetVariable(LLVMMetadataRef GVE); /** * Retrieves the \c DIExpression associated with this global variable expression. * \param GVE The global variable expression. * * @see llvm::DIGlobalVariableExpression::getExpression() */ LLVMMetadataRef LLVMDIGlobalVariableExpressionGetExpression( LLVMMetadataRef GVE); /** * Get the metadata of the file associated with a given variable. * \param Var The variable object. * * @see DIVariable::getFile() */ LLVMMetadataRef LLVMDIVariableGetFile(LLVMMetadataRef Var); /** * Get the metadata of the scope associated with a given variable. * \param Var The variable object. * * @see DIVariable::getScope() */ LLVMMetadataRef LLVMDIVariableGetScope(LLVMMetadataRef Var); /** * Get the source line where this \c DIVariable is declared. * \param Var The DIVariable. * * @see DIVariable::getLine() */ unsigned LLVMDIVariableGetLine(LLVMMetadataRef Var); /** * Create a new temporary \c MDNode. Suitable for use in constructing cyclic * \c MDNode structures. A temporary \c MDNode is not uniqued, may be RAUW'd, * and must be manually deleted with \c LLVMDisposeTemporaryMDNode. * \param Ctx The context in which to construct the temporary node. * \param Data The metadata elements. * \param NumElements Number of metadata elements. */ LLVMMetadataRef LLVMTemporaryMDNode(LLVMContextRef Ctx, LLVMMetadataRef *Data, size_t NumElements); /** * Deallocate a temporary node. * * Calls \c replaceAllUsesWith(nullptr) before deleting, so any remaining * references will be reset. * \param TempNode The temporary metadata node. */ void LLVMDisposeTemporaryMDNode(LLVMMetadataRef TempNode); /** * Replace all uses of temporary metadata. * \param TempTargetMetadata The temporary metadata node. * \param Replacement The replacement metadata node. */ void LLVMMetadataReplaceAllUsesWith(LLVMMetadataRef TempTargetMetadata, LLVMMetadataRef Replacement); /** * Create a new descriptor for the specified global variable that is temporary * and meant to be RAUWed. * \param Scope Variable scope. * \param Name Name of the variable. * \param NameLen The length of the C string passed to \c Name. * \param Linkage Mangled name of the variable. * \param LnkLen The length of the C string passed to \c Linkage. * \param File File where this variable is defined. * \param LineNo Line number. * \param Ty Variable Type. * \param LocalToUnit Boolean flag indicate whether this variable is * externally visible or not. * \param Decl Reference to the corresponding declaration. * \param AlignInBits Variable alignment(or 0 if no alignment attr was * specified) */ LLVMMetadataRef LLVMDIBuilderCreateTempGlobalVariableFwdDecl( LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, const char *Linkage, size_t LnkLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty, LLVMBool LocalToUnit, LLVMMetadataRef Decl, uint32_t AlignInBits); /** * Insert a new llvm.dbg.declare intrinsic call before the given instruction. * \param Builder The DIBuilder. * \param Storage The storage of the variable to declare. * \param VarInfo The variable's debug info descriptor. * \param Expr A complex location expression for the variable. * \param DebugLoc Debug info location. * \param Instr Instruction acting as a location for the new intrinsic. */ LLVMValueRef LLVMDIBuilderInsertDeclareBefore( LLVMDIBuilderRef Builder, LLVMValueRef Storage, LLVMMetadataRef VarInfo, LLVMMetadataRef Expr, LLVMMetadataRef DebugLoc, LLVMValueRef Instr); /** * Insert a new llvm.dbg.declare intrinsic call at the end of the given basic * block. If the basic block has a terminator instruction, the intrinsic is * inserted before that terminator instruction. * \param Builder The DIBuilder. * \param Storage The storage of the variable to declare. * \param VarInfo The variable's debug info descriptor. * \param Expr A complex location expression for the variable. * \param DebugLoc Debug info location. * \param Block Basic block acting as a location for the new intrinsic. */ LLVMValueRef LLVMDIBuilderInsertDeclareAtEnd( LLVMDIBuilderRef Builder, LLVMValueRef Storage, LLVMMetadataRef VarInfo, LLVMMetadataRef Expr, LLVMMetadataRef DebugLoc, LLVMBasicBlockRef Block); /** * Insert a new llvm.dbg.value intrinsic call before the given instruction. * \param Builder The DIBuilder. * \param Val The value of the variable. * \param VarInfo The variable's debug info descriptor. * \param Expr A complex location expression for the variable. * \param DebugLoc Debug info location. * \param Instr Instruction acting as a location for the new intrinsic. */ LLVMValueRef LLVMDIBuilderInsertDbgValueBefore(LLVMDIBuilderRef Builder, LLVMValueRef Val, LLVMMetadataRef VarInfo, LLVMMetadataRef Expr, LLVMMetadataRef DebugLoc, LLVMValueRef Instr); /** * Insert a new llvm.dbg.value intrinsic call at the end of the given basic * block. If the basic block has a terminator instruction, the intrinsic is * inserted before that terminator instruction. * \param Builder The DIBuilder. * \param Val The value of the variable. * \param VarInfo The variable's debug info descriptor. * \param Expr A complex location expression for the variable. * \param DebugLoc Debug info location. * \param Block Basic block acting as a location for the new intrinsic. */ LLVMValueRef LLVMDIBuilderInsertDbgValueAtEnd(LLVMDIBuilderRef Builder, LLVMValueRef Val, LLVMMetadataRef VarInfo, LLVMMetadataRef Expr, LLVMMetadataRef DebugLoc, LLVMBasicBlockRef Block); /** * Create a new descriptor for a local auto variable. * \param Builder The DIBuilder. * \param Scope The local scope the variable is declared in. * \param Name Variable name. * \param NameLen Length of variable name. * \param File File where this variable is defined. * \param LineNo Line number. * \param Ty Metadata describing the type of the variable. * \param AlwaysPreserve If true, this descriptor will survive optimizations. * \param Flags Flags. * \param AlignInBits Variable alignment. */ LLVMMetadataRef LLVMDIBuilderCreateAutoVariable( LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty, LLVMBool AlwaysPreserve, LLVMDIFlags Flags, uint32_t AlignInBits); /** * Create a new descriptor for a function parameter variable. * \param Builder The DIBuilder. * \param Scope The local scope the variable is declared in. * \param Name Variable name. * \param NameLen Length of variable name. * \param ArgNo Unique argument number for this variable; starts at 1. * \param File File where this variable is defined. * \param LineNo Line number. * \param Ty Metadata describing the type of the variable. * \param AlwaysPreserve If true, this descriptor will survive optimizations. * \param Flags Flags. */ LLVMMetadataRef LLVMDIBuilderCreateParameterVariable( LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, unsigned ArgNo, LLVMMetadataRef File, unsigned LineNo, LLVMMetadataRef Ty, LLVMBool AlwaysPreserve, LLVMDIFlags Flags); /** * Get the metadata of the subprogram attached to a function. * * @see llvm::Function::getSubprogram() */ LLVMMetadataRef LLVMGetSubprogram(LLVMValueRef Func); /** * Set the subprogram attached to a function. * * @see llvm::Function::setSubprogram() */ void LLVMSetSubprogram(LLVMValueRef Func, LLVMMetadataRef SP); /** * Get the line associated with a given subprogram. * \param Subprogram The subprogram object. * * @see DISubprogram::getLine() */ unsigned LLVMDISubprogramGetLine(LLVMMetadataRef Subprogram); /** * Get the debug location for the given instruction. * * @see llvm::Instruction::getDebugLoc() */ LLVMMetadataRef LLVMInstructionGetDebugLoc(LLVMValueRef Inst); /** * Set the debug location for the given instruction. * * To clear the location metadata of the given instruction, pass NULL to \p Loc. * * @see llvm::Instruction::setDebugLoc() */ void LLVMInstructionSetDebugLoc(LLVMValueRef Inst, LLVMMetadataRef Loc); /** * Obtain the enumerated type of a Metadata instance. * * @see llvm::Metadata::getMetadataID() */ LLVMMetadataKind LLVMGetMetadataKind(LLVMMetadataRef Metadata); #ifdef __cplusplus } /* end extern "C" */ #endif #endif