summary refs log tree commit diff stats
diff options
context:
space:
mode:
-rwxr-xr-xcompiler/ast.nim2
-rwxr-xr-xcompiler/rodread.nim16
-rwxr-xr-xcompiler/rodwrite.nim25
-rwxr-xr-xcompiler/sem.nim8
-rwxr-xr-xcompiler/semdata.nim38
-rwxr-xr-xcompiler/semexprs.nim9
-rwxr-xr-xcompiler/seminst.nim27
-rwxr-xr-xcompiler/semtypes.nim3
-rwxr-xr-xcompiler/semtypinst.nim10
-rwxr-xr-xcompiler/sigmatch.nim4
-rwxr-xr-xdoc/intern.txt14
-rwxr-xr-xlib/pure/parseutils.nim56
-rwxr-xr-xllvm/llvm.h1418
-rwxr-xr-xllvm/llvm.nim1452
-rw-r--r--tests/accept/run/mfriends.nim11
-rw-r--r--tests/accept/run/tfriends.nim11
-rwxr-xr-xtodo.txt5
17 files changed, 160 insertions, 2949 deletions
diff --git a/compiler/ast.nim b/compiler/ast.nim
index 9b2f210a3..c20e504d1 100755
--- a/compiler/ast.nim
+++ b/compiler/ast.nim
@@ -568,7 +568,7 @@ const
   ConstantDataTypes*: TTypeKinds = {tyArrayConstr, tyArray, tySet, 
                                     tyTuple, tySequence}
   ExportableSymKinds* = {skVar, skConst, skProc, skMethod, skType, skIterator, 
-    skMacro, skTemplate, skConverter, skStub}
+    skMacro, skTemplate, skConverter, skEnumField, skStub}
   PersistentNodeFlags*: TNodeFlags = {nfBase2, nfBase8, nfBase16, nfAllConst}
   namePos* = 0
   genericParamsPos* = 1
diff --git a/compiler/rodread.nim b/compiler/rodread.nim
index 6da2c9532..cd6719f35 100755
--- a/compiler/rodread.nim
+++ b/compiler/rodread.nim
@@ -142,7 +142,7 @@ type
   PRodReader* = ref TRodReader
 
 const 
-  FileVersion* = "1024"       # modify this if the rod-format changes!
+  FileVersion* = "1026"       # modify this if the rod-format changes!
 
 var rodCompilerprocs*: TStrTable
 
@@ -657,17 +657,26 @@ proc decodeSymSafePos(rd: PRodReader, offset: int, info: TLineInfo): PSym =
   result = decodeSym(rd, info)
   rd.pos = oldPos
 
+proc findSomeWhere(id: int) =
+  for i in countup(0, high(gMods)): 
+    var rd = gMods[i].rd
+    if rd != nil: 
+      var d = IITableGet(rd.index.tab, id)
+      if d != invalidKey:
+        echo "found id ", id, " in ", gMods[i].filename
+
 proc rrGetSym(r: PRodReader, id: int, info: TLineInfo): PSym = 
   result = PSym(IdTableGet(r.syms, id))
   if result == nil: 
     # load the symbol:
     var d = IITableGet(r.index.tab, id)
     if d == invalidKey: 
+      # import from other module:
       var moduleID = IiTableGet(r.imports.tab, id)
-      if moduleID < 0: 
+      if moduleID < 0:
         var x = ""
         encodeVInt(id, x)
-        InternalError(info, "missing from both indexes: +" & x) 
+        InternalError(info, "missing from both indexes: +" & x)
       # find the reader with the correct moduleID:
       for i in countup(0, high(gMods)): 
         var rd = gMods[i].rd
@@ -680,6 +689,7 @@ proc rrGetSym(r: PRodReader, id: int, info: TLineInfo): PSym =
             else:
               var x = ""
               encodeVInt(id, x)
+              when false: findSomeWhere(id)
               InternalError(info, "rrGetSym: no reader found: +" & x)
           else:
             #if IiTableGet(rd.index.tab, id) <> invalidKey then
diff --git a/compiler/rodwrite.nim b/compiler/rodwrite.nim
index 626d0382c..5a08ee144 100755
--- a/compiler/rodwrite.nim
+++ b/compiler/rodwrite.nim
@@ -322,7 +322,10 @@ proc addToIndex(w: var TIndex, key, val: int) =
   w.lastIdxVal = val
   IiTablePut(w.tab, key, val)
 
-#var debugWritten = initIntSet()
+const debugWrittenIds = false
+
+when debugWrittenIds:
+  var debugWritten = initIntSet()
 
 proc symStack(w: PRodWriter) =
   var i = 0
@@ -335,10 +338,12 @@ proc symStack(w: PRodWriter) =
         # put definition in here
         var L = w.data.len
         addToIndex(w.index, s.id, L) 
-        #intSetIncl(debugWritten, s.id)
+        when debugWrittenIds: incl(debugWritten, s.id)
         encodeSym(w, s, w.data)
         add(w.data, rodNL)
-        if sfExported in s.flags and s.kind in ExportableSymKinds: 
+        # put into interface section if appropriate:
+        if {sfExported, sfFromGeneric} * s.flags == {sfExported} and 
+            s.kind in ExportableSymKinds: 
           encodeStr(s.name.s, w.interf)
           add(w.interf, ' ')
           encodeVInt(s.id, w.interf)
@@ -355,12 +360,14 @@ proc symStack(w: PRodWriter) =
           if w.methods.len != 0: add(w.methods, ' ')
           encodeVInt(s.id, w.methods)
       elif IiTableGet(w.imports.tab, s.id) == invalidKey: 
-        addToIndex(w.imports, s.id, m.id) #if not Contains(debugWritten, s.id):
-                                          #  MessageOut(w.filename);
-                                          #  debug(s.owner);
-                                          #  debug(s);
-                                          #  InternalError('BUG!!!!');
-                                          #end
+        addToIndex(w.imports, s.id, m.id)
+        when debugWrittenIds:
+          if not Contains(debugWritten, s.id):
+            echo(w.filename)
+            debug(s)
+            debug(s.owner)
+            debug(m)
+            InternalError("BUG!!!!")
     inc(i)
   setlen(w.sstack, 0)
 
diff --git a/compiler/sem.nim b/compiler/sem.nim
index c59ac96a9..e530d6140 100755
--- a/compiler/sem.nim
+++ b/compiler/sem.nim
@@ -126,13 +126,13 @@ proc semConstBoolExpr(c: PContext, n: PNode): PNode =
 include semtypes, semexprs, semgnrc, semstmts
 
 proc addCodeForGenerics(c: PContext, n: PNode) = 
-  for i in countup(lastGenericIdx, Len(generics) - 1):
-    var prc = generics[i].instSym
+  for i in countup(c.generics.lastGenericIdx, Len(c.generics.generics) - 1):
+    var prc = c.generics.generics[i].instSym
     if prc.kind in {skProc, skMethod, skConverter} and prc.magic == mNone: 
       if prc.ast == nil or prc.ast.sons[codePos] == nil: 
         InternalError(prc.info, "no code for " & prc.name.s)
       addSon(n, prc.ast)
-  lastGenericIdx = Len(generics)
+  c.generics.lastGenericIdx = Len(c.generics.generics)
 
 proc semExprNoFlags(c: PContext, n: PNode): PNode {.procvar.} = 
   result = semExpr(c, n, {})
