llvm-c patch for atomicrmw & dibuilder

Carlo Kok ck at remobjects.com
Sat Apr 20 05:54:29 PDT 2013


Op 20-4-2013 1:21, Eric Christopher schreef:
> Mind splitting this up into two patches please?
>
> Thanks!
>
> -eric
>
> On Fri, Apr 19, 2013 at 3:42 PM, Carlo Kok <ck at remobjects.com> wrote:
>> Attached is a patch that adds AtomicRMW and DIBuilder to llvm-c. Code is
>> tested and works quite well for me.
>>

Split in two, attached

--
Carlo Kok
RemObjects Software
-------------- next part --------------
Index: include/llvm-c/Core.h
===================================================================
--- include/llvm-c/Core.h	(revision 179940)
+++ include/llvm-c/Core.h	(working copy)
@@ -360,6 +360,42 @@
   LLVMLocalExecTLSModel
 } LLVMThreadLocalMode;
 
+enum LLVMAtomicOrdering {
+  LLVMAtomicOrderingNotAtomic = 0,
+  LLVMAtomicOrderingUnordered = 1,
+  LLVMAtomicOrderingMonotonic = 2,
+  // Consume = 3,  // Not specified yet.
+  LLVMAtomicOrderingAcquire = 4,
+  LLVMAtomicOrderingRelease = 5,
+  LLVMAtomicOrderingAcquireRelease = 6,
+  LLVMAtomicOrderingSequentiallyConsistent = 7
+};
+
+enum LLVMAtomicRMWBinOp {
+	// *p = v
+    LLVMAtomicRMWBinOpXchg,
+    // *p = old + v
+    LLVMAtomicRMWBinOpAdd,
+    // *p = old - v
+    LLVMAtomicRMWBinOpSub,
+    // *p = old & v
+    LLVMAtomicRMWBinOpAnd,
+    // *p = ~old & v
+    LLVMAtomicRMWBinOpNand,
+    // *p = old | v
+    LLVMAtomicRMWBinOpOr,
+    // *p = old ^ v
+    LLVMAtomicRMWBinOpXor,
+    // *p = old >signed v ? old : v
+    LLVMAtomicRMWBinOpMax,
+    // *p = old <signed v ? old : v
+    LLVMAtomicRMWBinOpMin,
+    // *p = old >unsigned v ? old : v
+    LLVMAtomicRMWBinOpUMax,
+    // *p = old <unsigned v ? old : v
+    LLVMAtomicRMWBinOpUMin
+};
+
 /**
  * @}
  */
@@ -2534,6 +2570,10 @@
                                 const char *Name);
 LLVMValueRef LLVMBuildPtrDiff(LLVMBuilderRef, LLVMValueRef LHS,
                               LLVMValueRef RHS, const char *Name);
+LLVMValueRef LLVMBuildAtomicRMW(LLVMBuilderRef B,LLVMAtomicRMWBinOp op,  
+                                LLVMValueRef PTR, LLVMValueRef Val, 
+                                LLVMAtomicOrdering ordering, 
+                                LLVMBool singleThread);
 
 /**
  * @}
Index: lib/IR/Core.cpp
===================================================================
--- lib/IR/Core.cpp	(revision 179940)
+++ lib/IR/Core.cpp	(working copy)
@@ -2390,7 +2390,42 @@
   return wrap(unwrap(B)->CreatePtrDiff(unwrap(LHS), unwrap(RHS), Name));
 }
 
+LLVMValueRef LLVMBuildAtomicRMW(LLVMBuilderRef B,LLVMAtomicRMWBinOp op, 
+                               LLVMValueRef PTR, LLVMValueRef Val, 
+                               LLVMAtomicOrdering ordering, 
+                               LLVMBool singleThread) {
+	AtomicRMWInst::BinOp intop;
+	switch (op) {
+		case LLVMAtomicRMWBinOpXchg: intop = AtomicRMWInst::Xchg; break;
+		case LLVMAtomicRMWBinOpAdd: intop = AtomicRMWInst::Add; break;
+		case LLVMAtomicRMWBinOpSub: intop = AtomicRMWInst::Sub; break;
+		case LLVMAtomicRMWBinOpAnd: intop = AtomicRMWInst::And; break;
+		case LLVMAtomicRMWBinOpNand: intop = AtomicRMWInst::Nand; break;
+		case LLVMAtomicRMWBinOpOr: intop = AtomicRMWInst::Or; break;
+		case LLVMAtomicRMWBinOpXor: intop = AtomicRMWInst::Xor; break;
+		case LLVMAtomicRMWBinOpMax: intop = AtomicRMWInst::Max; break;
+		case LLVMAtomicRMWBinOpMin: intop = AtomicRMWInst::Min; break;
+		case LLVMAtomicRMWBinOpUMax: intop = AtomicRMWInst::UMax; break;
+		case LLVMAtomicRMWBinOpUMin: intop = AtomicRMWInst::UMin; break;
+	}
+	AtomicOrdering intordering;
+	switch (ordering) {
+		case LLVMAtomicOrderingNotAtomic: intordering = NotAtomic; break;
+		case LLVMAtomicOrderingUnordered: intordering = Unordered; break;
+		case LLVMAtomicOrderingMonotonic: intordering = Monotonic; break;
+		case LLVMAtomicOrderingAcquire: intordering = Acquire; break;
+		case LLVMAtomicOrderingRelease: intordering = Release; break;
+		case LLVMAtomicOrderingAcquireRelease: 
+          intordering = AcquireRelease; 
+          break;
+		case LLVMAtomicOrderingSequentiallyConsistent: 
+          intordering = SequentiallyConsistent; 
+          break;
+	}
+	return wrap(unwrap(B)->CreateAtomicRMW(intop, unwrap(PTR), unwrap(Val), intordering, singleThread ? SingleThread : CrossThread));
+}
 
+
 /*===-- Module providers --------------------------------------------------===*/
 
 LLVMModuleProviderRef
