Add C API bindings for DIBuilder 'Type' APIs
[lldb.git] / llvm / bindings / go / llvm / dibuilder.go
index 778c317..72131bd 100644 (file)
@@ -95,13 +95,13 @@ type DIBuilder struct {
 
 // NewDIBuilder creates a new DIBuilder, associated with the given module.
 func NewDIBuilder(m Module) *DIBuilder {
-       d := C.LLVMNewDIBuilder(m.C)
+       d := C.LLVMCreateDIBuilder(m.C)
        return &DIBuilder{ref: d, m: m}
 }
 
 // Destroy destroys the DIBuilder.
 func (d *DIBuilder) Destroy() {
-       C.LLVMDIBuilderDestroy(d.ref)
+       C.LLVMDisposeDIBuilder(d.ref)
 }
 
 // FInalize finalizes the debug information generated by the DIBuilder.
@@ -132,23 +132,30 @@ func (d *DIBuilder) CreateCompileUnit(cu DICompileUnit) Metadata {
        defer C.free(unsafe.Pointer(flags))
        result := C.LLVMDIBuilderCreateCompileUnit(
                d.ref,
-               C.unsigned(cu.Language),
-               file, dir,
-               producer,
-               boolToCInt(cu.Optimized),
-               flags,
+               C.LLVMDWARFSourceLanguage(cu.Language),
+               C.LLVMDIBuilderCreateFile(d.ref, file, C.size_t(len(cu.File)), dir, C.size_t(len(cu.Dir))),
+               producer, C.size_t(len(cu.Producer)),
+               C.LLVMBool(boolToCInt(cu.Optimized)),
+               flags, C.size_t(len(cu.Flags)),
                C.unsigned(cu.RuntimeVersion),
+               /*SplitName=*/ nil, 0,
+               C.LLVMDWARFEmissionFull,
+               /*DWOId=*/ 0,
+               /*SplitDebugInlining*/ C.LLVMBool(boolToCInt(true)),
+               /*DebugInfoForProfiling*/ C.LLVMBool(boolToCInt(false)),
        )
        return Metadata{C: result}
 }
 
-// CreateCompileUnit creates file debug metadata.
+// CreateFile creates file debug metadata.
 func (d *DIBuilder) CreateFile(filename, dir string) Metadata {
        cfilename := C.CString(filename)
        defer C.free(unsafe.Pointer(cfilename))
        cdir := C.CString(dir)
        defer C.free(unsafe.Pointer(cdir))
-       result := C.LLVMDIBuilderCreateFile(d.ref, cfilename, cdir)
+       result := C.LLVMDIBuilderCreateFile(d.ref,
+               cfilename, C.size_t(len(filename)),
+               cdir, C.size_t(len(dir)))
        return Metadata{C: result}
 }
 
@@ -159,7 +166,7 @@ type DILexicalBlock struct {
        Column int
 }
 
-// CreateCompileUnit creates lexical block debug metadata.
+// CreateLexicalBlock creates lexical block debug metadata.
 func (d *DIBuilder) CreateLexicalBlock(diScope Metadata, b DILexicalBlock) Metadata {
        result := C.LLVMDIBuilderCreateLexicalBlock(
                d.ref,
@@ -191,7 +198,7 @@ type DIFunction struct {
        Optimized    bool
 }
 
-// CreateCompileUnit creates function debug metadata.
+// CreateFunction creates function debug metadata.
 func (d *DIBuilder) CreateFunction(diScope Metadata, f DIFunction) Metadata {
        name := C.CString(f.Name)
        defer C.free(unsafe.Pointer(name))
@@ -222,6 +229,7 @@ type DIAutoVariable struct {
        Type           Metadata
        AlwaysPreserve bool
        Flags          int
+       AlignInBits    uint32
 }
 
 // CreateAutoVariable creates local variable debug metadata.
@@ -237,6 +245,7 @@ func (d *DIBuilder) CreateAutoVariable(scope Metadata, v DIAutoVariable) Metadat
                v.Type.C,
                boolToCInt(v.AlwaysPreserve),
                C.unsigned(v.Flags),
+               C.uint32_t(v.AlignInBits),
        )
        return Metadata{C: result}
 }
@@ -275,10 +284,9 @@ func (d *DIBuilder) CreateParameterVariable(scope Metadata, v DIParameterVariabl
 
 // DIBasicType holds the values for creating basic type debug metadata.
 type DIBasicType struct {
-       Name        string
-       SizeInBits  uint64
-       AlignInBits uint64
-       Encoding    DwarfTypeEncoding
+       Name       string
+       SizeInBits uint64
+       Encoding   DwarfTypeEncoding
 }
 
 // CreateBasicType creates basic type debug metadata.
@@ -288,8 +296,8 @@ func (d *DIBuilder) CreateBasicType(t DIBasicType) Metadata {
        result := C.LLVMDIBuilderCreateBasicType(
                d.ref,
                name,
-               C.uint64_t(t.SizeInBits),
-               C.uint64_t(t.AlignInBits),
+               C.size_t(len(t.Name)),
+               C.unsigned(t.SizeInBits),
                C.unsigned(t.Encoding),
        )
        return Metadata{C: result}
@@ -299,20 +307,23 @@ func (d *DIBuilder) CreateBasicType(t DIBasicType) Metadata {
 type DIPointerType struct {
        Pointee     Metadata
        SizeInBits  uint64
-       AlignInBits uint64 // optional
+       AlignInBits uint32 // optional
+       AddressSpace uint32
        Name        string // optional
 }
 
-// CreateBasicType creates basic type debug metadata.
+// CreatePointerType creates a type that represents a pointer to another type.
 func (d *DIBuilder) CreatePointerType(t DIPointerType) Metadata {
        name := C.CString(t.Name)
        defer C.free(unsafe.Pointer(name))
        result := C.LLVMDIBuilderCreatePointerType(
                d.ref,
                t.Pointee.C,
-               C.uint64_t(t.SizeInBits),
-               C.uint64_t(t.AlignInBits),
+               C.unsigned(t.SizeInBits),
+               C.unsigned(t.AlignInBits),
+               C.unsigned(t.AddressSpace),
                name,
+               C.size_t(len(t.Name)),
        )
        return Metadata{C: result}
 }
@@ -325,12 +336,20 @@ type DISubroutineType struct {
        // Parameters contains the subroutine parameter types,
        // including the return type at the 0th index.
        Parameters []Metadata
+
+       Flags int
 }
 
 // CreateSubroutineType creates subroutine type debug metadata.
 func (d *DIBuilder) CreateSubroutineType(t DISubroutineType) Metadata {
-       params := d.getOrCreateTypeArray(t.Parameters)
-       result := C.LLVMDIBuilderCreateSubroutineType(d.ref, t.File.C, params.C)
+       params, length := llvmMetadataRefs(t.Parameters)
+       result := C.LLVMDIBuilderCreateSubroutineType(
+               d.ref,
+               t.File.C,
+               params,
+               length,
+               C.LLVMDIFlags(t.Flags),
+       )
        return Metadata{C: result}
 }
 
@@ -340,28 +359,38 @@ type DIStructType struct {
        File        Metadata
        Line        int
        SizeInBits  uint64
-       AlignInBits uint64
+       AlignInBits uint32
        Flags       int
        DerivedFrom Metadata
        Elements    []Metadata
+       VTableHolder Metadata // optional
+       UniqueID     string
 }
 
 // CreateStructType creates struct type debug metadata.
 func (d *DIBuilder) CreateStructType(scope Metadata, t DIStructType) Metadata {
-       elements := d.getOrCreateArray(t.Elements)
+       elements, length := llvmMetadataRefs(t.Elements)
        name := C.CString(t.Name)
+       uniqueID := C.CString(t.UniqueID)
        defer C.free(unsafe.Pointer(name))
+       defer C.free(unsafe.Pointer(uniqueID))
        result := C.LLVMDIBuilderCreateStructType(
                d.ref,
                scope.C,
                name,
+               C.size_t(len(t.Name)),
                t.File.C,
                C.unsigned(t.Line),
-               C.uint64_t(t.SizeInBits),
-               C.uint64_t(t.AlignInBits),
-               C.unsigned(t.Flags),
+               C.unsigned(t.SizeInBits),
+               C.unsigned(t.AlignInBits),
+               C.LLVMDIFlags(t.Flags),
                t.DerivedFrom.C,
-               elements.C,
+               elements,
+               length,
+               C.unsigned(0), // Optional Objective-C runtime version.
+               t.VTableHolder.C,
+               uniqueID,
+               C.uint64_t(len(t.UniqueID)),
        )
        return Metadata{C: result}
 }
@@ -375,25 +404,31 @@ type DIReplaceableCompositeType struct {
        Line        int
        RuntimeLang int
        SizeInBits  uint64
-       AlignInBits uint64
+       AlignInBits uint32
        Flags       int
+       UniqueID    string
 }
 
 // CreateReplaceableCompositeType creates replaceable composite type debug metadata.
 func (d *DIBuilder) CreateReplaceableCompositeType(scope Metadata, t DIReplaceableCompositeType) Metadata {
        name := C.CString(t.Name)
+       uniqueID := C.CString(t.UniqueID)
        defer C.free(unsafe.Pointer(name))
+       defer C.free(unsafe.Pointer(uniqueID))
        result := C.LLVMDIBuilderCreateReplaceableCompositeType(
                d.ref,
                C.unsigned(t.Tag),
                name,
+               C.size_t(len(t.Name)),
                scope.C,
                t.File.C,
                C.unsigned(t.Line),
                C.unsigned(t.RuntimeLang),
-               C.uint64_t(t.SizeInBits),
-               C.uint64_t(t.AlignInBits),
-               C.unsigned(t.Flags),
+               C.unsigned(t.SizeInBits),
+               C.unsigned(t.AlignInBits),
+               C.LLVMDIFlags(t.Flags),
+               uniqueID,
+               C.size_t(len(t.UniqueID)),
        )
        return Metadata{C: result}
 }
@@ -404,7 +439,7 @@ type DIMemberType struct {
        File         Metadata
        Line         int
        SizeInBits   uint64
-       AlignInBits  uint64
+       AlignInBits  uint32
        OffsetInBits uint64
        Flags        int
        Type         Metadata
@@ -418,12 +453,13 @@ func (d *DIBuilder) CreateMemberType(scope Metadata, t DIMemberType) Metadata {
                d.ref,
                scope.C,
                name,
+               C.size_t(len(t.Name)),
                t.File.C,
                C.unsigned(t.Line),
-               C.uint64_t(t.SizeInBits),
-               C.uint64_t(t.AlignInBits),
-               C.uint64_t(t.OffsetInBits),
-               C.unsigned(t.Flags),
+               C.unsigned(t.SizeInBits),
+               C.unsigned(t.AlignInBits),
+               C.unsigned(t.OffsetInBits),
+               C.LLVMDIFlags(t.Flags),
                t.Type.C,
        )
        return Metadata{C: result}
@@ -438,7 +474,7 @@ type DISubrange struct {
 // DIArrayType holds the values for creating array type debug metadata.
 type DIArrayType struct {
        SizeInBits  uint64
-       AlignInBits uint64
+       AlignInBits uint32
        ElementType Metadata
        Subscripts  []DISubrange
 }
@@ -449,13 +485,14 @@ func (d *DIBuilder) CreateArrayType(t DIArrayType) Metadata {
        for i, s := range t.Subscripts {
                subscriptsSlice[i] = d.getOrCreateSubrange(s.Lo, s.Count)
        }
-       subscripts := d.getOrCreateArray(subscriptsSlice)
+       subscripts, length := llvmMetadataRefs(subscriptsSlice)
        result := C.LLVMDIBuilderCreateArrayType(
                d.ref,
-               C.uint64_t(t.SizeInBits),
-               C.uint64_t(t.AlignInBits),
+               C.unsigned(t.SizeInBits),
+               C.unsigned(t.AlignInBits),
                t.ElementType.C,
-               subscripts.C,
+               subscripts,
+               length,
        )
        return Metadata{C: result}
 }
@@ -533,8 +570,8 @@ func (d *DIBuilder) InsertDeclareAtEnd(v Value, diVarInfo, expr Metadata, bb Bas
 
 // InsertValueAtEnd inserts a call to llvm.dbg.value at the end of the
 // specified basic block for the given value and associated debug metadata.
-func (d *DIBuilder) InsertValueAtEnd(v Value, diVarInfo, expr Metadata, offset uint64, bb BasicBlock) Value {
-       result := C.LLVMDIBuilderInsertValueAtEnd(d.ref, v.C, C.uint64_t(offset), diVarInfo.C, expr.C, bb.C)
+func (d *DIBuilder) InsertValueAtEnd(v Value, diVarInfo, expr Metadata, bb BasicBlock) Value {
+       result := C.LLVMDIBuilderInsertValueAtEnd(d.ref, v.C, diVarInfo.C, expr.C, bb.C)
        return Value{C: result}
 }