Index: include/llvm-c/DebugInfo.h =================================================================== --- include/llvm-c/DebugInfo.h +++ include/llvm-c/DebugInfo.h @@ -110,6 +110,9 @@ LLVMDWARFEmissionLineTablesOnly } LLVMDWARFEmissionKind; +/// An LLVM DWARF type encoding. +typedef unsigned LLVMDWARFTypeEncoding; + /// The current debug metadata version number. unsigned LLVMDebugMetadataVersion(void); @@ -197,6 +200,281 @@ unsigned Column, LLVMMetadataRef Scope, LLVMMetadataRef InlinedAt); +/// Create subroutine type. +/// \param ParameterTypes An array of subroutine parameter types. This +/// includes return type at 0th index. +/// \param Flags E.g.: LValueReference. +/// These flags are used to emit dwarf attributes. +LLVMMetadataRef +LLVMDIBuilderCreateSubroutineType(LLVMDIBuilderRef Builder, + LLVMMetadataRef File, + LLVMMetadataRef *ParameterTypes, + unsigned NumParameterTypes); + +/// 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 UnderlyingType Underlying type of a C++11/ObjC fixed enum. +/// \param UniqueIdentifier A unique identifier for the 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 UniqueIdentifier A unique identifier for the union. +/// \param UniqueIdentifierLen 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. +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. +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 Name 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 DWARFAddressSpace DWARF address space. (optional, pass 0 to ignore) +/// \param Name Pointer type name. (optional) +/// \param Name 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 Name 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 RunTimeLang Optional parameter, Objective-C runtime version. +/// \param VTableHolder The object containing the vtable for the struct. +/// \param UniqueIdentifier A unique identifier for the struct. +/// \param UniqueIdentifierLen 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 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, + 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 Name Length of member name. +/// \param File File where this member is declared. +/// \param LineNo Line number. +/// \param Ty Type of the static member. +/// \param Flags Flags to encode member attribute, e.g. private. +/// \param Val 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 Class Type for which this pointer points to members of. +/// \param SizeInBits Size. +/// \param AlignInBits Alignment. (optional) +/// \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 Tag Tag identifing type, +/// e.g. LLVMDWARFTypeQualifier_volatile_type +/// \param FromTy Base Type. +LLVMMetadataRef +LLVMDIBuilderCreateQualifiedType(LLVMDIBuilderRef Builder, unsigned Tag, + LLVMMetadataRef Type); + +/// Create debugging information entry for a c++ +/// style reference or rvalue reference 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); + +/// 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 LineNo 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 DerivedFrom Debug info of the base class of this type. +/// \param TemplateParms 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); + #ifdef __cplusplus } // end extern "C" #endif Index: lib/IR/DebugInfo.cpp =================================================================== --- lib/IR/DebugInfo.cpp +++ lib/IR/DebugInfo.cpp @@ -711,6 +711,14 @@ llvm_unreachable("Unhandled Tag"); } +template DIT *unwrapDI(LLVMMetadataRef Ref) { + return (DIT *)(Ref ? unwrap(Ref) : nullptr); +} + +static DINode::DIFlags map_from_llvmDIFlags(LLVMDIFlags Flags) { + return static_cast(Flags); +} + unsigned LLVMDebugMetadataVersion() { return DEBUG_METADATA_VERSION; } @@ -746,7 +754,7 @@ unsigned RuntimeVer, const char *SplitName, size_t SplitNameLen, LLVMDWARFEmissionKind Kind, unsigned DWOId, LLVMBool SplitDebugInlining, LLVMBool DebugInfoForProfiling) { - auto File = unwrap(FileRef); + auto File = unwrapDI(FileRef); return wrap(unwrap(Builder)->createCompileUnit( map_from_llvmDWARFsourcelanguage(Lang), File, @@ -772,3 +780,177 @@ return wrap(DILocation::get(*unwrap(Ctx), Line, Column, unwrap(Scope), unwrap(InlinedAt))); } + +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) { +auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements), + NumElements}); +return wrap(unwrap(Builder)->createEnumerationType( + unwrapDI(Scope), {Name, NameLen}, unwrapDI(File), + LineNumber, SizeInBits, AlignInBits, Elts, unwrapDI(ClassTy))); +} + +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) { + auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements), + NumElements}); + return wrap(unwrap(Builder)->createUnionType( + unwrapDI(Scope), {Name, NameLen}, unwrapDI(File), + LineNumber, SizeInBits, AlignInBits, map_from_llvmDIFlags(Flags), + Elts, RunTimeLang, {UniqueId, UniqueIdLen})); +} + + +LLVMMetadataRef +LLVMDIBuilderCreateArrayType(LLVMDIBuilderRef Builder, unsigned Size, + unsigned AlignInBits, LLVMMetadataRef Ty, + LLVMMetadataRef *Subscripts, + unsigned NumSubscripts) { + auto Subs = unwrap(Builder)->getOrCreateArray({unwrap(Subscripts), + NumSubscripts}); + return wrap(unwrap(Builder)->createArrayType(Size, AlignInBits, + unwrapDI(Ty), Subs)); +} + +LLVMMetadataRef +LLVMDIBuilderCreateVectorType(LLVMDIBuilderRef Builder, unsigned Size, + unsigned AlignInBits, LLVMMetadataRef Ty, + LLVMMetadataRef *Subscripts, + unsigned NumSubscripts) { + auto Subs = unwrap(Builder)->getOrCreateArray({unwrap(Subscripts), + NumSubscripts}); + return wrap(unwrap(Builder)->createVectorType(Size, AlignInBits, + unwrapDI(Ty), Subs)); +} + +LLVMMetadataRef +LLVMDIBuilderCreateBasicType(LLVMDIBuilderRef Builder, const char *Name, + size_t NameLen, unsigned SizeInBits, + LLVMDWARFTypeEncoding Encoding) { + return wrap(unwrap(Builder)->createBasicType({Name, NameLen}, + SizeInBits, Encoding)); +} + +LLVMMetadataRef LLVMDIBuilderCreatePointerType( + LLVMDIBuilderRef Builder, LLVMMetadataRef PointeeTy, + unsigned SizeInBits, unsigned AlignInBits, unsigned AddressSpace, + const char *Name, size_t NameLen) { + return wrap(unwrap(Builder)->createPointerType(unwrapDI(PointeeTy), + SizeInBits, AlignInBits, + AddressSpace, {Name, NameLen})); +} + +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) { + auto Elts = unwrap(Builder)->getOrCreateArray({unwrap(Elements), + NumElements}); + return wrap(unwrap(Builder)->createStructType( + unwrapDI(Scope), {Name, NameLen}, unwrapDI(File), + LineNumber, SizeInBits, AlignInBits, map_from_llvmDIFlags(Flags), + unwrapDI(DerivedFrom), Elts, RunTimeLang, + unwrapDI(VTableHolder), {UniqueId, UniqueIdLen})); +} + +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) { + return wrap(unwrap(Builder)->createMemberType(unwrapDI(Scope), + {Name, NameLen}, unwrapDI(File), LineNo, SizeInBits, AlignInBits, + OffsetInBits, map_from_llvmDIFlags(Flags), unwrapDI(Ty))); +} + +LLVMMetadataRef +LLVMDIBuilderCreateUnspecifiedType(LLVMDIBuilderRef Builder, const char *Name, + size_t NameLen) { + return wrap(unwrap(Builder)->createUnspecifiedType({Name, NameLen})); +} + +LLVMMetadataRef +LLVMDIBuilderCreateStaticMemberType( + LLVMDIBuilderRef Builder, LLVMMetadataRef Scope, const char *Name, + size_t NameLen, LLVMMetadataRef File, unsigned LineNumber, + LLVMMetadataRef Type, LLVMDIFlags Flags, LLVMValueRef ConstantVal, + unsigned AlignInBits) { + return wrap(unwrap(Builder)->createStaticMemberType( + unwrapDI(Scope), {Name, NameLen}, + unwrapDI(File), LineNumber, unwrapDI(Type), + map_from_llvmDIFlags(Flags), unwrap(ConstantVal), + AlignInBits)); +} + +LLVMMetadataRef +LLVMDIBuilderCreateObjectPointerType(LLVMDIBuilderRef Builder, + LLVMMetadataRef Type) { + return wrap(unwrap(Builder)->createObjectPointerType(unwrapDI(Type))); +} + +LLVMMetadataRef +LLVMDIBuilderCreateReplaceableCompositeType( + LLVMDIBuilderRef Builder, unsigned Tag, const char *Name, size_t NameLen, + LLVMMetadataRef Scope, LLVMMetadataRef File, unsigned Line) { + return wrap(unwrap(Builder)->createReplaceableCompositeType( + Tag, {Name, NameLen}, unwrapDI(Scope), + unwrapDI(File), Line)); +} + +LLVMMetadataRef +LLVMDIBuilderCreateQualifiedType(LLVMDIBuilderRef Builder, unsigned Tag, + LLVMMetadataRef Type) { + return wrap(unwrap(Builder)->createQualifiedType(Tag, + unwrapDI(Type))); +} + +LLVMMetadataRef +LLVMDIBuilderCreateReferenceType(LLVMDIBuilderRef Builder, unsigned Tag, + LLVMMetadataRef Type) { + return wrap(unwrap(Builder)->createReferenceType(Tag, + unwrapDI(Type))); +} + +LLVMMetadataRef +LLVMDIBuilderCreateNullPtrType(LLVMDIBuilderRef Builder) { + return wrap(unwrap(Builder)->createNullPtrType()); +} + +LLVMMetadataRef +LLVMDIBuilderCreateMemberPointerType(LLVMDIBuilderRef Builder, + LLVMMetadataRef PointeeType, + LLVMMetadataRef ClassType, + unsigned SizeInBits, + unsigned AlignInBits, + LLVMDIFlags Flags) { + return wrap(unwrap(Builder)->createMemberPointerType( + unwrapDI(PointeeType), + unwrapDI(ClassType), AlignInBits, SizeInBits, + map_from_llvmDIFlags(Flags))); +} + +LLVMMetadataRef +LLVMDIBuilderCreateArtificialType(LLVMDIBuilderRef Builder, + LLVMMetadataRef Type) { + return wrap(unwrap(Builder)->createArtificialType(unwrapDI(Type))); +} + +LLVMMetadataRef +LLVMDIBuilderCreateSubroutineType(LLVMDIBuilderRef Builder, + LLVMMetadataRef File, + LLVMMetadataRef *ParameterTypes, + unsigned NumParameterTypes) { + auto Elts = unwrap(Builder)->getOrCreateTypeArray({unwrap(ParameterTypes), + NumParameterTypes}); + return wrap(unwrap(Builder)->createSubroutineType(Elts)); +} \ No newline at end of file Index: test/Bindings/llvm-c/debug_info.ll =================================================================== --- test/Bindings/llvm-c/debug_info.ll +++ test/Bindings/llvm-c/debug_info.ll @@ -3,6 +3,12 @@ ; CHECK: ; ModuleID = 'debuginfo.c' ; CHECK-NEXT: source_filename = "debuginfo.c" -; CHECK: !llvm.dbg.cu = !{!0} -; CHECK: !0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "llvm-c-test", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false) -; CHECK-NEXT: !1 = !DIFile(filename: "debuginfo.c\00", directory: ".") +; CHECK: !llvm.dbg.cu = !{!0} +; CHECK-NEXT: !FooType = !{!2} + +; CHECK: !0 = distinct !DICompileUnit(language: DW_LANG_C, file: !1, producer: "llvm-c-test", isOptimized: false, runtimeVersion: 0, emissionKind: FullDebug, splitDebugInlining: false) +; CHECK-NEXT: !1 = !DIFile(filename: "debuginfo.c", directory: ".") +; CHECK-NEXT: !2 = !DIDerivedType(tag: DW_TAG_pointer_type, baseType: !3, size: 192, dwarfAddressSpace: 0) +; CHECK-NEXT: !3 = !DICompositeType(tag: DW_TAG_structure_type, name: "MyStruct", file: !1, size: 192, elements: !4, runtimeLang: DW_LANG_C89, identifier: "MyStruct") +; CHECK-NEXT: !4 = !{!5, !5, !5} +; CHECK-NEXT: !5 = !DIBasicType(name: "Int64", size: 64) \ No newline at end of file Index: tools/llvm-c-test/debuginfo.c =================================================================== --- tools/llvm-c-test/debuginfo.c +++ tools/llvm-c-test/debuginfo.c @@ -12,20 +12,37 @@ \*===----------------------------------------------------------------------===*/ #include "llvm-c-test.h" +#include "llvm-c/Core.h" #include "llvm-c/DebugInfo.h" #include #include int llvm_test_dibuilder() { - LLVMModuleRef M = LLVMModuleCreateWithName("debuginfo.c"); + const char *Filename = "debuginfo.c"; + LLVMModuleRef M = LLVMModuleCreateWithName(Filename); LLVMDIBuilderRef DIB = LLVMCreateDIBuilder(M); - LLVMMetadataRef File = LLVMDIBuilderCreateFile(DIB, "debuginfo.c", 12, - ".", 1); + LLVMMetadataRef File = LLVMDIBuilderCreateFile(DIB, Filename, + strlen(Filename), ".", 1); - LLVMDIBuilderCreateCompileUnit(DIB, - LLVMDWARFSourceLanguageC, File,"llvm-c-test", 11, 0, NULL, 0, 0, - NULL, 0, LLVMDWARFEmissionFull, 0, 0, 0); + LLVMMetadataRef CompileUnit = LLVMDIBuilderCreateCompileUnit(DIB, + LLVMDWARFSourceLanguageC, File,"llvm-c-test", 11, 0, NULL, 0, 0, + NULL, 0, LLVMDWARFEmissionFull, 0, 0, 0); + + LLVMMetadataRef Int64Ty = + LLVMDIBuilderCreateBasicType(DIB, "Int64", 5, 64, 0); + + LLVMMetadataRef StructDbgElts[] = {Int64Ty, Int64Ty, Int64Ty}; + LLVMMetadataRef StructDbgTy = + LLVMDIBuilderCreateStructType(DIB, CompileUnit, "MyStruct", + 8, File, 0, 192, 0, 0, NULL, StructDbgElts, 3, + LLVMDWARFSourceLanguageC, NULL, "MyStruct", 8); + + LLVMMetadataRef StructDbgPtrTy = + LLVMDIBuilderCreatePointerType(DIB, StructDbgTy, 192, 0, 0, "", 0); + + LLVMAddNamedMetadataOperand(M, "FooType", + LLVMMetadataAsValue(LLVMGetModuleContext(M), StructDbgPtrTy)); char *MStr = LLVMPrintModuleToString(M); puts(MStr);