-------------- next part --------------
Index: include/llvm-c/DIBuilder.h
===================================================================
--- include/llvm-c/DIBuilder.h	(revision 0)
+++ include/llvm-c/DIBuilder.h	(working copy)
@@ -0,0 +1,510 @@
+/*===-- llvm-c/DIBuilder.h - Debug Info Builder C Interface -------*- C -*-===*\
+|*                                                                            *|
+|*                     The LLVM Compiler Infrastructure                       *|
+|*                                                                            *|
+|* This file is distributed under the University of Illinois Open Source      *|
+|* License. See LICENSE.TXT for details.                                      *|
+|*                                                                            *|
+|*===----------------------------------------------------------------------===*|
+|*                                                                            *|
+|* This header declares the C interface to libLLVMCore.a, which implements    *|
+|* the LLVM intermediate representation.                                      *|
+|*                                                                            *|
+\*===----------------------------------------------------------------------===*/
+
+#ifndef LLVM_C_DIBUILDER_H
+#define LLVM_C_DIBUILDER_H
+
+#include "llvm/Support/DataTypes.h"
+
+#ifdef __cplusplus
+
+#include "llvm-c/Core.h"
+#include "llvm-c/BitReader.h"
+#include "llvm/DebugInfo.h"
+#include "llvm/DIBuilder.h"
+
+
+extern "C" {
+#endif
+
+/**
+ * @defgroup LLVMC DIBuilder: C interface to DIBuilder
+ * @ingroup LLVMC
+ *
+ * @{
+ */
+
+typedef struct LLVMDIBuilder *LLVMDIBuilderRef;
+LLVMDIBuilderRef LLVMCreateDIBuilder(LLVMModuleRef module);
+void LLVMDestroyDIBuilder(LLVMDIBuilderRef builder);
+LLVMValueRef LLVMDIBuilderGetCU(LLVMDIBuilderRef builder);
+void LLVMDIBuilderFinalize(LLVMDIBuilderRef builder);
+
+/// createCompileUnit - A CompileUnit provides an anchor for all debugging
+/// information generated during this instance of compilation.
+/// @param Lang     Source programming language, eg. dwarf::DW_LANG_C99
+/// @param File     File name
+/// @param Dir      Directory
+/// @param Producer String identify producer of debugging information.
+///                 Usuall this is a compiler version string.
+/// @param isOptimized A boolean flag which indicates whether optimization
+///                    is ON 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 RV       This indicates runtime version for languages like
+///                 Objective-C.
+void LLVMDIBuilderCreateCompileUnit(LLVMDIBuilderRef builder, unsigned Lang,
+                                    char *File, char *Dir, char *Producer,
+                                    LLVMBool isOptimized, char *Flags,
+                                    unsigned RV);
+/// createFile - Create a file descriptor to hold debugging information
+/// for a file.
+LLVMValueRef LLVMDIBuilderCreateFile(LLVMDIBuilderRef builder, char *File,
+                                     char *Dir);
+/// createEnumerator - Create a single enumerator value.
+LLVMValueRef LLVMDIBuilderCreateEnumerator(LLVMDIBuilderRef builder, char *Name,
+                                           uint64_t Val);
+/// createNullPtrType - Create C++0x nullptr type.
+LLVMValueRef LLVMDIBuilderCreateNullPtr(LLVMDIBuilderRef builder, char *Name);
+/// createBasicType - Create debugging information entry for a basic
+void LLVMBuilderAssociatePosition(LLVMBuilderRef builder, int Row, int Col,
+                                  LLVMValueRef Scope);
+void LLVMBuilderDeassociatePosition(LLVMBuilderRef builder);
+/// createBasicType - Create debugging information entry for a basic
+/// type.
+/// @param Name        Type name.
+/// @param SizeInBits  Size of the type.
+/// @param AlignInBits Type alignment.
+/// @param Encoding    DWARF encoding code, e.g. dwarf::DW_ATE_float.
+LLVMValueRef LLVMDIBuilderCreateBasicType(LLVMDIBuilderRef builder, char *Name,
+                                          uint64_t sizeInBits,
+                                          uint64_t alignInBits,
+                                          unsigned Encoding);
+/// createQualifiedType - Create debugging information entry for a qualified
+/// type, e.g. 'const int'.
+/// @param Tag         Tag identifing type, e.g. dwarf::TAG_volatile_type
+/// @param FromTy      Base Type.
+LLVMValueRef LLVMDIBuilderCreateQualifiedType(LLVMDIBuilderRef builder,
+                                              unsigned Tag,
+                                              LLVMValueRef FromTy);
+/// createPointerType - Create debugging information entry for a pointer.
+/// @param PointeeTy   Type pointed by this pointer.
+/// @param SizeInBits  Size.
+/// @param AlignInBits Alignment. (optional)
+/// @param Name        Pointer type name. (optional)
+LLVMValueRef LLVMDIBuilderCreatePointerType(LLVMDIBuilderRef builder,
+                                            LLVMValueRef pointeeTy,
+                                            uint64_t SizeInBits,
+                                            uint64_t AlignInBits);
+/// createReferenceType - Create debugging information entry for a c++
+/// style reference or rvalue reference type.
+LLVMValueRef LLVMDIBuilderCreateReferenceType(LLVMDIBuilderRef builder,
+                                              unsigned Tag, LLVMValueRef RTy);
+/// createTypedef - Create debugging information entry for a typedef.
+/// @param Ty          Original type.
+/// @param Name        Typedef name.
+/// @param File        File where this type is defined.
+/// @param LineNo      Line number.
+/// @param Context     The surrounding context for the typedef.
+LLVMValueRef LLVMDIBuilderCreateTypeDef(LLVMDIBuilderRef builder,
+                                        LLVMValueRef Ty, char *Name,
+                                        LLVMValueRef File, unsigned LineNo,
+                                        LLVMValueRef Context);
+/// createFriend - Create debugging information entry for a 'friend'.
+LLVMValueRef LLVMDIBuilderCreateFriend(LLVMDIBuilderRef builder,
+                                       LLVMValueRef Ty, LLVMValueRef FriendTy);
+/// createInheritance - Create debugging information entry to establish
+/// inheritance relationship between two types.
+/// @param Ty           Original type.
+/// @param BaseTy       Base type. Ty is inherits from base.
+/// @param BaseOffset   Base offset.
+/// @param Flags        Flags to describe inheritance attribute,
+///                     e.g. private
+LLVMValueRef LLVMDIBuilderCreateInheritence(LLVMDIBuilderRef builder,
+                                            LLVMValueRef Ty,
+                                            LLVMValueRef BaseTy,
+                                            uint64_t BaseOffset,
+                                            unsigned flags);
+/// createMemberType - Create debugging information entry for a member.
+/// @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.
+LLVMValueRef LLVMDIBuilderCreateMemberType(
+    LLVMDIBuilderRef builder, LLVMValueRef Scope, char *Name, LLVMValueRef File,
+    unsigned LineNo, uint64_t SizeInBits, uint64_t AlignInBits,
+    uint64_t OffsetInBits, unsigned Flags, LLVMValueRef Ty);
+/// createObjCIVar - Create debugging information entry for Objective-C
+/// instance variable.
+/// @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.
+/// @param PropertyName Name of the Objective C property assoicated with
+///                     this ivar.
+/// @param GetterName   Name of the Objective C property getter selector.
+/// @param SetterName   Name of the Objective C property setter selector.
+/// @param PropertyAttributes Objective C property attributes.
+LLVMValueRef LLVMDIBuilderCreateObjCIVar(
+    LLVMDIBuilderRef builder, char *name, LLVMValueRef File, unsigned LineNo,
+    uint64_t SizeInBits, uint64_t AlignInBits, uint64_t OffsetInBits,
+    unsigned Flags, LLVMValueRef Ty, char *PropertyName,
+    char *PropertyGetterName, char *PropertySetterName,
+    unsigned PropertyAttributes);
+/// createObjCIVar - Create debugging information entry for Objective-C
+/// instance variable.
+/// @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.
+/// @param Property     Property associated with this ivar.
+
+LLVMValueRef LLVMDIBuilderCreateObjCPropertyIVar(
+    LLVMDIBuilderRef builder, char *name, LLVMValueRef File, unsigned LineNo,
+    uint64_t SizeInBits, uint64_t AlignInBits, uint64_t OffsetInBits,
+    unsigned Flags, LLVMValueRef Ty, LLVMValueRef Property);
+
+/// createObjCProperty - Create debugging information entry for Objective-C
+/// property.
+/// @param Name         Property name.
+/// @param File         File where this property is defined.
+/// @param LineNumber   Line number.
+/// @param GetterName   Name of the Objective C property getter selector.
+/// @param SetterName   Name of the Objective C property setter selector.
+/// @param PropertyAttributes Objective C property attributes.
+/// @param Ty           Type.
+LLVMValueRef LLVMDIBuilderCreateProperty(LLVMDIBuilderRef builder, char *Name,
+                                         LLVMValueRef File, unsigned LineNumber,
+                                         char *GetterName, char *SetterName,
+                                         unsigned PropertyAttributes,
+                                         LLVMValueRef Ty);
+/// createClassType - 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 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 Elements     class members.
+/// @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 TemplateParms Template type parameters.
+LLVMValueRef LLVMDIBuilderCreateClassType(
+    LLVMDIBuilderRef builder, LLVMValueRef Scope, char *Name, LLVMValueRef File,
+    unsigned LineNumber, uint64_t SizeInBits, uint64_t AlignInBits,
+    uint64_t OffsetInBits, unsigned Flags, LLVMValueRef DerivedFrom,
+    LLVMValueRef Elements, LLVMValueRef VTableHolder,
+    LLVMValueRef TemplateParms);
+/// createStructType - Create debugging information entry for a struct.
+/// @param Scope        Scope in which this struct is defined.
+/// @param Name         Struct name.
+/// @param File         File where this member is defined.
+/// @param LineNo       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.
+LLVMValueRef LLVMDIBuilderCreateStructType(
+    LLVMDIBuilderRef builder, LLVMValueRef Scope, char *Name, LLVMValueRef File,
+    unsigned LineNum, uint64_t SizeInBits, uint64_t AlignInBits, unsigned Flags,
+    LLVMValueRef Elements, unsigned RunTimeLang);
+/// createUnionType - Create debugging information entry for an union.
+/// @param Scope        Scope in which this union is defined.
+/// @param Name         Union name.
+/// @param File         File where this member is defined.
+/// @param LineNo       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 RunTimeLang  Optional parameter, Objective-C runtime version.
+LLVMValueRef LLVMDIBuilderCreateUnionType(
+    LLVMDIBuilderRef builder, LLVMValueRef Scope, char *Name, LLVMValueRef File,
+    unsigned LineNum, uint64_t SizeInBits, uint64_t AlignInBits, unsigned Flags,
+    LLVMValueRef Elements, unsigned RunTimeLang);
+/// createTemplateValueParameter - Create debugging information for template
+/// value parameter.
+/// @param Scope        Scope in which this type is defined.
+/// @param Name         Value parameter name.
+/// @param Ty           Parameter type.
+/// @param Value        Constant parameter value.
+/// @param File         File where this type parameter is defined.
+/// @param LineNo       Line number.
+/// @param ColumnNo     Column Number.
+LLVMValueRef LLVMDIBuilderCreateTemplateValueParameter(
+    LLVMDIBuilderRef builder, LLVMValueRef Scope, char *Name, LLVMValueRef Ty,
+    uint64_t Value, LLVMValueRef File, unsigned LineNo, unsigned ColumnNo);
+/// createArrayType - Create debugging information entry for an array.
+/// @param Size         Array size.
+/// @param AlignInBits  Alignment.
+/// @param Ty           Element type.
+/// @param Subscripts   Subscripts.
+LLVMValueRef LLVMDIBuilderCreateArrayType(LLVMDIBuilderRef builder,
+                                          uint64_t Size, uint64_t AlignInBits,
+                                          LLVMValueRef Ty,
+                                          LLVMValueRef Subscripts);
+/// createVectorType - Create debugging information entry for a vector type.
+/// @param Size         Array size.
+/// @param AlignInBits  Alignment.
+/// @param Ty           Element type.
+/// @param Subscripts   Subscripts.
+LLVMValueRef LLVMDIBuilderCreateVector(LLVMDIBuilderRef builder, uint64_t Size,
+                                       uint64_t AlignInBits, LLVMValueRef Ty,
+                                       LLVMValueRef Subscripts);
+/// createEnumerationType - Create debugging information entry for an
+/// enumeration.
+/// @param Scope        Scope in which this enumeration is defined.
+/// @param Name         Union name.
+/// @param File         File where this member is defined.
+/// @param LineNo       Line number.
+/// @param SizeInBits   Member size.
+/// @param AlignInBits  Member alignment.
+/// @param Elements     Enumeration elements.
+LLVMValueRef LLVMDIBuilderCreateEnumerationType(
+    LLVMDIBuilderRef builder, LLVMValueRef Scope, char *Name, LLVMValueRef File,
+    unsigned LineNumber, uint64_t SizeInBits, uint64_t AlignInBits,
+    LLVMValueRef Elements, LLVMValueRef ClassType);
+/// createSubroutineType - Create subroutine type.
+/// @param File          File in which this subroutine is defined.
+/// @param ParamterTypes An array of subroutine parameter types. This
+///                      includes return type at 0th index.
+LLVMValueRef LLVMDIBuilderCreateSubroutineType(LLVMDIBuilderRef builder,
+                                               LLVMValueRef File,
+                                               LLVMValueRef ParameterTypes);
+/// createArtificialType - Create a new DIType with "artificial" flag set.
+LLVMValueRef LLVMDIBuilderCreateArtificialType(LLVMDIBuilderRef builder,
+                                               LLVMValueRef Ty);
+/// createForwardDecl - Create a temporary forward-declared type.
+LLVMValueRef LLVMDIBuilderCreateForwardDecl(LLVMDIBuilderRef builder,
+                                            unsigned Tag, char *Name,
+                                            LLVMValueRef Scope,
+                                            LLVMValueRef File, unsigned Line,
+                                            unsigned RuntimeLang);
+/// retainType - Retain DIType in a module even if it is not referenced
+/// through debug info anchors.
+void LLVMDIBuilderRetainType(LLVMDIBuilderRef builder, LLVMValueRef Ty);
+/// createUnspecifiedParameter - Create unspeicified type descriptor
+/// for a subroutine type.
+LLVMValueRef LLVMDIBuilderCreateUnspecifiedParameter(LLVMDIBuilderRef builder);
+/// getOrCreateArray - Get a DIArray, create one if required.
+LLVMValueRef LLVMDIBuilderGetOrCreateArray(LLVMDIBuilderRef builder,
+                                           LLVMValueRef *Elements,
+                                           int ElementCount);
+/// getOrCreateSubrange - Create a descriptor for a value range.  This
+/// implicitly uniques the values returned.
+LLVMValueRef LLVMDIBuilderGetOrCreateRange(LLVMDIBuilderRef builder, int64_t Lo,
+                                           int64_t Hi);
+/// createGlobalVariable - Create a new descriptor for the specified global.
+/// @param Name        Name of the variable.
+/// @param File        File where this variable is defined.
+/// @param LineNo      Line number.
+/// @param Ty          Variable Type.
+/// @param isLocalToUnit Boolean flag indicate whether this variable is
+///                      externally visible or not.
+/// @param Val         llvm::Value of the variable.
+LLVMValueRef LLVMDIBuilderCreateGlobalVariable(LLVMDIBuilderRef builder,
+                                               char *Name, LLVMValueRef File,
+                                               unsigned LineNo, LLVMValueRef Ty,
+                                               bool IsLocalToUnit,
+                                               LLVMValueRef Val);
+/// createStaticVariable - Create a new descriptor for the specified
+/// variable.
+/// @param Conext      Variable scope.
+/// @param Name        Name of the variable.
+/// @param LinakgeName Mangled  name of the variable.
+/// @param File        File where this variable is defined.
+/// @param LineNo      Line number.
+/// @param Ty          Variable Type.
+/// @param isLocalToUnit Boolean flag indicate whether this variable is
+///                      externally visible or not.
+/// @param Val         llvm::Value of the variable.
+LLVMValueRef LLVMDIBuilderCreateStaticVariable(
+    LLVMDIBuilderRef builder, LLVMValueRef Context, char *Name,
+    char *LinkageName, LLVMValueRef File, unsigned LineNo, LLVMValueRef Ty,
+    bool IsLocalToUnit, LLVMValueRef Val);
+/// createLocalVariable - Create a new descriptor for the specified
+/// local variable.
+/// @param Tag         Dwarf TAG. Usually DW_TAG_auto_variable or
+///                    DW_TAG_arg_variable.
+/// @param Scope       Variable scope.
+/// @param Name        Variable name.
+/// @param File        File where this variable is defined.
+/// @param LineNo      Line number.
+/// @param Ty          Variable Type
+/// @param AlwaysPreserve Boolean. Set to true if debug info for this
+///                       variable should be preserved in optimized build.
+/// @param Flags          Flags, e.g. artificial variable.
+/// @param ArgNo       If this variable is an arugment then this argument's
+///                    number. 1 indicates 1st argument.
+LLVMValueRef LLVMDIBuilderCreateLocalVariable(LLVMDIBuilderRef builder,
+                                              unsigned Tag, LLVMValueRef Scope,
+                                              char *Name, LLVMValueRef File,
+                                              unsigned LineNo, LLVMValueRef Ty,
+                                              bool AlwaysPreserve,
+                                              unsigned Flags, unsigned ArgNo);
+/// createComplexVariable - Create a new descriptor for the specified
+/// variable which has a complex address expression for its address.
+/// @param Tag         Dwarf TAG. Usually DW_TAG_auto_variable or
+///                    DW_TAG_arg_variable.
+/// @param Scope       Variable scope.
+/// @param Name        Variable name.
+/// @param File        File where this variable is defined.
+/// @param LineNo      Line number.
+/// @param Ty          Variable Type
+/// @param Addr        An array of complex address operations.
+/// @param ArgNo       If this variable is an arugment then this argument's
+///                    number. 1 indicates 1st argument.
+LLVMValueRef LLVMDIBuilderCreateComplexVariable(
+    LLVMDIBuilderRef builder, unsigned Tag, LLVMValueRef Scope, char *Name,
+    LLVMValueRef File, unsigned LineNo, LLVMValueRef Ty, LLVMValueRef *Addrs,
+    int AddrCount, unsigned ArgNo);
+
+/// createFunction - Create a new descriptor for the specified subprogram.
+/// See comments in DISubprogram for descriptions of these fields.
+/// @param Scope         Function scope.
+/// @param Name          Function name.
+/// @param LinkageName   Mangled function 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. is this function prototyped or not.
+///                      This flags are used to emit dwarf attributes.
+/// @param isOptimized   True if optimization is ON.
+/// @param Fn            llvm::Function pointer.
+/// @param TParam        Function template parameters.
+LLVMValueRef LLVMDIBuilderCreateFunction(
+    LLVMDIBuilderRef builder, LLVMValueRef Scope, char *Name, char *LinkageName,
+    LLVMValueRef File, unsigned LineNo, LLVMValueRef Ty, bool IsLocalToUnit,
+    bool IsDefinition, unsigned ScopeLine, unsigned Flags, bool IsOptimized,
+    LLVMValueRef function, LLVMValueRef TParam, LLVMValueRef Decl);
+/// createMethod - Create a new descriptor for the specified C++ method.
+/// See comments in DISubprogram for descriptions of these fields.
+/// @param Scope         Function scope.
+/// @param Name          Function name.
+/// @param LinkageName   Mangled function 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 Virtuality    Attributes describing virtualness. e.g. pure
+///                      virtual function.
+/// @param VTableIndex   Index no of this method in virtual table.
+/// @param VTableHolder  Type that holds vtable.
+/// @param Flags         e.g. is this function prototyped or not.
+///                      This flags are used to emit dwarf attributes.
+/// @param isOptimized   True if optimization is ON.
+/// @param Fn            llvm::Function pointer.
+/// @param TParam        Function template parameters.
+LLVMValueRef LLVMDIBuilderCreateMethod(
+    LLVMDIBuilderRef builder, LLVMValueRef Scope, char *Name, char *LinkageName,
+    LLVMValueRef File, unsigned LineNo, LLVMValueRef Ty, bool lIsLocalToUnit,
+    bool IsDefintiion, unsigned Virtuality, unsigned VTableIndex,
+    LLVMValueRef VTableHolder, unsigned Flags, bool IsOptimized,
+    LLVMValueRef Fn, LLVMValueRef TParam);
+/// createNameSpace - This creates new descriptor for a namespace
+/// with the specified parent scope.
+/// @param Scope       Namespace scope
+/// @param Name        Name of this namespace
+/// @param File        Source file
+/// @param LineNo      Line number
+LLVMValueRef LLVMDIBuilderCreateNamespace(LLVMDIBuilderRef builder,
+                                          LLVMValueRef Scope, char *Name,
+                                          LLVMValueRef File, unsigned LineNo);
+/// createLexicalBlockFile - This creates a descriptor for a lexical
+/// block with a new file attached. This merely extends the existing
+/// lexical block as it crosses a file.
+/// @param Scope       Lexical block.
+/// @param File        Source file.
+LLVMValueRef LLVMDIBuilderCreateLexicalBlockFile(LLVMDIBuilderRef builder,
+                                                 LLVMValueRef Scope,
+                                                 LLVMValueRef File);
+/// createLexicalBlock - This creates a descriptor for a lexical block
+/// with the specified parent context.
+/// @param Scope       Parent lexical scope.
+/// @param File        Source file
+/// @param Line        Line number
+/// @param Col         Column number
+LLVMValueRef LLVMDIBuilderCreateLexicalBlock(LLVMDIBuilderRef builder,
+                                             LLVMValueRef Scope,
+                                             LLVMValueRef File, unsigned Line,
+                                             unsigned Col);
+/// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
+/// @param Storage     llvm::Value of the variable
+/// @param VarInfo     Variable's debug info descriptor.
+/// @param InsertAtEnd Location for the new intrinsic.
+LLVMValueRef LLVMDIBuilderInsertDeclare(LLVMDIBuilderRef builder,
+                                        LLVMValueRef Storage,
+                                        LLVMValueRef VarInfo,
+                                        LLVMBasicBlockRef InsertAtEnd);
+/// insertDeclare - Insert a new llvm.dbg.declare intrinsic call.
+/// @param Storage      llvm::Value of the variable
+/// @param VarInfo      Variable's debug info descriptor.
+/// @param InsertBefore Location for the new intrinsic.
+LLVMValueRef LLVMDIBuilderInsertDeclareBefore(LLVMDIBuilderRef builder,
+                                              LLVMValueRef Storage,
+                                              LLVMValueRef VarInfo,
+                                              LLVMValueRef InsertBefore);
+/// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
+/// @param Val          llvm::Value of the variable
+/// @param Offset       Offset
+/// @param VarInfo      Variable's debug info descriptor.
+/// @param InsertAtEnd Location for the new intrinsic.
+LLVMValueRef LLVMDIBuilderInsertDgbValueInstrinsic(
+    LLVMDIBuilderRef builder, LLVMValueRef Val, uint64_t Offset,
+    LLVMValueRef VarInfo, LLVMBasicBlockRef InsertAtEnd);
+/// insertDbgValueIntrinsic - Insert a new llvm.dbg.value intrinsic call.
+/// @param Val          llvm::Value of the variable
+/// @param Offset       Offset
+/// @param VarInfo      Variable's debug info descriptor.
+/// @param InsertBefore Location for the new intrinsic.
+LLVMValueRef LLVMDIBuilderInsertDbgValueIntrinsicBefore(
+    LLVMDIBuilderRef builder, LLVMValueRef Val, uint64_t Offset,
+    LLVMValueRef VarInfo, LLVMValueRef InsertBefore);
+
+void LLVMDIBuilderReplaceStructBody(LLVMDIBuilderRef builder,
+                                    LLVMValueRef Struct, LLVMValueRef NewBody);
+
+#ifdef __cplusplus
+}
+
+using namespace llvm;
+
+namespace llvm {
+class DIDescriptor;
+class DIBuilder;
+
+inline DIBuilder *unwrap(LLVMDIBuilderRef P) {
+  return reinterpret_cast<DIBuilder *>(P);
+}
+inline LLVMDIBuilderRef wrap(const DIBuilder *P) {
+  return reinterpret_cast<LLVMDIBuilderRef>(const_cast<DIBuilder *>(P));
+}
+}
+
+#endif /* !defined(__cplusplus) */
+
+#endif /* !LLVM_C_DIBUILDER_H */
Index: lib/IR/CMakeLists.txt
===================================================================
--- lib/IR/CMakeLists.txt	(revision 179940)
+++ lib/IR/CMakeLists.txt	(working copy)
@@ -10,6 +10,7 @@
   DebugInfo.cpp
   DebugLoc.cpp
   DIBuilder.cpp
