diff --git a/cbits/support.cpp b/cbits/support.cpp
--- a/cbits/support.cpp
+++ b/cbits/support.cpp
@@ -10,6 +10,7 @@
 
 #include "llvm-c/ExecutionEngine.h"
 #include "llvm/ExecutionEngine/ExecutionEngine.h"
+#include "llvm/IR/Instruction.h"
 #include "llvm/IR/IRBuilder.h"
 #include "llvm/IR/Module.h"
 #include "llvm/IR/Operator.h"
@@ -54,11 +55,11 @@
 }
 
 
-const char *LLVMGetHostCPUName(size_t &len) {
-  StringRef r = sys::getHostCPUName();
-  len = r.size();
-  return r.data();
+#if HS_LLVM_VERSION < 700
+char *LLVMGetHostCPUName(void) {
+  return strdup(sys::getHostCPUName().data());
 }
+#endif
 
 
 
@@ -148,12 +149,20 @@
 void LLVMSetHasAllowReciprocal(LLVMValueRef Instr, LLVMBool B) {
   (unwrap<Instruction>(Instr))->setHasAllowReciprocal(B);
 }
-void LLVMSetFastMathFlags(LLVMValueRef Instr, unsigned Flags) {
-  FastMathFlags FMF;
-  if (Flags & FastMathFlags::NoNaNs)          FMF.setNoNaNs();
-  if (Flags & FastMathFlags::NoInfs)          FMF.setNoInfs();
-  if (Flags & FastMathFlags::NoSignedZeros)   FMF.setNoSignedZeros();
-  if (Flags & FastMathFlags::AllowReciprocal) FMF.setAllowReciprocal();
-  if (Flags & FastMathFlags::UnsafeAlgebra)   FMF.setUnsafeAlgebra();
-  (unwrap<Instruction>(Instr))->setFastMathFlags(FMF);
+void LLVMSetHasAllowReassoc(LLVMValueRef Instr, LLVMBool B) {
+#if HS_LLVM_VERSION >= 600
+  (unwrap<Instruction>(Instr))->setHasAllowReassoc(B);
+#endif
+}
+/* It is not exported by Instruction.h
+void LLVMSetHasAllowContract(LLVMValueRef Instr, LLVMBool B) {
+#if HS_LLVM_VERSION >= 500
+  (unwrap<Instruction>(Instr))->setHasAllowContract(B);
+#endif
+}
+*/
+void LLVMSetHasApproxFunc(LLVMValueRef Instr, LLVMBool B) {
+#if HS_LLVM_VERSION >= 600
+  (unwrap<Instruction>(Instr))->setHasApproxFunc(B);
+#endif
 }
diff --git a/example/JIT.hs b/example/JIT.hs
--- a/example/JIT.hs
+++ b/example/JIT.hs
@@ -10,6 +10,7 @@
 import qualified LLVM.FFI.Transforms.PassManagerBuilder as PMB
 import qualified LLVM.FFI.Transforms.Scalar as Transform
 import qualified LLVM.FFI.ExecutionEngine as EE
+import qualified LLVM.FFI.Support.Host as Host
 import qualified LLVM.FFI.BitWriter as BW
 import qualified LLVM.FFI.Core as Core
 import qualified LLVM.Target.Native as Native
@@ -54,6 +55,9 @@
 main = do
    Native.initializeNativeTarget
 
+   bracket Host.getHostCPUName Core.disposeMessage $ \strPtr ->
+      putStrLn =<< CStr.peekCString strPtr
+
    modul <- withCString "_module" Core.moduleCreateWithName
    withCString Core.hostTriple $ Core.setTarget modul
    vectorType <-
@@ -98,8 +102,7 @@
            void $ withCString "" $ Core.buildFAdd builder loaded loaded
            zero <- Core.constNull vectorType
            add <- withCString "" $ Core.buildFAdd builder loaded zero
-           let true = 1
-           Core.setHasNoSignedZeros add true
+           Core.setHasNoSignedZeros add Core.true
            return add
 
    void $ Core.buildStore builder callRound param
diff --git a/flatpak/llvm-3.9.1.json b/flatpak/llvm-3.9.1.json
new file mode 100644
--- /dev/null
+++ b/flatpak/llvm-3.9.1.json
@@ -0,0 +1,27 @@
+{
+    "cleanup": [
+        "/bin",
+        "/include",
+        "/lib/debug",
+        "/lib/libLLVM*.a",
+        "/lib/LLVMHello.so",
+        "/share"
+    ],
+    "sources": [
+        {
+            "url": "http://releases.llvm.org/3.9.1/llvm-3.9.1.src.tar.xz",
+            "type": "archive",
+            "sha256": "1fd90354b9cf19232e8f168faf2220e79be555df3aa743242700879e8fd329ee"
+        }
+    ],
+    "config-opts": [
+        "-DCMAKE_BUILD_TYPE=Release",
+        "-DLLVM_ENABLE_ASSERTIONS=ON",
+        "-DLLVM_BUILD_TOOLS=OFF",
+        "-DLLVM_INCLUDE_EXAMPLES=OFF",
+        "-DLLVM_BUILD_LLVM_DYLIB=ON"
+    ],
+    "name": "llvm-3.9",
+    "buildsystem": "cmake",
+    "builddir": true
+}
diff --git a/include/support.h b/include/support.h
--- a/include/support.h
+++ b/include/support.h
@@ -1,7 +1,9 @@
 #ifndef LLVM_HS_SUPPORT_H
 #define LLVM_HS_SUPPORT_H
 
+#include "llvm-c/ExecutionEngine.h"
 
+
 #ifdef __cplusplus
 typedef llvm::StringMap<bool> LLVMFeatureMap;
 typedef llvm::StringMap<bool>::const_iterator LLVMFeatureIterator;
@@ -26,7 +28,9 @@
 unsigned LLVMCmpInstGetPredicate(LLVMValueRef cmpinst);
 
 
-const char *LLVMGetHostCPUName(size_t &len);
+#if HS_LLVM_VERSION < 700
+char *LLVMGetHostCPUName(void);
+#endif
 
 
 typedef LLVMFeatureMap *LLVMFeatureMapRef;
@@ -56,7 +60,9 @@
 void LLVMSetHasNoInfs(LLVMValueRef Instr, LLVMBool B);
 void LLVMSetHasNoSignedZeros(LLVMValueRef Instr, LLVMBool B);
 void LLVMSetHasAllowReciprocal(LLVMValueRef Instr, LLVMBool B);
-void LLVMSetFastMathFlags(LLVMValueRef Instr, unsigned Flags);
+void LLVMSetHasAllowReassoc(LLVMValueRef Instr, LLVMBool B);
+void LLVMSetHasAllowContract(LLVMValueRef Instr, LLVMBool B);
+void LLVMSetHasApproxFunc(LLVMValueRef Instr, LLVMBool B);
 
 
 #ifdef __cplusplus
diff --git a/llvm-ffi.cabal b/llvm-ffi.cabal
--- a/llvm-ffi.cabal
+++ b/llvm-ffi.cabal
@@ -1,6 +1,6 @@
 Cabal-Version: 2.2
 Name:          llvm-ffi
-Version:       3.8.1.2
+Version:       3.9.0
 License:       BSD-3-Clause
 License-File:  LICENSE
 Synopsis:      FFI bindings to the LLVM compiler toolkit.
@@ -17,7 +17,7 @@
   to the LLVM installation directories manually.
   On Ubuntu this would look like this:
   .
-  > cabal install --extra-include-dirs=/usr/lib/llvm-3.8/include --extra-lib-dirs=/usr/lib/llvm-3.8/lib llvm-ffi
+  > cabal install --extra-include-dirs=/usr/lib/llvm-3.9/include --extra-lib-dirs=/usr/lib/llvm-3.9/lib llvm-ffi
   .
   You can store such paths permanently in a @pkg-config@ file like @llvm.pc@.
   The optimal way would be if LLVM installations or GNU/Linux distributions
@@ -29,7 +29,7 @@
   > cabal install -fpkgConfig
   .
   We try to stay up to date with LLVM releases.
-  The current version of this package is compatible with LLVM 3.4-3.8.
+  The current version of this package is compatible with LLVM 3.4-3.9.
   Please understand that the package may or may not work
   against older LLVM releases.
   .
@@ -52,6 +52,7 @@
   tool/ltrace.config
   tool/ltrace.readme
   flatpak/llvm-3.8.1.json
+  flatpak/llvm-3.9.1.json
 
 Flag developer
   Description: developer mode - warnings let compilation fail
@@ -87,12 +88,16 @@
   Description: use LLVM-3.7 instead of latest supported LLVM
   Default: False
 
+Flag llvm308
+  Description: use LLVM-3.8 instead of latest supported LLVM
+  Default: False
+
 Source-Repository head
   Type:     darcs
   Location: http://hub.darcs.net/thielema/llvm-ffi/
 
 Source-Repository this
-  Tag:      3.8.1.2
+  Tag:      3.9.0
   Type:     darcs
   Location: http://hub.darcs.net/thielema/llvm-ffi/
 
@@ -123,6 +128,7 @@
       LLVM.Target.Native
 
   Other-modules:
+      LLVM.FFI.Base
       LLVM.Target.ARM
       LLVM.Target.CppBackend
       LLVM.Target.Hexagon
@@ -139,7 +145,7 @@
       If flag(specificPkgConfig)
         PkgConfig-Depends: llvm-3.4
       Else
-        PkgConfig-Depends: llvm == 3.4
+        PkgConfig-Depends: llvm == 3.4.*
     Else
       Extra-Libraries: LLVM-3.4
     CC-Options: -DHS_LLVM_VERSION=304
@@ -151,7 +157,7 @@
         If flag(specificPkgConfig)
           PkgConfig-Depends: llvm-3.5
         Else
-          PkgConfig-Depends: llvm == 3.5
+          PkgConfig-Depends: llvm == 3.5.*
       Else
         Extra-Libraries: LLVM-3.5
       CC-Options: -DHS_LLVM_VERSION=305
@@ -163,7 +169,7 @@
           If flag(specificPkgConfig)
             PkgConfig-Depends: llvm-3.6
           Else
-            PkgConfig-Depends: llvm == 3.6
+            PkgConfig-Depends: llvm == 3.6.*
         Else
           Extra-Libraries: LLVM-3.6
         CC-Options: -DHS_LLVM_VERSION=306
@@ -175,23 +181,35 @@
             If flag(specificPkgConfig)
               PkgConfig-Depends: llvm-3.7
             Else
-              PkgConfig-Depends: llvm == 3.7
+              PkgConfig-Depends: llvm == 3.7.*
           Else
             Extra-Libraries: LLVM-3.7
           CC-Options: -DHS_LLVM_VERSION=307
           Cxx-Options: -DHS_LLVM_VERSION=307
           CPP-Options: -DHS_LLVM_VERSION=307
         Else
-          If flag(pkgConfig)
-            If flag(specificPkgConfig)
-              PkgConfig-Depends: llvm-3.8
+          If flag(llvm308)
+            If flag(pkgConfig)
+              If flag(specificPkgConfig)
+                PkgConfig-Depends: llvm-3.8
+              Else
+                PkgConfig-Depends: llvm == 3.8.*
             Else
-              PkgConfig-Depends: llvm == 3.8
+              Extra-Libraries: LLVM-3.8
+            CC-Options: -DHS_LLVM_VERSION=308
+            Cxx-Options: -DHS_LLVM_VERSION=308
+            CPP-Options: -DHS_LLVM_VERSION=308
           Else
-            Extra-Libraries: LLVM-3.8
-          CC-Options: -DHS_LLVM_VERSION=308
-          Cxx-Options: -DHS_LLVM_VERSION=308
-          CPP-Options: -DHS_LLVM_VERSION=308
+            If flag(pkgConfig)
+              If flag(specificPkgConfig)
+                PkgConfig-Depends: llvm-3.9
+              Else
+                PkgConfig-Depends: llvm == 3.9.*
+            Else
+              Extra-Libraries: LLVM-3.9
+            CC-Options: -DHS_LLVM_VERSION=309
+            Cxx-Options: -DHS_LLVM_VERSION=309
+            CPP-Options: -DHS_LLVM_VERSION=309
 
   CC-Options: -DHAVE_LLVM_SUPPORT_DYNAMICLIBRARY_H=1
   CPP-Options: -D__STDC_CONSTANT_MACROS -D__STDC_FORMAT_MACROS
diff --git a/src/LLVM/FFI/Base.hsc b/src/LLVM/FFI/Base.hsc
new file mode 100644
--- /dev/null
+++ b/src/LLVM/FFI/Base.hsc
@@ -0,0 +1,30 @@
+{-# LANGUAGE Safe #-}
+module LLVM.FFI.Base where
+
+import qualified Data.Bool as Bool
+import Data.Int (Int32)
+
+import Prelude
+         (Eq, Enum, Show, fromIntegral, show, fromEnum, toEnum, (.), (==))
+
+#include <llvm-c/Core.h>
+
+
+newtype Bool = Bool (#type LLVMBool)
+    deriving (Eq)
+
+instance Enum Bool where
+    fromEnum (Bool b) = fromIntegral b
+    toEnum = Bool . fromIntegral
+
+instance Show Bool where
+    show b = if b == false then "false" else "true"
+
+false, true :: Bool
+false = Bool 0; true = Bool 1
+
+consBool :: Bool.Bool -> Bool
+consBool = toEnum . fromEnum
+
+deconsBool :: Bool -> Bool.Bool
+deconsBool = toEnum . fromEnum
diff --git a/src/LLVM/FFI/Core.hsc b/src/LLVM/FFI/Core.hsc
--- a/src/LLVM/FFI/Core.hsc
+++ b/src/LLVM/FFI/Core.hsc
@@ -19,11 +19,11 @@
       initializeCore
 
     -- * Boolean values
-    , Bool(Bool)
-    , false
-    , true
-    , consBool
-    , deconsBool
+    , LLVM.Bool(LLVM.Bool)
+    , LLVM.false
+    , LLVM.true
+    , LLVM.consBool
+    , LLVM.deconsBool
 
     -- * Error handling
     , disposeMessage
@@ -269,20 +269,14 @@
     , blockAddress
 
     -- ** Floating point attributes
+    , setFastMath
     , setHasUnsafeAlgebra
     , setHasNoNaNs
     , setHasNoInfs
     , setHasNoSignedZeros
     , setHasAllowReciprocal
-
-    , FastMathFlags(..)
-    , FastMathFlagSet
-    , noNaNs
-    , noInfs
-    , noSignedZeros
-    , allowReciprocal
-    , unsafeAlgebra
-    , setFastMathFlags
+    , setHasAllowReassoc
+    , setHasApproxFunc
 
     -- ** Support operations and types
     , Linkage(..)
@@ -574,20 +568,18 @@
 
     ) where
 
+import qualified LLVM.FFI.Base as LLVM
+
 import qualified Foreign.C.Types as C
 import Foreign.C.String (CString)
 import Foreign.Ptr (Ptr, FunPtr)
 
-import qualified Data.EnumBitSet as EnumSet
 import Data.Typeable (Typeable)
 
-import Data.Int (Int32)
-
-import qualified Data.Bool as Bool
 import Prelude
          (IO, Eq, Ord, Int, Bounded, Enum, Show, Read, String,
           ($), (++), (.), (==), error,
-           fmap, fromIntegral, show, fromEnum, toEnum, )
+           fmap, fromIntegral, show, toEnum, )
 
 
 type CDouble  = C.CDouble
@@ -601,26 +593,6 @@
 #include <llvm-c/Core.h>
 
 
-newtype Bool = Bool (#type LLVMBool)
-    deriving (Eq)
-
-instance Enum Bool where
-    fromEnum (Bool b) = fromIntegral b
-    toEnum = Bool . fromIntegral
-
-instance Show Bool where
-    show b = if b == false then "false" else "true"
-
-false, true :: Bool
-false = Bool 0; true = Bool 1
-
-consBool :: Bool.Bool -> Bool
-consBool = toEnum . fromEnum
-
-deconsBool :: Bool -> Bool.Bool
-deconsBool = toEnum . fromEnum
-
-
 data Module
     deriving (Typeable)
 type ModuleRef = Ptr Module
@@ -903,7 +875,7 @@
     :: CString -> IO ModuleRef
 foreign import ccall unsafe "LLVMModuleCreateWithNameInContext"
         moduleCreateWithNameInContext
-    :: CString -> IO ModuleRef
+    :: CString -> ContextRef -> IO ModuleRef
 foreign import ccall unsafe "LLVMDisposeModule" disposeModule
     :: ModuleRef -> IO ()
 foreign import ccall unsafe "&LLVMDisposeModule" ptrDisposeModule
@@ -929,12 +901,31 @@
 foreign import ccall unsafe "LLVMGetModuleContext" getModuleContext
     :: ModuleRef -> IO ContextRef
 
+-- ** Functions
+foreign import ccall unsafe "LLVMAddFunction" addFunction
+    :: ModuleRef                -- ^ module
+    -> CString                  -- ^ name
+    -> TypeRef                  -- ^ type
+    -> IO ValueRef
+foreign import ccall unsafe "LLVMGetNamedFunction" getNamedFunction
+    :: ModuleRef                -- ^ module
+    -> CString                  -- ^ name
+    -> IO ValueRef              -- ^ function (@nullPtr@ if not found)
+foreign import ccall unsafe "LLVMGetFirstFunction" getFirstFunction
+    :: ModuleRef -> IO ValueRef
+foreign import ccall unsafe "LLVMGetLastFunction" getLastFunction
+    :: ModuleRef -> IO ValueRef
+foreign import ccall unsafe "LLVMGetNextFunction" getNextFunction
+    :: ValueRef -> IO ValueRef
+foreign import ccall unsafe "LLVMGetPreviousFunction" getPreviousFunction
+    :: ValueRef -> IO ValueRef
 
+
 -- ** Types
 foreign import ccall unsafe "LLVMGetTypeKind" getTypeKindCUInt
     :: TypeRef -> IO CUInt
 foreign import ccall unsafe "LLVMTypeIsSized" typeIsSized
-    :: TypeRef -> IO Bool
+    :: TypeRef -> IO LLVM.Bool
 foreign import ccall unsafe "LLVMGetTypeContext" getTypeContext
     :: TypeRef -> IO ContextRef
 
@@ -985,12 +976,12 @@
         :: TypeRef              -- ^ return type
         -> Ptr TypeRef          -- ^ array of argument types
         -> CUInt                -- ^ number of elements in array
-        -> Bool                 -- ^ non-zero if function is varargs
+        -> LLVM.Bool                 -- ^ non-zero if function is varargs
         -> IO TypeRef
 
 -- | Indicate whether a function takes varargs.
 foreign import ccall unsafe "LLVMIsFunctionVarArg" isFunctionVarArg
-        :: TypeRef -> IO Bool
+        :: TypeRef -> IO LLVM.Bool
 
 -- | Give a function's return type.
 foreign import ccall unsafe "LLVMGetReturnType" getReturnType
@@ -1007,23 +998,23 @@
 
 -- ** Struct Type
 foreign import ccall unsafe "LLVMStructTypeInContext" structTypeInContext
-    :: ContextRef -> (Ptr TypeRef) -> CUInt -> Bool -> IO TypeRef
+    :: ContextRef -> (Ptr TypeRef) -> CUInt -> LLVM.Bool -> IO TypeRef
 foreign import ccall unsafe "LLVMStructType" structType
-    :: Ptr TypeRef -> CUInt -> Bool -> IO TypeRef
+    :: Ptr TypeRef -> CUInt -> LLVM.Bool -> IO TypeRef
 foreign import ccall unsafe "LLVMStructCreateNamed" structCreateNamed
     :: ContextRef -> CString -> IO TypeRef
 foreign import ccall unsafe "LLVMGetStructName" getStructName
     :: TypeRef -> IO CString
 foreign import ccall unsafe "LLVMStructSetBody" structSetBody
-    :: TypeRef -> Ptr TypeRef -> CUInt -> Bool -> IO ()
+    :: TypeRef -> Ptr TypeRef -> CUInt -> LLVM.Bool -> IO ()
 foreign import ccall unsafe "LLVMCountStructElementTypes"
     countStructElementTypes :: TypeRef -> IO CUInt
 foreign import ccall unsafe "LLVMGetStructElementTypes" getStructElementTypes
     :: TypeRef -> Ptr TypeRef -> IO ()
 foreign import ccall unsafe "LLVMIsPackedStruct" isPackedStruct
-    :: TypeRef -> IO Bool
+    :: TypeRef -> IO LLVM.Bool
 foreign import ccall unsafe "LLVMIsOpaqueStruct" isOpaqueStruct
-    :: TypeRef -> IO Bool
+    :: TypeRef -> IO LLVM.Bool
 foreign import ccall unsafe "LLVMGetTypeByName" getTypeByName
     :: ModuleRef -> CString -> IO TypeRef
 
@@ -1078,7 +1069,7 @@
 foreign import ccall unsafe "LLVMReplaceAllUsesWith" replaceAllUsesWith
     :: ValueRef -> ValueRef -> IO ()
 foreign import ccall unsafe "LLVMHasMetadata" hasMetadata
-    :: ValueRef -> IO Bool
+    :: ValueRef -> IO LLVM.Bool
 foreign import ccall unsafe "LLVMGetMetadata" getMetadata
     :: ValueRef -> CUInt -> IO ValueRef
 foreign import ccall unsafe "LLVMSetMetadata" setMetadata
@@ -1110,11 +1101,11 @@
 foreign import ccall unsafe "LLVMGetUndef" getUndef
     :: TypeRef -> IO ValueRef
 foreign import ccall unsafe "LLVMIsConstant" isConstant
-    :: ValueRef -> IO Bool
+    :: ValueRef -> IO LLVM.Bool
 foreign import ccall unsafe "LLVMIsUndef" isUndef
-    :: ValueRef -> IO Bool
+    :: ValueRef -> IO LLVM.Bool
 foreign import ccall unsafe "LLVMIsNull" isNull
-    :: ValueRef -> IO Bool
+    :: ValueRef -> IO LLVM.Bool
 foreign import ccall unsafe "LLVMConstPointerNull" constPointerNull
     :: TypeRef -> IO ValueRef
 
@@ -1142,7 +1133,7 @@
 
 -- ** Scalar Constants
 foreign import ccall unsafe "LLVMConstInt" constInt
-    :: TypeRef -> CULLong -> Bool -> IO ValueRef
+    :: TypeRef -> CULLong -> LLVM.Bool -> IO ValueRef
 foreign import ccall unsafe "LLVMConstIntOfArbitraryPrecision" constIntOfArbitraryPrecision
     :: TypeRef -> CUInt -> Ptr CULLong -> IO ValueRef
 foreign import ccall unsafe "LLVMConstIntOfString" constIntOfString
@@ -1162,15 +1153,15 @@
 
 -- ** Composite Constants
 foreign import ccall unsafe "LLVMConstStringInContext" constStringInContext
-    :: ContextRef -> CString -> CUInt -> Bool -> IO ValueRef
+    :: ContextRef -> CString -> CUInt -> LLVM.Bool -> IO ValueRef
 foreign import ccall unsafe "LLVMConstStructInContext" constStructInContext
-    :: ContextRef -> (Ptr ValueRef) -> CUInt -> Bool -> IO ValueRef
+    :: ContextRef -> (Ptr ValueRef) -> CUInt -> LLVM.Bool -> IO ValueRef
 foreign import ccall unsafe "LLVMConstString" constString
-    :: CString -> CUInt -> Bool -> IO ValueRef
+    :: CString -> CUInt -> LLVM.Bool -> IO ValueRef
 foreign import ccall unsafe "LLVMConstArray" constArray
     :: TypeRef -> Ptr ValueRef -> CUInt -> IO ValueRef
 foreign import ccall unsafe "LLVMConstStruct" constStruct
-    :: Ptr ValueRef -> CUInt -> Bool -> IO ValueRef
+    :: Ptr ValueRef -> CUInt -> LLVM.Bool -> IO ValueRef
 foreign import ccall unsafe "LLVMConstNamedStruct" constNamedStruct
     :: TypeRef -> Ptr ValueRef -> CUInt -> IO ValueRef
 foreign import ccall unsafe "LLVMConstVector" constVector
@@ -1300,7 +1291,7 @@
 foreign import ccall unsafe "LLVMConstInsertValue" constInsertValue
     :: ValueRef -> ValueRef -> Ptr CUInt -> CUInt -> IO ValueRef
 foreign import ccall unsafe "LLVMConstInlineAsm" constInlineAsm
-    :: TypeRef -> CString -> CString -> Bool -> Bool -> IO ValueRef
+    :: TypeRef -> CString -> CString -> LLVM.Bool -> LLVM.Bool -> IO ValueRef
 foreign import ccall unsafe "LLVMBlockAddress" blockAddress
     :: ValueRef -> BasicBlockRef -> IO ValueRef
 
@@ -1308,7 +1299,7 @@
 foreign import ccall unsafe "LLVMGetGlobalParent" getGlobalParent
     :: ValueRef -> IO ModuleRef
 foreign import ccall unsafe "LLVMIsDeclaration" isDeclaration
-    :: ValueRef -> IO Bool
+    :: ValueRef -> IO LLVM.Bool
 foreign import ccall unsafe "LLVMGetLinkage" getLinkage
     :: ValueRef -> IO CUInt
 foreign import ccall unsafe "LLVMSetLinkage" setLinkage
@@ -1348,36 +1339,18 @@
 foreign import ccall unsafe "LLVMGetInitializer" getInitializer
     :: ValueRef -> IO ValueRef
 foreign import ccall unsafe "LLVMIsThreadLocal" isThreadLocal
-    :: ValueRef -> IO Bool
+    :: ValueRef -> IO LLVM.Bool
 foreign import ccall unsafe "LLVMSetThreadLocal" setThreadLocal
-    :: ValueRef -> Bool -> IO ()
+    :: ValueRef -> LLVM.Bool -> IO ()
 foreign import ccall unsafe "LLVMIsGlobalConstant" isGlobalConstant
-    :: ValueRef -> IO Bool
+    :: ValueRef -> IO LLVM.Bool
 foreign import ccall unsafe "LLVMSetGlobalConstant" setGlobalConstant
-    :: ValueRef -> Bool -> IO ()
+    :: ValueRef -> LLVM.Bool -> IO ()
 
 -- ** Aliases
 foreign import ccall unsafe "LLVMAddAlias" addAlias
     :: ModuleRef -> TypeRef -> ValueRef -> CString -> IO ValueRef
 
--- ** Functions
-foreign import ccall unsafe "LLVMAddFunction" addFunction
-    :: ModuleRef                -- ^ module
-    -> CString                  -- ^ name
-    -> TypeRef                  -- ^ type
-    -> IO ValueRef
-foreign import ccall unsafe "LLVMGetNamedFunction" getNamedFunction
-    :: ModuleRef                -- ^ module
-    -> CString                  -- ^ name
-    -> IO ValueRef              -- ^ function (@nullPtr@ if not found)
-foreign import ccall unsafe "LLVMGetFirstFunction" getFirstFunction
-    :: ModuleRef -> IO ValueRef
-foreign import ccall unsafe "LLVMGetLastFunction" getLastFunction
-    :: ModuleRef -> IO ValueRef
-foreign import ccall unsafe "LLVMGetNextFunction" getNextFunction
-    :: ValueRef -> IO ValueRef
-foreign import ccall unsafe "LLVMGetPreviousFunction" getPreviousFunction
-    :: ValueRef -> IO ValueRef
 foreign import ccall unsafe "LLVMDeleteFunction" deleteFunction
     :: ValueRef                 -- ^ function
     -> IO ()
@@ -1437,7 +1410,7 @@
 foreign import ccall unsafe "LLVMBasicBlockAsValue" basicBlockAsValue
     :: BasicBlockRef -> IO ValueRef
 foreign import ccall unsafe "LLVMValueIsBasicBlock" valueIsBasicBlock
-    :: ValueRef -> IO Bool
+    :: ValueRef -> IO LLVM.Bool
 foreign import ccall unsafe "LLVMValueAsBasicBlock" valueAsBasicBlock
     :: ValueRef                 -- ^ basic block
     -> IO BasicBlockRef
@@ -1516,9 +1489,9 @@
 
 -- ** Call instructions
 foreign import ccall unsafe "LLVMIsTailCall" isTailCall
-    :: ValueRef -> IO Bool
+    :: ValueRef -> IO LLVM.Bool
 foreign import ccall unsafe "LLVMSetTailCall" setTailCall
-    :: ValueRef -> Bool -> IO ()
+    :: ValueRef -> LLVM.Bool -> IO ()
 
 -- ** Switch Instructions
 foreign import ccall unsafe "LLVMGetSwitchDefaultDest" getSwitchDefaultDest
@@ -1603,7 +1576,7 @@
 
 -- ** Resume instructions
 foreign import ccall unsafe "LLVMSetCleanup" setCleanup
-    :: ValueRef -> Bool -> IO ()
+    :: ValueRef -> LLVM.Bool -> IO ()
 
 -- ** Arithmetic
 foreign import ccall unsafe "LLVMBuildAdd" buildAdd
@@ -1670,36 +1643,22 @@
     :: BuilderRef -> ValueRef -> CString -> IO ValueRef
 
 -- ** Floating point attributes
+foreign import ccall unsafe "LLVMSetHasUnsafeAlgebra" setFastMath
+    :: ValueRef -> LLVM.Bool -> IO ()
 foreign import ccall unsafe "LLVMSetHasUnsafeAlgebra" setHasUnsafeAlgebra
-    :: ValueRef -> CUInt{-Bool-} -> IO ()
+    :: ValueRef -> LLVM.Bool -> IO ()
 foreign import ccall unsafe "LLVMSetHasNoNaNs" setHasNoNaNs
-    :: ValueRef -> CUInt{-Bool-} -> IO ()
+    :: ValueRef -> LLVM.Bool -> IO ()
 foreign import ccall unsafe "LLVMSetHasNoInfs" setHasNoInfs
-    :: ValueRef -> CUInt{-Bool-} -> IO ()
+    :: ValueRef -> LLVM.Bool -> IO ()
 foreign import ccall unsafe "LLVMSetHasNoSignedZeros" setHasNoSignedZeros
-    :: ValueRef -> CUInt{-Bool-} -> IO ()
+    :: ValueRef -> LLVM.Bool -> IO ()
 foreign import ccall unsafe "LLVMSetHasAllowReciprocal" setHasAllowReciprocal
-    :: ValueRef -> CUInt{-Bool-} -> IO ()
-
-data FastMathFlags
-    = NoNaNs
-    | NoInfs
-    | NoSignedZeros
-    | AllowReciprocal
-    | UnsafeAlgebra
-    deriving (Eq, Ord, Enum, Bounded, Show, Read, Typeable)
-
-type FastMathFlagSet = EnumSet.T CUInt FastMathFlags
-
-noNaNs, noInfs, noSignedZeros, allowReciprocal, unsafeAlgebra :: FastMathFlagSet
-noNaNs          = EnumSet.fromEnum NoNaNs
-noInfs          = EnumSet.fromEnum NoInfs
-noSignedZeros   = EnumSet.fromEnum NoSignedZeros
-allowReciprocal = EnumSet.fromEnum AllowReciprocal
-unsafeAlgebra   = EnumSet.fromEnum UnsafeAlgebra
-
-foreign import ccall unsafe "LLVMSetFastMathFlags" setFastMathFlags
-    :: ValueRef -> FastMathFlagSet -> IO ()
+    :: ValueRef -> LLVM.Bool -> IO ()
+foreign import ccall unsafe "LLVMSetHasAllowReassoc" setHasAllowReassoc
+    :: ValueRef -> LLVM.Bool -> IO ()
+foreign import ccall unsafe "LLVMSetHasApproxFunc" setHasApproxFunc
+    :: ValueRef -> LLVM.Bool -> IO ()
 
 
 -- ** Memory
@@ -1804,9 +1763,9 @@
 
 -- ** Memory Buffers
 foreign import ccall unsafe "LLVMCreateMemoryBufferWithContentsOfFile" createMemoryBufferWithContentsOfFile
-    :: CString -> Ptr MemoryBufferRef -> Ptr CString -> IO Bool
+    :: CString -> Ptr MemoryBufferRef -> Ptr CString -> IO LLVM.Bool
 foreign import ccall unsafe "LLVMCreateMemoryBufferWithSTDIN" createMemoryBufferWithSTDIN
-    :: Ptr MemoryBufferRef -> Ptr CString -> IO Bool
+    :: Ptr MemoryBufferRef -> Ptr CString -> IO LLVM.Bool
 foreign import ccall unsafe "LLVMDisposeMemoryBuffer" disposeMemoryBuffer
     :: MemoryBufferRef -> IO ()
 
@@ -1820,13 +1779,13 @@
 foreign import ccall unsafe "LLVMCreateFunctionPassManagerForModule" createFunctionPassManagerForModule
     :: ModuleRef -> IO PassManagerRef
 foreign import ccall unsafe "LLVMRunPassManager" runPassManager
-    :: PassManagerRef -> ModuleRef -> IO Bool
+    :: PassManagerRef -> ModuleRef -> IO LLVM.Bool
 foreign import ccall unsafe "LLVMInitializeFunctionPassManager" initializeFunctionPassManager
-    :: PassManagerRef -> IO Bool
+    :: PassManagerRef -> IO LLVM.Bool
 foreign import ccall unsafe "LLVMRunFunctionPassManager" runFunctionPassManager
-    :: PassManagerRef -> ValueRef -> IO Bool
+    :: PassManagerRef -> ValueRef -> IO LLVM.Bool
 foreign import ccall unsafe "LLVMFinalizeFunctionPassManager" finalizeFunctionPassManager
-    :: PassManagerRef -> IO Bool
+    :: PassManagerRef -> IO LLVM.Bool
 foreign import ccall unsafe "LLVMDisposePassManager" disposePassManager
     :: PassManagerRef -> IO ()
 foreign import ccall unsafe "&LLVMDisposePassManager" ptrDisposePassManager
diff --git a/src/LLVM/FFI/Support/Host.hs b/src/LLVM/FFI/Support/Host.hs
--- a/src/LLVM/FFI/Support/Host.hs
+++ b/src/LLVM/FFI/Support/Host.hs
@@ -14,15 +14,13 @@
     ) where
 
 import qualified LLVM.FFI.Core as LLVM
-import qualified Foreign.C.Types as C
 import Foreign.C.String (CString)
 import Foreign.Ptr (Ptr)
 
 import Data.Typeable (Typeable)
 
 
-foreign import ccall unsafe "LLVMGetHostCPUName" getHostCPUName
-    :: Ptr C.CSize -> IO CString
+foreign import ccall unsafe "LLVMGetHostCPUName" getHostCPUName :: IO CString
 
 
 data FeatureMap
diff --git a/src/LLVM/FFI/Target.hsc b/src/LLVM/FFI/Target.hsc
--- a/src/LLVM/FFI/Target.hsc
+++ b/src/LLVM/FFI/Target.hsc
@@ -39,8 +39,6 @@
 
 foreign import ccall unsafe "LLVMCreateTargetData" createTargetData
     :: CString -> IO TargetDataRef
-foreign import ccall unsafe "LLVMAddTargetData" addTargetData
-    :: TargetDataRef -> PassManagerRef -> IO ()
 foreign import ccall unsafe "LLVMAddTargetLibraryInfo" addTargetLibraryInfo
     :: TargetLibraryInfoRef -> PassManagerRef -> IO ()
 foreign import ccall unsafe "LLVMCopyStringRepOfTargetData" copyStringRepOfTargetData
