//===------------ DebugInfo.h - LLVM C API Debug Info API -----------------===// // // The LLVM Compiler Infrastructure // // This file is distributed under the University of Illinois Open Source // License. See LICENSE.TXT for details. // //===----------------------------------------------------------------------===// /// /// 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, LLVMDIFlagBlockByrefStruct = 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, LLVMDIFlagMainSubprogram = 1 << 21, LLVMDIFlagTypePassByValue = 1 << 22, LLVMDIFlagTypePassByReference = 1 << 23, 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; /** * An LLVM DWARF type encoding. */ typedef unsigned LLVMDWARFTypeEncoding; /** * 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); /** * 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); /** * 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); /** * 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 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, unsigned SizeInBits, unsigned 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, unsigned SizeInBits, unsigned 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, unsigned Size, unsigned 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, unsigned Size, unsigned 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. */ LLVMMetadataRef LLVMDIBuilderCreateBasicType(LLVMDIBuilderRef Builder, const char *Name, size_t NameLen, unsigned SizeInBits, LLVMDWARFTypeEncoding Encoding); /** * 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, unsigned SizeInBits, unsigned 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, unsigned SizeInBits, unsigned 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, unsigned SizeInBits, unsigned AlignInBits, unsigned 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, unsigned 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, unsigned SizeInBits, unsigned AlignInBits, LLVMDIFlags Flags); /** * Create a new DIType* with the "object pointer" * flag 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 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. */ LLVMMetadataRef LLVMDIBuilderCreateReplaceableCompositeType( LLVMDIBuilderRef Builder, unsigned Tag, const char *Name, size_t NameLen, LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line, unsigned RuntimeLang, unsigned SizeInBits, unsigned 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, unsigned SizeInBits, unsigned OffsetInBits, unsigned 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 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 Elements class members. * \param NumElements Number of class elements. * \param DerivedFrom Debug info of the base class of this type. * \param TemplateParamsNode Template type parameters. */ LLVMMetadataRef LLVMDIBuilderCreateClassType(LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, unsigned SizeInBits, unsigned AlignInBits, unsigned OffsetInBits, LLVMDIFlags Flags, LLVMMetadataRef *Elements, unsigned NumElements, LLVMMetadataRef DerivedFrom, LLVMMetadataRef TemplateParamsNode); /** * Create a new DIType* with "artificial" flag set. * \param Builder The DIBuilder. * \param Type The underlying type. */ LLVMMetadataRef LLVMDIBuilderCreateArtificialType(LLVMDIBuilderRef Builder, LLVMMetadataRef Type); /** * 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); #ifdef __cplusplus } /* end extern "C" */ #endif #endif