+  DIBuilderC.cpp
   Dominators.cpp
   Function.cpp
   GCOV.cpp
Index: lib/IR/DIBuilderC.cpp
===================================================================
--- lib/IR/DIBuilderC.cpp	(revision 0)
+++ lib/IR/DIBuilderC.cpp	(working copy)
@@ -0,0 +1,448 @@
+//===-- DIBuilderC.cpp
+//----------------------------------------------------------===//
+//
+//                     The LLVM Compiler Infrastructure
+//
+// This file is distributed under the University of Illinois Open Source
+// License. See LICENSE.TXT for details.
+//
+//===----------------------------------------------------------------------===//
+//
+// This file implements the the C binding for DIBuilder
+//
+//===----------------------------------------------------------------------===//
+
+#include "llvm-c/Core.h"
+#include "llvm-c/DIBuilder.h"
+
+using namespace llvm;
+
+LLVMDIBuilderRef LLVMCreateDIBuilder(LLVMModuleRef module) {
+  Module *mod = unwrap(module);
+  return wrap(new DIBuilder(*mod));
+}
+
+void LLVMDestroyDIBuilder(LLVMDIBuilderRef builder) { delete unwrap(builder); }
+
+LLVMValueRef LLVMDIBuilderGetCU(LLVMDIBuilderRef builder) {
+  return wrap(unwrap(builder)->getCU());
+}
+
+void LLVMDIBuilderFinalize(LLVMDIBuilderRef builder) {
+  unwrap(builder)->finalize();
+}
+
+void LLVMDIBuilderCreateCompileUnit(LLVMDIBuilderRef builder, unsigned Lang,
+                                    char *File, char *Dir, char *Producer,
+                                    LLVMBool isOptimized, char *Flags,
+                                    unsigned RV) {
+  StringRef file(File);
+  StringRef dir(Dir);
+  StringRef producer(Producer);
+  StringRef flags(Flags);
+  unwrap(builder)
+      ->createCompileUnit(Lang, file, dir, producer, isOptimized, flags, RV);
+}
+
+LLVMValueRef LLVMDIBuilderCreateFile(LLVMDIBuilderRef builder, char *File,
+                                     char *Dir) {
+  StringRef filename(File);
+  StringRef directory(Dir);
+  DIDescriptor descr = unwrap(builder)->createFile(File, Dir);
+  return wrap(descr);
+}
+
+LLVMValueRef LLVMDIBuilderCreateEnumerator(LLVMDIBuilderRef builder, char *Name,
+                                           uint64_t Val) {
+  StringRef name(Name);
+  return wrap(unwrap(builder)->createEnumerator(name, Val));
+}
+
+LLVMValueRef LLVMDIBuilderCreateNullPtr(LLVMDIBuilderRef builder, char *Name) {
+  StringRef name(Name);
+  return wrap(unwrap(builder)->createNullPtrType(name));
+}
+
+void LLVMBuilderAssociatePosition(LLVMBuilderRef builder, int Row, int Col,
+                                  LLVMValueRef Scope) {
+  Value *node = unwrap(Scope);
+  unwrap(builder)->SetCurrentDebugLocation(
+      DebugLoc::get(Row, Col, cast_or_null<MDNode>(node)));
+}
+
+void LLVMBuilderDeassociatePosition(LLVMBuilderRef builder) {
+  unwrap(builder)->SetCurrentDebugLocation(DebugLoc());
+}
+
+LLVMValueRef LLVMDIBuilderCreateBasicType(LLVMDIBuilderRef builder, char *Name,
+                                          uint64_t sizeInBits,
+                                          uint64_t alignInBits,
+                                          unsigned Encoding) {
+  StringRef name(Name);
+  return wrap(unwrap(builder)
+                  ->createBasicType(name, sizeInBits, alignInBits, Encoding));
+}
+
+LLVMValueRef LLVMDIBuilderCreateQualifiedType(LLVMDIBuilderRef builder,
+                                              unsigned Tag,
+                                              LLVMValueRef FromTy) {
+  MDNode *ft = cast_or_null<MDNode>(unwrap(FromTy));
+  return wrap(unwrap(builder)->createQualifiedType(Tag, (DIType) ft));
+}
+
+LLVMValueRef LLVMDIBuilderCreatePointerType(LLVMDIBuilderRef builder,
+                                            LLVMValueRef pointeeTy,
+                                            uint64_t SizeInBits,
+                                            uint64_t AlignInBits, char *name) {
+  return wrap(unwrap(builder)->createPointerType(
+      (DIType) cast_or_null<MDNode>(unwrap(pointeeTy)), SizeInBits, AlignInBits,
+      name));
+}
+
+LLVMValueRef LLVMDIBuilderCreateReferenceType(LLVMDIBuilderRef builder,
+                                              unsigned Tag, LLVMValueRef RTy) {
+  return wrap(unwrap(builder)->createReferenceType(
+      Tag, (DIType) cast_or_null<MDNode>(unwrap(RTy))));
+}
+
+LLVMValueRef LLVMDIBuilderCreateTypeDef(LLVMDIBuilderRef builder,
+                                        LLVMValueRef Ty, char *Name,
+                                        LLVMValueRef File, unsigned LineNo,
+                                        LLVMValueRef Context) {
+
+  StringRef name(Name);
+  return wrap(unwrap(builder)->createTypedef(
+      (DIType) cast_or_null<MDNode>(unwrap(Ty)), Name,
+      (DIFile) cast_or_null<MDNode>(unwrap(File)), LineNo,
+      (DIDescriptor) cast_or_null<MDNode>(unwrap(Context))));
+}
+
+LLVMValueRef LLVMDIBuilderCreateFriend(LLVMDIBuilderRef builder,
+                                       LLVMValueRef Ty, LLVMValueRef FriendTy) {
+  return wrap(unwrap(builder)->createFriend(
+      (DIType) cast_or_null<MDNode>(unwrap(Ty)),
+      (DIType) cast_or_null<MDNode>(unwrap(FriendTy))));
+}
+
+LLVMValueRef LLVMDIBuilderCreateInheritence(LLVMDIBuilderRef builder,
+                                            LLVMValueRef Ty,
+                                            LLVMValueRef BaseTy,
+                                            uint64_t BaseOffset,
+                                            unsigned flags) {
+  return wrap(unwrap(builder)->createInheritance(
+      (DIType) cast_or_null<MDNode>(unwrap(Ty)),
+      (DIType) cast_or_null<MDNode>(unwrap(BaseTy)), BaseOffset, flags));
+}
+
+LLVMValueRef LLVMDIBuilderCreateMemberType(
+    LLVMDIBuilderRef builder, LLVMValueRef Scope, char *Name, LLVMValueRef File,
+    unsigned LineNo, uint64_t SizeInBits, uint64_t AlignInBits,
+    uint64_t OffsetInBits, unsigned Flags, LLVMValueRef Ty) {
+  return wrap(unwrap(builder)->createMemberType(
+      (DIDescriptor) cast_or_null<MDNode>(unwrap(Scope)), StringRef(Name),
+      (DIFile) cast_or_null<MDNode>(unwrap(File)), LineNo, SizeInBits,
+      AlignInBits, OffsetInBits, Flags,
+      (DIType) cast_or_null<MDNode>(unwrap(Ty))));
+}
+
+LLVMValueRef LLVMDIBuilderCreateObjCIVar(
+    LLVMDIBuilderRef builder, char *Name, LLVMValueRef File, unsigned LineNo,
+    uint64_t SizeInBits, uint64_t AlignInBits, uint64_t OffsetInBits,
+    unsigned Flags, LLVMValueRef Ty, char *PropertyName,
+    char *PropertyGetterName, char *PropertySetterName,
+    unsigned PropertyAttributes) {
+  return wrap(unwrap(builder)->createObjCIVar(
+      StringRef(Name), (DIFile) cast_or_null<MDNode>(unwrap(File)), LineNo,
+      SizeInBits, AlignInBits, OffsetInBits, Flags,
+      (DIType) cast_or_null<MDNode>(unwrap(Ty)), StringRef(PropertyName),
+      StringRef(PropertyGetterName), StringRef(PropertySetterName),
+      PropertyAttributes));
+}
+
+LLVMValueRef LLVMDIBuilderCreateObjCPropertyIVar(
+    LLVMDIBuilderRef builder, char *Name, LLVMValueRef File, unsigned LineNo,
+    uint64_t SizeInBits, uint64_t AlignInBits, uint64_t OffsetInBits,
+    unsigned Flags, LLVMValueRef Ty, LLVMValueRef Property) {
+  return wrap(unwrap(builder)->createObjCIVar(
+      StringRef(Name), (DIFile) cast_or_null<MDNode>(unwrap(File)), LineNo,
+      SizeInBits, AlignInBits, OffsetInBits, Flags,
+      (DIType) cast_or_null<MDNode>(unwrap(Ty)),
+      cast_or_null<MDNode>(unwrap(Property))));
+}
+
+LLVMValueRef LLVMDIBuilderCreateProperty(LLVMDIBuilderRef builder, char *Name,
+                                         LLVMValueRef File, unsigned LineNumber,
+                                         char *GetterName, char *SetterName,
+                                         unsigned PropertyAttributes,
+                                         LLVMValueRef Ty) {
+  return wrap(unwrap(builder)->createObjCProperty(
+      StringRef(Name), (DIFile) cast_or_null<MDNode>(unwrap(File)), LineNumber,
+      StringRef(GetterName), StringRef(SetterName), PropertyAttributes,
+      (DIType) cast_or_null<MDNode>(unwrap(Ty))));
+}
+
+LLVMValueRef LLVMDIBuilderCreateClassType(
+    LLVMDIBuilderRef builder, LLVMValueRef Scope, char *Name, LLVMValueRef File,
+    unsigned LineNumber, uint64_t SizeInBits, uint64_t AlignInBits,
+    uint64_t OffsetInBits, unsigned Flags, LLVMValueRef DerivedFrom,
+    LLVMValueRef Elements, LLVMValueRef VTableHolder,
+    LLVMValueRef TemplateParms) {
+  return wrap(unwrap(builder)->createClassType(
+      (DIDescriptor) cast_or_null<MDNode>(unwrap(Scope)), StringRef(Name),
+      (DIFile) cast_or_null<MDNode>(unwrap(File)), LineNumber, SizeInBits,
+      AlignInBits, OffsetInBits, Flags,
+      (DIType) cast_or_null<MDNode>(unwrap(DerivedFrom)),
+      (DIArray) cast_or_null<MDNode>(unwrap(Elements)),
+      cast_or_null<MDNode>(unwrap(VTableHolder)),
+      cast_or_null<MDNode>(unwrap(TemplateParms))));
+}
+
+LLVMValueRef LLVMDIBuilderCreateStructType(
+    LLVMDIBuilderRef builder, LLVMValueRef Scope, char *Name, LLVMValueRef File,
+    unsigned LineNum, uint64_t SizeInBits, uint64_t AlignInBits, unsigned Flags,
+    LLVMValueRef Elements, unsigned RunTimeLang) {
+  //return
+  //wrap(unwrap(builder)->createStructType((DIFile)cast_or_null<MDNode>(unwrap(Scope)),
+  //StringRef(Name), (DIFile)cast_or_null<MDNode>(unwrap(File)), LineNum,
+  //SizeInBits, AlignInBits, Flags,
+  //(DIArray)cast_or_null<MDNode>(unwrap(Elements)), RunTimeLang));
+  return NULL;
+}
+
+LLVMValueRef LLVMDIBuilderCreateUnionType(
+    LLVMDIBuilderRef builder, LLVMValueRef Scope, char *Name, LLVMValueRef File,
+    unsigned LineNum, uint64_t SizeInBits, uint64_t AlignInBits, unsigned Flags,
+    LLVMValueRef Elements, unsigned RunTimeLang) {
+  return wrap(unwrap(builder)->createUnionType(
+      (DIDescriptor) cast_or_null<MDNode>(unwrap(Scope)), StringRef(Name),
+      (DIFile) cast_or_null<MDNode>(unwrap(File)), LineNum, SizeInBits,
+      AlignInBits, Flags, (DIArray) cast_or_null<MDNode>(unwrap(Elements)),
+      RunTimeLang));
+}
+
+LLVMValueRef LLVMDIBuilderCreateTemplateValueParameter(
+    LLVMDIBuilderRef builder, LLVMValueRef Scope, char *Name, LLVMValueRef Ty,
+    uint64_t Value, LLVMValueRef File, unsigned LineNo, unsigned ColumnNo) {
+  return wrap(unwrap(builder)->createTemplateValueParameter(
+      (DIDerivedType) cast_or_null<MDNode>(unwrap(Scope)), StringRef(Name),
+      (DIType) cast_or_null<MDNode>(unwrap(Ty)), Value,
+      cast_or_null<MDNode>(unwrap(File)), LineNo, ColumnNo));
+}
+
+LLVMValueRef LLVMDIBuilderCreateArrayType(LLVMDIBuilderRef builder,
+                                          uint64_t Size, uint64_t AlignInBits,
+                                          LLVMValueRef Ty,
+                                          LLVMValueRef Subscripts) {
+  return wrap(unwrap(builder)->createArrayType(
+      Size, AlignInBits, (DIType) cast_or_null<MDNode>(unwrap(Ty)),
+      (DIArray) cast_or_null<MDNode>(unwrap(Subscripts))));
+}
+
+LLVMValueRef LLVMDIBuilderCreateVector(LLVMDIBuilderRef builder, uint64_t Size,
+                                       uint64_t AlignInBits, LLVMValueRef Ty,
+                                       LLVMValueRef Subscripts) {
+  return wrap(unwrap(builder)->createVectorType(
+      Size, AlignInBits, (DIType) cast_or_null<MDNode>(unwrap(Ty)),
+      (DIArray) cast_or_null<MDNode>(unwrap(Subscripts))));
+}
+
+LLVMValueRef LLVMDIBuilderCreateEnumerationType(
+    LLVMDIBuilderRef builder, LLVMValueRef Scope, char *Name, LLVMValueRef File,
+    unsigned LineNumber, uint64_t SizeInBits, uint64_t AlignInBits,
+    LLVMValueRef Elements, LLVMValueRef ClassType) {
+  return wrap(unwrap(builder)->createEnumerationType(
+      (DIDescriptor) cast_or_null<MDNode>(unwrap(Scope)), StringRef(Name),
+      (DIFile) cast_or_null<MDNode>(unwrap(File)), LineNumber, SizeInBits,
+      AlignInBits, (DIArray) cast_or_null<MDNode>(unwrap(Elements)),
+      (DIType) cast_or_null<MDNode>(unwrap(ClassType))));
+
+}
+
+LLVMValueRef LLVMDIBuilderCreateSubroutineType(LLVMDIBuilderRef builder,
+                                               LLVMValueRef File,
+                                               LLVMValueRef ParameterTypes) {
+  Value *file = unwrap(File);
+  Value *params = unwrap(ParameterTypes);
+  MDNode *filemd = cast_or_null<MDNode>(file);
+  MDNode *paramsmd = cast_or_null<MDNode>(params);
+
+  return wrap(unwrap(builder)
+                  ->createSubroutineType((DIFile) filemd, (DIArray) paramsmd));
+}
+
+LLVMValueRef LLVMDIBuilderCreateArtificialType(LLVMDIBuilderRef builder,
+                                               LLVMValueRef Ty) {
+  return wrap(unwrap(builder)->createArtificialType(
+      (DIType) cast_or_null<MDNode>(unwrap(Ty))));
+}
+
+LLVMValueRef LLVMDIBuilderCreateForwardDecl(LLVMDIBuilderRef builder,
+                                            unsigned Tag, char *Name,
+                                            LLVMValueRef Scope,
+                                            LLVMValueRef File, unsigned Line,
+                                            unsigned RuntimeLang) {
+  return wrap(unwrap(builder)->createForwardDecl(
+      Tag, StringRef(Name), (DIDescriptor) cast_or_null<MDNode>(unwrap(Scope)),
+      (DIFile) cast_or_null<MDNode>(unwrap(File)), Line, RuntimeLang));
+}
+
+void LLVMDIBuilderRetainType(LLVMDIBuilderRef builder, LLVMValueRef Ty) {
+  unwrap(builder)->retainType((DIType) cast_or_null<MDNode>(unwrap(Ty)));
+}
+
+LLVMValueRef LLVMDIBuilderCreateUnspecifiedParameter(LLVMDIBuilderRef builder) {
+  return wrap(unwrap(builder)->createUnspecifiedParameter());
+}
+
+LLVMValueRef LLVMDIBuilderGetOrCreateArray(LLVMDIBuilderRef builder,
+                                           LLVMValueRef *Elements,
+                                           int ElementCount) {
+  ArrayRef<Value *> arr(unwrap(Elements), ElementCount);
+
+  return wrap(unwrap(builder)->getOrCreateArray(arr));
+}
+
+LLVMValueRef LLVMDIBuilderGetOrCreateRange(LLVMDIBuilderRef builder, int64_t Lo,
+                                           int64_t Hi) {
+  return wrap(unwrap(builder)->getOrCreateSubrange(Lo, Hi));
+}
+
+LLVMValueRef LLVMDIBuilderCreateGlobalVariable(LLVMDIBuilderRef builder,
+                                               char *Name, LLVMValueRef File,
+                                               unsigned LineNo, LLVMValueRef Ty,
+                                               bool IsLocalToUnit,
+                                               LLVMValueRef Val) {
+  return wrap(unwrap(builder)->createGlobalVariable(
+      StringRef(Name), (DIFile) cast_or_null<MDNode>(unwrap(File)), LineNo,
+      (DIType) cast_or_null<MDNode>(unwrap(Ty)), IsLocalToUnit, unwrap(Val)));
+}
+
+LLVMValueRef LLVMDIBuilderCreateStaticVariable(
+    LLVMDIBuilderRef builder, LLVMValueRef Context, char *Name,
+    char *LinkageName, LLVMValueRef File, unsigned LineNo, LLVMValueRef Ty,
+    bool IsLocalToUnit, LLVMValueRef Val) {
+  return wrap(unwrap(builder)->createStaticVariable(
+      (DIDescriptor) cast_or_null<MDNode>(unwrap(Context)), StringRef(Name),
+      StringRef(LinkageName), (DIFile) cast_or_null<MDNode>(unwrap(File)),
+      LineNo, (DIType) cast_or_null<MDNode>(unwrap(Ty)), IsLocalToUnit,
+      unwrap(Val)));
+}
+
+LLVMValueRef LLVMDIBuilderCreateLocalVariable(LLVMDIBuilderRef builder,
+                                              unsigned Tag, LLVMValueRef Scope,
+                                              char *Name, LLVMValueRef File,
+                                              unsigned LineNo, LLVMValueRef Ty,
+                                              bool AlwaysPreserve,
+                                              unsigned Flags, unsigned ArgNo) {
+  return wrap(unwrap(builder)->createLocalVariable(
+      Tag, (DIDescriptor) cast_or_null<MDNode>(unwrap(Scope)), StringRef(Name),
+      (DIFile) cast_or_null<MDNode>(unwrap(File)), LineNo,
+      (DIType) cast_or_null<MDNode>(unwrap(Ty)), AlwaysPreserve, Flags, ArgNo));
+}
+
+LLVMValueRef LLVMDIBuilderCreateComplexVariable(
+    LLVMDIBuilderRef builder, unsigned Tag, LLVMValueRef Scope, char *Name,
+    LLVMValueRef File, unsigned LineNo, LLVMValueRef Ty, LLVMValueRef *Addrs,
+    int AddrCount, unsigned ArgNo) {
+  return wrap(unwrap(builder)->createComplexVariable(
+      Tag, (DIDescriptor) cast_or_null<MDNode>(unwrap(Scope)), StringRef(Name),
+      (DIFile) cast_or_null<MDNode>(unwrap(File)), LineNo,
+      (DIType) cast_or_null<MDNode>(unwrap(Ty)),
+      ArrayRef<Value *>(unwrap(Addrs), AddrCount), ArgNo));
+}
+
+LLVMValueRef LLVMDIBuilderCreateFunction(
+    LLVMDIBuilderRef builder, LLVMValueRef Scope, char *Name, char *LinkageName,
+    LLVMValueRef File, unsigned LineNo, LLVMValueRef Ty, bool IsLocalToUnit,
+    bool IsDefinition, unsigned ScopeLine, unsigned Flags, bool IsOptimized,
+    LLVMValueRef function, LLVMValueRef TParam, LLVMValueRef Decl) {
+  return wrap(unwrap(builder)->createFunction(
+      (DIDescriptor) cast_or_null<MDNode>(unwrap(Scope)), StringRef(Name),
+      StringRef(LinkageName), (DIFile) cast_or_null<MDNode>(unwrap(File)),
+      LineNo, (DIType) cast_or_null<MDNode>(unwrap(Ty)), IsLocalToUnit,
+      IsDefinition, ScopeLine, Flags, IsOptimized,
+      cast_or_null<Function>(unwrap(function)),
+      cast_or_null<MDNode>(unwrap(TParam)),
+      cast_or_null<MDNode>(unwrap(Decl))));
+}
+
+LLVMValueRef LLVMDIBuilderCreateMethod(
+    LLVMDIBuilderRef builder, LLVMValueRef Scope, char *Name, char *LinkageName,
+    LLVMValueRef File, unsigned LineNo, LLVMValueRef Ty, bool lIsLocalToUnit,
+    bool IsDefintiion, unsigned Virtuality, unsigned VTableIndex,
+    LLVMValueRef VTableHolder, unsigned Flags, bool IsOptimized,
+    LLVMValueRef Fn, LLVMValueRef TParam) {
+  return wrap(unwrap(builder)->createMethod(
+      (DIDescriptor) cast_or_null<MDNode>(unwrap(Scope)), StringRef(Name),
+      StringRef(LinkageName), (DIFile) cast_or_null<MDNode>(unwrap(File)),
+      LineNo, (DIType) cast_or_null<MDNode>(unwrap(Ty)), lIsLocalToUnit,
+      IsDefintiion, Virtuality, VTableIndex,
+      cast_or_null<MDNode>(unwrap(VTableHolder)), Flags, IsOptimized,
+      (Function *)cast_or_null<MDNode>(unwrap(Fn)),
+      cast_or_null<MDNode>(unwrap(TParam))));
+}
+
+LLVMValueRef LLVMDIBuilderCreateNamespace(LLVMDIBuilderRef builder,
+                                          LLVMValueRef Scope, char *Name,
+                                          LLVMValueRef File, unsigned LineNo) {
+  return wrap(unwrap(builder)->createNameSpace(
+      (DIDescriptor) cast_or_null<MDNode>(unwrap(Scope)), StringRef(Name),
+      (DIFile) cast_or_null<MDNode>(unwrap(File)), LineNo));
+}
+
+LLVMValueRef LLVMDIBuilderCreateLexicalBlockFile(LLVMDIBuilderRef builder,
+                                                 LLVMValueRef Scope,
+                                                 LLVMValueRef File) {
+  return wrap(unwrap(builder)->createLexicalBlockFile(
+      (DIDescriptor) cast_or_null<MDNode>(unwrap(Scope)),
+      (DIFile) cast_or_null<MDNode>(unwrap(File))));
+}
+
+LLVMValueRef LLVMDIBuilderCreateLexicalBlock(LLVMDIBuilderRef builder,
+                                             LLVMValueRef Scope,
+                                             LLVMValueRef File, unsigned Line,
+                                             unsigned Col) {
+  return wrap(unwrap(builder)->createLexicalBlock(
+      (DIDescriptor) cast_or_null<MDNode>(unwrap(Scope)),
+      (DIFile) cast_or_null<MDNode>(unwrap(File)), Line, Col));
+}
+LLVMValueRef LLVMDIBuilderInsertDeclare(LLVMDIBuilderRef builder,
+                                        LLVMValueRef Storage,
+                                        LLVMValueRef VarInfo,
+                                        LLVMBasicBlockRef InsertAtEnd) {
+  return wrap(unwrap(builder)->insertDeclare(
+      unwrap(Storage), (DIVariable) cast_or_null<MDNode>(unwrap(VarInfo)),
+      unwrap(InsertAtEnd)));
+}
+
+LLVMValueRef LLVMDIBuilderInsertDeclareBefore(LLVMDIBuilderRef builder,
+                                              LLVMValueRef Storage,
+                                              LLVMValueRef VarInfo,
+                                              LLVMValueRef InsertBefore) {
+  return wrap(unwrap(builder)->insertDeclare(
+      unwrap(Storage), (DIVariable) cast_or_null<MDNode>(unwrap(VarInfo)),
+      cast_or_null<Instruction>(unwrap(InsertBefore))));
+}
+
+LLVMValueRef LLVMDIBuilderInsertDgbValueInstrinsic(
+    LLVMDIBuilderRef builder, LLVMValueRef Val, uint64_t Offset,
+    LLVMValueRef VarInfo, LLVMBasicBlockRef InsertAtEnd) {
+  return wrap(unwrap(builder)->insertDbgValueIntrinsic(
+      unwrap(Val), Offset, (DIVariable) cast_or_null<MDNode>(unwrap(VarInfo)),
+      unwrap(InsertAtEnd)));
+}
+
+LLVMValueRef LLVMDIBuilderInsertDbgValueIntrinsicBefore(
+    LLVMDIBuilderRef builder, LLVMValueRef Val, uint64_t Offset,
+    LLVMValueRef VarInfo, LLVMValueRef InsertBefore) {
+  return wrap(unwrap(builder)->insertDbgValueIntrinsic(
+      unwrap(Val), Offset, (DIVariable) cast_or_null<MDNode>(unwrap(VarInfo)),
+      cast_or_null<Instruction>(unwrap(InsertBefore))));
+}
+
+void LLVMDIBuilderReplaceStructBody(LLVMDIBuilderRef builder,
+                                    LLVMValueRef Struct, LLVMValueRef NewBody) {
+  MDNode *fwd = cast_or_null<MDNode>(unwrap(Struct));
+  DIArray arr = (DIArray) cast_or_null<MDNode>(unwrap(NewBody));
+  fwd->replaceOperandWith(10, arr);
+}


More information about the llvm-commits mailing list