@@ -162,7 +162,7 @@ proc myOpenCached(module: PSym, filename: string,
 proc SemStmtAndGenerateGenerics(c: PContext, n: PNode): PNode = 
   result = semStmt(c, n)
   # BUGFIX: process newly generated generics here, not at the end!
-  if lastGenericIdx < Len(generics):
+  if c.generics.lastGenericIdx < Len(c.generics.generics):
     var a = newNodeI(nkStmtList, n.info)
     addCodeForGenerics(c, a)
     if sonsLen(a) > 0: 
diff --git a/compiler/semdata.nim b/compiler/semdata.nim
index 50100160b..65ff11963 100755
--- a/compiler/semdata.nim
+++ b/compiler/semdata.nim
@@ -7,7 +7,7 @@
 #    distribution, for details about the copyright.
 #
 
-# This module contains the data structures for the semantic checking phase.
+## This module contains the data structures for the semantic checking phase.
 
 import 
   strutils, lists, intsets, options, lexer, ast, astalgo, trees, treetab,
@@ -37,10 +37,24 @@ type
     genericSym*, instSym*: PSym
     concreteTypes*: seq[PType]
   
+  # If we generate an instance of a generic, we'd like to re-use that
+  # instance if possible across module boundaries. However, this is not
+  # possible if the compilation cache is enabled. So we give up then and use
+  # the caching of generics only per module, not per project.
+  TGenericsCache* {.final.} = object
+    InstTypes*: TIdTable # map PType to PType
+    generics*: seq[TInstantiatedSymbol] # a list of the things to compile
+    lastGenericIdx*: int      # used for the generics stack
+  
+  PGenericsCache* = ref TGenericsCache
   PContext* = ref TContext
   TContext* = object of TPassContext # a context represents a module
     module*: PSym             # the module sym belonging to the context
     p*: PProcCon              # procedure context
+    generics*: PGenericsCache # may point to a global or module-local structure 
+    friendModule*: PSym       # current friend module; may access private data;
+                              # this is used so that generic instantiations can
+                              # access private object fields
     InstCounter*: int         # to prevent endless instantiations
    
     threadEntries*: TSymSeq   # list of thread entries to check
@@ -56,10 +70,13 @@ type
     filename*: string         # the module's filename
     userPragmas*: TStrTable
   
+var
+  gGenericsCache: PGenericsCache # save for modularity
 
-var gInstTypes*: TIdTable # map PType to PType
-var generics*: seq[TInstantiatedSymbol] = @[] # a list of the things to compile
-var lastGenericIdx*: int      # used for the generics stack
+proc newGenericsCache: PGenericsCache =
+  new(result)
+  initIdTable(result.InstTypes)
+  result.generics = @[]
 
 proc newContext*(module: PSym, nimfile: string): PContext
 
@@ -126,11 +143,21 @@ proc newContext(module: PSym, nimfile: string): PContext =
   initLinkedList(result.libs)
   append(result.optionStack, newOptionEntry())
   result.module = module
+  result.friendModule = module
   result.threadEntries = @[]
   result.converters = @[]
   result.filename = nimfile
   result.includedFiles = initIntSet()
   initStrTable(result.userPragmas)
+  if optSymbolFiles notin gGlobalOptions:
+    # re-usage of generic instantiations across module boundaries is
+    # very nice for code size:
+    if gGenericsCache == nil: gGenericsCache = newGenericsCache()
+    result.generics = gGenericsCache
+  else:
+    # we have to give up and use a per-module cache for generic instantiations:
+    result.generics = newGenericsCache()
+    assert gGenericsCache == nil
 
 proc addConverter(c: PContext, conv: PSym) = 
   var L = len(c.converters)
@@ -189,5 +216,4 @@ proc checkSonsLen*(n: PNode, length: int) =
   
 proc checkMinSonsLen*(n: PNode, length: int) = 
   if sonsLen(n) < length: illFormedAst(n)
-  
-initIdTable(gInstTypes)
+
diff --git a/compiler/semexprs.nim b/compiler/semexprs.nim
index 708e3055d..e93644457 100755
--- a/compiler/semexprs.nim
+++ b/compiler/semexprs.nim
@@ -53,8 +53,9 @@ proc inlineConst(n: PNode, s: PSym): PNode {.inline.} =
 proc semSym(c: PContext, n: PNode, s: PSym, flags: TExprFlags): PNode = 
   case s.kind
   of skProc, skMethod, skIterator, skConverter: 
+    var smoduleId = getModule(s).id
     if sfProcVar notin s.flags and s.typ.callConv == ccDefault and
-        getModule(s).id != c.module.id: 
+        smoduleId != c.module.id and smoduleId != c.friendModule.id: 
       LocalError(n.info, errXCannotBePassedToProcVar, s.name.s)
     result = symChoice(c, n, s)
   of skConst:
@@ -673,8 +674,10 @@ proc builtinFieldAccess(c: PContext, n: PNode, flags: TExprFlags): PNode =
       if ty.sons[0] == nil: break 
       ty = skipTypes(ty.sons[0], {tyGenericInst})
     if f != nil: 
-      if sfExported in f.flags or getModule(f).id == c.module.id: 
-        # is the access to a public field or in the same module?
+      var fmoduleId = getModule(f).id
+      if sfExported in f.flags or fmoduleId == c.module.id or
+          fmoduleId == c.friendModule.id: 
+        # is the access to a public field or in the same module or in a friend?
         n.sons[0] = makeDeref(n.sons[0])
         n.sons[1] = newSymNode(f) # we now have the correct field
         n.typ = f.typ
diff --git a/compiler/seminst.nim b/compiler/seminst.nim
index d53d33898..f66a90ecf 100755
--- a/compiler/seminst.nim
+++ b/compiler/seminst.nim
@@ -22,9 +22,9 @@ proc instantiateGenericParamList(c: PContext, n: PNode, pt: TIdTable,
     if q.typ.kind notin {tyTypeDesc, tyGenericParam}: continue 
     var s = newSym(skType, q.name, getCurrOwner())
     s.info = q.info
-    incl(s.flags, sfUsed)
+    s.flags = s.flags + {sfUsed, sfFromGeneric}
     var t = PType(IdTableGet(pt, q.typ))
-    if t == nil: 
+    if t == nil:
       LocalError(a.info, errCannotInstantiateX, s.name.s)
       break
     if t.kind == tyGenericParam: 
@@ -45,9 +45,9 @@ proc sameInstantiation(a, b: TInstantiatedSymbol): bool =
     result = true
 
 proc GenericCacheGet(c: PContext, entry: var TInstantiatedSymbol): PSym = 
-  for i in countup(0, Len(generics) - 1):
-    if sameInstantiation(entry, generics[i]):
-      result = generics[i].instSym
+  for i in countup(0, Len(c.generics.generics) - 1):
+    if sameInstantiation(entry, c.generics.generics[i]):
+      result = c.generics.generics[i].instSym
       # checking for the concrete parameter list is wrong and unnecessary!
       #if equalParams(b.typ.n, instSym.typ.n) == paramsEqual:
       #echo "found in cache: ", getProcHeader(result)
@@ -86,9 +86,9 @@ proc instantiateBody(c: PContext, n: PNode, result: PSym) =
     popProcCon(c)
 
 proc fixupInstantiatedSymbols(c: PContext, s: PSym) =
-  for i in countup(0, Len(generics) - 1):
-    if generics[i].genericSym.id == s.id:
-      var oldPrc = generics[i].instSym
+  for i in countup(0, Len(c.generics.generics) - 1):
+    if c.generics.generics[i].genericSym.id == s.id:
+      var oldPrc = c.generics.generics[i].instSym
       pushInfoContext(oldPrc.info)
       openScope(c.tab)
       var n = oldPrc.ast
@@ -112,10 +112,9 @@ proc generateInstance(c: PContext, fn: PSym, pt: TIdTable,
   if c.InstCounter > 1000: InternalError(fn.ast.info, "nesting too deep")
   inc(c.InstCounter)
   # NOTE: for access of private fields within generics from a different module
-  # and other identifiers we fake the current module temporarily!
-  # XXX bad hack!
-  var oldMod = c.module
-  c.module = getModule(fn)
+  # we set the friend module:
+  var oldFriend = c.friendModule
+  c.friendModule = getModule(fn)
   result = copySym(fn, false)
   incl(result.flags, sfFromGeneric)
   result.owner = getCurrOwner().owner
@@ -144,7 +143,7 @@ proc generateInstance(c: PContext, fn: PSym, pt: TIdTable,
   ParamsTypeCheck(c, result.typ)
   var oldPrc = GenericCacheGet(c, entry)
   if oldPrc == nil:
-    generics.add(entry)
+    c.generics.generics.add(entry)
     if n.sons[pragmasPos].kind != nkEmpty:
       pragma(c, result, n.sons[pragmasPos], allRoutinePragmas)
     instantiateBody(c, n, result)
@@ -154,7 +153,7 @@ proc generateInstance(c: PContext, fn: PSym, pt: TIdTable,
   popInfoContext()
   closeScope(c.tab)           # close scope for parameters
   popOwner()
-  c.module = oldMod
+  c.friendModule = oldFriend
   dec(c.InstCounter)
   
 proc instGenericContainer(c: PContext, n: PNode, header: PType): PType = 
diff --git a/compiler/semtypes.nim b/compiler/semtypes.nim
index d7ca0d8ef..3536a2a34 100755
--- a/compiler/semtypes.nim
+++ b/compiler/semtypes.nim
@@ -527,8 +527,7 @@ proc semProcTypeNode(c: PContext, n, genericParams: PNode,
       typ = paramType(c, a.sons[length-2], genericParams, cl)
       #if matchType(typ, [(tyVar, 0)], tyGenericInvokation):
       #  debug a.sons[length-2][0][1]
-        
-    else: 
+    else:
       typ = nil
     if a.sons[length-1].kind != nkEmpty:
       def = semExprWithType(c, a.sons[length-1]) 
diff --git a/compiler/semtypinst.nim b/compiler/semtypinst.nim
index 88697dc85..5ce9d4688 100755
--- a/compiler/semtypinst.nim
+++ b/compiler/semtypinst.nim
@@ -105,7 +105,7 @@ proc handleGenericInvokation(cl: var TReplTypeVars, t: PType): PType =
   var header: PType = nil
   when true:
     # search for some instantiation here:
-    result = searchInstTypes(gInstTypes, t)
+    result = searchInstTypes(cl.c.generics.InstTypes, t)
     if result != nil: return
     for i in countup(1, sonsLen(t) - 1):
       var x = t.sons[i]
@@ -116,7 +116,7 @@ proc handleGenericInvokation(cl: var TReplTypeVars, t: PType): PType =
         #idTablePut(cl.typeMap, body.sons[i-1], x)
     if header != nil:
       # search again after first pass:
-      result = searchInstTypes(gInstTypes, header)
+      result = searchInstTypes(cl.c.generics.InstTypes, header)
       if result != nil: return
     else:
       header = copyType(t, t.owner, false)
@@ -124,7 +124,7 @@ proc handleGenericInvokation(cl: var TReplTypeVars, t: PType): PType =
     # we need to add the candidate here, before it's fully instantiated for
     # recursive instantions:
     result = newType(tyGenericInst, t.sons[0].owner)
-    idTablePut(gInstTypes, header, result)
+    idTablePut(cl.c.generics.InstTypes, header, result)
 
     for i in countup(1, sonsLen(t) - 1):
       var x = replaceTypeVarsT(cl, t.sons[i])
@@ -154,14 +154,14 @@ proc handleGenericInvokation(cl: var TReplTypeVars, t: PType): PType =
       assert x.kind != tyGenericInvokation
       idTablePut(cl.typeMap, body.sons[i-1], x)
     if header == nil: header = t
-    result = searchInstTypes(gInstTypes, header)
+    result = searchInstTypes(cl.c.generics.InstTypes, header)
     if result != nil: return 
     result = newType(tyGenericInst, t.sons[0].owner)
     for i in countup(0, sonsLen(t) - 1): 
       # if one of the params is not concrete, we cannot do anything
       # but we already raised an error!
       addSon(result, header.sons[i])
-    idTablePut(gInstTypes, header, result)
+    idTablePut(cl.c.generics.InstTypes, header, result)
     var newbody = ReplaceTypeVarsT(cl, lastSon(body))
     newbody.flags = newbody.flags + t.flags + body.flags
     newbody.n = ReplaceTypeVarsN(cl, lastSon(body).n)
diff --git a/compiler/sigmatch.nim b/compiler/sigmatch.nim
index 543027b41..f91d4798a 100755
--- a/compiler/sigmatch.nim
+++ b/compiler/sigmatch.nim
@@ -7,8 +7,8 @@
 #    distribution, for details about the copyright.
 #
 
-# This module implements the signature matching for resolving
-# the call to overloaded procs, generic procs and operators.
+## This module implements the signature matching for resolving
+## the call to overloaded procs, generic procs and operators.
 
 import 
   intsets, ast, astalgo, semdata, types, msgs, renderer, lookups, semtypinst, 
diff --git a/doc/intern.txt b/doc/intern.txt
index 475aad75f..86afbb7ba 100755
--- a/doc/intern.txt
+++ b/doc/intern.txt
@@ -160,6 +160,9 @@ program*.
 Frontend issues
 ---------------
 
+Methods and type converters
+~~~~~~~~~~~~~~~~~~~~~~~~~~~
+
 Nimrod contains language features that are *global*. The best example for that
 are multi methods: Introducing a new method with the same name and some 
 compatible object parameter means that the method's dispatcher needs to take
@@ -189,6 +192,17 @@ Both the multi method and the type converter problems are solved by storing
 them in special sections in the ROD file that are loaded *unconditionally*
 when the ROD file is read.
 
+Generics
+~~~~~~~~
+
+If we generate an instance of a generic, we'd like to re-use that
+instance if possible across module boundaries. However, this is not
+possible if the compilation cache is enabled. So we give up then and use
+the caching of generics only per module, not per project. This means that
+``--symbolFiles:on`` hurts a bit for efficiency. A better solution would
+be to persist the instantiations in a global cache per project. This might be
+implemented in later versions.
+
 
 Backend issues
 --------------
diff --git a/lib/pure/parseutils.nim b/lib/pure/parseutils.nim
index 0e1619cdd..c78dbcf6f 100755
--- a/lib/pure/parseutils.nim
+++ b/lib/pure/parseutils.nim
@@ -274,30 +274,30 @@ type
     ikDollar,                ## escaped ``$`` part of the interpolated string
     ikVar,                   ## ``var`` part of the interpolated string
     ikExpr                   ## ``expr`` part of the interpolated string
-

+
 iterator interpolatedFragments*(s: string): tuple[kind: TInterpolatedKind,
-  value: string] =

-  ## Tokenizes the string `s` into substrings for interpolation purposes.

-  ##

-  ## Example:

-  ##

-  ## .. code-block:: nimrod

-  ##   for k, v in interpolatedFragments("  $this is ${an  example}  $$"):

-  ##     echo "(", k, ", \"", v, "\")"

-  ##

-  ## Results in:

-  ##

-  ## .. code-block:: nimrod

-  ##   (ikString, "  ")

-  ##   (ikExpr, "this")

-  ##   (ikString, " is ")

-  ##   (ikExpr, "an  example")

+  value: string] =
+  ## Tokenizes the string `s` into substrings for interpolation purposes.
+  ##
+  ## Example:
+  ##
+  ## .. code-block:: nimrod
+  ##   for k, v in interpolatedFragments("  $this is ${an  example}  $$"):
+  ##     echo "(", k, ", \"", v, "\")"
+  ##
+  ## Results in:
+  ##
+  ## .. code-block:: nimrod
+  ##   (ikString, "  ")
+  ##   (ikExpr, "this")
+  ##   (ikString, " is ")
+  ##   (ikExpr, "an  example")
   ##   (ikString, "  ")
-  ##   (ikDollar, "$")

+  ##   (ikDollar, "$")
   var i = 0
-  var kind: TInterpolatedKind

-  while true:

-    var j = i

+  var kind: TInterpolatedKind
+  while true:
+    var j = i
     if s[j] == '$':
       if s[j+1] == '{':
         inc j, 2
@@ -333,15 +333,15 @@ iterator interpolatedFragments*(s: string): tuple[kind: TInterpolatedKind,
       while j < s.len and s[j] != '$': inc j
       kind = ikStr
     if j > i:
-      # do not copy the trailing } for ikExpr:

-      yield (kind, substr(s, i, j-1-ord(kind == ikExpr)))

-    else:

-      break

-    i = j

+      # do not copy the trailing } for ikExpr:
+      yield (kind, substr(s, i, j-1-ord(kind == ikExpr)))
+    else:
+      break
+    i = j
 
 when isMainModule:
-  for k, v in interpolatedFragments("$test{}  $this is ${an{  example}}  "):

-    echo "(", k, ", \"", v, "\")"

+  for k, v in interpolatedFragments("$test{}  $this is ${an{  example}}  "):
+    echo "(", k, ", \"", v, "\")"
 
 
 {.pop.}
diff --git a/llvm/llvm.h b/llvm/llvm.h
deleted file mode 100755
index a873b44eb..000000000
--- a/llvm/llvm.h
+++ /dev/null
@@ -1,1418 +0,0 @@
-/* Core.h */
-/* Opaque types. */
-
-/**
- * The top-level container for all LLVM global data.  See the LLVMContext class.
- */
-typedef struct LLVMOpaqueContext *LLVMContextRef;
-
-/**
- * The top-level container for all other LLVM Intermediate Representation (IR)
- * objects. See the llvm::Module class.
- */
-typedef struct LLVMOpaqueModule *LLVMModuleRef;
-
-/**
- * Each value in the LLVM IR has a type, an LLVMTypeRef. See the llvm::Type
- * class.
- */
-typedef struct LLVMOpaqueType *LLVMTypeRef;
-
-/**
- * When building recursive types using LLVMRefineType, LLVMTypeRef values may
- * become invalid; use LLVMTypeHandleRef to resolve this problem. See the
- * llvm::AbstractTypeHolder class.
- */
-typedef struct LLVMOpaqueTypeHandle *LLVMTypeHandleRef;
-
-typedef struct LLVMOpaqueValue *LLVMValueRef;
-typedef struct LLVMOpaqueBasicBlock *LLVMBasicBlockRef;
-typedef struct LLVMOpaqueBuilder *LLVMBuilderRef;
-
-/* Used to provide a module to JIT or interpreter.
- * See the llvm::ModuleProvider class.
- */
-typedef struct LLVMOpaqueModuleProvider *LLVMModuleProviderRef;
-
-/* Used to provide a module to JIT or interpreter.
- * See the llvm::MemoryBuffer class.
- */
-typedef struct LLVMOpaqueMemoryBuffer *LLVMMemoryBufferRef;
-
-/** See the llvm::PassManagerBase class. */
-typedef struct LLVMOpaquePassManager *LLVMPassManagerRef;
-
-/**
- * Used to iterate through the uses of a Value, allowing access to all Values
- * that use this Value.  See the llvm::Use and llvm::value_use_iterator classes.
- */
-typedef struct LLVMOpaqueUseIterator *LLVMUseIteratorRef;
-
-typedef enum {
-    LLVMZExtAttribute       = 1<<0,
-    LLVMSExtAttribute       = 1<<1,
-    LLVMNoReturnAttribute   = 1<<2,
-    LLVMInRegAttribute      = 1<<3,
-    LLVMStructRetAttribute  = 1<<4,
-    LLVMNoUnwindAttribute   = 1<<5,
-    LLVMNoAliasAttribute    = 1<<6,
-    LLVMByValAttribute      = 1<<7,
-    LLVMNestAttribute       = 1<<8,
-    LLVMReadNoneAttribute   = 1<<9,
-    LLVMReadOnlyAttribute   = 1<<10,
-    LLVMNoInlineAttribute   = 1<<11,
-    LLVMAlwaysInlineAttribute    = 1<<12,
-    LLVMOptimizeForSizeAttribute = 1<<13,
-    LLVMStackProtectAttribute    = 1<<14,
-    LLVMStackProtectReqAttribute = 1<<15,
-    LLVMNoCaptureAttribute  = 1<<21,
-    LLVMNoRedZoneAttribute  = 1<<22,
-    LLVMNoImplicitFloatAttribute = 1<<23,
-    LLVMNakedAttribute      = 1<<24,
-    LLVMInlineHintAttribute = 1<<25
-} LLVMAttribute;
-
-typedef enum {
-  LLVMRet            = 1,
-  LLVMBr             = 2,
-  LLVMSwitch         = 3,
-  LLVMInvoke         = 4,
-  LLVMUnwind         = 5,
-  LLVMUnreachable    = 6,
-  LLVMAdd            = 7,
-  LLVMFAdd           = 8,
-  LLVMSub            = 9,
-  LLVMFSub           = 10,
-  LLVMMul            = 11,
-  LLVMFMul           = 12,
-  LLVMUDiv           = 13,
-  LLVMSDiv           = 14,
-  LLVMFDiv           = 15,
-  LLVMURem           = 16,
-  LLVMSRem           = 17,
-  LLVMFRem           = 18,
-  LLVMShl            = 19,
-  LLVMLShr           = 20,
-  LLVMAShr           = 21,
-  LLVMAnd            = 22,
-  LLVMOr             = 23,
-  LLVMXor            = 24,
-  LLVMMalloc         = 25,
-  LLVMFree           = 26,
-  LLVMAlloca         = 27,
-  LLVMLoad           = 28,
-  LLVMStore          = 29,
-  LLVMGetElementPtr  = 30,
-  LLVMTrunk          = 31,
-  LLVMZExt           = 32,
-  LLVMSExt           = 33,
-  LLVMFPToUI         = 34,
-  LLVMFPToSI         = 35,
-  LLVMUIToFP         = 36,
-  LLVMSIToFP         = 37,
-  LLVMFPTrunc        = 38,
-  LLVMFPExt          = 39,
-  LLVMPtrToInt       = 40,
-  LLVMIntToPtr       = 41,
-  LLVMBitCast        = 42,
-  LLVMICmp           = 43,
-  LLVMFCmp           = 44,
-  LLVMPHI            = 45,
-  LLVMCall           = 46,
-  LLVMSelect         = 47,
-  LLVMVAArg          = 50,
-  LLVMExtractElement = 51,
-  LLVMInsertElement  = 52,
-  LLVMShuffleVector  = 53,
-  LLVMExtractValue   = 54,
-  LLVMInsertValue    = 55
-} LLVMOpcode;
-
-typedef enum {
-  LLVMVoidTypeKind,        /**< type with no size */
-  LLVMFloatTypeKind,       /**< 32 bit floating point type */
-  LLVMDoubleTypeKind,      /**< 64 bit floating point type */
-  LLVMX86_FP80TypeKind,    /**< 80 bit floating point type (X87) */
-  LLVMFP128TypeKind,       /**< 128 bit floating point type (112-bit mantissa)*/
-  LLVMPPC_FP128TypeKind,   /**< 128 bit floating point type (two 64-bits) */
-  LLVMLabelTypeKind,       /**< Labels */
-  LLVMIntegerTypeKind,     /**< Arbitrary bit width integers */
-  LLVMFunctionTypeKind,    /**< Functions */
-  LLVMStructTypeKind,      /**< Structures */
-  LLVMArrayTypeKind,       /**< Arrays */
-  LLVMPointerTypeKind,     /**< Pointers */
-  LLVMOpaqueTypeKind,      /**< Opaque: type with unknown structure */
-  LLVMVectorTypeKind,      /**< SIMD 'packed' format, or other vector type */
-  LLVMMetadataTypeKind     /**< Metadata */
-} LLVMTypeKind;
-
-typedef enum {
-  LLVMExternalLinkage,    /**< Externally visible function */
-  LLVMAvailableExternallyLinkage,
-  LLVMLinkOnceAnyLinkage, /**< Keep one copy of function when linking (inline)*/
-  LLVMLinkOnceODRLinkage, /**< Same, but only replaced by something
-                            equivalent. */
-  LLVMWeakAnyLinkage,     /**< Keep one copy of function when linking (weak) */
-  LLVMWeakODRLinkage,     /**< Same, but only replaced by something
-                            equivalent. */
-  LLVMAppendingLinkage,   /**< Special purpose, only applies to global arrays */
-  LLVMInternalLinkage,    /**< Rename collisions when linking (static
-                               functions) */
-  LLVMPrivateLinkage,     /**< Like Internal, but omit from symbol table */
-  LLVMDLLImportLinkage,   /**< Function to be imported from DLL */
-  LLVMDLLExportLinkage,   /**< Function to be accessible from DLL */
-  LLVMExternalWeakLinkage,/**< ExternalWeak linkage description */
-  LLVMGhostLinkage,       /**< Stand-in functions for streaming fns from
-                               bitcode */
-  LLVMCommonLinkage,      /**< Tentative definitions */
-  LLVMLinkerPrivateLinkage /**< Like Private, but linker removes. */
-} LLVMLinkage;
-
-typedef enum {
-  LLVMDefaultVisibility,  /**< The GV is visible */
-  LLVMHiddenVisibility,   /**< The GV is hidden */
-  LLVMProtectedVisibility /**< The GV is protected */
-} LLVMVisibility;
-
-typedef enum {
-  LLVMCCallConv           = 0,
-  LLVMFastCallConv        = 8,
-  LLVMColdCallConv        = 9,
-  LLVMX86StdcallCallConv  = 64,
-  LLVMX86FastcallCallConv = 65
-} LLVMCallConv;
-
-typedef enum {
-  LLVMIntEQ = 32, /**< equal */
-  LLVMIntNE,      /**< not equal */
-  LLVMIntUGT,     /**< unsigned greater than */
-  LLVMIntUGE,     /**< unsigned greater or equal */
-  LLVMIntULT,     /**< unsigned less than */
-  LLVMIntULE,     /**< unsigned less or equal */
-  LLVMIntSGT,     /**< signed greater than */
-  LLVMIntSGE,     /**< signed greater or equal */
-  LLVMIntSLT,     /**< signed less than */
-  LLVMIntSLE      /**< signed less or equal */
-} LLVMIntPredicate;
-
-typedef enum {
-  LLVMRealPredicateFalse, /**< Always false (always folded) */
-  LLVMRealOEQ,            /**< True if ordered and equal */
-  LLVMRealOGT,            /**< True if ordered and greater than */
-  LLVMRealOGE,            /**< True if ordered and greater than or equal */
-  LLVMRealOLT,            /**< True if ordered and less than */
-  LLVMRealOLE,            /**< True if ordered and less than or equal */
-  LLVMRealONE,            /**< True if ordered and operands are unequal */
-  LLVMRealORD,            /**< True if ordered (no nans) */
-  LLVMRealUNO,            /**< True if unordered: isnan(X) | isnan(Y) */
-  LLVMRealUEQ,            /**< True if unordered or equal */
-  LLVMRealUGT,            /**< True if unordered or greater than */
-  LLVMRealUGE,            /**< True if unordered, greater than, or equal */
-  LLVMRealULT,            /**< True if unordered or less than */
-  LLVMRealULE,            /**< True if unordered, less than, or equal */
-  LLVMRealUNE,            /**< True if unordered or not equal */
-  LLVMRealPredicateTrue   /**< Always true (always folded) */
-} LLVMRealPredicate;
-
-
-/*===-- Error handling ----------------------------------------------------===*/
-
-void LLVMDisposeMessage(char *Message);
-
-
-/*===-- Modules -----------------------------------------------------------===*/
-
-/* Create and destroy contexts. */
-LLVMContextRef LLVMContextCreate(void);
-LLVMContextRef LLVMGetGlobalContext(void);
-void LLVMContextDispose(LLVMContextRef C);
-
-/* Create and destroy modules. */ 
-/** See llvm::Module::Module. */
-LLVMModuleRef LLVMModuleCreateWithName(const char *ModuleID);
-LLVMModuleRef LLVMModuleCreateWithNameInContext(const char *ModuleID,
-                                                LLVMContextRef C);
-
-/** See llvm::Module::~Module. */
-void LLVMDisposeModule(LLVMModuleRef M);
-
-/** Data layout. See Module::getDataLayout. */
-const char *LLVMGetDataLayout(LLVMModuleRef M);
-void LLVMSetDataLayout(LLVMModuleRef M, const char *Triple);
-
-/** Target triple. See Module::getTargetTriple. */
-const char *LLVMGetTarget(LLVMModuleRef M);
-void LLVMSetTarget(LLVMModuleRef M, const char *Triple);
-
-/** See Module::addTypeName. */
-int LLVMAddTypeName(LLVMModuleRef M, const char *Name, LLVMTypeRef Ty);
-void LLVMDeleteTypeName(LLVMModuleRef M, const char *Name);
-LLVMTypeRef LLVMGetTypeByName(LLVMModuleRef M, const char *Name);
-
-/** See Module::dump. */
-void LLVMDumpModule(LLVMModuleRef M);
-
-
-/*===-- Types -------------------------------------------------------------===*/
-
-/* LLVM types conform to the following hierarchy:
- * 
- *   types:
- *     integer type
- *     real type
- *     function type
- *     sequence types:
- *       array type
- *       pointer type
- *       vector type
- *     void type
- *     label type
- *     opaque type
- */
-
-/** See llvm::LLVMTypeKind::getTypeID. */
-LLVMTypeKind LLVMGetTypeKind(LLVMTypeRef Ty);
-
-/** See llvm::LLVMType::getContext. */
-LLVMContextRef LLVMGetTypeContext(LLVMTypeRef Ty);
-
-/* Operations on integer types */
-LLVMTypeRef LLVMInt1TypeInContext(LLVMContextRef C);
-LLVMTypeRef LLVMInt8TypeInContext(LLVMContextRef C);
-LLVMTypeRef LLVMInt16TypeInContext(LLVMContextRef C);
-LLVMTypeRef LLVMInt32TypeInContext(LLVMContextRef C);
-LLVMTypeRef LLVMInt64TypeInContext(LLVMContextRef C);
-LLVMTypeRef LLVMIntTypeInContext(LLVMContextRef C, unsigned NumBits);
-
-LLVMTypeRef LLVMInt1Type(void);
-LLVMTypeRef LLVMInt8Type(void);
-LLVMTypeRef LLVMInt16Type(void);
-LLVMTypeRef LLVMInt32Type(void);
-LLVMTypeRef LLVMInt64Type(void);
-LLVMTypeRef LLVMIntType(unsigned NumBits);
-unsigned LLVMGetIntTypeWidth(LLVMTypeRef IntegerTy);
-
-/* Operations on real types */
-LLVMTypeRef LLVMFloatTypeInContext(LLVMContextRef C);
-LLVMTypeRef LLVMDoubleTypeInContext(LLVMContextRef C);
-LLVMTypeRef LLVMX86FP80TypeInContext(LLVMContextRef C);
-LLVMTypeRef LLVMFP128TypeInContext(LLVMContextRef C);
-LLVMTypeRef LLVMPPCFP128TypeInContext(LLVMContextRef C);
-
-LLVMTypeRef LLVMFloatType(void);
-LLVMTypeRef LLVMDoubleType(void);
-LLVMTypeRef LLVMX86FP80Type(void);
-LLVMTypeRef LLVMFP128Type(void);
-LLVMTypeRef LLVMPPCFP128Type(void);
-
-/* Operations on function types */
-LLVMTypeRef LLVMFunctionType(LLVMTypeRef ReturnType,
-                             LLVMTypeRef *ParamTypes, unsigned ParamCount,
-                             int IsVarArg);
-int LLVMIsFunctionVarArg(LLVMTypeRef FunctionTy);
-LLVMTypeRef LLVMGetReturnType(LLVMTypeRef FunctionTy);
-unsigned LLVMCountParamTypes(LLVMTypeRef FunctionTy);
-void LLVMGetParamTypes(LLVMTypeRef FunctionTy, LLVMTypeRef *Dest);
-
-/* Operations on struct types */
-LLVMTypeRef LLVMStructTypeInContext(LLVMContextRef C, LLVMTypeRef *ElementTypes,
-                                    unsigned ElementCount, int Packed);
-LLVMTypeRef LLVMStructType(LLVMTypeRef *ElementTypes, unsigned ElementCount,
-                           int Packed);
-unsigned LLVMCountStructElementTypes(LLVMTypeRef StructTy);
-void LLVMGetStructElementTypes(LLVMTypeRef StructTy, LLVMTypeRef *Dest);
-int LLVMIsPackedStruct(LLVMTypeRef StructTy);
-
-/* Operations on array, pointer, and vector types (sequence types) */
-LLVMTypeRef LLVMArrayType(LLVMTypeRef ElementType, unsigned ElementCount);
-LLVMTypeRef LLVMPointerType(LLVMTypeRef ElementType, unsigned AddressSpace);
-LLVMTypeRef LLVMVectorType(LLVMTypeRef ElementType, unsigned ElementCount);
-
-LLVMTypeRef LLVMGetElementType(LLVMTypeRef Ty);
-unsigned LLVMGetArrayLength(LLVMTypeRef ArrayTy);
-unsigned LLVMGetPointerAddressSpace(LLVMTypeRef PointerTy);
-unsigned LLVMGetVectorSize(LLVMTypeRef VectorTy);
-
-/* Operations on other types */
-LLVMTypeRef LLVMVoidTypeInContext(LLVMContextRef C);
-LLVMTypeRef LLVMLabelTypeInContext(LLVMContextRef C);
-LLVMTypeRef LLVMOpaqueTypeInContext(LLVMContextRef C);
-
-LLVMTypeRef LLVMVoidType(void);
-LLVMTypeRef LLVMLabelType(void);
-LLVMTypeRef LLVMOpaqueType(void);
-
-/* Operations on type handles */
-LLVMTypeHandleRef LLVMCreateTypeHandle(LLVMTypeRef PotentiallyAbstractTy);
-void LLVMRefineType(LLVMTypeRef AbstractTy, LLVMTypeRef ConcreteTy);
-LLVMTypeRef LLVMResolveTypeHandle(LLVMTypeHandleRef TypeHandle);
-void LLVMDisposeTypeHandle(LLVMTypeHandleRef TypeHandle);
-
-
-
-/* Operations on all values */
-LLVMTypeRef LLVMTypeOf(LLVMValueRef Val);
-const char *LLVMGetValueName(LLVMValueRef Val);
-void LLVMSetValueName(LLVMValueRef Val, const char *Name);
-void LLVMDumpValue(LLVMValueRef Val);
-void LLVMReplaceAllUsesWith(LLVMValueRef OldVal, LLVMValueRef NewVal);
-
-/* Conversion functions. Return the input value if it is an instance of the
-   specified class, otherwise NULL. See llvm::dyn_cast_or_null<>. */
-LLVMValueRef LLVMIsAArgument(LLVMValueRef Val);
-LLVMValueRef LLVMIsABasicBlock(LLVMValueRef Val);
-LLVMValueRef LLVMIsAInlineAsm(LLVMValueRef Val);
-LLVMValueRef LLVMIsAUser(LLVMValueRef Val);
-LLVMValueRef LLVMIsAConstant(LLVMValueRef Val);
-LLVMValueRef LLVMIsAConstantAggregateZero(LLVMValueRef Val);
-LLVMValueRef LLVMIsAConstantArray(LLVMValueRef Val);
-LLVMValueRef LLVMIsAConstantExpr(LLVMValueRef Val);
-LLVMValueRef LLVMIsAConstantFP(LLVMValueRef Val);
-LLVMValueRef LLVMIsAConstantInt(LLVMValueRef Val);
-LLVMValueRef LLVMIsAConstantPointerNull(LLVMValueRef Val);
-LLVMValueRef LLVMIsAConstantStruct(LLVMValueRef Val);
-LLVMValueRef LLVMIsAConstantVector(LLVMValueRef Val);
-LLVMValueRef LLVMIsAGlobalValue(LLVMValueRef Val);
-LLVMValueRef LLVMIsAFunction(LLVMValueRef Val);
-LLVMValueRef LLVMIsAGlobalAlias(LLVMValueRef Val);
-LLVMValueRef LLVMIsAGlobalVariable(LLVMValueRef Val);
-LLVMValueRef LLVMIsAUndefValue(LLVMValueRef Val);
-LLVMValueRef LLVMIsAInstruction(LLVMValueRef Val);
-LLVMValueRef LLVMIsABinaryOperator(LLVMValueRef Val);
-LLVMValueRef LLVMIsACallInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAIntrinsicInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsADbgInfoIntrinsic(LLVMValueRef Val);
-LLVMValueRef LLVMIsADbgDeclareInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsADbgFuncStartInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsADbgRegionEndInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsADbgRegionStartInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsADbgStopPointInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAEHSelectorInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAMemIntrinsic(LLVMValueRef Val);
-LLVMValueRef LLVMIsAMemCpyInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAMemMoveInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAMemSetInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsACmpInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAFCmpInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAICmpInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAExtractElementInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAGetElementPtrInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAInsertElementInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAInsertValueInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAPHINode(LLVMValueRef Val);
-LLVMValueRef LLVMIsASelectInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAShuffleVectorInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAStoreInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsATerminatorInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsABranchInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAInvokeInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAReturnInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsASwitchInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAUnreachableInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAUnwindInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAUnaryInstruction(LLVMValueRef Val);
-LLVMValueRef LLVMIsAAllocationInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAAllocaInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsACastInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsABitCastInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAFPExtInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAFPToSIInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAFPToUIInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAFPTruncInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAIntToPtrInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAPtrToIntInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsASExtInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsASIToFPInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsATruncInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAUIToFPInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAZExtInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAExtractValueInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAFreeInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsALoadInst(LLVMValueRef Val);
-LLVMValueRef LLVMIsAVAArgInst(LLVMValueRef Val);
-
-
-/* Operations on Uses */
-LLVMUseIteratorRef LLVMGetFirstUse(LLVMValueRef Val);
-LLVMUseIteratorRef LLVMGetNextUse(LLVMUseIteratorRef U);
-LLVMValueRef LLVMGetUser(LLVMUseIteratorRef U);
-LLVMValueRef LLVMGetUsedValue(LLVMUseIteratorRef U);
-
-/* Operations on Users */
-LLVMValueRef LLVMGetOperand(LLVMValueRef Val, unsigned Index);
-
-/* Operations on constants of any type */
-LLVMValueRef LLVMConstNull(LLVMTypeRef Ty); /* all zeroes */
-LLVMValueRef LLVMConstAllOnes(LLVMTypeRef Ty); /* only for int/vector */
-LLVMValueRef LLVMGetUndef(LLVMTypeRef Ty);
-int LLVMIsConstant(LLVMValueRef Val);
-int LLVMIsNull(LLVMValueRef Val);
-int LLVMIsUndef(LLVMValueRef Val);
-LLVMValueRef LLVMConstPointerNull(LLVMTypeRef Ty);
-
-/* Operations on scalar constants */
-LLVMValueRef LLVMConstInt(LLVMTypeRef IntTy, unsigned long long N,
-                          int SignExtend);
-LLVMValueRef LLVMConstIntOfString(LLVMTypeRef IntTy, const char *Text,
-                                  uint8_t Radix);
-LLVMValueRef LLVMConstIntOfStringAndSize(LLVMTypeRef IntTy, const char *Text,
-                                         unsigned SLen, uint8_t Radix);
-LLVMValueRef LLVMConstReal(LLVMTypeRef RealTy, double N);
-LLVMValueRef LLVMConstRealOfString(LLVMTypeRef RealTy, const char *Text);
-LLVMValueRef LLVMConstRealOfStringAndSize(LLVMTypeRef RealTy, const char *Text,
-                                          unsigned SLen);
-unsigned long long LLVMConstIntGetZExtValue(LLVMValueRef ConstantVal);
-long long LLVMConstIntGetSExtValue(LLVMValueRef ConstantVal);
-
-
-/* Operations on composite constants */
-LLVMValueRef LLVMConstStringInContext(LLVMContextRef C, const char *Str,
-                                      unsigned Length, int DontNullTerminate);
-LLVMValueRef LLVMConstStructInContext(LLVMContextRef C, 
-                                      LLVMValueRef *ConstantVals,
-                                      unsigned Count, int Packed);
-
-LLVMValueRef LLVMConstString(const char *Str, unsigned Length,
-                             int DontNullTerminate);
-LLVMValueRef LLVMConstArray(LLVMTypeRef ElementTy,
-                            LLVMValueRef *ConstantVals, unsigned Length);
-LLVMValueRef LLVMConstStruct(LLVMValueRef *ConstantVals, unsigned Count,
-                             int Packed);
-LLVMValueRef LLVMConstVector(LLVMValueRef *ScalarConstantVals, unsigned Size);
-
-/* Constant expressions */
-LLVMOpcode LLVMGetConstOpcode(LLVMValueRef ConstantVal);
-LLVMValueRef LLVMAlignOf(LLVMTypeRef Ty);
-LLVMValueRef LLVMSizeOf(LLVMTypeRef Ty);
-LLVMValueRef LLVMConstNeg(LLVMValueRef ConstantVal);
-LLVMValueRef LLVMConstFNeg(LLVMValueRef ConstantVal);
-LLVMValueRef LLVMConstNot(LLVMValueRef ConstantVal);
-LLVMValueRef LLVMConstAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
-LLVMValueRef LLVMConstNSWAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
-LLVMValueRef LLVMConstFAdd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
-LLVMValueRef LLVMConstSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
-LLVMValueRef LLVMConstFSub(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
-LLVMValueRef LLVMConstMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
-LLVMValueRef LLVMConstFMul(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
-LLVMValueRef LLVMConstUDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
-LLVMValueRef LLVMConstSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
-LLVMValueRef LLVMConstExactSDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
-LLVMValueRef LLVMConstFDiv(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
-LLVMValueRef LLVMConstURem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
-LLVMValueRef LLVMConstSRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
-LLVMValueRef LLVMConstFRem(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
-LLVMValueRef LLVMConstAnd(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
-LLVMValueRef LLVMConstOr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
-LLVMValueRef LLVMConstXor(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
-LLVMValueRef LLVMConstICmp(LLVMIntPredicate Predicate,
-                           LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
-LLVMValueRef LLVMConstFCmp(LLVMRealPredicate Predicate,
-                           LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
-LLVMValueRef LLVMConstShl(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
-LLVMValueRef LLVMConstLShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
-LLVMValueRef LLVMConstAShr(LLVMValueRef LHSConstant, LLVMValueRef RHSConstant);
-LLVMValueRef LLVMConstGEP(LLVMValueRef ConstantVal,
-                          LLVMValueRef *ConstantIndices, unsigned NumIndices);
-LLVMValueRef LLVMConstInBoundsGEP(LLVMValueRef ConstantVal,
-                                  LLVMValueRef *ConstantIndices,
-                                  unsigned NumIndices);
-LLVMValueRef LLVMConstTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
-LLVMValueRef LLVMConstSExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
-LLVMValueRef LLVMConstZExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
-LLVMValueRef LLVMConstFPTrunc(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
-LLVMValueRef LLVMConstFPExt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
-LLVMValueRef LLVMConstUIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
-LLVMValueRef LLVMConstSIToFP(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
-LLVMValueRef LLVMConstFPToUI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
-LLVMValueRef LLVMConstFPToSI(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
-LLVMValueRef LLVMConstPtrToInt(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
-LLVMValueRef LLVMConstIntToPtr(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
-LLVMValueRef LLVMConstBitCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
-LLVMValueRef LLVMConstZExtOrBitCast(LLVMValueRef ConstantVal,
-                                    LLVMTypeRef ToType);
-LLVMValueRef LLVMConstSExtOrBitCast(LLVMValueRef ConstantVal,
-                                    LLVMTypeRef ToType);
-LLVMValueRef LLVMConstTruncOrBitCast(LLVMValueRef ConstantVal,
-                                     LLVMTypeRef ToType);
-LLVMValueRef LLVMConstPointerCast(LLVMValueRef ConstantVal,
-                                  LLVMTypeRef ToType);
-LLVMValueRef LLVMConstIntCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType,
-                              unsigned isSigned);
-LLVMValueRef LLVMConstFPCast(LLVMValueRef ConstantVal, LLVMTypeRef ToType);
-LLVMValueRef LLVMConstSelect(LLVMValueRef ConstantCondition,
-                             LLVMValueRef ConstantIfTrue,
-                             LLVMValueRef ConstantIfFalse);
-LLVMValueRef LLVMConstExtractElement(LLVMValueRef VectorConstant,
-                                     LLVMValueRef IndexConstant);
-LLVMValueRef LLVMConstInsertElement(LLVMValueRef VectorConstant,
-                                    LLVMValueRef ElementValueConstant,
-                                    LLVMValueRef IndexConstant);
-LLVMValueRef LLVMConstShuffleVector(LLVMValueRef VectorAConstant,
-                                    LLVMValueRef VectorBConstant,
-                                    LLVMValueRef MaskConstant);
-LLVMValueRef LLVMConstExtractValue(LLVMValueRef AggConstant, unsigned *IdxList,
-                                   unsigned NumIdx);
-LLVMValueRef LLVMConstInsertValue(LLVMValueRef AggConstant,
-                                  LLVMValueRef ElementValueConstant,
-                                  unsigned *IdxList, unsigned NumIdx);
-LLVMValueRef LLVMConstInlineAsm(LLVMTypeRef Ty, 
-                                const char *AsmString, const char *Constraints,
-                                int HasSideEffects);
-
-/* Operations on global variables, functions, and aliases (globals) */
-LLVMModuleRef LLVMGetGlobalParent(LLVMValueRef Global);
-int LLVMIsDeclaration(LLVMValueRef Global);
-LLVMLinkage LLVMGetLinkage(LLVMValueRef Global);
-void LLVMSetLinkage(LLVMValueRef Global, LLVMLinkage Linkage);
-const char *LLVMGetSection(LLVMValueRef Global);
-void LLVMSetSection(LLVMValueRef Global, const char *Section);
-LLVMVisibility LLVMGetVisibility(LLVMValueRef Global);
-void LLVMSetVisibility(LLVMValueRef Global, LLVMVisibility Viz);
-unsigned LLVMGetAlignment(LLVMValueRef Global);
-void LLVMSetAlignment(LLVMValueRef Global, unsigned Bytes);
-
-/* Operations on global variables */
-LLVMValueRef LLVMAddGlobal(LLVMModuleRef M, LLVMTypeRef Ty, const char *Name);
-LLVMValueRef LLVMGetNamedGlobal(LLVMModuleRef M, const char *Name);
-LLVMValueRef LLVMGetFirstGlobal(LLVMModuleRef M);
-LLVMValueRef LLVMGetLastGlobal(LLVMModuleRef M);
-LLVMValueRef LLVMGetNextGlobal(LLVMValueRef GlobalVar);
-LLVMValueRef LLVMGetPreviousGlobal(LLVMValueRef GlobalVar);
-void LLVMDeleteGlobal(LLVMValueRef GlobalVar);
-LLVMValueRef LLVMGetInitializer(LLVMValueRef GlobalVar);
-void LLVMSetInitializer(LLVMValueRef GlobalVar, LLVMValueRef ConstantVal);
-int LLVMIsThreadLocal(LLVMValueRef GlobalVar);
-void LLVMSetThreadLocal(LLVMValueRef GlobalVar, int IsThreadLocal);
-int LLVMIsGlobalConstant(LLVMValueRef GlobalVar);
-void LLVMSetGlobalConstant(LLVMValueRef GlobalVar, int IsConstant);
-
-/* Operations on aliases */
-LLVMValueRef LLVMAddAlias(LLVMModuleRef M, LLVMTypeRef Ty, LLVMValueRef Aliasee,
-                          const char *Name);
-
-/* Operations on functions */
-LLVMValueRef LLVMAddFunction(LLVMModuleRef M, const char *Name,
-                             LLVMTypeRef FunctionTy);
-LLVMValueRef LLVMGetNamedFunction(LLVMModuleRef M, const char *Name);
-LLVMValueRef LLVMGetFirstFunction(LLVMModuleRef M);
-LLVMValueRef LLVMGetLastFunction(LLVMModuleRef M);
-LLVMValueRef LLVMGetNextFunction(LLVMValueRef Fn);
-LLVMValueRef LLVMGetPreviousFunction(LLVMValueRef Fn);
-void LLVMDeleteFunction(LLVMValueRef Fn);
-unsigned LLVMGetIntrinsicID(LLVMValueRef Fn);
-unsigned LLVMGetFunctionCallConv(LLVMValueRef Fn);
-void LLVMSetFunctionCallConv(LLVMValueRef Fn, unsigned CC);
-const char *LLVMGetGC(LLVMValueRef Fn);
-void LLVMSetGC(LLVMValueRef Fn, const char *Name);
-void LLVMAddFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA);
-LLVMAttribute LLVMGetFunctionAttr(LLVMValueRef Fn);
-void LLVMRemoveFunctionAttr(LLVMValueRef Fn, LLVMAttribute PA);
-
-/* Operations on parameters */
-unsigned LLVMCountParams(LLVMValueRef Fn);
-void LLVMGetParams(LLVMValueRef Fn, LLVMValueRef *Params);
-LLVMValueRef LLVMGetParam(LLVMValueRef Fn, unsigned Index);
-LLVMValueRef LLVMGetParamParent(LLVMValueRef Inst);
-LLVMValueRef LLVMGetFirstParam(LLVMValueRef Fn);
-LLVMValueRef LLVMGetLastParam(LLVMValueRef Fn);
-LLVMValueRef LLVMGetNextParam(LLVMValueRef Arg);
-LLVMValueRef LLVMGetPreviousParam(LLVMValueRef Arg);
-void LLVMAddAttribute(LLVMValueRef Arg, LLVMAttribute PA);
-void LLVMRemoveAttribute(LLVMValueRef Arg, LLVMAttribute PA);
-LLVMAttribute LLVMGetAttribute(LLVMValueRef Arg);
-void LLVMSetParamAlignment(LLVMValueRef Arg, unsigned align);
-
-/* Operations on basic blocks */
-LLVMValueRef LLVMBasicBlockAsValue(LLVMBasicBlockRef BB);
-int LLVMValueIsBasicBlock(LLVMValueRef Val);
-LLVMBasicBlockRef LLVMValueAsBasicBlock(LLVMValueRef Val);
-LLVMValueRef LLVMGetBasicBlockParent(LLVMBasicBlockRef BB);
-unsigned LLVMCountBasicBlocks(LLVMValueRef Fn);
-void LLVMGetBasicBlocks(LLVMValueRef Fn, LLVMBasicBlockRef *BasicBlocks);
-LLVMBasicBlockRef LLVMGetFirstBasicBlock(LLVMValueRef Fn);
-LLVMBasicBlockRef LLVMGetLastBasicBlock(LLVMValueRef Fn);
-LLVMBasicBlockRef LLVMGetNextBasicBlock(LLVMBasicBlockRef BB);
-LLVMBasicBlockRef LLVMGetPreviousBasicBlock(LLVMBasicBlockRef BB);
-LLVMBasicBlockRef LLVMGetEntryBasicBlock(LLVMValueRef Fn);
-
-LLVMBasicBlockRef LLVMAppendBasicBlockInContext(LLVMContextRef C,
-                                                LLVMValueRef Fn,
-                                                const char *Name);
-LLVMBasicBlockRef LLVMInsertBasicBlockInContext(LLVMContextRef C,
-                                                LLVMBasicBlockRef BB,
-                                                const char *Name);
-
-LLVMBasicBlockRef LLVMAppendBasicBlock(LLVMValueRef Fn, const char *Name);
-LLVMBasicBlockRef LLVMInsertBasicBlock(LLVMBasicBlockRef InsertBeforeBB,
-                                       const char *Name);
-void LLVMDeleteBasicBlock(LLVMBasicBlockRef BB);
-
-/* Operations on instructions */
-LLVMBasicBlockRef LLVMGetInstructionParent(LLVMValueRef Inst);
-LLVMValueRef LLVMGetFirstInstruction(LLVMBasicBlockRef BB);
-LLVMValueRef LLVMGetLastInstruction(LLVMBasicBlockRef BB);
-LLVMValueRef LLVMGetNextInstruction(LLVMValueRef Inst);
-LLVMValueRef LLVMGetPreviousInstruction(LLVMValueRef Inst);
-
-/* Operations on call sites */
-void LLVMSetInstructionCallConv(LLVMValueRef Instr, unsigned CC);
-unsigned LLVMGetInstructionCallConv(LLVMValueRef Instr);
-void LLVMAddInstrAttribute(LLVMValueRef Instr, unsigned index, LLVMAttribute);
-void LLVMRemoveInstrAttribute(LLVMValueRef Instr, unsigned index, 
-                              LLVMAttribute);
-void LLVMSetInstrParamAlignment(LLVMValueRef Instr, unsigned index, 
-                                unsigned align);
-
-/* Operations on call instructions (only) */
-int LLVMIsTailCall(LLVMValueRef CallInst);
-void LLVMSetTailCall(LLVMValueRef CallInst, int IsTailCall);
-
-/* Operations on phi nodes */
-void LLVMAddIncoming(LLVMValueRef PhiNode, LLVMValueRef *IncomingValues,
-                     LLVMBasicBlockRef *IncomingBlocks, unsigned Count);
-unsigned LLVMCountIncoming(LLVMValueRef PhiNode);
-LLVMValueRef LLVMGetIncomingValue(LLVMValueRef PhiNode, unsigned Index);
-LLVMBasicBlockRef LLVMGetIncomingBlock(LLVMValueRef PhiNode, unsigned Index);
-
-/*===-- Instruction builders ----------------------------------------------===*/
-
-/* An instruction builder represents a point within a basic block, and is the
- * exclusive means of building instructions using the C interface.
- */
-
-LLVMBuilderRef LLVMCreateBuilderInContext(LLVMContextRef C);
-LLVMBuilderRef LLVMCreateBuilder(void);
-void LLVMPositionBuilder(LLVMBuilderRef Builder, LLVMBasicBlockRef Block,
-                         LLVMValueRef Instr);
-void LLVMPositionBuilderBefore(LLVMBuilderRef Builder, LLVMValueRef Instr);
-void LLVMPositionBuilderAtEnd(LLVMBuilderRef Builder, LLVMBasicBlockRef Block);
-LLVMBasicBlockRef LLVMGetInsertBlock(LLVMBuilderRef Builder);
-void LLVMClearInsertionPosition(LLVMBuilderRef Builder);
-void LLVMInsertIntoBuilder(LLVMBuilderRef Builder, LLVMValueRef Instr);
-void LLVMInsertIntoBuilderWithName(LLVMBuilderRef Builder, LLVMValueRef Instr,
-                                   const char *Name);
-void LLVMDisposeBuilder(LLVMBuilderRef Builder);
-
-/* Terminators */
-LLVMValueRef LLVMBuildRetVoid(LLVMBuilderRef);
-LLVMValueRef LLVMBuildRet(LLVMBuilderRef, LLVMValueRef V);
-LLVMValueRef LLVMBuildAggregateRet(LLVMBuilderRef, LLVMValueRef *RetVals,
-                                   unsigned N);
-LLVMValueRef LLVMBuildBr(LLVMBuilderRef, LLVMBasicBlockRef Dest);
-LLVMValueRef LLVMBuildCondBr(LLVMBuilderRef, LLVMValueRef If,
-                             LLVMBasicBlockRef Then, LLVMBasicBlockRef Else);
-LLVMValueRef LLVMBuildSwitch(LLVMBuilderRef, LLVMValueRef V,
-                             LLVMBasicBlockRef Else, unsigned NumCases);
-LLVMValueRef LLVMBuildInvoke(LLVMBuilderRef, LLVMValueRef Fn,
-                             LLVMValueRef *Args, unsigned NumArgs,
-                             LLVMBasicBlockRef Then, LLVMBasicBlockRef Catch,
-                             const char *Name);
-LLVMValueRef LLVMBuildUnwind(LLVMBuilderRef);
-LLVMValueRef LLVMBuildUnreachable(LLVMBuilderRef);
-
-/* Add a case to the switch instruction */
-void LLVMAddCase(LLVMValueRef Switch, LLVMValueRef OnVal,
-                 LLVMBasicBlockRef Dest);
-
-/* Arithmetic */
-LLVMValueRef LLVMBuildAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
-                          const char *Name);
-LLVMValueRef LLVMBuildNSWAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
-                             const char *Name);
-LLVMValueRef LLVMBuildFAdd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
-                           const char *Name);
-LLVMValueRef LLVMBuildSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
-                          const char *Name);
-LLVMValueRef LLVMBuildFSub(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
-                           const char *Name);
-LLVMValueRef LLVMBuildMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
-                          const char *Name);
-LLVMValueRef LLVMBuildFMul(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
-                           const char *Name);
-LLVMValueRef LLVMBuildUDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
-                           const char *Name);
-LLVMValueRef LLVMBuildSDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
-                           const char *Name);
-LLVMValueRef LLVMBuildExactSDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
-                                const char *Name);
-LLVMValueRef LLVMBuildFDiv(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
-                           const char *Name);
-LLVMValueRef LLVMBuildURem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
-                           const char *Name);
-LLVMValueRef LLVMBuildSRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
-                           const char *Name);
-LLVMValueRef LLVMBuildFRem(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
-                           const char *Name);
-LLVMValueRef LLVMBuildShl(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
-                           const char *Name);
-LLVMValueRef LLVMBuildLShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
-                           const char *Name);
-LLVMValueRef LLVMBuildAShr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
-                           const char *Name);
-LLVMValueRef LLVMBuildAnd(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
-                          const char *Name);
-LLVMValueRef LLVMBuildOr(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
-                          const char *Name);
-LLVMValueRef LLVMBuildXor(LLVMBuilderRef, LLVMValueRef LHS, LLVMValueRef RHS,
-                          const char *Name);
-LLVMValueRef LLVMBuildNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
-LLVMValueRef LLVMBuildFNeg(LLVMBuilderRef, LLVMValueRef V, const char *Name);
-LLVMValueRef LLVMBuildNot(LLVMBuilderRef, LLVMValueRef V, const char *Name);
-
-/* Memory */
-LLVMValueRef LLVMBuildMalloc(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
-LLVMValueRef LLVMBuildArrayMalloc(LLVMBuilderRef, LLVMTypeRef Ty,
-                                  LLVMValueRef Val, const char *Name);
-LLVMValueRef LLVMBuildAlloca(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
-LLVMValueRef LLVMBuildArrayAlloca(LLVMBuilderRef, LLVMTypeRef Ty,
-                                  LLVMValueRef Val, const char *Name);
-LLVMValueRef LLVMBuildFree(LLVMBuilderRef, LLVMValueRef PointerVal);
-LLVMValueRef LLVMBuildLoad(LLVMBuilderRef, LLVMValueRef PointerVal,
-                           const char *Name);
-LLVMValueRef LLVMBuildStore(LLVMBuilderRef, LLVMValueRef Val, LLVMValueRef Ptr);
-LLVMValueRef LLVMBuildGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
-                          LLVMValueRef *Indices, unsigned NumIndices,
-                          const char *Name);
-LLVMValueRef LLVMBuildInBoundsGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
-                                  LLVMValueRef *Indices, unsigned NumIndices,
-                                  const char *Name);
-LLVMValueRef LLVMBuildStructGEP(LLVMBuilderRef B, LLVMValueRef Pointer,
-                                unsigned Idx, const char *Name);
-LLVMValueRef LLVMBuildGlobalString(LLVMBuilderRef B, const char *Str,
-                                   const char *Name);
-LLVMValueRef LLVMBuildGlobalStringPtr(LLVMBuilderRef B, const char *Str,
-                                      const char *Name);
-
-/* Casts */
-LLVMValueRef LLVMBuildTrunc(LLVMBuilderRef, LLVMValueRef Val,
-                            LLVMTypeRef DestTy, const char *Name);
-LLVMValueRef LLVMBuildZExt(LLVMBuilderRef, LLVMValueRef Val,
-                           LLVMTypeRef DestTy, const char *Name);
-LLVMValueRef LLVMBuildSExt(LLVMBuilderRef, LLVMValueRef Val,
-                           LLVMTypeRef DestTy, const char *Name);
-LLVMValueRef LLVMBuildFPToUI(LLVMBuilderRef, LLVMValueRef Val,
-                             LLVMTypeRef DestTy, const char *Name);
-LLVMValueRef LLVMBuildFPToSI(LLVMBuilderRef, LLVMValueRef Val,
-                             LLVMTypeRef DestTy, const char *Name);
-LLVMValueRef LLVMBuildUIToFP(LLVMBuilderRef, LLVMValueRef Val,
-                             LLVMTypeRef DestTy, const char *Name);
-LLVMValueRef LLVMBuildSIToFP(LLVMBuilderRef, LLVMValueRef Val,
-                             LLVMTypeRef DestTy, const char *Name);
-LLVMValueRef LLVMBuildFPTrunc(LLVMBuilderRef, LLVMValueRef Val,
-                              LLVMTypeRef DestTy, const char *Name);
-LLVMValueRef LLVMBuildFPExt(LLVMBuilderRef, LLVMValueRef Val,
-                            LLVMTypeRef DestTy, const char *Name);
-LLVMValueRef LLVMBuildPtrToInt(LLVMBuilderRef, LLVMValueRef Val,
-                               LLVMTypeRef DestTy, const char *Name);
-LLVMValueRef LLVMBuildIntToPtr(LLVMBuilderRef, LLVMValueRef Val,
-                               LLVMTypeRef DestTy, const char *Name);
-LLVMValueRef LLVMBuildBitCast(LLVMBuilderRef, LLVMValueRef Val,
-                              LLVMTypeRef DestTy, const char *Name);
-LLVMValueRef LLVMBuildZExtOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
-                                    LLVMTypeRef DestTy, const char *Name);
-LLVMValueRef LLVMBuildSExtOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
-                                    LLVMTypeRef DestTy, const char *Name);
-LLVMValueRef LLVMBuildTruncOrBitCast(LLVMBuilderRef, LLVMValueRef Val,
-                                     LLVMTypeRef DestTy, const char *Name);
-LLVMValueRef LLVMBuildPointerCast(LLVMBuilderRef, LLVMValueRef Val,
-                                  LLVMTypeRef DestTy, const char *Name);
-LLVMValueRef LLVMBuildIntCast(LLVMBuilderRef, LLVMValueRef Val,
-                              LLVMTypeRef DestTy, const char *Name);
-LLVMValueRef LLVMBuildFPCast(LLVMBuilderRef, LLVMValueRef Val,
-                             LLVMTypeRef DestTy, const char *Name);
-
-/* Comparisons */
-LLVMValueRef LLVMBuildICmp(LLVMBuilderRef, LLVMIntPredicate Op,
-                           LLVMValueRef LHS, LLVMValueRef RHS,
-                           const char *Name);
-LLVMValueRef LLVMBuildFCmp(LLVMBuilderRef, LLVMRealPredicate Op,
-                           LLVMValueRef LHS, LLVMValueRef RHS,
-                           const char *Name);
-
-/* Miscellaneous instructions */
-LLVMValueRef LLVMBuildPhi(LLVMBuilderRef, LLVMTypeRef Ty, const char *Name);
-LLVMValueRef LLVMBuildCall(LLVMBuilderRef, LLVMValueRef Fn,
-                           LLVMValueRef *Args, unsigned NumArgs,
-                           const char *Name);
-LLVMValueRef LLVMBuildSelect(LLVMBuilderRef, LLVMValueRef If,
-                             LLVMValueRef Then, LLVMValueRef Else,
-                             const char *Name);
-LLVMValueRef LLVMBuildVAArg(LLVMBuilderRef, LLVMValueRef List, LLVMTypeRef Ty,
-                            const char *Name);
-LLVMValueRef LLVMBuildExtractElement(LLVMBuilderRef, LLVMValueRef VecVal,
-                                     LLVMValueRef Index, const char *Name);
-LLVMValueRef LLVMBuildInsertElement(LLVMBuilderRef, LLVMValueRef VecVal,
-                                    LLVMValueRef EltVal, LLVMValueRef Index,
-                                    const char *Name);
-LLVMValueRef LLVMBuildShuffleVector(LLVMBuilderRef, LLVMValueRef V1,
-                                    LLVMValueRef V2, LLVMValueRef Mask,
-                                    const char *Name);
-LLVMValueRef LLVMBuildExtractValue(LLVMBuilderRef, LLVMValueRef AggVal,
-                                   unsigned Index, const char *Name);
-LLVMValueRef LLVMBuildInsertValue(LLVMBuilderRef, LLVMValueRef AggVal,
-                                  LLVMValueRef EltVal, unsigned Index,
-                                  const char *Name);
-
-LLVMValueRef LLVMBuildIsNull(LLVMBuilderRef, LLVMValueRef Val,
-                             const char *Name);
-LLVMValueRef LLVMBuildIsNotNull(LLVMBuilderRef, LLVMValueRef Val,
-                                const char *Name);
-LLVMValueRef LLVMBuildPtrDiff(LLVMBuilderRef, LLVMValueRef LHS,
-                              LLVMValueRef RHS, const char *Name);
-
-
-/*===-- Module providers --------------------------------------------------===*/
-
-/* Encapsulates the module M in a module provider, taking ownership of the
- * module.
- * See the constructor llvm::ExistingModuleProvider::ExistingModuleProvider.
- */
-LLVMModuleProviderRef
-LLVMCreateModuleProviderForExistingModule(LLVMModuleRef M);
-
-/* Destroys the module provider MP as well as the contained module.
- * See the destructor llvm::ModuleProvider::~ModuleProvider.
- */
-void LLVMDisposeModuleProvider(LLVMModuleProviderRef MP);
-
-
-/*===-- Memory buffers ----------------------------------------------------===*/
-
-int LLVMCreateMemoryBufferWithContentsOfFile(const char *Path,
-                                             LLVMMemoryBufferRef *OutMemBuf,
-                                             char **OutMessage);
-int LLVMCreateMemoryBufferWithSTDIN(LLVMMemoryBufferRef *OutMemBuf,
-                                    char **OutMessage);
-void LLVMDisposeMemoryBuffer(LLVMMemoryBufferRef MemBuf);
-
-
-/*===-- Pass Managers -----------------------------------------------------===*/
-
-/** Constructs a new whole-module pass pipeline. This type of pipeline is
-    suitable for link-time optimization and whole-module transformations.
-    See llvm::PassManager::PassManager. */
-LLVMPassManagerRef LLVMCreatePassManager(void);
-
-/** Constructs a new function-by-function pass pipeline over the module
-    provider. It does not take ownership of the module provider. This type of
-    pipeline is suitable for code generation and JIT compilation tasks.
-    See llvm::FunctionPassManager::FunctionPassManager. */
-LLVMPassManagerRef LLVMCreateFunctionPassManager(LLVMModuleProviderRef MP);
-
-/** Initializes, executes on the provided module, and finalizes all of the
-    passes scheduled in the pass manager. Returns 1 if any of the passes
-    modified the module, 0 otherwise. See llvm::PassManager::run(Module&). */
-int LLVMRunPassManager(LLVMPassManagerRef PM, LLVMModuleRef M);
-
-/** Initializes all of the function passes scheduled in the function pass
-    manager. Returns 1 if any of the passes modified the module, 0 otherwise.
-    See llvm::FunctionPassManager::doInitialization. */
-int LLVMInitializeFunctionPassManager(LLVMPassManagerRef FPM);
-
-/** Executes all of the function passes scheduled in the function pass manager
-    on the provided function. Returns 1 if any of the passes modified the
-    function, false otherwise.
-    See llvm::FunctionPassManager::run(Function&). */
-int LLVMRunFunctionPassManager(LLVMPassManagerRef FPM, LLVMValueRef F);
-
-/** Finalizes all of the function passes scheduled in in the function pass
-    manager. Returns 1 if any of the passes modified the module, 0 otherwise.
-    See llvm::FunctionPassManager::doFinalization. */
-int LLVMFinalizeFunctionPassManager(LLVMPassManagerRef FPM);
-
-/** Frees the memory of a pass pipeline. For function pipelines, does not free
-    the module provider.
-    See llvm::PassManagerBase::~PassManagerBase. */
-void LLVMDisposePassManager(LLVMPassManagerRef PM);
-
-
-
-/* Analysis.h */
-
-typedef enum {
-  LLVMAbortProcessAction, /* verifier will print to stderr and abort() */
-  LLVMPrintMessageAction, /* verifier will print to stderr and return 1 */
-  LLVMReturnStatusAction  /* verifier will just return 1 */
-} LLVMVerifierFailureAction;
-
-
-/* Verifies that a module is valid, taking the specified action if not.
-   Optionally returns a human-readable description of any invalid constructs.
-   OutMessage must be disposed with LLVMDisposeMessage. */
-int LLVMVerifyModule(LLVMModuleRef M, LLVMVerifierFailureAction Action,
-                     char **OutMessage);
-
-/* Verifies that a single function is valid, taking the specified action. Useful
-   for debugging. */
-int LLVMVerifyFunction(LLVMValueRef Fn, LLVMVerifierFailureAction Action);
-
-/* Open up a ghostview window that displays the CFG of the current function.
-   Useful for debugging. */
-void LLVMViewFunctionCFG(LLVMValueRef Fn);
-void LLVMViewFunctionCFGOnly(LLVMValueRef Fn);
-
-/* BitReader.h */
-
-/* Builds a module from the bitcode in the specified memory buffer, returning a
-   reference to the module via the OutModule parameter. Returns 0 on success.
-   Optionally returns a human-readable error message via OutMessage. */ 
-int LLVMParseBitcode(LLVMMemoryBufferRef MemBuf,
-                     LLVMModuleRef *OutModule, char **OutMessage);
-
-int LLVMParseBitcodeInContext(LLVMContextRef ContextRef,
-                              LLVMMemoryBufferRef MemBuf,
-                              LLVMModuleRef *OutModule, char **OutMessage);
-
-/* Reads a module from the specified path, returning via the OutMP parameter
-   a module provider which performs lazy deserialization. Returns 0 on success.
-   Optionally returns a human-readable error message via OutMessage. */ 
-int LLVMGetBitcodeModuleProvider(LLVMMemoryBufferRef MemBuf,
-                                 LLVMModuleProviderRef *OutMP,
-                                 char **OutMessage);
-
-int LLVMGetBitcodeModuleProviderInContext(LLVMContextRef ContextRef,
-                                          LLVMMemoryBufferRef MemBuf,
-                                          LLVMModuleProviderRef *OutMP,
-                                          char **OutMessage);
-
-/* BitWriter.h */
-
-/*===-- Operations on modules ---------------------------------------------===*/
-
-/* Writes a module to an open file descriptor. Returns 0 on success.
-   Closes the Handle. Use dup first if this is not what you want. */ 
-int LLVMWriteBitcodeToFileHandle(LLVMModuleRef M, int Handle);
-
-/* Writes a module to the specified path. Returns 0 on success. */ 
-int LLVMWriteBitcodeToFile(LLVMModuleRef M, const char *Path);
-
-
-/* Target.h */
-
-#define LLVMBigEndian 0
-#define LLVMLittleEndian 1
-typedef int LLVMByteOrdering;
-
-typedef struct LLVMOpaqueTargetData *LLVMTargetDataRef;
-typedef struct LLVMStructLayout *LLVMStructLayoutRef;
-
-/*===-- Target Data -------------------------------------------------------===*/
-
-/** Creates target data from a target layout string.
-    See the constructor llvm::TargetData::TargetData. */
-LLVMTargetDataRef LLVMCreateTargetData(const char *StringRep);
-
-/** Adds target data information to a pass manager. This does not take ownership
-    of the target data.
-    See the method llvm::PassManagerBase::add. */
-void LLVMAddTargetData(LLVMTargetDataRef, LLVMPassManagerRef);
-
-/** Converts target data to a target layout string. The string must be disposed
-    with LLVMDisposeMessage.
-    See the constructor llvm::TargetData::TargetData. */
-char *LLVMCopyStringRepOfTargetData(LLVMTargetDataRef);
-
-/** Returns the byte order of a target, either LLVMBigEndian or
-    LLVMLittleEndian.
-    See the method llvm::TargetData::isLittleEndian. */
-LLVMByteOrdering LLVMByteOrder(LLVMTargetDataRef);
-
-/** Returns the pointer size in bytes for a target.
-    See the method llvm::TargetData::getPointerSize. */
-unsigned LLVMPointerSize(LLVMTargetDataRef);
-
-/** Returns the integer type that is the same size as a pointer on a target.
-    See the method llvm::TargetData::getIntPtrType. */
-LLVMTypeRef LLVMIntPtrType(LLVMTargetDataRef);
-
-/** Computes the size of a type in bytes for a target.
-    See the method llvm::TargetData::getTypeSizeInBits. */
-unsigned long long LLVMSizeOfTypeInBits(LLVMTargetDataRef, LLVMTypeRef);
-
-/** Computes the storage size of a type in bytes for a target.
-    See the method llvm::TargetData::getTypeStoreSize. */
-unsigned long long LLVMStoreSizeOfType(LLVMTargetDataRef, LLVMTypeRef);
-
-/** Computes the ABI size of a type in bytes for a target.
-    See the method llvm::TargetData::getTypeAllocSize. */
-unsigned long long LLVMABISizeOfType(LLVMTargetDataRef, LLVMTypeRef);
-
-/** Computes the ABI alignment of a type in bytes for a target.
-    See the method llvm::TargetData::getTypeABISize. */
-unsigned LLVMABIAlignmentOfType(LLVMTargetDataRef, LLVMTypeRef);
-
-/** Computes the call frame alignment of a type in bytes for a target.
-    See the method llvm::TargetData::getTypeABISize. */
-unsigned LLVMCallFrameAlignmentOfType(LLVMTargetDataRef, LLVMTypeRef);
-
-/** Computes the preferred alignment of a type in bytes for a target.
-    See the method llvm::TargetData::getTypeABISize. */
-unsigned LLVMPreferredAlignmentOfType(LLVMTargetDataRef, LLVMTypeRef);
-
-/** Computes the preferred alignment of a global variable in bytes for a target.
-    See the method llvm::TargetData::getPreferredAlignment. */
-unsigned LLVMPreferredAlignmentOfGlobal(LLVMTargetDataRef,
-                                        LLVMValueRef GlobalVar);
-
-/** Computes the structure element that contains the byte offset for a target.
-    See the method llvm::StructLayout::getElementContainingOffset. */
-unsigned LLVMElementAtOffset(LLVMTargetDataRef, LLVMTypeRef StructTy,
-                             unsigned long long Offset);
-
-/** Computes the byte offset of the indexed struct element for a target.
-    See the method llvm::StructLayout::getElementContainingOffset. */
-unsigned long long LLVMOffsetOfElement(LLVMTargetDataRef, LLVMTypeRef StructTy,
-                                       unsigned Element);
-
-/** Struct layouts are speculatively cached. If a TargetDataRef is alive when
-    types are being refined and removed, this method must be called whenever a
-    struct type is removed to avoid a dangling pointer in this cache.
-    See the method llvm::TargetData::InvalidateStructLayoutInfo. */
-void LLVMInvalidateStructLayout(LLVMTargetDataRef, LLVMTypeRef StructTy);
-
-/** Deallocates a TargetData.
-    See the destructor llvm::TargetData::~TargetData. */
-void LLVMDisposeTargetData(LLVMTargetDataRef);
-
-
-/* ExecutionEngine.h */
-void LLVMLinkInJIT(void);
-void LLVMLinkInInterpreter(void);
-
-typedef struct LLVMOpaqueGenericValue *LLVMGenericValueRef;
-typedef struct LLVMOpaqueExecutionEngine *LLVMExecutionEngineRef;
-
-/*===-- Operations on generic values --------------------------------------===*/
-
-LLVMGenericValueRef LLVMCreateGenericValueOfInt(LLVMTypeRef Ty,
-                                                unsigned long long N,
-                                                int IsSigned);
-
-LLVMGenericValueRef LLVMCreateGenericValueOfPointer(void *P);
-
-LLVMGenericValueRef LLVMCreateGenericValueOfFloat(LLVMTypeRef Ty, double N);
-
-unsigned LLVMGenericValueIntWidth(LLVMGenericValueRef GenValRef);
-
-unsigned long long LLVMGenericValueToInt(LLVMGenericValueRef GenVal,
-                                         int IsSigned);
-
-void *LLVMGenericValueToPointer(LLVMGenericValueRef GenVal);
-
-double LLVMGenericValueToFloat(LLVMTypeRef TyRef, LLVMGenericValueRef GenVal);
-
-void LLVMDisposeGenericValue(LLVMGenericValueRef GenVal);
-
-/*===-- Operations on execution engines -----------------------------------===*/
-
-int LLVMCreateExecutionEngine(LLVMExecutionEngineRef *OutEE,
-                              LLVMModuleProviderRef MP,
-                              char **OutError);
-
-int LLVMCreateInterpreter(LLVMExecutionEngineRef *OutInterp,
-                          LLVMModuleProviderRef MP,
-                          char **OutError);
-
-int LLVMCreateJITCompiler(LLVMExecutionEngineRef *OutJIT,
-                          LLVMModuleProviderRef MP,
-                          unsigned OptLevel,
-                          char **OutError);
-
-void LLVMDisposeExecutionEngine(LLVMExecutionEngineRef EE);
-
-void LLVMRunStaticConstructors(LLVMExecutionEngineRef EE);
-
-void LLVMRunStaticDestructors(LLVMExecutionEngineRef EE);
-
-int LLVMRunFunctionAsMain(LLVMExecutionEngineRef EE, LLVMValueRef F,
-                          unsigned ArgC, const char * const *ArgV,
-                          const char * const *EnvP);
-
-LLVMGenericValueRef LLVMRunFunction(LLVMExecutionEngineRef EE, LLVMValueRef F,
-                                    unsigned NumArgs,
-                                    LLVMGenericValueRef *Args);
-
-void LLVMFreeMachineCodeForFunction(LLVMExecutionEngineRef EE, LLVMValueRef F);
-
-void LLVMAddModuleProvider(LLVMExecutionEngineRef EE, LLVMModuleProviderRef MP);
-
-int LLVMRemoveModuleProvider(LLVMExecutionEngineRef EE,
-                             LLVMModuleProviderRef MP,
-                             LLVMModuleRef *OutMod, char **OutError);
-
-int LLVMFindFunction(LLVMExecutionEngineRef EE, const char *Name,
-                     LLVMValueRef *OutFn);
-
-LLVMTargetDataRef LLVMGetExecutionEngineTargetData(LLVMExecutionEngineRef EE);
-
-void LLVMAddGlobalMapping(LLVMExecutionEngineRef EE, LLVMValueRef Global,
-                          void* Addr);
-
-void *LLVMGetPointerToGlobal(LLVMExecutionEngineRef EE, LLVMValueRef Global);
-
-
-/* LinkTimeOptimizer.h */
-/// This provides a dummy type for pointers to the LTO object.
-typedef void* llvm_lto_t;
-
-/// This provides a C-visible enumerator to manage status codes.
-/// This should map exactly onto the C++ enumerator LTOStatus.
-typedef enum llvm_lto_status {
-  LLVM_LTO_UNKNOWN,
-  LLVM_LTO_OPT_SUCCESS,
-  LLVM_LTO_READ_SUCCESS,
-  LLVM_LTO_READ_FAILURE,
-  LLVM_LTO_WRITE_FAILURE,
-  LLVM_LTO_NO_TARGET,
-  LLVM_LTO_NO_WORK,
-  LLVM_LTO_MODULE_MERGE_FAILURE,
-  LLVM_LTO_ASM_FAILURE,
-
-  //  Added C-specific error codes
-  LLVM_LTO_NULL_OBJECT
-} llvm_lto_status_t;
-
-/// This provides C interface to initialize link time optimizer. This allows
-/// linker to use dlopen() interface to dynamically load LinkTimeOptimizer.
-/// extern "C" helps, because dlopen() interface uses name to find the symbol.
-extern llvm_lto_t llvm_create_optimizer(void);
-extern void llvm_destroy_optimizer(llvm_lto_t lto);
-
-extern llvm_lto_status_t llvm_read_object_file
-  (llvm_lto_t lto, const char* input_filename);
-extern llvm_lto_status_t llvm_optimize_modules
-  (llvm_lto_t lto, const char* output_filename);
-
-/* lto.h */
-
-#define LTO_API_VERSION 3
-
-typedef enum {
-    LTO_SYMBOL_ALIGNMENT_MASK         = 0x0000001F,    /* log2 of alignment */
-    LTO_SYMBOL_PERMISSIONS_MASK       = 0x000000E0,    
-    LTO_SYMBOL_PERMISSIONS_CODE       = 0x000000A0,    
-    LTO_SYMBOL_PERMISSIONS_DATA       = 0x000000C0,    
-    LTO_SYMBOL_PERMISSIONS_RODATA     = 0x00000080,    
-    LTO_SYMBOL_DEFINITION_MASK        = 0x00000700,    
-    LTO_SYMBOL_DEFINITION_REGULAR     = 0x00000100,    
-    LTO_SYMBOL_DEFINITION_TENTATIVE   = 0x00000200,    
-    LTO_SYMBOL_DEFINITION_WEAK        = 0x00000300,    
-    LTO_SYMBOL_DEFINITION_UNDEFINED   = 0x00000400,    
-    LTO_SYMBOL_DEFINITION_WEAKUNDEF   = 0x00000500,
-    LTO_SYMBOL_SCOPE_MASK             = 0x00003800,    
-    LTO_SYMBOL_SCOPE_INTERNAL         = 0x00000800,    
-    LTO_SYMBOL_SCOPE_HIDDEN           = 0x00001000,    
-    LTO_SYMBOL_SCOPE_PROTECTED        = 0x00002000,    
-    LTO_SYMBOL_SCOPE_DEFAULT          = 0x00001800    
-} lto_symbol_attributes;
-
-typedef enum {
-    LTO_DEBUG_MODEL_NONE         = 0,
-    LTO_DEBUG_MODEL_DWARF        = 1
-} lto_debug_model;
-
-typedef enum {
-    LTO_CODEGEN_PIC_MODEL_STATIC         = 0,
-    LTO_CODEGEN_PIC_MODEL_DYNAMIC        = 1,
-    LTO_CODEGEN_PIC_MODEL_DYNAMIC_NO_PIC = 2
-} lto_codegen_model;
-
-
-/** opaque reference to a loaded object module */
-typedef struct LTOModule*         lto_module_t;
-
-/** opaque reference to a code generator */
-typedef struct LTOCodeGenerator*  lto_code_gen_t;
-
-/**
- * Returns a printable string.
- */
-extern const char*
-lto_get_version(void);
-
-
-/**
- * Returns the last error string or NULL if last operation was sucessful.
- */
-extern const char*
-lto_get_error_message(void);
-
-/**
- * Checks if a file is a loadable object file.
- */
-extern bool
-lto_module_is_object_file(const char* path);
-
-
-/**
- * Checks if a file is a loadable object compiled for requested target.
- */
-extern bool
-lto_module_is_object_file_for_target(const char* path, 
-                                     const char* target_triple_prefix);
-
-
-/**
- * Checks if a buffer is a loadable object file.
- */
-extern bool
-lto_module_is_object_file_in_memory(const void* mem, size_t length);
-
-
-/**
- * Checks if a buffer is a loadable object compiled for requested target.
- */
-extern bool
-lto_module_is_object_file_in_memory_for_target(const void* mem, size_t length, 
-                                               const char* target_triple_prefix);
-
-
-/**
- * Loads an object file from disk.
- * Returns NULL on error (check lto_get_error_message() for details).
- */
-extern lto_module_t
-lto_module_create(const char* path);
-
-
-/**
- * Loads an object file from memory.
- * Returns NULL on error (check lto_get_error_message() for details).
- */
-extern lto_module_t
-lto_module_create_from_memory(const void* mem, size_t length);
-
-
-/**
- * Frees all memory internally allocated by the module.
- * Upon return the lto_module_t is no longer valid.
- */
-extern void
-lto_module_dispose(lto_module_t mod);
-
-
-/**
- * Returns triple string which the object module was compiled under.
- */
-extern const char*
-lto_module_get_target_triple(lto_module_t mod);
-
-
-/**
- * Returns the number of symbols in the object module.
- */
-extern unsigned int
-lto_module_get_num_symbols(lto_module_t mod);
-
-
-/**
- * Returns the name of the ith symbol in the object module.
- */
-extern const char*
-lto_module_get_symbol_name(lto_module_t mod, unsigned int index);
-
-
-/**
- * Returns the attributes of the ith symbol in the object module.
- */
-extern lto_symbol_attributes
-lto_module_get_symbol_attribute(lto_module_t mod, unsigned int index);
-
-
-/**
- * Instantiates a code generator.
- * Returns NULL on error (check lto_get_error_message() for details).
- */
-extern lto_code_gen_t
-lto_codegen_create(void);
-
-
-/**
- * Frees all code generator and all memory it internally allocated.
- * Upon return the lto_code_gen_t is no longer valid.
- */
-extern void
-lto_codegen_dispose(lto_code_gen_t);
-
-
-
-/**
- * Add an object module to the set of modules for which code will be generated.
- * Returns true on error (check lto_get_error_message() for details).
- */
-extern bool
-lto_codegen_add_module(lto_code_gen_t cg, lto_module_t mod);
-
-
-
-/**
- * Sets if debug info should be generated.
- * Returns true on error (check lto_get_error_message() for details).
- */
-extern bool
-lto_codegen_set_debug_model(lto_code_gen_t cg, lto_debug_model);
-
-
-/**
- * Sets which PIC code model to generated.
- * Returns true on error (check lto_get_error_message() for details).
- */
-extern bool
-lto_codegen_set_pic_model(lto_code_gen_t cg, lto_codegen_model);
-
-
-/**
- * Sets the location of the "gcc" to run. If not set, libLTO will search for
- * "gcc" on the path.
- */
-extern void
-lto_codegen_set_gcc_path(lto_code_gen_t cg, const char* path);
-
-
-/**
- * Sets the location of the assembler tool to run. If not set, libLTO
- * will use gcc to invoke the assembler.
- */
-extern void
-lto_codegen_set_assembler_path(lto_code_gen_t cg, const char* path);
-
-
-/**
- * Adds to a list of all global symbols that must exist in the final
- * generated code.  If a function is not listed, it might be
- * inlined into every usage and optimized away.
- */
-extern void
-lto_codegen_add_must_preserve_symbol(lto_code_gen_t cg, const char* symbol);
-
-
-/**
- * Writes a new object file at the specified path that contains the
- * merged contents of all modules added so far.
- * Returns true on error (check lto_get_error_message() for details).
- */
-extern bool
-lto_codegen_write_merged_modules(lto_code_gen_t cg, const char* path);
-
-
-/**
- * Generates code for all added modules into one native object file.
- * On sucess returns a pointer to a generated mach-o/ELF buffer and
- * length set to the buffer size.  The buffer is owned by the 
- * lto_code_gen_t and will be freed when lto_codegen_dispose()
- * is called, or lto_codegen_compile() is called again.
- * On failure, returns NULL (check lto_get_error_message() for details).
- */
-extern const void*
-lto_codegen_compile(lto_code_gen_t cg, size_t* length);
-
-
-/**
- * Sets options to help debug codegen bugs.
- */
-extern void
-lto_codegen_debug_options(lto_code_gen_t cg, const char *);
-
-
-
-
diff --git a/llvm/llvm.nim b/llvm/llvm.nim
deleted file mode 100755
index d010457f8..000000000
--- a/llvm/llvm.nim
+++ /dev/null
@@ -1,1452 +0,0 @@
-const 
-  libname* = "llvm.dll"               #Setup as you need
-
-type
-  OpaqueContext {.pure.} = object
-  OpaqueModule {.pure.} = object
-  TOpaqueType {.pure.} = object
-  OpaqueTypeHandle {.pure.} = object
-  OpaqueValue {.pure.} = object
-  OpaqueBasicBlock {.pure.} = object
-  OpaqueBuilder {.pure.} = object
-  OpaqueModuleProvider {.pure.} = object
-  OpaqueMemoryBuffer {.pure.} = object
-  OpaquePassManager {.pure.} = object
-  OpaqueUseIterator {.pure.} = object
-
-  ContextRef* = OpaqueContext
-  ModuleRef* = OpaqueModule  
-  TypeRef* = TOpaqueType  
-  TypeHandleRef* = OpaqueTypeHandle
-  ValueRef* = OpaqueValue
-  BasicBlockRef* = OpaqueBasicBlock
-  BuilderRef* = OpaqueBuilder 
-  ModuleProviderRef* = OpaqueModuleProvider   
-  MemoryBufferRef* = OpaqueMemoryBuffer   
-  PassManagerRef* = OpaquePassManager 
-  UseIteratorRef* = OpaqueUseIterator
-  Attribute* = enum 
-    ZExtAttribute = 1 shl 0, SExtAttribute = 1 shl 1, 
-    NoReturnAttribute = 1 shl 2, InRegAttribute = 1 shl 3, 
-    StructRetAttribute = 1 shl 4, NoUnwindAttribute = 1 shl 5, 
-    NoAliasAttribute = 1 shl 6, ByValAttribute = 1 shl 7, 
-    NestAttribute = 1 shl 8, ReadNoneAttribute = 1 shl 9, 
-    ReadOnlyAttribute = 1 shl 10, NoInlineAttribute = 1 shl 11, 
-    AlwaysInlineAttribute = 1 shl 12, OptimizeForSizeAttribute = 1 shl 13, 
-    StackProtectAttribute = 1 shl 14, StackProtectReqAttribute = 1 shl 15, 
-    NoCaptureAttribute = 1 shl 21, NoRedZoneAttribute = 1 shl 22, 
-    NoImplicitFloatAttribute = 1 shl 23, NakedAttribute = 1 shl 24, 
-    InlineHintAttribute = 1 shl 25
-  Opcode* = enum
-    opcRet = 1, opcBr = 2, opcSwitch = 3, opcInvoke = 4, opcUnwind = 5,
-    opcUnreachable = 6, 
-    opcAdd = 7, opcFAdd = 8, opcSub = 9, opcFSub = 10, opcMul = 11,
-    opcFMul = 12, opcUDiv = 13, 
-    opcSDiv = 14, opcFDiv = 15, opcURem = 16, opcSRem = 17, opcFRem = 18,
-    opcShl = 19,
-    opcLShr = 20, opcAShr = 21, opcAnd = 22, opcOr = 23, opcXor = 24,
-    opcMalloc = 25, opcFree = 26, opcAlloca = 27, 
-    opcLoad = 28, opcStore = 29,
-    opcGetElementPtr = 30, opcTrunk = 31, opcZExt = 32, opcSExt = 33, 
-    opcFPToUI = 34, opcFPToSI = 35, opcUIToFP = 36, opcSIToFP = 37,
-    opcFPTrunc = 38, opcFPExt = 39, opcPtrToInt = 40, opcIntToPtr = 41,
-    opcBitCast = 42, opcICmp = 43, 
-    opcFCmp = 44, opcPHI = 45, opcCall = 46, opcSelect = 47, opcVAArg = 50, 
-    opcExtractElement = 51, opcInsertElement = 52, opcShuffleVector = 53, 
-    opcExtractValue = 54, opcInsertValue = 55
-  TypeKind* = enum 
-    VoidTypeKind, FloatTypeKind, DoubleTypeKind, X86_FP80TypeKind, 
-    FP128TypeKind, PPC_FP128TypeKind, LabelTypeKind, IntegerTypeKind, 
-    FunctionTypeKind, StructTypeKind, ArrayTypeKind, PointerTypeKind, 
-    OpaqueTypeKind, VectorTypeKind, MetadataTypeKind
-  TLinkage* = enum
-    ExternalLinkage,            ## Externally visible function 
-    AvailableExternallyLinkage, ## Keep one copy of function when linking (inline) 
-    LinkOnceAnyLinkage, ## Same, but only replaced by something equivalent.
-    LinkOnceODRLinkage, ## Keep one copy of function when linking (weak)
-    WeakAnyLinkage,     ## Same, but only replaced by something equivalent.
-    WeakODRLinkage,     ## Special purpose, only applies to global arrays
-    AppendingLinkage,   ## Rename collisions when linking (static functions)
-    InternalLinkage,    ## 
-    PrivateLinkage,     ## Like Internal, but omit from symbol table
-    DLLImportLinkage,   ## Function to be imported from DLL
-    DLLExportLinkage,   ## Function to be accessible from DLL 
-    ExternalWeakLinkage, ## ExternalWeak linkage description 
-    GhostLinkage,       ## Stand-in functions for streaming fns from bitcode 
-    CommonLinkage,      ## Tentative definitions  
-    LinkerPrivateLinkage ## Like Private, but linker removes.
-  TVisibility* = enum
-    DefaultVisibility,
-    HiddenVisibility,
-    ProtectedVisibility
-  TCallConv* = enum          
-    CCallConv = 0, FastCallConv = 8, ColdCallConv = 9, X86StdcallCallConv = 64, 
-    X86FastcallCallConv = 65
-  IntPredicate* = enum       
-    IntEQ = 32, IntNE, IntUGT, IntUGE, IntULT, IntULE, IntSGT, IntSGE, IntSLT, 
-    IntSLE
-  RealPredicate* = enum       
-    RealPredicateFalse, RealOEQ, RealOGT, RealOGE, RealOLT, RealOLE, RealONE, 
-    RealORD, RealUNO, RealUEQ, RealUGT, RealUGE, RealULT, RealULE, RealUNE, 
-    RealPredicateTrue
-
-#===-- Error handling ----------------------------------------------------=== 
-
-proc DisposeMessage*(Message: cstring){.cdecl, dynlib: libname, 
-                                        importc: "LLVMDisposeMessage".}
-  
-#===-- Modules -----------------------------------------------------------=== 
-# Create and destroy contexts.  
-proc ContextCreate*(): ContextRef{.cdecl, dynlib: libname, 
-                                   importc: "LLVMContextCreate".}
-proc GetGlobalContext*(): ContextRef{.cdecl, dynlib: libname, 
-                                      importc: "LLVMGetGlobalContext".}
-proc ContextDispose*(C: ContextRef){.cdecl, dynlib: libname, 
-                                     importc: "LLVMContextDispose".}
-  # Create and destroy modules.  
-  # See llvm::Module::Module.  
-proc ModuleCreateWithName*(ModuleID: cstring): ModuleRef{.cdecl, 
-    dynlib: libname, importc: "LLVMModuleCreateWithName".}
-proc ModuleCreateWithNameInContext*(ModuleID: cstring, C: ContextRef): ModuleRef{.
-    cdecl, dynlib: libname, importc: "LLVMModuleCreateWithNameInContext".}
-  # See llvm::Module::~Module.  
-proc DisposeModule*(M: ModuleRef){.cdecl, dynlib: libname, 
-                                   importc: "LLVMDisposeModule".}
-  # Data layout. See Module::getDataLayout.  
-proc GetDataLayout*(M: ModuleRef): cstring{.cdecl, dynlib: libname, 
-    importc: "LLVMGetDataLayout".}
-proc SetDataLayout*(M: ModuleRef, Triple: cstring){.cdecl, dynlib: libname, 
-    importc: "LLVMSetDataLayout".}
-  # Target triple. See Module::getTargetTriple.  
-proc GetTarget*(M: ModuleRef): cstring{.cdecl, dynlib: libname, 
-                                        importc: "LLVMGetTarget".}
-proc SetTarget*(M: ModuleRef, Triple: cstring){.cdecl, dynlib: libname, 
-    importc: "LLVMSetTarget".}
-  # See Module::addTypeName.  
-proc AddTypeName*(M: ModuleRef, Name: cstring, Ty: TypeRef): int32{.cdecl, 
-    dynlib: libname, importc: "LLVMAddTypeName".}
-proc DeleteTypeName*(M: ModuleRef, Name: cstring){.cdecl, dynlib: libname, 
-    importc: "LLVMDeleteTypeName".}
-proc GetTypeByName*(M: ModuleRef, Name: cstring): TypeRef{.cdecl, 
-    dynlib: libname, importc: "LLVMGetTypeByName".}
-  # See Module::dump.  
-proc DumpModule*(M: ModuleRef){.cdecl, dynlib: libname, 
-                                importc: "LLVMDumpModule".}
-  #===-- Types -------------------------------------------------------------=== 
-  # LLVM types conform to the following hierarchy:
-  # * 
-  # *   types:
-  # *     integer type
-  # *     real type
-  # *     function type
-  # *     sequence types:
-  # *       array type
-  # *       pointer type
-  # *       vector type
-  # *     void type
-  # *     label type
-  # *     opaque type
-  #  
-  # See llvm::LLVMTypeKind::getTypeID.  
-proc GetTypeKind*(Ty: TypeRef): TypeKind{.cdecl, dynlib: libname, 
-    importc: "LLVMGetTypeKind".}
-  # See llvm::LLVMType::getContext.  
-proc GetTypeContext*(Ty: TypeRef): ContextRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetTypeContext".}
-  # Operations on integer types  
-proc Int1TypeInContext*(C: ContextRef): TypeRef{.cdecl, dynlib: libname, 
-    importc: "LLVMInt1TypeInContext".}
-proc Int8TypeInContext*(C: ContextRef): TypeRef{.cdecl, dynlib: libname, 
-    importc: "LLVMInt8TypeInContext".}
-proc Int16TypeInContext*(C: ContextRef): TypeRef{.cdecl, dynlib: libname, 
-    importc: "LLVMInt16TypeInContext".}
-proc Int32TypeInContext*(C: ContextRef): TypeRef{.cdecl, dynlib: libname, 
-    importc: "LLVMInt32TypeInContext".}
-proc Int64TypeInContext*(C: ContextRef): TypeRef{.cdecl, dynlib: libname, 
-    importc: "LLVMInt64TypeInContext".}
-proc IntTypeInContext*(C: ContextRef, NumBits: int32): TypeRef{.cdecl, 
-    dynlib: libname, importc: "LLVMIntTypeInContext".}
-proc Int1Type*(): TypeRef{.cdecl, dynlib: libname, importc: "LLVMInt1Type".}
-proc Int8Type*(): TypeRef{.cdecl, dynlib: libname, importc: "LLVMInt8Type".}
-proc Int16Type*(): TypeRef{.cdecl, dynlib: libname, importc: "LLVMInt16Type".}
-proc Int32Type*(): TypeRef{.cdecl, dynlib: libname, importc: "LLVMInt32Type".}
-proc Int64Type*(): TypeRef{.cdecl, dynlib: libname, importc: "LLVMInt64Type".}
-proc IntType*(NumBits: int32): TypeRef{.cdecl, dynlib: libname, 
-                                        importc: "LLVMIntType".}
-proc GetIntTypeWidth*(IntegerTy: TypeRef): int32{.cdecl, dynlib: libname, 
-    importc: "LLVMGetIntTypeWidth".}
-  # Operations on real types  
-proc FloatTypeInContext*(C: ContextRef): TypeRef{.cdecl, dynlib: libname, 
-    importc: "LLVMFloatTypeInContext".}
-proc DoubleTypeInContext*(C: ContextRef): TypeRef{.cdecl, dynlib: libname, 
-    importc: "LLVMDoubleTypeInContext".}
-proc X86FP80TypeInContext*(C: ContextRef): TypeRef{.cdecl, dynlib: libname, 
-    importc: "LLVMX86FP80TypeInContext".}
-proc FP128TypeInContext*(C: ContextRef): TypeRef{.cdecl, dynlib: libname, 
-    importc: "LLVMFP128TypeInContext".}
-proc PPCFP128TypeInContext*(C: ContextRef): TypeRef{.cdecl, dynlib: libname, 
-    importc: "LLVMPPCFP128TypeInContext".}
-proc FloatType*(): TypeRef{.cdecl, dynlib: libname, importc: "LLVMFloatType".}
-proc DoubleType*(): TypeRef{.cdecl, dynlib: libname, importc: "LLVMDoubleType".}
-proc X86FP80Type*(): TypeRef{.cdecl, dynlib: libname, importc: "LLVMX86FP80Type".}
-proc FP128Type*(): TypeRef{.cdecl, dynlib: libname, importc: "LLVMFP128Type".}
-proc PPCFP128Type*(): TypeRef{.cdecl, dynlib: libname, 
-                               importc: "LLVMPPCFP128Type".}
-  # Operations on function types  
-proc FunctionType*(ReturnType: TypeRef, ParamTypes: ptr TypeRef,
-                   ParamCount: int32, IsVarArg: int32): TypeRef {.
-    cdecl, dynlib: libname, importc: "LLVMFunctionType".}
-proc IsFunctionVarArg*(FunctionTy: TypeRef): int32{.cdecl, dynlib: libname, 
-    importc: "LLVMIsFunctionVarArg".}
-proc GetReturnType*(FunctionTy: TypeRef): TypeRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetReturnType".}
-proc CountParamTypes*(FunctionTy: TypeRef): int32{.cdecl, dynlib: libname, 
-    importc: "LLVMCountParamTypes".}
-proc GetParamTypes*(FunctionTy: TypeRef, Dest: ptr TypeRef){.cdecl, 
-    dynlib: libname, importc: "LLVMGetParamTypes".}
-  # Operations on struct types  
-proc StructTypeInContext*(C: ContextRef, ElementTypes: ptr TypeRef, 
-                          ElementCount: int32, isPacked: int32): TypeRef{.cdecl, 
-    dynlib: libname, importc: "LLVMStructTypeInContext".}
-proc StructType*(ElementTypes: ptr TypeRef, ElementCount: int32, isPacked: int32): TypeRef{.
-    cdecl, dynlib: libname, importc: "LLVMStructType".}
-proc CountStructElementTypes*(StructTy: TypeRef): int32{.cdecl, dynlib: libname, 
-    importc: "LLVMCountStructElementTypes".}
-proc GetStructElementTypes*(StructTy: TypeRef, Dest: ptr TypeRef){.cdecl, 
-    dynlib: libname, importc: "LLVMGetStructElementTypes".}
-proc IsPackedStruct*(StructTy: TypeRef): int32{.cdecl, dynlib: libname, 
-    importc: "LLVMIsPackedStruct".}
-  # Operations on array, pointer, and vector types (sequence types)  
-proc ArrayType*(ElementType: TypeRef, ElementCount: int32): TypeRef{.cdecl, 
-    dynlib: libname, importc: "LLVMArrayType".}
-proc PointerType*(ElementType: TypeRef, AddressSpace: int32): TypeRef{.cdecl, 
-    dynlib: libname, importc: "LLVMPointerType".}
-proc VectorType*(ElementType: TypeRef, ElementCount: int32): TypeRef{.cdecl, 
-    dynlib: libname, importc: "LLVMVectorType".}
-proc GetElementType*(Ty: TypeRef): TypeRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetElementType".}
-proc GetArrayLength*(ArrayTy: TypeRef): int32{.cdecl, dynlib: libname, 
-    importc: "LLVMGetArrayLength".}
-proc GetPointerAddressSpace*(PointerTy: TypeRef): int32{.cdecl, dynlib: libname, 
-    importc: "LLVMGetPointerAddressSpace".}
-proc GetVectorSize*(VectorTy: TypeRef): int32{.cdecl, dynlib: libname, 
-    importc: "LLVMGetVectorSize".}
-  # Operations on other types  
-proc VoidTypeInContext*(C: ContextRef): TypeRef{.cdecl, dynlib: libname, 
-    importc: "LLVMVoidTypeInContext".}
-proc LabelTypeInContext*(C: ContextRef): TypeRef{.cdecl, dynlib: libname, 
-    importc: "LLVMLabelTypeInContext".}
-proc OpaqueTypeInContext*(C: ContextRef): TypeRef{.cdecl, dynlib: libname, 
-    importc: "LLVMOpaqueTypeInContext".}
-proc VoidType*(): TypeRef{.cdecl, dynlib: libname, importc: "LLVMVoidType".}
-proc LabelType*(): TypeRef{.cdecl, dynlib: libname, importc: "LLVMLabelType".}
-proc OpaqueType*(): TypeRef{.cdecl, dynlib: libname, importc: "LLVMOpaqueType".}
-  # Operations on type handles  
-proc CreateTypeHandle*(PotentiallyAbstractTy: TypeRef): TypeHandleRef{.cdecl, 
-    dynlib: libname, importc: "LLVMCreateTypeHandle".}
-proc RefineType*(AbstractTy: TypeRef, ConcreteTy: TypeRef){.cdecl, 
-    dynlib: libname, importc: "LLVMRefineType".}
-proc ResolveTypeHandle*(TypeHandle: TypeHandleRef): TypeRef{.cdecl, 
-    dynlib: libname, importc: "LLVMResolveTypeHandle".}
-proc DisposeTypeHandle*(TypeHandle: TypeHandleRef){.cdecl, dynlib: libname, 
-    importc: "LLVMDisposeTypeHandle".}
-  # Operations on all values  
-proc TypeOf*(Val: ValueRef): TypeRef{.cdecl, dynlib: libname, 
-                                      importc: "LLVMTypeOf".}
-proc GetValueName*(Val: ValueRef): cstring{.cdecl, dynlib: libname, 
-    importc: "LLVMGetValueName".}
-proc SetValueName*(Val: ValueRef, Name: cstring){.cdecl, dynlib: libname, 
-    importc: "LLVMSetValueName".}
-proc DumpValue*(Val: ValueRef){.cdecl, dynlib: libname, importc: "LLVMDumpValue".}
-proc ReplaceAllUsesWith*(OldVal: ValueRef, NewVal: ValueRef){.cdecl, 
-    dynlib: libname, importc: "LLVMReplaceAllUsesWith".}
-  # Conversion functions. Return the input value if it is an instance of the
-  #   specified class, otherwise NULL. See llvm::dyn_cast_or_null<>.  
-proc IsAArgument*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAArgument".}
-proc IsABasicBlock*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsABasicBlock".}
-proc IsAInlineAsm*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAInlineAsm".}
-proc IsAUser*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-                                        importc: "LLVMIsAUser".}
-proc IsAConstant*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAConstant".}
-proc IsAConstantAggregateZero*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAConstantAggregateZero".}
-proc IsAConstantArray*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAConstantArray".}
-proc IsAConstantExpr*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAConstantExpr".}
-proc IsAConstantFP*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAConstantFP".}
-proc IsAConstantInt*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAConstantInt".}
-proc IsAConstantPointerNull*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAConstantPointerNull".}
-proc IsAConstantStruct*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAConstantStruct".}
-proc IsAConstantVector*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAConstantVector".}
-proc IsAGlobalValue*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAGlobalValue".}
-proc IsAFunction*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAFunction".}
-proc IsAGlobalAlias*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAGlobalAlias".}
-proc IsAGlobalVariable*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAGlobalVariable".}
-proc IsAUndefValue*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAUndefValue".}
-proc IsAInstruction*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAInstruction".}
-proc IsABinaryOperator*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsABinaryOperator".}
-proc IsACallInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsACallInst".}
-proc IsAIntrinsicInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAIntrinsicInst".}
-proc IsADbgInfoIntrinsic*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsADbgInfoIntrinsic".}
-proc IsADbgDeclareInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsADbgDeclareInst".}
-proc IsADbgFuncStartInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsADbgFuncStartInst".}
-proc IsADbgRegionEndInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsADbgRegionEndInst".}
-proc IsADbgRegionStartInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsADbgRegionStartInst".}
-proc IsADbgStopPointInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsADbgStopPointInst".}
-proc IsAEHSelectorInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAEHSelectorInst".}
-proc IsAMemIntrinsic*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAMemIntrinsic".}
-proc IsAMemCpyInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAMemCpyInst".}
-proc IsAMemMoveInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAMemMoveInst".}
-proc IsAMemSetInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAMemSetInst".}
-proc IsACmpInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsACmpInst".}
-proc IsAFCmpInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAFCmpInst".}
-proc IsAICmpInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAICmpInst".}
-proc IsAExtractElementInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAExtractElementInst".}
-proc IsAGetElementPtrInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAGetElementPtrInst".}
-proc IsAInsertElementInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAInsertElementInst".}
-proc IsAInsertValueInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAInsertValueInst".}
-proc IsAPHINode*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAPHINode".}
-proc IsASelectInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsASelectInst".}
-proc IsAShuffleVectorInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAShuffleVectorInst".}
-proc IsAStoreInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAStoreInst".}
-proc IsATerminatorInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsATerminatorInst".}
-proc IsABranchInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsABranchInst".}
-proc IsAInvokeInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAInvokeInst".}
-proc IsAReturnInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAReturnInst".}
-proc IsASwitchInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsASwitchInst".}
-proc IsAUnreachableInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAUnreachableInst".}
-proc IsAUnwindInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAUnwindInst".}
-proc IsAUnaryInstruction*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAUnaryInstruction".}
-proc IsAAllocationInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAAllocationInst".}
-proc IsAAllocaInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAAllocaInst".}
-proc IsACastInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsACastInst".}
-proc IsABitCastInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsABitCastInst".}
-proc IsAFPExtInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAFPExtInst".}
-proc IsAFPToSIInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAFPToSIInst".}
-proc IsAFPToUIInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAFPToUIInst".}
-proc IsAFPTruncInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAFPTruncInst".}
-proc IsAIntToPtrInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAIntToPtrInst".}
-proc IsAPtrToIntInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAPtrToIntInst".}
-proc IsASExtInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsASExtInst".}
-proc IsASIToFPInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsASIToFPInst".}
-proc IsATruncInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsATruncInst".}
-proc IsAUIToFPInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAUIToFPInst".}
-proc IsAZExtInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAZExtInst".}
-proc IsAExtractValueInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAExtractValueInst".}
-proc IsAFreeInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAFreeInst".}
-proc IsALoadInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsALoadInst".}
-proc IsAVAArgInst*(Val: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIsAVAArgInst".}
-  # Operations on Uses  
-proc GetFirstUse*(Val: ValueRef): UseIteratorRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetFirstUse".}
-proc GetNextUse*(U: UseIteratorRef): UseIteratorRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetNextUse".}
-proc GetUser*(U: UseIteratorRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetUser".}
-proc GetUsedValue*(U: UseIteratorRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetUsedValue".}
-  # Operations on Users  
-proc GetOperand*(Val: ValueRef, Index: int32): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetOperand".}
-  # Operations on constants of any type  
-proc ConstNull*(Ty: TypeRef): ValueRef{.cdecl, dynlib: libname, 
-                                        importc: "LLVMConstNull".}
-  # all zeroes  
-proc ConstAllOnes*(Ty: TypeRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMConstAllOnes".}
-  # only for int/vector  
-proc GetUndef*(Ty: TypeRef): ValueRef{.cdecl, dynlib: libname, 
-                                       importc: "LLVMGetUndef".}
-proc IsConstant*(Val: ValueRef): int32{.cdecl, dynlib: libname, 
-                                        importc: "LLVMIsConstant".}
-proc IsNull*(Val: ValueRef): int32{.cdecl, dynlib: libname, 
-                                    importc: "LLVMIsNull".}
-proc IsUndef*(Val: ValueRef): int32{.cdecl, dynlib: libname, 
-                                     importc: "LLVMIsUndef".}
-proc ConstPointerNull*(Ty: TypeRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMConstPointerNull".}
-  # Operations on scalar constants  
-proc ConstInt*(IntTy: TypeRef, N: int64, SignExtend: int32): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstInt".}
-proc ConstIntOfString*(IntTy: TypeRef, Text: cstring, Radix: byte): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMConstIntOfString".}
-proc ConstIntOfStringAndSize*(IntTy: TypeRef, Text: cstring, SLen: int32, 
-                              Radix: byte): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMConstIntOfStringAndSize".}
-proc ConstReal*(RealTy: TypeRef, N: float64): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMConstReal".}
-proc ConstRealOfString*(RealTy: TypeRef, Text: cstring): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstRealOfString".}
-proc ConstRealOfStringAndSize*(RealTy: TypeRef, Text: cstring, SLen: int32): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMConstRealOfStringAndSize".}
-proc ConstIntGetZExtValue*(ConstantVal: ValueRef): int64{.cdecl, 
-    dynlib: libname, importc: "LLVMConstIntGetZExtValue".}
-proc ConstIntGetSExtValue*(ConstantVal: ValueRef): int64{.cdecl, 
-    dynlib: libname, importc: "LLVMConstIntGetSExtValue".}
-  # Operations on composite constants  
-proc ConstStringInContext*(C: ContextRef, Str: cstring, len: int32, 
-                           DontNullTerminate: int32): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstStringInContext".}
-proc ConstStructInContext*(C: ContextRef, ConstantVals: ptr ValueRef,
-                           Count: int32, 
-                           isPacked: int32): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMConstStructInContext".}
-proc ConstString*(Str: cstring, len: int32, DontNullTerminate: int32): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMConstString".}
-proc ConstArray*(ElementTy: TypeRef, ConstantVals: ptr ValueRef, len: int32): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMConstArray".}
-proc ConstStruct*(ConstantVals: ptr ValueRef, Count: int32, isPacked: int32): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMConstStruct".}
-proc ConstVector*(ScalarConstantVals: ptr ValueRef, Size: int32): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstVector".}
-  # Constant expressions  
-proc GetConstOpcode*(ConstantVal: ValueRef): Opcode{.cdecl, dynlib: libname, 
-    importc: "LLVMGetConstOpcode".}
-proc AlignOf*(Ty: TypeRef): ValueRef{.cdecl, dynlib: libname, 
-                                      importc: "LLVMAlignOf".}
-proc SizeOf*(Ty: TypeRef): ValueRef{.cdecl, dynlib: libname, 
-                                     importc: "LLVMSizeOf".}
-proc ConstNeg*(ConstantVal: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMConstNeg".}
-proc ConstFNeg*(ConstantVal: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMConstFNeg".}
-proc ConstNot*(ConstantVal: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMConstNot".}
-proc ConstAdd*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstAdd".}
-proc ConstNSWAdd*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMConstNSWAdd".}
-proc ConstFAdd*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstFAdd".}
-proc ConstSub*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstSub".}
-proc ConstFSub*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstFSub".}
-proc ConstMul*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstMul".}
-proc ConstFMul*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstFMul".}
-proc ConstUDiv*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstUDiv".}
-proc ConstSDiv*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstSDiv".}
-proc ConstExactSDiv*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMConstExactSDiv".}
-proc ConstFDiv*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstFDiv".}
-proc ConstURem*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstURem".}
-proc ConstSRem*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstSRem".}
-proc ConstFRem*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstFRem".}
-proc ConstAnd*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstAnd".}
-proc ConstOr*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstOr".}
-proc ConstXor*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstXor".}
-proc ConstICmp*(Predicate: IntPredicate, LHSConstant: ValueRef, 
-                RHSConstant: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMConstICmp".}
-proc ConstFCmp*(Predicate: RealPredicate, LHSConstant: ValueRef, 
-                RHSConstant: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMConstFCmp".}
-proc ConstShl*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstShl".}
-proc ConstLShr*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstLShr".}
-proc ConstAShr*(LHSConstant: ValueRef, RHSConstant: ValueRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstAShr".}
-proc ConstGEP*(ConstantVal: ValueRef, ConstantIndices: ptr ValueRef, 
-               NumIndices: int32): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMConstGEP".}
-proc ConstInBoundsGEP*(ConstantVal: ValueRef, ConstantIndices: ptr ValueRef, 
-                       NumIndices: int32): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMConstInBoundsGEP".}
-proc ConstTrunc*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstTrunc".}
-proc ConstSExt*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstSExt".}
-proc ConstZExt*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstZExt".}
-proc ConstFPTrunc*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstFPTrunc".}
-proc ConstFPExt*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstFPExt".}
-proc ConstUIToFP*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstUIToFP".}
-proc ConstSIToFP*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstSIToFP".}
-proc ConstFPToUI*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstFPToUI".}
-proc ConstFPToSI*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstFPToSI".}
-proc ConstPtrToInt*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstPtrToInt".}
-proc ConstIntToPtr*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstIntToPtr".}
-proc ConstBitCast*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstBitCast".}
-proc ConstZExtOrBitCast*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMConstZExtOrBitCast".}
-proc ConstSExtOrBitCast*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMConstSExtOrBitCast".}
-proc ConstTruncOrBitCast*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMConstTruncOrBitCast".}
-proc ConstPointerCast*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstPointerCast".}
-proc ConstIntCast*(ConstantVal: ValueRef, ToType: TypeRef, isSigned: int32): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMConstIntCast".}
-proc ConstFPCast*(ConstantVal: ValueRef, ToType: TypeRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstFPCast".}
-proc ConstSelect*(ConstantCondition: ValueRef, ConstantIfTrue: ValueRef, 
-                  ConstantIfFalse: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMConstSelect".}
-proc ConstExtractElement*(VectorConstant: ValueRef, IndexConstant: ValueRef): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMConstExtractElement".}
-proc ConstInsertElement*(VectorConstant: ValueRef, 
-                         ElementValueConstant: ValueRef, IndexConstant: ValueRef): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMConstInsertElement".}
-proc ConstShuffleVector*(VectorAConstant: ValueRef, VectorBConstant: ValueRef, 
-                         MaskConstant: ValueRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstShuffleVector".}
-proc ConstExtractValue*(AggConstant: ValueRef, IdxList: ptr int32, NumIdx: int32): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMConstExtractValue".}
-proc ConstInsertValue*(AggConstant: ValueRef, ElementValueConstant: ValueRef, 
-                       IdxList: ptr int32, NumIdx: int32): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMConstInsertValue".}
-proc ConstInlineAsm*(Ty: TypeRef, AsmString: cstring, Constraints: cstring, 
-                     HasSideEffects: int32): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMConstInlineAsm".}
-  # Operations on global variables, functions, and aliases (globals)  
-proc GetGlobalParent*(Global: ValueRef): ModuleRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetGlobalParent".}
-proc IsDeclaration*(Global: ValueRef): int32{.cdecl, dynlib: libname, 
-    importc: "LLVMIsDeclaration".}
-proc GetLinkage*(Global: ValueRef): TLinkage{.cdecl, dynlib: libname, 
-    importc: "LLVMGetLinkage".}
-proc SetLinkage*(Global: ValueRef, Linkage: TLinkage){.cdecl, dynlib: libname, 
-    importc: "LLVMSetLinkage".}
-proc GetSection*(Global: ValueRef): cstring{.cdecl, dynlib: libname, 
-    importc: "LLVMGetSection".}
-proc SetSection*(Global: ValueRef, Section: cstring){.cdecl, dynlib: libname, 
-    importc: "LLVMSetSection".}
-proc GetVisibility*(Global: ValueRef): TVisibility{.cdecl, dynlib: libname, 
-    importc: "LLVMGetVisibility".}
-proc SetVisibility*(Global: ValueRef, Viz: TVisibility){.cdecl, dynlib: libname, 
-    importc: "LLVMSetVisibility".}
-proc GetAlignment*(Global: ValueRef): int32{.cdecl, dynlib: libname, 
-    importc: "LLVMGetAlignment".}
-proc SetAlignment*(Global: ValueRef, Bytes: int32){.cdecl, dynlib: libname, 
-    importc: "LLVMSetAlignment".}
-  # Operations on global variables  
-proc AddGlobal*(M: ModuleRef, Ty: TypeRef, Name: cstring): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMAddGlobal".}
-proc GetNamedGlobal*(M: ModuleRef, Name: cstring): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMGetNamedGlobal".}
-proc GetFirstGlobal*(M: ModuleRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetFirstGlobal".}
-proc GetLastGlobal*(M: ModuleRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetLastGlobal".}
-proc GetNextGlobal*(GlobalVar: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetNextGlobal".}
-proc GetPreviousGlobal*(GlobalVar: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetPreviousGlobal".}
-proc DeleteGlobal*(GlobalVar: ValueRef){.cdecl, dynlib: libname, 
-    importc: "LLVMDeleteGlobal".}
-proc GetInitializer*(GlobalVar: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetInitializer".}
-proc SetInitializer*(GlobalVar: ValueRef, ConstantVal: ValueRef){.cdecl, 
-    dynlib: libname, importc: "LLVMSetInitializer".}
-proc IsThreadLocal*(GlobalVar: ValueRef): int32{.cdecl, dynlib: libname, 
-    importc: "LLVMIsThreadLocal".}
-proc SetThreadLocal*(GlobalVar: ValueRef, IsThreadLocal: int32){.cdecl, 
-    dynlib: libname, importc: "LLVMSetThreadLocal".}
-proc IsGlobalConstant*(GlobalVar: ValueRef): int32{.cdecl, dynlib: libname, 
-    importc: "LLVMIsGlobalConstant".}
-proc SetGlobalConstant*(GlobalVar: ValueRef, IsConstant: int32){.cdecl, 
-    dynlib: libname, importc: "LLVMSetGlobalConstant".}
-  # Operations on aliases  
-proc AddAlias*(M: ModuleRef, Ty: TypeRef, Aliasee: ValueRef, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMAddAlias".}
-  # Operations on functions  
-proc AddFunction*(M: ModuleRef, Name: cstring, FunctionTy: TypeRef): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMAddFunction".}
-proc GetNamedFunction*(M: ModuleRef, Name: cstring): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMGetNamedFunction".}
-proc GetFirstFunction*(M: ModuleRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetFirstFunction".}
-proc GetLastFunction*(M: ModuleRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetLastFunction".}
-proc GetNextFunction*(Fn: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetNextFunction".}
-proc GetPreviousFunction*(Fn: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetPreviousFunction".}
-proc DeleteFunction*(Fn: ValueRef){.cdecl, dynlib: libname, 
-                                    importc: "LLVMDeleteFunction".}
-proc GetIntrinsicID*(Fn: ValueRef): int32{.cdecl, dynlib: libname, 
-    importc: "LLVMGetIntrinsicID".}
-proc GetFunctionCallConv*(Fn: ValueRef): int32{.cdecl, dynlib: libname, 
-    importc: "LLVMGetFunctionCallConv".}
-proc SetFunctionCallConv*(Fn: ValueRef, CC: int32){.cdecl, dynlib: libname, 
-    importc: "LLVMSetFunctionCallConv".}
-proc GetGC*(Fn: ValueRef): cstring{.cdecl, dynlib: libname, importc: "LLVMGetGC".}
-proc SetGC*(Fn: ValueRef, Name: cstring){.cdecl, dynlib: libname, 
-    importc: "LLVMSetGC".}
-proc AddFunctionAttr*(Fn: ValueRef, PA: Attribute){.cdecl, dynlib: libname, 
-    importc: "LLVMAddFunctionAttr".}
-proc GetFunctionAttr*(Fn: ValueRef): Attribute{.cdecl, dynlib: libname, 
-    importc: "LLVMGetFunctionAttr".}
-proc RemoveFunctionAttr*(Fn: ValueRef, PA: Attribute){.cdecl, dynlib: libname, 
-    importc: "LLVMRemoveFunctionAttr".}
-  # Operations on parameters  
-proc CountParams*(Fn: ValueRef): int32{.cdecl, dynlib: libname, 
-                                        importc: "LLVMCountParams".}
-proc GetParams*(Fn: ValueRef, Params: ptr ValueRef){.cdecl, dynlib: libname, 
-    importc: "LLVMGetParams".}
-proc GetParam*(Fn: ValueRef, Index: int32): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetParam".}
-proc GetParamParent*(Inst: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetParamParent".}
-proc GetFirstParam*(Fn: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetFirstParam".}
-proc GetLastParam*(Fn: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetLastParam".}
-proc GetNextParam*(Arg: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetNextParam".}
-proc GetPreviousParam*(Arg: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetPreviousParam".}
-proc AddAttribute*(Arg: ValueRef, PA: Attribute){.cdecl, dynlib: libname, 
-    importc: "LLVMAddAttribute".}
-proc RemoveAttribute*(Arg: ValueRef, PA: Attribute){.cdecl, dynlib: libname, 
-    importc: "LLVMRemoveAttribute".}
-proc GetAttribute*(Arg: ValueRef): Attribute{.cdecl, dynlib: libname, 
-    importc: "LLVMGetAttribute".}
-proc SetParamAlignment*(Arg: ValueRef, align: int32){.cdecl, dynlib: libname, 
-    importc: "LLVMSetParamAlignment".}
-  # Operations on basic blocks  
-proc BasicBlockAsValue*(BB: BasicBlockRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBasicBlockAsValue".}
-proc ValueIsBasicBlock*(Val: ValueRef): int32{.cdecl, dynlib: libname, 
-    importc: "LLVMValueIsBasicBlock".}
-proc ValueAsBasicBlock*(Val: ValueRef): BasicBlockRef{.cdecl, dynlib: libname, 
-    importc: "LLVMValueAsBasicBlock".}
-proc GetBasicBlockParent*(BB: BasicBlockRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetBasicBlockParent".}
-proc CountBasicBlocks*(Fn: ValueRef): int32{.cdecl, dynlib: libname, 
-    importc: "LLVMCountBasicBlocks".}
-proc GetBasicBlocks*(Fn: ValueRef, BasicBlocks: ptr BasicBlockRef){.cdecl, 
-    dynlib: libname, importc: "LLVMGetBasicBlocks".}
-proc GetFirstBasicBlock*(Fn: ValueRef): BasicBlockRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetFirstBasicBlock".}
-proc GetLastBasicBlock*(Fn: ValueRef): BasicBlockRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetLastBasicBlock".}
-proc GetNextBasicBlock*(BB: BasicBlockRef): BasicBlockRef{.cdecl, 
-    dynlib: libname, importc: "LLVMGetNextBasicBlock".}
-proc GetPreviousBasicBlock*(BB: BasicBlockRef): BasicBlockRef{.cdecl, 
-    dynlib: libname, importc: "LLVMGetPreviousBasicBlock".}
-proc GetEntryBasicBlock*(Fn: ValueRef): BasicBlockRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetEntryBasicBlock".}
-proc AppendBasicBlockInContext*(C: ContextRef, Fn: ValueRef, Name: cstring): BasicBlockRef{.
-    cdecl, dynlib: libname, importc: "LLVMAppendBasicBlockInContext".}
-proc InsertBasicBlockInContext*(C: ContextRef, BB: BasicBlockRef, Name: cstring): BasicBlockRef{.
-    cdecl, dynlib: libname, importc: "LLVMInsertBasicBlockInContext".}
-proc AppendBasicBlock*(Fn: ValueRef, Name: cstring): BasicBlockRef{.cdecl, 
-    dynlib: libname, importc: "LLVMAppendBasicBlock".}
-proc InsertBasicBlock*(InsertBeforeBB: BasicBlockRef, Name: cstring): BasicBlockRef{.
-    cdecl, dynlib: libname, importc: "LLVMInsertBasicBlock".}
-proc DeleteBasicBlock*(BB: BasicBlockRef){.cdecl, dynlib: libname, 
-    importc: "LLVMDeleteBasicBlock".}
-  # Operations on instructions  
-proc GetInstructionParent*(Inst: ValueRef): BasicBlockRef{.cdecl, 
-    dynlib: libname, importc: "LLVMGetInstructionParent".}
-proc GetFirstInstruction*(BB: BasicBlockRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetFirstInstruction".}
-proc GetLastInstruction*(BB: BasicBlockRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetLastInstruction".}
-proc GetNextInstruction*(Inst: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetNextInstruction".}
-proc GetPreviousInstruction*(Inst: ValueRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMGetPreviousInstruction".}
-  # Operations on call sites  
-proc SetInstructionCallConv*(Instr: ValueRef, CC: int32){.cdecl, 
-    dynlib: libname, importc: "LLVMSetInstructionCallConv".}
-proc GetInstructionCallConv*(Instr: ValueRef): int32{.cdecl, dynlib: libname, 
-    importc: "LLVMGetInstructionCallConv".}
-proc AddInstrAttribute*(Instr: ValueRef, index: int32, para3: Attribute){.cdecl, 
-    dynlib: libname, importc: "LLVMAddInstrAttribute".}
-proc RemoveInstrAttribute*(Instr: ValueRef, index: int32, para3: Attribute){.
-    cdecl, dynlib: libname, importc: "LLVMRemoveInstrAttribute".}
-proc SetInstrParamAlignment*(Instr: ValueRef, index: int32, align: int32){.
-    cdecl, dynlib: libname, importc: "LLVMSetInstrParamAlignment".}
-  # Operations on call instructions (only)  
-proc IsTailCall*(CallInst: ValueRef): int32{.cdecl, dynlib: libname, 
-    importc: "LLVMIsTailCall".}
-proc SetTailCall*(CallInst: ValueRef, IsTailCall: int32){.cdecl, 
-    dynlib: libname, importc: "LLVMSetTailCall".}
-  # Operations on phi nodes  
-proc AddIncoming*(PhiNode: ValueRef, IncomingValues: ptr ValueRef, 
-                  IncomingBlocks: ptr BasicBlockRef, Count: int32){.cdecl, 
-    dynlib: libname, importc: "LLVMAddIncoming".}
-proc CountIncoming*(PhiNode: ValueRef): int32{.cdecl, dynlib: libname, 
-    importc: "LLVMCountIncoming".}
-proc GetIncomingValue*(PhiNode: ValueRef, Index: int32): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMGetIncomingValue".}
-proc GetIncomingBlock*(PhiNode: ValueRef, Index: int32): BasicBlockRef{.cdecl, 
-    dynlib: libname, importc: "LLVMGetIncomingBlock".}
-  #===-- Instruction builders ----------------------------------------------=== 
-  # An instruction builder represents a point within a basic block, and is the
-  # * exclusive means of building instructions using the C interface.
-  #  
-proc CreateBuilderInContext*(C: ContextRef): BuilderRef{.cdecl, dynlib: libname, 
-    importc: "LLVMCreateBuilderInContext".}
-proc CreateBuilder*(): BuilderRef{.cdecl, dynlib: libname, 
-                                   importc: "LLVMCreateBuilder".}
-proc PositionBuilder*(Builder: BuilderRef, theBlock: BasicBlockRef, 
-                      Instr: ValueRef){.cdecl, dynlib: libname, 
-                                        importc: "LLVMPositionBuilder".}
-proc PositionBuilderBefore*(Builder: BuilderRef, Instr: ValueRef){.cdecl, 
-    dynlib: libname, importc: "LLVMPositionBuilderBefore".}
-proc PositionBuilderAtEnd*(Builder: BuilderRef, theBlock: BasicBlockRef){.cdecl, 
-    dynlib: libname, importc: "LLVMPositionBuilderAtEnd".}
-proc GetInsertBlock*(Builder: BuilderRef): BasicBlockRef{.cdecl, 
-    dynlib: libname, importc: "LLVMGetInsertBlock".}
-proc ClearInsertionPosition*(Builder: BuilderRef){.cdecl, dynlib: libname, 
-    importc: "LLVMClearInsertionPosition".}
-proc InsertIntoBuilder*(Builder: BuilderRef, Instr: ValueRef){.cdecl, 
-    dynlib: libname, importc: "LLVMInsertIntoBuilder".}
-proc InsertIntoBuilderWithName*(Builder: BuilderRef, Instr: ValueRef, 
-                                Name: cstring){.cdecl, dynlib: libname, 
-    importc: "LLVMInsertIntoBuilderWithName".}
-proc DisposeBuilder*(Builder: BuilderRef){.cdecl, dynlib: libname, 
-    importc: "LLVMDisposeBuilder".}
-  # Terminators  
-proc BuildRetVoid*(para1: BuilderRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildRetVoid".}
-proc BuildRet*(para1: BuilderRef, V: ValueRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMBuildRet".}
-proc BuildAggregateRet*(para1: BuilderRef, RetVals: ptr ValueRef, N: int32): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildAggregateRet".}
-proc BuildBr*(para1: BuilderRef, Dest: BasicBlockRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMBuildBr".}
-proc BuildCondBr*(para1: BuilderRef, Cond: ValueRef, ThenBranch: BasicBlockRef, 
-                  ElseBranch: BasicBlockRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildCondBr".}
-proc BuildSwitch*(para1: BuilderRef, V: ValueRef, ElseBranch: BasicBlockRef, 
-                  NumCases: int32): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildSwitch".}
-proc BuildInvoke*(para1: BuilderRef, Fn: ValueRef, Args: ptr ValueRef, 
-                  NumArgs: int32, ThenBranch: BasicBlockRef, 
-                  Catch: BasicBlockRef, Name: cstring): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMBuildInvoke".}
-proc BuildUnwind*(para1: BuilderRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildUnwind".}
-proc BuildUnreachable*(para1: BuilderRef): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildUnreachable".}
-  # Add a case to the switch instruction  
-proc AddCase*(Switch: ValueRef, OnVal: ValueRef, Dest: BasicBlockRef){.cdecl, 
-    dynlib: libname, importc: "LLVMAddCase".}
-  # Arithmetic  
-proc BuildAdd*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildAdd".}
-proc BuildNSWAdd*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildNSWAdd".}
-proc BuildFAdd*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildFAdd".}
-proc BuildSub*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildSub".}
-proc BuildFSub*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildFSub".}
-proc BuildMul*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildMul".}
-proc BuildFMul*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildFMul".}
-proc BuildUDiv*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildUDiv".}
-proc BuildSDiv*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildSDiv".}
-proc BuildExactSDiv*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, 
-                     Name: cstring): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildExactSDiv".}
-proc BuildFDiv*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildFDiv".}
-proc BuildURem*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildURem".}
-proc BuildSRem*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildSRem".}
-proc BuildFRem*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildFRem".}
-proc BuildShl*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildShl".}
-proc BuildLShr*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildLShr".}
-proc BuildAShr*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildAShr".}
-proc BuildAnd*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildAnd".}
-proc BuildOr*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildOr".}
-proc BuildXor*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildXor".}
-proc BuildNeg*(para1: BuilderRef, V: ValueRef, Name: cstring): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMBuildNeg".}
-proc BuildFNeg*(para1: BuilderRef, V: ValueRef, Name: cstring): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMBuildFNeg".}
-proc BuildNot*(para1: BuilderRef, V: ValueRef, Name: cstring): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMBuildNot".}
-  # Memory  
-proc BuildMalloc*(para1: BuilderRef, Ty: TypeRef, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildMalloc".}
-proc BuildArrayMalloc*(para1: BuilderRef, Ty: TypeRef, Val: ValueRef, 
-                       Name: cstring): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildArrayMalloc".}
-proc BuildAlloca*(para1: BuilderRef, Ty: TypeRef, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildAlloca".}
-proc BuildArrayAlloca*(para1: BuilderRef, Ty: TypeRef, Val: ValueRef, 
-                       Name: cstring): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildArrayAlloca".}
-proc BuildFree*(para1: BuilderRef, PointerVal: ValueRef): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMBuildFree".}
-proc BuildLoad*(para1: BuilderRef, PointerVal: ValueRef, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildLoad".}
-proc BuildStore*(para1: BuilderRef, Val: ValueRef, thePtr: ValueRef): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildStore".}
-proc BuildGEP*(B: BuilderRef, Pointer: ValueRef, Indices: ptr ValueRef, 
-               NumIndices: int32, Name: cstring): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMBuildGEP".}
-proc BuildInBoundsGEP*(B: BuilderRef, Pointer: ValueRef, Indices: ptr ValueRef, 
-                       NumIndices: int32, Name: cstring): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMBuildInBoundsGEP".}
-proc BuildStructGEP*(B: BuilderRef, Pointer: ValueRef, Idx: int32, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildStructGEP".}
-proc BuildGlobalString*(B: BuilderRef, Str: cstring, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildGlobalString".}
-proc BuildGlobalStringPtr*(B: BuilderRef, Str: cstring, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildGlobalStringPtr".}
-  # Casts  
-proc BuildTrunc*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, 
-                 Name: cstring): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildTrunc".}
-proc BuildZExt*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildZExt".}
-proc BuildSExt*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildSExt".}
-proc BuildFPToUI*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, 
-                  Name: cstring): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildFPToUI".}
-proc BuildFPToSI*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, 
-                  Name: cstring): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildFPToSI".}
-proc BuildUIToFP*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, 
-                  Name: cstring): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildUIToFP".}
-proc BuildSIToFP*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, 
-                  Name: cstring): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildSIToFP".}
-proc BuildFPTrunc*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, 
-                   Name: cstring): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildFPTrunc".}
-proc BuildFPExt*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, 
-                 Name: cstring): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildFPExt".}
-proc BuildPtrToInt*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, 
-                    Name: cstring): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildPtrToInt".}
-proc BuildIntToPtr*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, 
-                    Name: cstring): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildIntToPtr".}
-proc BuildBitCast*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, 
-                   Name: cstring): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildBitCast".}
-proc BuildZExtOrBitCast*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, 
-                         Name: cstring): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildZExtOrBitCast".}
-proc BuildSExtOrBitCast*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, 
-                         Name: cstring): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildSExtOrBitCast".}
-proc BuildTruncOrBitCast*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, 
-                          Name: cstring): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildTruncOrBitCast".}
-proc BuildPointerCast*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, 
-                       Name: cstring): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildPointerCast".}
-proc BuildIntCast*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, 
-                   Name: cstring): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildIntCast".}
-proc BuildFPCast*(para1: BuilderRef, Val: ValueRef, DestTy: TypeRef, 
-                  Name: cstring): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildFPCast".}
-  # Comparisons  
-proc BuildICmp*(para1: BuilderRef, Op: IntPredicate, LHS: ValueRef, 
-                RHS: ValueRef, Name: cstring): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildICmp".}
-proc BuildFCmp*(para1: BuilderRef, Op: RealPredicate, LHS: ValueRef, 
-                RHS: ValueRef, Name: cstring): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildFCmp".}
-  # Miscellaneous instructions  
-proc BuildPhi*(para1: BuilderRef, Ty: TypeRef, Name: cstring): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMBuildPhi".}
-proc BuildCall*(para1: BuilderRef, Fn: ValueRef, Args: ptr ValueRef, 
-                NumArgs: int32, Name: cstring): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMBuildCall".}
-proc BuildSelect*(para1: BuilderRef, Cond: ValueRef, ThenBranch: ValueRef, 
-                  ElseBranch: ValueRef, Name: cstring): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMBuildSelect".}
-proc BuildVAArg*(para1: BuilderRef, List: ValueRef, Ty: TypeRef, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildVAArg".}
-proc BuildExtractElement*(para1: BuilderRef, VecVal: ValueRef, Index: ValueRef, 
-                          Name: cstring): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildExtractElement".}
-proc BuildInsertElement*(para1: BuilderRef, VecVal: ValueRef, EltVal: ValueRef, 
-                         Index: ValueRef, Name: cstring): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMBuildInsertElement".}
-proc BuildShuffleVector*(para1: BuilderRef, V1: ValueRef, V2: ValueRef, 
-                         Mask: ValueRef, Name: cstring): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMBuildShuffleVector".}
-proc BuildExtractValue*(para1: BuilderRef, AggVal: ValueRef, Index: int32, 
-                        Name: cstring): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildExtractValue".}
-proc BuildInsertValue*(para1: BuilderRef, AggVal: ValueRef, EltVal: ValueRef, 
-                       Index: int32, Name: cstring): ValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMBuildInsertValue".}
-proc BuildIsNull*(para1: BuilderRef, Val: ValueRef, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildIsNull".}
-proc BuildIsNotNull*(para1: BuilderRef, Val: ValueRef, Name: cstring): ValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMBuildIsNotNull".}
-proc BuildPtrDiff*(para1: BuilderRef, LHS: ValueRef, RHS: ValueRef, 
-                   Name: cstring): ValueRef{.cdecl, dynlib: libname, 
-    importc: "LLVMBuildPtrDiff".}
-  #===-- Module providers --------------------------------------------------=== 
-  # Encapsulates the module M in a module provider, taking ownership of the
-  # module.
-  # See the constructor llvm::ExistingModuleProvider::ExistingModuleProvider.
-  #  
-proc CreateModuleProviderForExistingModule*(M: ModuleRef): ModuleProviderRef{.
-    cdecl, dynlib: libname, importc: "LLVMCreateModuleProviderForExistingModule".}
-  # Destroys the module provider MP as well as the contained module.
-  # See the destructor llvm::ModuleProvider::~ModuleProvider.
-  #  
-proc DisposeModuleProvider*(MP: ModuleProviderRef){.cdecl, dynlib: libname, 
-    importc: "LLVMDisposeModuleProvider".}
-  #===-- Memory buffers ----------------------------------------------------=== 
-proc CreateMemoryBufferWithContentsOfFile*(Path: cstring, 
-    OutMemBuf: ptr MemoryBufferRef, OutMessage: var cstring): int32{.cdecl, 
-    dynlib: libname, importc: "LLVMCreateMemoryBufferWithContentsOfFile".}
-proc CreateMemoryBufferWithSTDIN*(OutMemBuf: ptr MemoryBufferRef, 
-                                  OutMessage: var cstring): int32{.cdecl, 
-    dynlib: libname, importc: "LLVMCreateMemoryBufferWithSTDIN".}
-proc DisposeMemoryBuffer*(MemBuf: MemoryBufferRef){.cdecl, dynlib: libname, 
-    importc: "LLVMDisposeMemoryBuffer".}
-  #===-- Pass Managers -----------------------------------------------------=== 
-  # Constructs a new whole-module pass pipeline. This type of pipeline is
-  #    suitable for link-time optimization and whole-module transformations.
-  #    See llvm::PassManager::PassManager.  
-proc CreatePassManager*(): PassManagerRef{.cdecl, dynlib: libname, 
-    importc: "LLVMCreatePassManager".}
-  #    Constructs a new function-by-function pass pipeline over the module
-  #    provider. It does not take ownership of the module provider. This type of
-  #    pipeline is suitable for code generation and JIT compilation tasks.
-  #    See llvm::FunctionPassManager::FunctionPassManager.  
-proc CreateFunctionPassManager*(MP: ModuleProviderRef): PassManagerRef{.cdecl, 
-    dynlib: libname, importc: "LLVMCreateFunctionPassManager".}
-  # Initializes, executes on the provided module, and finalizes all of the
-  #    passes scheduled in the pass manager. Returns 1 if any of the passes
-  #    modified the module, 0 otherwise. See llvm::PassManager::run(Module&).  
-proc RunPassManager*(PM: PassManagerRef, M: ModuleRef): int32{.cdecl, 
-    dynlib: libname, importc: "LLVMRunPassManager".}
-  # Initializes all of the function passes scheduled in the function pass
-  #    manager. Returns 1 if any of the passes modified the module, 0 otherwise.
-  #    See llvm::FunctionPassManager::doInitialization.  
-proc InitializeFunctionPassManager*(FPM: PassManagerRef): int32{.cdecl, 
-    dynlib: libname, importc: "LLVMInitializeFunctionPassManager".}
-  # Executes all of the function passes scheduled in the function pass manager
-  # on the provided function. Returns 1 if any of the passes modified the
-  # function, false otherwise.
-  # See llvm::FunctionPassManager::run(Function&).  
-proc RunFunctionPassManager*(FPM: PassManagerRef, F: ValueRef): int32{.cdecl, 
-    dynlib: libname, importc: "LLVMRunFunctionPassManager".}
-  # Finalizes all of the function passes scheduled in in the function pass
-  #    manager. Returns 1 if any of the passes modified the module, 0 otherwise.
-  #    See llvm::FunctionPassManager::doFinalization.  
-proc FinalizeFunctionPassManager*(FPM: PassManagerRef): int32{.cdecl, 
-    dynlib: libname, importc: "LLVMFinalizeFunctionPassManager".}
-  # Frees the memory of a pass pipeline. For function pipelines, does not free
-  #    the module provider.
-  #    See llvm::PassManagerBase::~PassManagerBase.  
-proc DisposePassManager*(PM: PassManagerRef){.cdecl, dynlib: libname, 
-    importc: "LLVMDisposePassManager".}
-  # Analysis.h  
-  # verifier will print to stderr and abort()  
-  # verifier will print to stderr and return 1  
-  # verifier will just return 1  
-type 
-  VerifierFailureAction* = enum  # Verifies that a module is valid, taking the specified action if not.
-                                 #   Optionally returns a human-readable description of any invalid constructs.
-                                 #   OutMessage must be disposed with LLVMDisposeMessage.  
-    AbortProcessAction, PrintMessageAction, ReturnStatusAction
-
-proc VerifyModule*(M: ModuleRef, Action: VerifierFailureAction, 
-                   OutMessage: var cstring): int32{.cdecl, dynlib: libname, 
-    importc: "LLVMVerifyModule".}
-  # Verifies that a single function is valid, taking the specified action. Useful
-  #   for debugging.  
-proc VerifyFunction*(Fn: ValueRef, Action: VerifierFailureAction): int32{.cdecl, 
-    dynlib: libname, importc: "LLVMVerifyFunction".}
-  # Open up a ghostview window that displays the CFG of the current function.
-  #   Useful for debugging.  
-proc ViewFunctionCFG*(Fn: ValueRef){.cdecl, dynlib: libname, 
-                                     importc: "LLVMViewFunctionCFG".}
-proc ViewFunctionCFGOnly*(Fn: ValueRef){.cdecl, dynlib: libname, 
-    importc: "LLVMViewFunctionCFGOnly".}
-  # BitReader.h  
-  # Builds a module from the bitcode in the specified memory buffer, returning a
-  #   reference to the module via the OutModule parameter. Returns 0 on success.
-  #   Optionally returns a human-readable error message via OutMessage.  
-proc ParseBitcode*(MemBuf: MemoryBufferRef, OutModule: var ModuleRef, 
-                   OutMessage: var cstring): int32{.cdecl, dynlib: libname, 
-    importc: "LLVMParseBitcode".}
-proc ParseBitcodeInContext*(ContextRef: ContextRef, MemBuf: MemoryBufferRef, 
-                            OutModule: var ModuleRef, OutMessage: var cstring): int32{.
-    cdecl, dynlib: libname, importc: "LLVMParseBitcodeInContext".}
-  # Reads a module from the specified path, returning via the OutMP parameter
-  #   a module provider which performs lazy deserialization. Returns 0 on success.
-  #   Optionally returns a human-readable error message via OutMessage.  
-proc GetBitcodeModuleProvider*(MemBuf: MemoryBufferRef, 
-                               OutMP: var ModuleProviderRef,
-                               OutMessage: var cstring): int32{.
-    cdecl, dynlib: libname, importc: "LLVMGetBitcodeModuleProvider".}
-proc GetBitcodeModuleProviderInContext*(ContextRef: ContextRef, 
-                                        MemBuf: MemoryBufferRef, 
-                                        OutMP: var ModuleProviderRef, 
-                                        OutMessage: var cstring): int32{.cdecl, 
-    dynlib: libname, importc: "LLVMGetBitcodeModuleProviderInContext".}
-  # BitWriter.h  
-  #===-- Operations on modules ---------------------------------------------=== 
-  # Writes a module to an open file descriptor. Returns 0 on success.
-  #   Closes the Handle. Use dup first if this is not what you want.  
-proc WriteBitcodeToFileHandle*(M: ModuleRef, Handle: int32): int32{.cdecl, 
-    dynlib: libname, importc: "LLVMWriteBitcodeToFileHandle".}
-  # Writes a module to the specified path. Returns 0 on success.  
-proc WriteBitcodeToFile*(M: ModuleRef, Path: cstring): int32{.cdecl, 
-    dynlib: libname, importc: "LLVMWriteBitcodeToFile".}
-  # Target.h  
-const 
-  BigEndian* = 0
-  LittleEndian* = 1
-
-type 
-  ByteOrdering* = int32
-  OpaqueTargetData {.pure} = object
-  StructLayout {.pure} = object
-  TargetDataRef* = ref OpaqueTargetData
-  StructLayoutRef* = ref StructLayout
-  
-  
-#===-- Target Data -------------------------------------------------------=== 
-# Creates target data from a target layout string.
-# See the constructor llvm::TargetData::TargetData.  
-
-proc CreateTargetData*(StringRep: cstring): TargetDataRef{.cdecl, 
-    dynlib: libname, importc: "LLVMCreateTargetData".}
-  # Adds target data information to a pass manager. This does not take ownership
-  #    of the target data.
-  #    See the method llvm::PassManagerBase::add.  
-proc AddTargetData*(para1: TargetDataRef, para2: PassManagerRef){.cdecl, 
-    dynlib: libname, importc: "LLVMAddTargetData".}
-  # Converts target data to a target layout string. The string must be disposed
-  #    with LLVMDisposeMessage.
-  #    See the constructor llvm::TargetData::TargetData.  
-proc CopyStringRepOfTargetData*(para1: TargetDataRef): cstring{.cdecl, 
-    dynlib: libname, importc: "LLVMCopyStringRepOfTargetData".}
-  # Returns the byte order of a target, either LLVMBigEndian or
-  #    LLVMLittleEndian.
-  #    See the method llvm::TargetData::isLittleEndian.  
-proc ByteOrder*(para1: TargetDataRef): ByteOrdering{.cdecl, dynlib: libname, 
-    importc: "LLVMByteOrder".}
-  # Returns the pointer size in bytes for a target.
-  #    See the method llvm::TargetData::getPointerSize.  
-proc PointerSize*(para1: TargetDataRef): int32{.cdecl, dynlib: libname, 
-    importc: "LLVMPointerSize".}
-  # Returns the integer type that is the same size as a pointer on a target.
-  #    See the method llvm::TargetData::getIntPtrType.  
-proc IntPtrType*(para1: TargetDataRef): TypeRef{.cdecl, dynlib: libname, 
-    importc: "LLVMIntPtrType".}
-  # Computes the size of a type in bytes for a target.
-  #    See the method llvm::TargetData::getTypeSizeInBits.  
-proc SizeOfTypeInBits*(para1: TargetDataRef, para2: TypeRef): int64{.cdecl, 
-    dynlib: libname, importc: "LLVMSizeOfTypeInBits".}
-  # Computes the storage size of a type in bytes for a target.
-  #    See the method llvm::TargetData::getTypeStoreSize.  
-proc StoreSizeOfType*(para1: TargetDataRef, para2: TypeRef): int64{.cdecl, 
-    dynlib: libname, importc: "LLVMStoreSizeOfType".}
-  # Computes the ABI size of a type in bytes for a target.
-  #    See the method llvm::TargetData::getTypeAllocSize.  
-proc ABISizeOfType*(para1: TargetDataRef, para2: TypeRef): int64{.cdecl, 
-    dynlib: libname, importc: "LLVMABISizeOfType".}
-  # Computes the ABI alignment of a type in bytes for a target.
-  #    See the method llvm::TargetData::getTypeABISize.  
-proc ABIAlignmentOfType*(para1: TargetDataRef, para2: TypeRef): int32{.cdecl, 
-    dynlib: libname, importc: "LLVMABIAlignmentOfType".}
-  # Computes the call frame alignment of a type in bytes for a target.
-  #    See the method llvm::TargetData::getTypeABISize.  
-proc CallFrameAlignmentOfType*(para1: TargetDataRef, para2: TypeRef): int32{.
-    cdecl, dynlib: libname, importc: "LLVMCallFrameAlignmentOfType".}
-  # Computes the preferred alignment of a type in bytes for a target.
-  #    See the method llvm::TargetData::getTypeABISize.  
-proc PreferredAlignmentOfType*(para1: TargetDataRef, para2: TypeRef): int32{.
-    cdecl, dynlib: libname, importc: "LLVMPreferredAlignmentOfType".}
-  # Computes the preferred alignment of a global variable in bytes for a target.
-  #    See the method llvm::TargetData::getPreferredAlignment.  
-proc PreferredAlignmentOfGlobal*(para1: TargetDataRef, GlobalVar: ValueRef): int32{.
-    cdecl, dynlib: libname, importc: "LLVMPreferredAlignmentOfGlobal".}
-  # Computes the structure element that contains the byte offset for a target.
-  #    See the method llvm::StructLayout::getElementContainingOffset.  
-proc ElementAtOffset*(para1: TargetDataRef, StructTy: TypeRef, Offset: int64): int32{.
-    cdecl, dynlib: libname, importc: "LLVMElementAtOffset".}
-  # Computes the byte offset of the indexed struct element for a target.
-  #    See the method llvm::StructLayout::getElementContainingOffset.  
-proc OffsetOfElement*(para1: TargetDataRef, StructTy: TypeRef, Element: int32): int64{.
-    cdecl, dynlib: libname, importc: "LLVMOffsetOfElement".}
-  # Struct layouts are speculatively cached. If a TargetDataRef is alive when
-  #    types are being refined and removed, this method must be called whenever a
-  #    struct type is removed to avoid a dangling pointer in this cache.
-  #    See the method llvm::TargetData::InvalidateStructLayoutInfo.  
-proc InvalidateStructLayout*(para1: TargetDataRef, StructTy: TypeRef){.cdecl, 
-    dynlib: libname, importc: "LLVMInvalidateStructLayout".}
-  # Deallocates a TargetData.
-  #    See the destructor llvm::TargetData::~TargetData.  
-proc DisposeTargetData*(para1: TargetDataRef){.cdecl, dynlib: libname, 
-    importc: "LLVMDisposeTargetData".}
-  # ExecutionEngine.h  
-proc LinkInJIT*(){.cdecl, dynlib: libname, importc: "LLVMLinkInJIT".}
-proc LinkInInterpreter*(){.cdecl, dynlib: libname, 
-                           importc: "LLVMLinkInInterpreter".}
-type 
-  OpaqueGenericValue {.pure} = object
-  OpaqueExecutionEngine {.pure} = object
-  GenericValueRef* = OpaqueGenericValue
-  ExecutionEngineRef* = OpaqueExecutionEngine
-  
-#===-- Operations on generic values --------------------------------------=== 
-
-proc CreateGenericValueOfInt*(Ty: TypeRef, N: int64, IsSigned: int32): GenericValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMCreateGenericValueOfInt".}
-proc CreateGenericValueOfPointer*(P: pointer): GenericValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMCreateGenericValueOfPointer".}
-proc CreateGenericValueOfFloat*(Ty: TypeRef, N: float64): GenericValueRef{.
-    cdecl, dynlib: libname, importc: "LLVMCreateGenericValueOfFloat".}
-proc GenericValueIntWidth*(GenValRef: GenericValueRef): int32{.cdecl, 
-    dynlib: libname, importc: "LLVMGenericValueIntWidth".}
-proc GenericValueToInt*(GenVal: GenericValueRef, IsSigned: int32): int64{.cdecl, 
-    dynlib: libname, importc: "LLVMGenericValueToInt".}
-proc GenericValueToPointer*(GenVal: GenericValueRef): pointer{.cdecl, 
-    dynlib: libname, importc: "LLVMGenericValueToPointer".}
-proc GenericValueToFloat*(TyRef: TypeRef, GenVal: GenericValueRef): float64{.
-    cdecl, dynlib: libname, importc: "LLVMGenericValueToFloat".}
-proc DisposeGenericValue*(GenVal: GenericValueRef){.cdecl, dynlib: libname, 
-    importc: "LLVMDisposeGenericValue".}
-  
-#===-- Operations on execution engines -----------------------------------=== 
-proc CreateExecutionEngine*(OutEE: var ExecutionEngineRef, MP: ModuleProviderRef, 
-                            OutError: var cstring): int32{.cdecl, dynlib: libname, 
-    importc: "LLVMCreateExecutionEngine".}
-proc CreateInterpreter*(OutInterp: var ExecutionEngineRef, MP: ModuleProviderRef, 
-                        OutError: var cstring): int32{.cdecl, dynlib: libname, 
-    importc: "LLVMCreateInterpreter".}
-proc CreateJITCompiler*(OutJIT: var ExecutionEngineRef, MP: ModuleProviderRef, 
-                        OptLevel: int32, OutError: var cstring): int32{.cdecl, 
-    dynlib: libname, importc: "LLVMCreateJITCompiler".}
-proc DisposeExecutionEngine*(EE: ExecutionEngineRef){.cdecl, dynlib: libname, 
-    importc: "LLVMDisposeExecutionEngine".}
-proc RunStaticConstructors*(EE: ExecutionEngineRef){.cdecl, dynlib: libname, 
-    importc: "LLVMRunStaticConstructors".}
-proc RunStaticDestructors*(EE: ExecutionEngineRef){.cdecl, dynlib: libname, 
-    importc: "LLVMRunStaticDestructors".}
-
-proc RunFunctionAsMain*(EE: ExecutionEngineRef, F: ValueRef, ArgC: int32, 
-                        ArgV: cstringArray, EnvP: cstringArray): int32{.cdecl, 
-    dynlib: libname, importc: "LLVMRunFunctionAsMain".}
-proc RunFunction*(EE: ExecutionEngineRef, F: ValueRef, NumArgs: int32, 
-                  Args: ptr GenericValueRef): GenericValueRef{.cdecl, 
-    dynlib: libname, importc: "LLVMRunFunction".}
-proc FreeMachineCodeForFunction*(EE: ExecutionEngineRef, F: ValueRef){.cdecl, 
-    dynlib: libname, importc: "LLVMFreeMachineCodeForFunction".}
-proc AddModuleProvider*(EE: ExecutionEngineRef, MP: ModuleProviderRef){.cdecl, 
-    dynlib: libname, importc: "LLVMAddModuleProvider".}
-proc RemoveModuleProvider*(EE: ExecutionEngineRef, MP: ModuleProviderRef, 
-                           OutMod: var ModuleRef, OutError: var cstring): int32{.cdecl, 
-    dynlib: libname, importc: "LLVMRemoveModuleProvider".}
-proc FindFunction*(EE: ExecutionEngineRef, Name: cstring, OutFn: var ValueRef): int32{.
-    cdecl, dynlib: libname, importc: "LLVMFindFunction".}
-proc GetExecutionEngineTargetData*(EE: ExecutionEngineRef): TargetDataRef{.
-    cdecl, dynlib: libname, importc: "LLVMGetExecutionEngineTargetData".}
-proc AddGlobalMapping*(EE: ExecutionEngineRef, Global: ValueRef, 
-                       theAddr: pointer){.cdecl, dynlib: libname, 
-    importc: "LLVMAddGlobalMapping".}
-proc GetPointerToGlobal*(EE: ExecutionEngineRef, Global: ValueRef): pointer{.
-    cdecl, dynlib: libname, importc: "LLVMGetPointerToGlobal".}
-
-# LinkTimeOptimizer.h  
-# This provides a dummy type for pointers to the LTO object. 
-type 
-  lto_t* = pointer
-  lto_status* = enum 
-    LTO_UNKNOWN, LTO_OPT_SUCCESS, LTO_READ_SUCCESS, LTO_READ_FAILURE, 
-    LTO_WRITE_FAILURE, LTO_NO_TARGET, LTO_NO_WORK, LTO_MODULE_MERGE_FAILURE, 
-    LTO_ASM_FAILURE, LTO_NULL_OBJECT
-  lto_status_t* = lto_status
-  # This provides C interface to initialize link time optimizer. This allows 
-  # linker to use dlopen() interface to dynamically load LinkTimeOptimizer. 
-  # extern "C" helps, because dlopen() interface uses name to find the symbol. 
-
-proc create_optimizer*(): lto_t{.cdecl, dynlib: libname, 
-                                 importc: "llvm_create_optimizer".}
-proc destroy_optimizer*(lto: lto_t){.cdecl, dynlib: libname, 
-                                     importc: "llvm_destroy_optimizer".}
-proc read_object_file*(lto: lto_t, input_filename: cstring): lto_status_t{.
-    cdecl, dynlib: libname, importc: "llvm_read_object_file".}
-proc optimize_modules*(lto: lto_t, output_filename: cstring): lto_status_t{.
-    cdecl, dynlib: libname, importc: "llvm_optimize_modules".}
-  
-# lto.h  
-const 
-  LTO_API_VERSION* = 3        # log2 of alignment  
-
-type 
-  lto_symbol_attributes* = enum 
-    SYMBOL_ALIGNMENT_MASK = 0x0000001F,
-    SYMBOL_PERMISSIONS_RODATA = 0x00000080,
-    SYMBOL_PERMISSIONS_CODE = 0x000000A0,
-    SYMBOL_PERMISSIONS_DATA = 0x000000C0, 
-    SYMBOL_PERMISSIONS_MASK = 0x000000E0, 
-    
-    SYMBOL_DEFINITION_REGULAR = 0x00000100, 
-    SYMBOL_DEFINITION_TENTATIVE = 0x00000200, 
-    SYMBOL_DEFINITION_WEAK = 0x00000300, 
-    SYMBOL_DEFINITION_UNDEFINED = 0x00000400, 
-    SYMBOL_DEFINITION_WEAKUNDEF = 0x00000500,
-    SYMBOL_DEFINITION_MASK = 0x00000700, 
-    SYMBOL_SCOPE_INTERNAL = 0x00000800,
-    
-    SYMBOL_SCOPE_HIDDEN = 0x00001000,
-    SYMBOL_SCOPE_DEFAULT = 0x00001800,
-    SYMBOL_SCOPE_PROTECTED = 0x00002000,
-    SYMBOL_SCOPE_MASK = 0x00003800, 
-  lto_debug_model* = enum 
-    DEBUG_MODEL_NONE = 0, DEBUG_MODEL_DWARF = 1
-  lto_codegen_model* = enum
-    CODEGEN_PIC_MODEL_STATIC = 0, CODEGEN_PIC_MODEL_DYNAMIC = 1, 
-    CODEGEN_PIC_MODEL_DYNAMIC_NO_PIC = 2
-  
-  LTOModule {.pure} = object
-  LTOCodeGenerator {.pure} = object
-  lto_module_t* = ref LTOModule
-  lto_code_gen_t* = ref LTOCodeGenerator
-
-proc lto_get_version*(): cstring{.cdecl, dynlib: libname, 
-                                  importc: "lto_get_version".}
-  #
-  # Returns the last error string or NULL if last operation was sucessful.
-  #  
-proc lto_get_error_message*(): cstring{.cdecl, dynlib: libname, 
-                                        importc: "lto_get_error_message".}
-  #
-  # Checks if a file is a loadable object file.
-  #  
-proc lto_module_is_object_file*(path: cstring): bool{.cdecl, dynlib: libname, 
-    importc: "lto_module_is_object_file".}
-  #
-  # Checks if a file is a loadable object compiled for requested target.
-  #  
-proc lto_module_is_object_file_for_target*(path: cstring, 
-    target_triple_prefix: cstring): bool{.cdecl, dynlib: libname, 
-    importc: "lto_module_is_object_file_for_target".}
-  #
-  # Checks if a buffer is a loadable object file.
-  #  
-proc lto_module_is_object_file_in_memory*(mem: pointer, len: int): bool{.
-    cdecl, dynlib: libname, importc: "lto_module_is_object_file_in_memory".}
-  #
-  # Checks if a buffer is a loadable object compiled for requested target.
-  #  
-proc lto_module_is_object_file_in_memory_for_target*(mem: pointer, len: int, 
-    target_triple_prefix: cstring): bool{.cdecl, dynlib: libname, 
-    importc: "lto_module_is_object_file_in_memory_for_target".}
-  #
-  # Loads an object file from disk.
-  # Returns NULL on error (check lto_get_error_message() for details).
-  #  
-proc lto_module_create*(path: cstring): lto_module_t{.cdecl, dynlib: libname, 
-    importc: "lto_module_create".}
-  #
-  # Loads an object file from memory.
-  # Returns NULL on error (check lto_get_error_message() for details).
-  #  
-proc lto_module_create_from_memory*(mem: pointer, len: int): lto_module_t{.
-    cdecl, dynlib: libname, importc: "lto_module_create_from_memory".}
-  #
-  # Frees all memory internally allocated by the module.
-  # Upon return the lto_module_t is no longer valid.
-  #  
-proc lto_module_dispose*(module: lto_module_t){.cdecl, dynlib: libname, 
-    importc: "lto_module_dispose".}
-  #
-  # Returns triple string which the object module was compiled under.
-  #  
-proc lto_module_get_target_triple*(module: lto_module_t): cstring{.cdecl, 
-    dynlib: libname, importc: "lto_module_get_target_triple".}
-  #
-  # Returns the number of symbols in the object module.
-  #  
-proc lto_module_get_num_symbols*(module: lto_module_t): int32{.cdecl, 
-    dynlib: libname, importc: "lto_module_get_num_symbols".}
-  #
-  # Returns the name of the ith symbol in the object module.
-  #  
-proc lto_module_get_symbol_name*(module: lto_module_t, index: int32): cstring{.
-    cdecl, dynlib: libname, importc: "lto_module_get_symbol_name".}
-  #
-  # Returns the attributes of the ith symbol in the object module.
-  #  
-proc lto_module_get_symbol_attribute*(module: lto_module_t, index: int32): lto_symbol_attributes{.
-    cdecl, dynlib: libname, importc: "lto_module_get_symbol_attribute".}
-  #
-  # Instantiates a code generator.
-  # Returns NULL on error (check lto_get_error_message() for details).
-  #  
-proc lto_codegen_create*(): lto_code_gen_t{.cdecl, dynlib: libname, 
-    importc: "lto_codegen_create".}
-  #
-  # Frees all code generator and all memory it internally allocated.
-  # Upon return the lto_code_gen_t is no longer valid.
-  #  
-proc lto_codegen_dispose*(para1: lto_code_gen_t){.cdecl, dynlib: libname, 
-    importc: "lto_codegen_dispose".}
-  #
-  # Add an object module to the set of modules for which code will be generated.
-  # Returns true on error (check lto_get_error_message() for details).
-  #  
-proc lto_codegen_add_module*(cg: lto_code_gen_t, module: lto_module_t): bool{.
-    cdecl, dynlib: libname, importc: "lto_codegen_add_module".}
-  #
-  # Sets if debug info should be generated.
-  # Returns true on error (check lto_get_error_message() for details).
-  #  
-proc lto_codegen_set_debug_model*(cg: lto_code_gen_t, para2: lto_debug_model): bool{.
-    cdecl, dynlib: libname, importc: "lto_codegen_set_debug_model".}
-  #
-  # Sets which PIC code model to generated.
-  # Returns true on error (check lto_get_error_message() for details).
-  #  
-proc lto_codegen_set_pic_model*(cg: lto_code_gen_t, para2: lto_codegen_model): bool{.
-    cdecl, dynlib: libname, importc: "lto_codegen_set_pic_model".}
-  #
-  # Sets the location of the "gcc" to run. If not set, libLTO will search for
-  # "gcc" on the path.
-  #  
-proc lto_codegen_set_gcc_path*(cg: lto_code_gen_t, path: cstring){.cdecl, 
-    dynlib: libname, importc: "lto_codegen_set_gcc_path".}
-  #
-  # Sets the location of the assembler tool to run. If not set, libLTO
-  # will use gcc to invoke the assembler.
-  #  
-proc lto_codegen_set_assembler_path*(cg: lto_code_gen_t, path: cstring){.cdecl, 
-    dynlib: libname, importc: "lto_codegen_set_assembler_path".}
-  #
-  # Adds to a list of all global symbols that must exist in the final
-  # generated code.  If a function is not listed, it might be
-  # inlined into every usage and optimized away.
-  #  
-proc lto_codegen_add_must_preserve_symbol*(cg: lto_code_gen_t, symbol: cstring){.
-    cdecl, dynlib: libname, importc: "lto_codegen_add_must_preserve_symbol".}
-  #
-  # Writes a new object file at the specified path that contains the
-  # merged contents of all modules added so far.
-  # Returns true on error (check lto_get_error_message() for details).
-  #  
-proc lto_codegen_write_merged_modules*(cg: lto_code_gen_t, path: cstring): bool{.
-    cdecl, dynlib: libname, importc: "lto_codegen_write_merged_modules".}
-  #
-  # Generates code for all added modules into one native object file.
-  # On sucess returns a pointer to a generated mach-o/ELF buffer and
-  # length set to the buffer size.  The buffer is owned by the 
-  # lto_code_gen_t and will be freed when lto_codegen_dispose()
-  # is called, or lto_codegen_compile() is called again.
-  # On failure, returns NULL (check lto_get_error_message() for details).
-  #  
-proc lto_codegen_compile*(cg: lto_code_gen_t, len: var int): pointer{.cdecl, 
-    dynlib: libname, importc: "lto_codegen_compile".}
-  #
-  # Sets options to help debug codegen bugs.
-  #  
-proc lto_codegen_debug_options*(cg: lto_code_gen_t, para2: cstring){.cdecl, 
-    dynlib: libname, importc: "lto_codegen_debug_options".}
diff --git a/tests/accept/run/mfriends.nim b/tests/accept/run/mfriends.nim
new file mode 100644
index 000000000..f1c663655
--- /dev/null
+++ b/tests/accept/run/mfriends.nim
@@ -0,0 +1,11 @@
+
+type
+  TMyObj = object 
+    x: int
+    
+proc gen*[T](): T = 
+  var d: TMyObj
+  # access private field here
+  d.x = 3
+  result = d.x
+
diff --git a/tests/accept/run/tfriends.nim b/tests/accept/run/tfriends.nim
new file mode 100644
index 000000000..1e70d50a5
--- /dev/null
+++ b/tests/accept/run/tfriends.nim
@@ -0,0 +1,11 @@
+discard """
+  output: "3"
+"""
+
+# Tests that a generic instantiation from a different module may access
+# private object fields:
+
+import mfriends
+
+echo gen[int]()
+
diff --git a/todo.txt b/todo.txt
index e7959a930..6a8fa2b63 100755
--- a/todo.txt
+++ b/todo.txt
@@ -16,11 +16,12 @@ Version 0.8.14
 incremental compilation
 -----------------------
 
+- object types need to be compared by container ID!
 - adapt thread var implementation to care about the new merge operation
 - write test cases: needs test script support
-  - test thread var
-  - test DLL interfacing!
   - stress test with whole compiler
+  - test DLL interfacing!
+  - test thread var
 
 - automate tests:
   - test basic recompilation scheme