llvm-general 3.2.5.0 → 3.2.6.0
raw patch · 33 files changed
+395/−194 lines, 33 files
Files
- llvm-general.cabal +4/−3
- src/LLVM/General/AST.hs +1/−1
- src/LLVM/General/AST/Operand.hs +1/−1
- src/LLVM/General/Internal/Atomicity.hs +1/−1
- src/LLVM/General/Internal/Coding.hs +16/−18
- src/LLVM/General/Internal/DataLayout.hs +16/−0
- src/LLVM/General/Internal/Diagnostic.hs +1/−1
- src/LLVM/General/Internal/FFI/Cleanup.hs +1/−0
- src/LLVM/General/Internal/FFI/DataLayout.hs +24/−0
- src/LLVM/General/Internal/FFI/LLVMCTypes.hsc +6/−0
- src/LLVM/General/Internal/FFI/PassManager.hs +24/−14
- src/LLVM/General/Internal/FFI/PassManagerC.cpp +49/−1
- src/LLVM/General/Internal/FFI/Target.hs +8/−0
- src/LLVM/General/Internal/FFI/TargetC.cpp +12/−0
- src/LLVM/General/Internal/FFI/Transforms.hs +13/−1
- src/LLVM/General/Internal/FloatingPointPredicate.hs +1/−1
- src/LLVM/General/Internal/Global.hs +2/−2
- src/LLVM/General/Internal/InlineAssembly.hs +1/−1
- src/LLVM/General/Internal/IntegerPredicate.hs +1/−1
- src/LLVM/General/Internal/Module.hs +1/−1
- src/LLVM/General/Internal/Operand.hs +1/−1
- src/LLVM/General/Internal/PassManager.hs +92/−78
- src/LLVM/General/Internal/PrettyPrint.hs +1/−0
- src/LLVM/General/Internal/RMWOperation.hs +1/−1
- src/LLVM/General/Internal/String.hs +5/−0
- src/LLVM/General/Internal/Target.hs +18/−6
- src/LLVM/General/PassManager.hs +3/−8
- src/LLVM/General/Target.hs +3/−1
- src/LLVM/General/Transforms.hs +54/−22
- test/LLVM/General/Test/Linking.hs +0/−5
- test/LLVM/General/Test/Metadata.hs +22/−9
- test/LLVM/General/Test/Optimization.hs +9/−15
- test/LLVM/General/Test/Tests.hs +3/−1
llvm-general.cabal view
@@ -1,5 +1,5 @@ name: llvm-general-version: 3.2.5.0+version: 3.2.6.0 license: BSD3 license-file: LICENSE author: Benjamin S.Scarlet <fgthb0@greynode.net>@@ -16,7 +16,7 @@ handles almost all of the stateful complexities of using the LLVM API to build IR; and it supports moving IR not only from Haskell into LLVM C++ objects, but the other direction - from LLVM C++ into Haskell. .- For haddock, see <http://bscarlet.github.io/llvm-general/3.2.5.0/doc/html/llvm-general/index.html>.+ For haddock, see <http://bscarlet.github.io/llvm-general/3.2.6.0/doc/html/llvm-general/index.html>. extra-source-files: src/LLVM/General/Internal/FFI/Analysis.h src/LLVM/General/Internal/FFI/Function.h@@ -37,7 +37,7 @@ type: git location: git://github.com/bscarlet/llvm-general.git branch: llvm-3.2- tag: v3.2.5.0+ tag: v3.2.6.0 flag shared-llvm description: link against llvm shared rather than static library@@ -151,6 +151,7 @@ LLVM.General.Internal.FFI.CommandLine LLVM.General.Internal.FFI.Constant LLVM.General.Internal.FFI.Context+ LLVM.General.Internal.FFI.DataLayout LLVM.General.Internal.FFI.ExecutionEngine LLVM.General.Internal.FFI.Function LLVM.General.Internal.FFI.GlobalAlias
src/LLVM/General/AST.hs view
@@ -27,7 +27,7 @@ data Definition = GlobalDefinition Global | TypeDefinition Name (Maybe Type)- | MetadataNodeDefinition MetadataNodeID [Operand]+ | MetadataNodeDefinition MetadataNodeID [Maybe Operand] | NamedMetadataDefinition String [MetadataNodeID] | ModuleInlineAssembly String deriving (Eq, Read, Show)
src/LLVM/General/AST/Operand.hs view
@@ -15,7 +15,7 @@ -- | <http://llvm.org/docs/LangRef.html#metadata> data MetadataNode - = MetadataNode [Operand]+ = MetadataNode [Maybe Operand] | MetadataNodeReference MetadataNodeID deriving (Eq, Ord, Read, Show)
src/LLVM/General/Internal/Atomicity.hs view
@@ -14,7 +14,7 @@ import qualified LLVM.General.AST as A -genCodingInstance' [t| Maybe A.MemoryOrdering |] ''FFI.MemoryOrdering [+genCodingInstance [t| Maybe A.MemoryOrdering |] ''FFI.MemoryOrdering [ (FFI.memoryOrderingNotAtomic, Nothing), (FFI.memoryOrderingUnordered, Just A.Unordered), (FFI.memoryOrderingMonotonic, Just A.Monotonic),
src/LLVM/General/Internal/Coding.hs view
@@ -9,6 +9,7 @@ import Language.Haskell.TH import Language.Haskell.TH.Quote +import Control.Monad import Control.Monad.AnyCont import Control.Monad.IO.Class @@ -30,24 +31,8 @@ class DecodeM d h c where decodeM :: c -> d h -genCodingInstance :: Data h => TypeQ -> Name -> [(Integer, h)] -> Q [Dec]-genCodingInstance ht ctn ihs = do- let n = const Nothing- TyConI (NewtypeD _ _ _ (NormalC ctcn _) _) <- reify ctn- [d| - instance Monad m => EncodeM m $(ht) $(conT ctn) where- encodeM h = return $ $(- caseE [| h |] [ match (dataToPatQ n h) (normalB (appE (conE ctcn) (litE (integerL i)))) [] | (i,h) <- ihs ] - )-- instance Monad m => DecodeM m $(ht) $(conT ctn) where- decodeM i = return $ $(- caseE [| i |] [ match (conP ctcn [litP (integerL i)]) (normalB (dataToExpQ n h)) [] | (i,h) <- ihs ]- )- |]--genCodingInstance' :: (Data c, Data h) => TypeQ -> Name -> [(c, h)] -> Q [Dec]-genCodingInstance' ht ctn chs = do+genCodingInstance :: (Data c, Data h) => TypeQ -> Name -> [(c, h)] -> Q [Dec]+genCodingInstance ht ctn chs = do let n = const Nothing [d| instance Monad m => EncodeM m $(ht) $(conT ctn) where@@ -99,6 +84,19 @@ instance Monad m => DecodeM m Bool FFI.LLVMBool where decodeM (FFI.LLVMBool 0) = return $ False decodeM (FFI.LLVMBool 1) = return $ True++instance (Monad m, EncodeM m h (Ptr c)) => EncodeM m (Maybe h) (Ptr c) where+ encodeM = maybe (return nullPtr) encodeM++instance (Monad m, DecodeM m h (Ptr c)) => DecodeM m (Maybe h) (Ptr c) where+ decodeM p | p == nullPtr = return Nothing+ | otherwise = liftM Just $ decodeM p++instance Monad m => EncodeM m (Maybe Bool) (FFI.NothingAsMinusOne Bool) where+ encodeM = return . FFI.NothingAsMinusOne . maybe (-1) (fromIntegral . fromEnum)++instance Monad m => EncodeM m (Maybe Word) (FFI.NothingAsMinusOne Word) where+ encodeM = return . FFI.NothingAsMinusOne . maybe (-1) fromIntegral instance Monad m => EncodeM m Word CUInt where encodeM = return . fromIntegral
src/LLVM/General/Internal/DataLayout.hs view
@@ -2,15 +2,31 @@ import Text.ParserCombinators.Parsec +import Control.Monad.Error+import Control.Monad.AnyCont+import Control.Exception+ import Data.Word import Data.Functor +import Foreign.Ptr+ import qualified Data.List as List import qualified Data.Map as Map import qualified Data.Set as Set +import qualified LLVM.General.Internal.FFI.DataLayout as FFI+ import LLVM.General.AST.DataLayout import LLVM.General.AST.AddrSpace++import LLVM.General.Internal.Coding+import LLVM.General.Internal.String ()++withFFIDataLayout :: DataLayout -> (Ptr FFI.DataLayout -> IO a) -> IO a+withFFIDataLayout dl f = flip runAnyContT return $ do+ dls <- encodeM (dataLayoutToString dl)+ liftIO $ bracket (FFI.createDataLayout dls) FFI.disposeDataLayout f dataLayoutToString :: DataLayout -> String dataLayoutToString dl =
src/LLVM/General/Internal/Diagnostic.hs view
@@ -15,7 +15,7 @@ import LLVM.General.Internal.Coding import LLVM.General.Internal.String () -genCodingInstance' [t| DiagnosticKind |] ''FFI.DiagnosticKind [+genCodingInstance [t| DiagnosticKind |] ''FFI.DiagnosticKind [ (FFI.diagnosticKindError, ErrorKind), (FFI.diagnosticKindWarning, WarningKind), (FFI.diagnosticKindNote, NoteKind)
src/LLVM/General/Internal/FFI/Cleanup.hs view
@@ -81,3 +81,4 @@ | h == ''A.FloatingPointPredicate -> [t| FCmpPredicate |] | h == ''A.IntegerPredicate -> [t| ICmpPredicate |] AppT ListT x -> foldl1 appT [tupleT 2, [t| CUInt |], appT [t| Ptr |] (typeMapping x)]+ x -> error $ "type not handled in Cleanup typeMapping: " ++ show x
+ src/LLVM/General/Internal/FFI/DataLayout.hs view
@@ -0,0 +1,24 @@+{-# LANGUAGE+ ForeignFunctionInterface+ #-}++module LLVM.General.Internal.FFI.DataLayout where++import Foreign.C.String+import Foreign.Ptr++import LLVM.General.Internal.FFI.LLVMCTypes++data DataLayout++-- Oooh those wacky LLVM C-API coders: C API called DataLayout TargetData.+-- Great. Just great.++foreign import ccall unsafe "LLVMCreateTargetData" createDataLayout :: + CString -> IO (Ptr DataLayout)++foreign import ccall unsafe "LLVMDisposeTargetData" disposeDataLayout :: + Ptr DataLayout -> IO ()++foreign import ccall unsafe "LLVMCopyStringRepOfTargetData" dataLayoutToString ::+ Ptr DataLayout -> IO MallocedCString
src/LLVM/General/Internal/FFI/LLVMCTypes.hsc view
@@ -56,6 +56,12 @@ newtype MallocedCString = MallocedCString CString deriving (Storable) +newtype NothingAsMinusOne h = NothingAsMinusOne CInt+ deriving (Storable)++newtype NothingAsEmptyString c = NothingAsEmptyString c+ deriving (Storable)+ newtype CPPOpcode = CPPOpcode CUInt deriving (Eq, Ord, Show, Typeable, Data)
src/LLVM/General/Internal/FFI/PassManager.hs view
@@ -9,7 +9,7 @@ import Control.Monad -import Data.Word (Word)+import Data.Word import Foreign.Ptr import Foreign.C@@ -19,6 +19,7 @@ import LLVM.General.Internal.FFI.Cleanup import LLVM.General.Internal.FFI.Module import LLVM.General.Internal.FFI.Target+import LLVM.General.Internal.FFI.DataLayout import LLVM.General.Internal.FFI.Transforms import qualified LLVM.General.Transforms as G@@ -26,29 +27,36 @@ data PassManager foreign import ccall unsafe "LLVMCreatePassManager" createPassManager ::- IO (Ptr PassManager)+ IO (Ptr PassManager) foreign import ccall unsafe "LLVMDisposePassManager" disposePassManager ::- Ptr PassManager -> IO ()+ Ptr PassManager -> IO () foreign import ccall unsafe "LLVMRunPassManager" runPassManager ::- Ptr PassManager -> Ptr Module -> IO CUInt+ Ptr PassManager -> Ptr Module -> IO CUInt foreign import ccall unsafe "LLVMCreateFunctionPassManagerForModule" createFunctionPassManagerForModule ::- Ptr Module -> IO (Ptr PassManager)+ Ptr Module -> IO (Ptr PassManager) foreign import ccall unsafe "LLVMInitializeFunctionPassManager" initializeFunctionPassManager ::- Ptr PassManager -> IO CUInt+ Ptr PassManager -> IO CUInt foreign import ccall unsafe "LLVMRunFunctionPassManager" runFunctionPassManager ::- Ptr PassManager -> Ptr Value -> IO CUInt+ Ptr PassManager -> Ptr Value -> IO CUInt foreign import ccall unsafe "LLVMFinalizeFunctionPassManager" finalizeFunctionPassManager ::- Ptr PassManager -> IO CUInt+ Ptr PassManager -> IO CUInt -newtype LLVMEncoded i a = LLVMEncoded i- deriving (Eq, Ord, Read, Show)+foreign import ccall unsafe "LLVMAddTargetData" addDataLayoutPass' ::+ Ptr DataLayout -> Ptr PassManager -> IO () +addDataLayoutPass = flip addDataLayoutPass'++foreign import ccall unsafe "LLVMAddTargetLibraryInfo" addTargetLibraryInfoPass' ::+ Ptr TargetLibraryInfo -> Ptr PassManager -> IO ()++addTargetLibraryInfoPass = flip addTargetLibraryInfoPass'+ $(do let declareForeign :: TH.Name -> [TH.Type] -> TH.DecsQ declareForeign hName extraParams = do@@ -56,12 +64,14 @@ passTypeMapping :: TH.Type -> TH.TypeQ passTypeMapping t = case t of TH.ConT h | h == ''Word -> [t| CUInt |]+ | h == ''G.GCOVVersion -> [t| LLVMBool |] -- some of the LLVM methods for making passes use "-1" as a special value -- handle those here TH.AppT (TH.ConT mby) t' | mby == ''Maybe -> case t' of- TH.ConT h | h == ''Bool -> [t| LLVMEncoded CInt (Maybe Bool) |]- | h == ''Word -> [t| LLVMEncoded CInt (Maybe Word) |]+ TH.ConT h | h == ''Bool -> [t| NothingAsMinusOne Bool |]+ | h == ''Word -> [t| NothingAsMinusOne Word |]+ | h == ''FilePath -> [t| NothingAsEmptyString CString |] _ -> typeMapping t _ -> typeMapping t foreignDecl @@ -94,13 +104,13 @@ Ptr PassManagerBuilder -> CUInt -> IO () foreign import ccall unsafe "LLVMPassManagerBuilderSetDisableUnitAtATime" passManagerBuilderSetDisableUnitAtATime ::- Ptr PassManagerBuilder -> CUInt -> IO () + Ptr PassManagerBuilder -> LLVMBool -> IO () foreign import ccall unsafe "LLVMPassManagerBuilderSetDisableUnrollLoops" passManagerBuilderSetDisableUnrollLoops :: Ptr PassManagerBuilder -> CUInt -> IO () foreign import ccall unsafe "LLVMPassManagerBuilderSetDisableSimplifyLibCalls" passManagerBuilderSetDisableSimplifyLibCalls ::- Ptr PassManagerBuilder -> CUInt -> IO () + Ptr PassManagerBuilder -> LLVMBool -> IO () foreign import ccall unsafe "LLVMPassManagerBuilderUseInlinerWithThreshold" passManagerBuilderUseInlinerWithThreshold :: Ptr PassManagerBuilder -> CUInt -> IO ()
src/LLVM/General/Internal/FFI/PassManagerC.cpp view
@@ -1,8 +1,10 @@ #define __STDC_LIMIT_MACROS #include "llvm/LLVMContext.h"+#include "llvm/DataLayout.h" #include "llvm/Transforms/Scalar.h" #include "llvm/Transforms/IPO.h" #include "llvm/Transforms/Vectorize.h"+#include "llvm/Transforms/Instrumentation.h" #include "llvm/PassManager.h" #include "llvm-c/Core.h"@@ -26,6 +28,10 @@ extern "C" { +void LLVM_General_AddDataLayoutPass(LLVMPassManagerRef PM, const char *dl) {+ unwrap(PM)->add(new DataLayout(dl));+}+ #define LLVM_GENERAL_FOR_EACH_PASS_WITHOUT_LLVM_C_BINDING(macro) \ macro(BlockPlacement) \ macro(BreakCriticalEdges) \@@ -125,6 +131,48 @@ vectorizeConfig.FastDep = fastDependencyAnalysis; unwrap(PM)->add(createBBVectorizePass(vectorizeConfig));-} +}++void LLVM_General_AddEdgeProfilerPass(LLVMPassManagerRef PM) {+ unwrap(PM)->add(createEdgeProfilerPass());+}++void LLVM_General_AddOptimalEdgeProfilerPass(LLVMPassManagerRef PM) {+ unwrap(PM)->add(createOptimalEdgeProfilerPass());+}++void LLVM_General_AddPathProfilerPass(LLVMPassManagerRef PM) {+ unwrap(PM)->add(createPathProfilerPass());+}++void LLVM_General_AddGCOVProfilerPass(+ LLVMPassManagerRef PM,+ LLVMBool emitNotes,+ LLVMBool emitData,+ LLVMBool use402Format,+ LLVMBool useCfgChecksum+) {+ unwrap(PM)->add(+ createGCOVProfilerPass(+ emitNotes,+ emitData,+ use402Format,+ useCfgChecksum+ )+ );+}++void LLVM_General_AddAddressSanitizerFunctionPass(LLVMPassManagerRef PM) {+ unwrap(PM)->add(createAddressSanitizerPass()+ );+}++void LLVM_General_AddThreadSanitizerPass(LLVMPassManagerRef PM) {+ unwrap(PM)->add(createThreadSanitizerPass());+}++void LLVM_General_AddBoundsCheckingPass(LLVMPassManagerRef PM) {+ unwrap(PM)->add(createBoundsCheckingPass());+} }
src/LLVM/General/Internal/FFI/Target.hs view
@@ -98,4 +98,12 @@ foreign import ccall unsafe "LLVM_General_GetTargetMachineDataLayout" getTargetMachineDataLayout :: Ptr TargetMachine -> IO MallocedCString +data TargetLibraryInfo++foreign import ccall unsafe "LLVM_General_CreateTargetLibraryInfo" createTargetLibraryInfo ::+ CString -> IO (Ptr TargetLibraryInfo)++foreign import ccall unsafe "LLVM_General_DisposeTargetLibraryInfo" disposeTargetLibraryInfo ::+ Ptr TargetLibraryInfo -> IO ()+ foreign import ccall unsafe "LLVM_General_InitializeAllTargets" initializeAllTargets :: IO ()
src/LLVM/General/Internal/FFI/TargetC.cpp view
@@ -3,6 +3,7 @@ #include "llvm/Support/TargetSelect.h" #include "llvm/Support/Host.h" #include "llvm/Target/TargetMachine.h"+#include "llvm/Target/TargetLibraryInfo.h" #include "llvm/ADT/Triple.h" #include "llvm/ExecutionEngine/Interpreter.h" #include "llvm/DataLayout.h"@@ -14,6 +15,7 @@ using namespace llvm; namespace llvm {+ static Reloc::Model unwrap(LLVMRelocMode x) { switch(x) { #define ENUM_CASE(x,y) case LLVMReloc ## x: return Reloc::y;@@ -224,6 +226,16 @@ char *LLVM_General_GetTargetMachineDataLayout(LLVMTargetMachineRef t) { return strdup(unwrap(t)->getDataLayout()->getStringRepresentation().c_str());+}++LLVMTargetLibraryInfoRef LLVM_General_CreateTargetLibraryInfo(+ const char *triple+) {+ return wrap(new TargetLibraryInfo(Triple(triple)));+}++void LLVM_General_DisposeTargetLibraryInfo(LLVMTargetLibraryInfoRef l) {+ delete unwrap(l); } void LLVM_General_InitializeAllTargets() {
src/LLVM/General/Internal/FFI/Transforms.hs view
@@ -14,6 +14,7 @@ -- | as part of this Haskell package ("LLVM_General_" prefix). cName n = let core = case n of+ "AddressSanitizer" -> "AddressSanitizerFunction" "AggressiveDeadCodeElimination" -> "AggressiveDCE" "AlwaysInline" -> "AlwaysInliner" "DeadInstructionElimination" -> "DeadInstElimination"@@ -35,6 +36,9 @@ "SparseConditionalConstantPropagation" -> "SCCP" h -> h patchImpls = [+ "AddressSanitizer",+ "AddressSanitizerModule",+ "BoundsChecking", "CodeGenPrepare", "GlobalValueNumbering", "InternalizeFunctions",@@ -43,20 +47,28 @@ "BreakCriticalEdges", "DeadCodeElimination", "DeadInstructionElimination",+ "DebugExistingIR",+ "DebugGeneratedIR", "DemoteRegisterToMemory",+ "EdgeProfiler",+ "GCOVProfiler", "LoopClosedSingleStaticAssignment", "LoopInstructionSimplify", "LoopStrengthReduce", "LowerAtomic", "LowerInvoke", "LowerSwitch",+ "MemorySanitizer", "MergeFunctions",+ "OptimalEdgeProfiler",+ "PathProfiler", "PartialInlining", "ScalarReplacementOfAggregates", "Sinking", "StripDeadDebugInfo", "StripDebugDeclare",- "StripNonDebugSymbols"+ "StripNonDebugSymbols",+ "ThreadSanitizer" ] in (if (n `elem` patchImpls) then "LLVM_General_" else "LLVM") ++ "Add" ++ core ++ "Pass"
src/LLVM/General/Internal/FloatingPointPredicate.hs view
@@ -9,7 +9,7 @@ import qualified LLVM.General.Internal.FFI.LLVMCTypes as FFI import qualified LLVM.General.AST.FloatingPointPredicate as A.FPPred -genCodingInstance' [t| A.FPPred.FloatingPointPredicate |] ''FFI.FCmpPredicate [+genCodingInstance [t| A.FPPred.FloatingPointPredicate |] ''FFI.FCmpPredicate [ (FFI.fCmpPredFalse, A.FPPred.False), (FFI.fCmpPredOEQ, A.FPPred.OEQ), (FFI.fCmpPredOGT, A.FPPred.OGT),
src/LLVM/General/Internal/Global.hs view
@@ -22,7 +22,7 @@ import qualified LLVM.General.AST.Linkage as A.L import qualified LLVM.General.AST.Visibility as A.V -genCodingInstance' [t| A.L.Linkage |] ''FFI.Linkage [+genCodingInstance [t| A.L.Linkage |] ''FFI.Linkage [ (FFI.linkageExternal, A.L.External), (FFI.linkageAvailableExternally, A.L.AvailableExternally), (FFI.linkageLinkOnceAny, A.L.LinkOnce),@@ -46,7 +46,7 @@ setLinkage :: FFI.DescendentOf FFI.GlobalValue v => Ptr v -> A.L.Linkage -> EncodeAST () setLinkage g l = liftIO . FFI.setLinkage (FFI.upCast g) =<< encodeM l -genCodingInstance' [t| A.V.Visibility |] ''FFI.Visibility [+genCodingInstance [t| A.V.Visibility |] ''FFI.Visibility [ (FFI.visibilityDefault, A.V.Default), (FFI.visibilityHidden, A.V.Hidden), (FFI.visibilityProtected, A.V.Protected)
src/LLVM/General/Internal/InlineAssembly.hs view
@@ -24,7 +24,7 @@ import LLVM.General.Internal.DecodeAST import LLVM.General.Internal.Value -genCodingInstance' [t| A.Dialect |] ''FFI.AsmDialect [+genCodingInstance [t| A.Dialect |] ''FFI.AsmDialect [ (FFI.asmDialectATT, A.ATTDialect), (FFI.asmDialectIntel, A.IntelDialect) ]
src/LLVM/General/Internal/IntegerPredicate.hs view
@@ -9,7 +9,7 @@ import qualified LLVM.General.Internal.FFI.LLVMCTypes as FFI import qualified LLVM.General.AST.IntegerPredicate as A.IPred -genCodingInstance' [t| A.IPred.IntegerPredicate |] ''FFI.ICmpPredicate [+genCodingInstance [t| A.IPred.IntegerPredicate |] ''FFI.ICmpPredicate [ (FFI.iCmpPredEQ, A.IPred.EQ), (FFI.iCmpPredNE, A.IPred.NE), (FFI.iCmpPredUGT, A.IPred.UGT),
src/LLVM/General/Internal/Module.hs view
@@ -59,7 +59,7 @@ instance Error (Either String Diagnostic) where strMsg = Left -genCodingInstance' [t| Bool |] ''FFI.LinkerMode [+genCodingInstance [t| Bool |] ''FFI.LinkerMode [ (FFI.linkerModeDestroySource, False), (FFI.linkerModePreserveSource, True) ]
src/LLVM/General/Internal/Operand.hs view
@@ -70,7 +70,7 @@ liftIO $ FFI.createMDNodeInContext c ops encodeM (A.MetadataNodeReference n) = referMDNode n -instance DecodeM DecodeAST [A.Operand] (Ptr FFI.MDNode) where+instance DecodeM DecodeAST [Maybe A.Operand] (Ptr FFI.MDNode) where decodeM p = scopeAnyCont $ do n <- liftIO $ FFI.getMDNodeNumOperands p ops <- allocaArray n
src/LLVM/General/Internal/PassManager.hs view
@@ -7,109 +7,123 @@ import qualified Language.Haskell.TH as TH import Control.Exception-import Control.Monad+import Control.Monad hiding (forM_) import Control.Monad.IO.Class import Control.Applicative import Control.Monad.AnyCont -import Data.Word (Word)-import Foreign.C.Types (CInt)+import Data.Word+import Data.Foldable (forM_) import Foreign.Ptr import qualified LLVM.General.Internal.FFI.PassManager as FFI import qualified LLVM.General.Internal.FFI.Transforms as FFI+import qualified LLVM.General.Internal.FFI.LLVMCTypes as FFI import LLVM.General.Internal.Module import LLVM.General.Internal.Target import LLVM.General.Internal.Coding+import LLVM.General.Internal.DataLayout import LLVM.General.Transforms +import LLVM.General.AST.DataLayout+ -- | <http://llvm.org/doxygen/classllvm_1_1PassManager.html>+-- Note: a PassManager does substantive behind-the-scenes work, arranging for the+-- results of various analyses to be available as needed by transform passes, shared+-- as possible. newtype PassManager = PassManager (Ptr FFI.PassManager) --- | There are different ways to get a 'PassManager'. This class embodies them.-class PassManagerSpecification s where- -- | make a 'PassManager'- createPassManager :: s -> IO (Ptr FFI.PassManager)---- | This type is a high-level specification of a set of passes. It uses the same--- collection of passes chosen by the LLVM team in the command line tool 'opt'. The fields--- of this spec are much like typical compiler command-line flags - e.g. -O\<n\>, etc.-data CuratedPassSetSpec = CuratedPassSetSpec {- optLevel :: Maybe Int,- sizeLevel :: Maybe Int,- unitAtATime :: Maybe Bool,- simplifyLibCalls :: Maybe Bool,- useInlinerWithThreshold :: Maybe Int- }+-- | There are different ways to get a 'PassManager'. This type embodies them.+data PassSetSpec+ -- | a 'PassSetSpec' is a lower-level, detailed specification of a set of passes. It+ -- allows fine-grained control of what passes are to be run when, and the specification+ -- of passes not available through 'CuratedPassSetSpec'.+ = PassSetSpec {+ transforms :: [Pass],+ dataLayout :: Maybe DataLayout,+ targetLibraryInfo :: Maybe TargetLibraryInfo,+ targetLowering :: Maybe TargetLowering+ }+ -- | This type is a high-level specification of a set of passes. It uses the same+ -- collection of passes chosen by the LLVM team in the command line tool 'opt'. The fields+ -- of this spec are much like typical compiler command-line flags - e.g. -O\<n\>, etc.+ | CuratedPassSetSpec {+ optLevel :: Maybe Word,+ sizeLevel :: Maybe Word,+ unitAtATime :: Maybe Bool,+ simplifyLibCalls :: Maybe Bool,+ useInlinerWithThreshold :: Maybe Word+ } --- | Helper to make a 'CuratedPassSetSpec'+-- | Helper to make a curated 'PassSetSpec' defaultCuratedPassSetSpec = CuratedPassSetSpec {- optLevel = Nothing,- sizeLevel = Nothing,- unitAtATime = Nothing,- simplifyLibCalls = Nothing,- useInlinerWithThreshold = Nothing- }--instance PassManagerSpecification CuratedPassSetSpec where- createPassManager s = bracket FFI.passManagerBuilderCreate FFI.passManagerBuilderDispose $ \b -> do- let handleOption g m = maybe (return ()) (g b . fromIntegral . fromEnum) (m s)- handleOption FFI.passManagerBuilderSetOptLevel optLevel- handleOption FFI.passManagerBuilderSetSizeLevel sizeLevel- handleOption FFI.passManagerBuilderSetDisableUnitAtATime (liftM not . unitAtATime)- handleOption FFI.passManagerBuilderSetDisableSimplifyLibCalls (liftM not . simplifyLibCalls)- handleOption FFI.passManagerBuilderUseInlinerWithThreshold useInlinerWithThreshold- pm <- FFI.createPassManager- FFI.passManagerBuilderPopulateModulePassManager b pm- return pm--data PassSetSpec = PassSetSpec [Pass] (Maybe TargetLowering)--instance Monad m => EncodeM m (Maybe Bool) (FFI.LLVMEncoded CInt (Maybe Bool)) where- encodeM mb = return $ FFI.LLVMEncoded ((maybe (-1) (\b -> if b then 1 else 0) mb) :: CInt)--instance Monad m => EncodeM m (Maybe Word) (FFI.LLVMEncoded CInt (Maybe Word)) where- encodeM mw = return $ FFI.LLVMEncoded ((maybe (-1) fromIntegral mw) :: CInt)+ optLevel = Nothing,+ sizeLevel = Nothing,+ unitAtATime = Nothing,+ simplifyLibCalls = Nothing,+ useInlinerWithThreshold = Nothing+} -instance PassManagerSpecification PassSetSpec where- createPassManager (PassSetSpec ps tl') = flip runAnyContT return $ do- let tl = maybe nullPtr (\(TargetLowering tl) -> tl) tl'- pm <- liftIO $ FFI.createPassManager- forM ps $ \p -> $(- do- TH.TyConI (TH.DataD _ _ _ cons _) <- TH.reify ''Pass- TH.caseE [| p |] $ flip map cons $ \con -> do- let- (n, fns) = case con of- TH.RecC n fs -> (n, [ TH.nameBase fn | (fn, _, _) <- fs ])- TH.NormalC n [] -> (n, [])- actions = - [ TH.bindS (TH.varP . TH.mkName $ fn) [| encodeM $(TH.dyn fn) |] | fn <- fns ]- ++ [- TH.noBindS [|- liftIO $(- foldl1 TH.appE- (map TH.dyn $- ["FFI.add" ++ TH.nameBase n ++ "Pass", "pm"]- ++ ["tl" | FFI.needsTargetLowering (TH.nameBase n)]- ++ fns)- )- |]- ]- TH.match (TH.conP n $ map (TH.varP . TH.mkName) fns) (TH.normalB (TH.doE actions)) []- )- return pm+-- | an empty 'PassSetSpec'+defaultPassSetSpec = PassSetSpec {+ transforms = [],+ dataLayout = Nothing,+ targetLibraryInfo = Nothing,+ targetLowering = Nothing+} -instance PassManagerSpecification [Pass] where- createPassManager ps = createPassManager (PassSetSpec ps Nothing)+instance (Monad m, MonadAnyCont IO m) => EncodeM m GCOVVersion FFI.LLVMBool where+ encodeM (GCOVVersion "402*") = encodeM True+ encodeM (GCOVVersion "404*") = encodeM False+ encodeM s = fail $ "unsupported GCOVVersion: "++ show s ++ ". llvm-3.2 supports only \"402*\" and \"404*\"" -instance PassManagerSpecification ([Pass], TargetLowering) where- createPassManager (ps, tl) = createPassManager (PassSetSpec ps (Just tl))+createPassManager :: PassSetSpec -> IO (Ptr FFI.PassManager)+createPassManager pss = flip runAnyContT return $ do+ pm <- liftIO $ FFI.createPassManager+ case pss of+ s@CuratedPassSetSpec {} -> liftIO $ do+ bracket FFI.passManagerBuilderCreate FFI.passManagerBuilderDispose $ \b -> do+ let handleOption g m = forM_ (m s) (g b <=< encodeM) + handleOption FFI.passManagerBuilderSetOptLevel optLevel+ handleOption FFI.passManagerBuilderSetSizeLevel sizeLevel+ handleOption FFI.passManagerBuilderSetDisableUnitAtATime (liftM not . unitAtATime)+ handleOption FFI.passManagerBuilderSetDisableSimplifyLibCalls (liftM not . simplifyLibCalls)+ handleOption FFI.passManagerBuilderUseInlinerWithThreshold useInlinerWithThreshold+ FFI.passManagerBuilderPopulateModulePassManager b pm+ PassSetSpec ps dl tli tl' -> do+ let tl = maybe nullPtr (\(TargetLowering tl) -> tl) tl'+ forM_ tli $ \(TargetLibraryInfo tli) -> do+ liftIO $ FFI.addTargetLibraryInfoPass pm tli+ forM_ dl $ \dl -> liftIO $ withFFIDataLayout dl $ FFI.addDataLayoutPass pm + forM_ ps $ \p -> $(+ do+ TH.TyConI (TH.DataD _ _ _ cons _) <- TH.reify ''Pass+ TH.caseE [| p |] $ flip map cons $ \con -> do+ let+ (n, fns) = case con of+ TH.RecC n fs -> (n, [ TH.nameBase fn | (fn, _, _) <- fs ])+ TH.NormalC n [] -> (n, [])+ actions = + [ TH.bindS (TH.varP . TH.mkName $ fn) [| encodeM $(TH.dyn fn) |] | fn <- fns ]+ ++ [+ TH.noBindS [|+ liftIO $(+ foldl1 TH.appE+ (map TH.dyn $+ ["FFI.add" ++ TH.nameBase n ++ "Pass", "pm"]+ ++ ["tl" | FFI.needsTargetLowering (TH.nameBase n)]+ ++ fns)+ )+ |]+ ]+ TH.match (TH.conP n $ map (TH.varP . TH.mkName) fns) (TH.normalB (TH.doE actions)) []+ )+ return pm -- | bracket the creation of a 'PassManager'-withPassManager :: PassManagerSpecification s => s -> (PassManager -> IO a) -> IO a+withPassManager :: PassSetSpec -> (PassManager -> IO a) -> IO a withPassManager s = bracket (createPassManager s) FFI.disposePassManager . (. PassManager) -- | run the passes in a 'PassManager' on a 'Module', modifying the 'Module'.
src/LLVM/General/Internal/PrettyPrint.hs view
@@ -99,6 +99,7 @@ p <- asks precedence parensIfNeeded appPrec (foldl (<+>) name fields) +-- | a class for simple pretty-printing with indentation a function only of syntactic depth. class Show a => PrettyShow a where prettyShow :: a -> QTree prettyShowList :: [a] -> QTree
src/LLVM/General/Internal/RMWOperation.hs view
@@ -10,7 +10,7 @@ import LLVM.General.Internal.Coding -genCodingInstance' [t| RMWOperation |] ''FFI.RMWOperation [+genCodingInstance [t| RMWOperation |] ''FFI.RMWOperation [ (FFI.rmwOperationXchg, Xchg), (FFI.rmwOperationAdd, Add), (FFI.rmwOperationSub, Sub),
src/LLVM/General/Internal/String.hs view
@@ -9,6 +9,7 @@ import Control.Monad.AnyCont import Control.Monad.IO.Class import Control.Exception (finally)+import Data.Maybe (fromMaybe) import Foreign.C (CString, CChar) import Foreign.Ptr import Foreign.Storable (Storable)@@ -51,3 +52,7 @@ instance (Integral i, Storable i, MonadIO d) => DecodeM d String (Ptr i -> IO (Ptr CChar)) where decodeM f = decodeM =<< (liftIO $ F.M.alloca $ \p -> (,) `liftM` f p `ap` peek p)++instance (Monad e, EncodeM e String c) => EncodeM e (Maybe String) (NothingAsEmptyString c) where+ encodeM = liftM NothingAsEmptyString . encodeM . fromMaybe ""+
src/LLVM/General/Internal/Target.hs view
@@ -32,14 +32,14 @@ import qualified LLVM.General.CodeModel as CodeModel import qualified LLVM.General.CodeGenOpt as CodeGenOpt -genCodingInstance' [t| Reloc.Model |] ''FFI.RelocModel [+genCodingInstance [t| Reloc.Model |] ''FFI.RelocModel [ (FFI.relocModelDefault, Reloc.Default), (FFI.relocModelStatic, Reloc.Static), (FFI.relocModelPIC, Reloc.PIC), (FFI.relocModelDynamicNoPic, Reloc.DynamicNoPIC) ] -genCodingInstance' [t| CodeModel.Model |] ''FFI.CodeModel [+genCodingInstance [t| CodeModel.Model |] ''FFI.CodeModel [ (FFI.codeModelDefault,CodeModel.Default), (FFI.codeModelJITDefault, CodeModel.JITDefault), (FFI.codeModelSmall, CodeModel.Small),@@ -48,20 +48,20 @@ (FFI.codeModelLarge, CodeModel.Large) ] -genCodingInstance' [t| CodeGenOpt.Level |] ''FFI.CodeGenOptLevel [+genCodingInstance [t| CodeGenOpt.Level |] ''FFI.CodeGenOptLevel [ (FFI.codeGenOptLevelNone, CodeGenOpt.None), (FFI.codeGenOptLevelLess, CodeGenOpt.Less), (FFI.codeGenOptLevelDefault, CodeGenOpt.Default), (FFI.codeGenOptLevelAggressive, CodeGenOpt.Aggressive) ] -genCodingInstance' [t| TO.FloatABI |] ''FFI.FloatABIType [+genCodingInstance [t| TO.FloatABI |] ''FFI.FloatABIType [ (FFI.floatABIDefault, TO.FloatABIDefault), (FFI.floatABISoft, TO.FloatABISoft), (FFI.floatABIHard, TO.FloatABIHard) ] -genCodingInstance' [t| TO.FloatingPointOperationFusionMode |] ''FFI.FPOpFusionMode [+genCodingInstance [t| TO.FloatingPointOperationFusionMode |] ''FFI.FPOpFusionMode [ (FFI.fpOpFusionModeFast, TO.FloatingPointOperationFusionFast), (FFI.fpOpFusionModeStandard, TO.FloatingPointOperationFusionStandard), (FFI.fpOpFusionModeStrict, TO.FloatingPointOperationFusionStrict)@@ -263,7 +263,6 @@ getTargetMachineDataLayout (TargetMachine m) = fromMaybe (error "parseDataLayout failed") . parseDataLayout <$> (decodeM =<< (FFI.getTargetMachineDataLayout m)) - -- | Initialize all targets so they can be found by 'lookupTarget' initializeAllTargets :: IO () initializeAllTargets = FFI.initializeAllTargets@@ -278,3 +277,16 @@ (target, _) <- lookupTarget Nothing triple liftIO $ withTargetOptions $ \options -> withTargetMachine target triple cpu features options Reloc.Default CodeModel.Default CodeGenOpt.Default f++-- | <http://llvm.org/docs/doxygen/html/classllvm_1_1TargetLibraryInfo.html>+newtype TargetLibraryInfo = TargetLibraryInfo (Ptr FFI.TargetLibraryInfo)++-- | look up information about the library functions available on a given platform+withTargetLibraryInfo :: + String -- ^ triple+ -> (TargetLibraryInfo -> IO a)+ -> IO a+withTargetLibraryInfo triple f = flip runAnyContT return $ do+ triple <- encodeM triple+ liftIO $ bracket (FFI.createTargetLibraryInfo triple) FFI.disposeTargetLibraryInfo (f . TargetLibraryInfo)+
src/LLVM/General/PassManager.hs view
@@ -1,17 +1,12 @@ -- | A 'PassManager' holds collection of passes, to be run on 'Module's. -- Build one with 'withPassManager': -- --- * from a 'CuratedPassSetSpec' if you want optimization but not to play with your compiler------ * from a ['LLVM.General.Transform.Pass'] if you do want to play with your compiler+-- * using 'CuratedPassSetSpec' if you want optimization but not to play with your compiler ----- * from a (['LLVM.General.Transform.Pass'], 'LLVM.General.Target.TargetLowering') if you--- want to provide target-specific information (e.g. instruction costs) to the few passes--- that use it (see comments on 'LLVM.General.Transforms.Pass').+-- * using 'PassSetSpec' if you do want to play with your compiler module LLVM.General.PassManager ( PassManager,- PassManagerSpecification,- CuratedPassSetSpec(..), defaultCuratedPassSetSpec,+ PassSetSpec(..), defaultPassSetSpec, defaultCuratedPassSetSpec, withPassManager, runPassManager ) where
src/LLVM/General/Target.hs view
@@ -10,7 +10,9 @@ withTargetMachine, withDefaultTargetMachine, getTargetLowering, getDefaultTargetTriple, getHostCPUName, getHostCPUFeatures,- getTargetMachineDataLayout, initializeNativeTarget, initializeAllTargets+ getTargetMachineDataLayout, initializeNativeTarget, initializeAllTargets,+ TargetLibraryInfo,+ withTargetLibraryInfo ) where import LLVM.General.Internal.Target
src/LLVM/General/Transforms.hs view
@@ -83,30 +83,44 @@ -- here begin the vectorization passes | BasicBlockVectorize { - vectorBits :: Word,- vectorizeBools :: Bool,- vectorizeInts :: Bool,- vectorizeFloats :: Bool,- vectorizePointers :: Bool,- vectorizeCasts :: Bool,- vectorizeMath :: Bool,- vectorizeFusedMultiplyAdd :: Bool,- vectorizeSelect :: Bool,- vectorizeCmp :: Bool,- vectorizeGetElementPtr :: Bool,- vectorizeMemoryOperations :: Bool,- alignedOnly :: Bool,- requiredChainDepth :: Word,- searchLimit :: Word,- maxCandidatePairsForCycleCheck :: Word,- splatBreaksChain :: Bool,- maxInstructions :: Word,- maxIterations :: Word,- powerOfTwoLengthsOnly :: Bool,- noMemoryOperationBoost :: Bool,- fastDependencyAnalysis :: Bool+ vectorBits :: Word,+ vectorizeBools :: Bool,+ vectorizeInts :: Bool,+ vectorizeFloats :: Bool,+ vectorizePointers :: Bool,+ vectorizeCasts :: Bool,+ vectorizeMath :: Bool,+ vectorizeFusedMultiplyAdd :: Bool,+ vectorizeSelect :: Bool,+ vectorizeCmp :: Bool,+ vectorizeGetElementPtr :: Bool,+ vectorizeMemoryOperations :: Bool,+ alignedOnly :: Bool,+ requiredChainDepth :: Word,+ searchLimit :: Word,+ maxCandidatePairsForCycleCheck :: Word,+ splatBreaksChain :: Bool,+ maxInstructions :: Word,+ maxIterations :: Word,+ powerOfTwoLengthsOnly :: Bool,+ noMemoryOperationBoost :: Bool,+ fastDependencyAnalysis :: Bool } | LoopVectorize++ -- here begin the instrumentation passes+ | EdgeProfiler+ | OptimalEdgeProfiler+ | PathProfiler+ | GCOVProfiler {+ emitNotes :: Bool,+ emitData :: Bool,+ version :: GCOVVersion,+ useCfgChecksum :: Bool+ }+ | AddressSanitizer+ | ThreadSanitizer+ | BoundsChecking deriving (Eq, Ord, Read, Show, Typeable, Data) -- | Defaults for the 'BasicBlockVectorize' pass - copied from the C++ code to keep these defaults@@ -137,3 +151,21 @@ noMemoryOperationBoost = False, fastDependencyAnalysis = False }++-- | See <http://gcc.gnu.org/viewcvs/gcc/trunk/gcc/gcov-io.h?view=markup>.+newtype GCOVVersion = GCOVVersion String+ deriving (Eq, Ord, Read, Show, Typeable, Data)++-- | Defaults for 'GCOVProfiler'.+defaultGCOVProfiler = GCOVProfiler {+ emitNotes = True,+ emitData = True,+ version = GCOVVersion "402*", + useCfgChecksum = False+ }++-- | Defaults for 'AddressSanitizer'.+defaultAddressSanitizer = AddressSanitizer++-- | Defaults for 'ThreadSanitizer'.+defaultThreadSanitizer = ThreadSanitizer
test/LLVM/General/Test/Linking.hs view
@@ -30,11 +30,6 @@ import qualified LLVM.General.AST.Global as G import qualified LLVM.General.AST.Constant as C -optimize :: PassManagerSpecification s => s -> A.Module -> IO A.Module-optimize s m = withContext $ \context -> withModuleFromAST' context m $ \mIn' -> do- withPassManager s $ \pm -> runPassManager pm mIn'- moduleAST mIn'- tests = testGroup "Linking" [ testCase "basic" $ do let
test/LLVM/General/Test/Metadata.hs view
@@ -35,8 +35,9 @@ ( "my-metadatum", MetadataNode [- LocalReference (UnName 1),- MetadataStringOperand "super hyper"+ Just $ LocalReference (UnName 1),+ Just $ MetadataStringOperand "super hyper",+ Nothing ] ) ]@@ -49,7 +50,7 @@ \\n\ \define i32 @foo() {\n\ \ %1 = load i32* @0\n\- \ ret i32 0, !my-metadatum !{i32 %1, metadata !\"super hyper\"}\n\+ \ ret i32 0, !my-metadatum !{i32 %1, metadata !\"super hyper\", null}\n\ \}\n" strCheck ast s, @@ -67,7 +68,7 @@ ] ) ],- MetadataNodeDefinition (MetadataNodeID 0) [ ConstantOperand (C.Int 32 1) ]+ MetadataNodeDefinition (MetadataNodeID 0) [ Just $ ConstantOperand (C.Int 32 1) ] ] let s = "; ModuleID = '<string>'\n\ \\n\@@ -80,8 +81,8 @@ testCase "named" $ do let ast = Module "<string>" Nothing Nothing [- NamedMetadataDefinition "my-module-metadata" [MetadataNodeID 0],- MetadataNodeDefinition (MetadataNodeID 0) [ ConstantOperand (C.Int 32 1) ]+ NamedMetadataDefinition "my-module-metadata" [ MetadataNodeID 0 ],+ MetadataNodeDefinition (MetadataNodeID 0) [ Just $ ConstantOperand (C.Int 32 1) ] ] let s = "; ModuleID = '<string>'\n\ \\n\@@ -90,15 +91,27 @@ \!0 = metadata !{i32 1}\n" strCheck ast s, + testCase "null" $ do+ let ast = Module "<string>" Nothing Nothing [+ NamedMetadataDefinition "my-module-metadata" [ MetadataNodeID 0 ],+ MetadataNodeDefinition (MetadataNodeID 0) [ Nothing ]+ ]+ let s = "; ModuleID = '<string>'\n\+ \\n\+ \!my-module-metadata = !{!0}\n\+ \\n\+ \!0 = metadata !{null}\n"+ strCheck ast s,+ testGroup "cyclic" [ testCase "metadata-only" $ do let ast = Module "<string>" Nothing Nothing [ NamedMetadataDefinition "my-module-metadata" [MetadataNodeID 0], MetadataNodeDefinition (MetadataNodeID 0) [- MetadataNodeOperand (MetadataNodeReference (MetadataNodeID 1)) + Just $ MetadataNodeOperand (MetadataNodeReference (MetadataNodeID 1)) ], MetadataNodeDefinition (MetadataNodeID 1) [- MetadataNodeOperand (MetadataNodeReference (MetadataNodeID 0)) + Just $ MetadataNodeOperand (MetadataNodeReference (MetadataNodeID 0)) ] ] let s = "; ModuleID = '<string>'\n\@@ -122,7 +135,7 @@ ) ], MetadataNodeDefinition (MetadataNodeID 0) [- ConstantOperand (C.GlobalReference (Name "foo"))+ Just $ ConstantOperand (C.GlobalReference (Name "foo")) ] ] let s = "; ModuleID = '<string>'\n\
test/LLVM/General/Test/Optimization.hs view
@@ -93,9 +93,9 @@ ] ] -optimize :: PassManagerSpecification s => s -> A.Module -> IO A.Module-optimize s m = withContext $ \context -> withModuleFromAST' context m $ \mIn' -> do- withPassManager s $ \pm -> runPassManager pm mIn'+optimize :: PassSetSpec -> A.Module -> IO A.Module+optimize pss m = withContext $ \context -> withModuleFromAST' context m $ \mIn' -> do+ withPassManager pss $ \pm -> runPassManager pm mIn' moduleAST mIn' tests = testGroup "Optimization" [@@ -118,7 +118,7 @@ testGroup "individual" [ testCase "ConstantPropagation" $ do- mOut <- optimize [ConstantPropagation] handAST+ mOut <- optimize defaultPassSetSpec { transforms = [ConstantPropagation] } handAST mOut @?= Module "<string>" Nothing Nothing [ GlobalDefinition $ Function L.External V.Default CC.C [] (IntegerType 32) (Name "foo") ([@@ -210,14 +210,8 @@ ] (Do $ Ret (Just (LocalReference (Name "r"))) []) ] ]- mOut <- optimize [ - defaultVectorizeBasicBlocks {- vectorizePointers = False,- requiredChainDepth = 3- },- InstructionCombining,- GlobalValueNumbering False- ] mIn+ mOut <- + optimize (defaultPassSetSpec { transforms = [ defaultVectorizeBasicBlocks { vectorizePointers = False, requiredChainDepth = 3 }, InstructionCombining, GlobalValueNumbering False ] }) mIn mOut @?= Module "<string>" Nothing Nothing [ GlobalDefinition $ Function L.External V.Default CC.C [] (FloatingPointType 64 IEEE) (Name "foo") ([@@ -299,9 +293,9 @@ (target, _) <- failInIO $ lookupTarget Nothing triple withTargetOptions $ \targetOptions -> do withTargetMachine target triple "" Set.empty targetOptions- R.Default CM.Default CGO.Default $ \targetMachine -> do- targetLowering <- getTargetLowering targetMachine- withPassManager ([LowerInvoke False], targetLowering) $ \passManager -> do+ R.Default CM.Default CGO.Default $ \tm -> do+ tl <- getTargetLowering tm+ withPassManager (defaultPassSetSpec { transforms = [LowerInvoke False], targetLowering = Just tl}) $ \passManager -> do let astIn = Module "<string>" Nothing Nothing [ GlobalDefinition $ Function L.External V.Default CC.C [] (IntegerType 32) (Name "foo") ([
test/LLVM/General/Test/Tests.hs view
@@ -15,6 +15,7 @@ import qualified LLVM.General.Test.Analysis as Analysis import qualified LLVM.General.Test.PrettyPrint as PrettyPrint import qualified LLVM.General.Test.Linking as Linking+import qualified LLVM.General.Test.Instrumentation as Instrumentation tests = testGroup "llvm-general" [ Constants.tests,@@ -29,5 +30,6 @@ Target.tests, Analysis.tests, PrettyPrint.tests,- Linking.tests+ Linking.tests,+ Instrumentation.tests ]