Ich versuche, zusammen mit dem Tutorial here zu folgen und in einen segfault zu laufen. Der folgende Code funktioniert in dem Sinne, dass es einen Modulkopf auf output.ll
druckt, aber es segfaults irgendwo auch.Segfault in Haskell LLVM-Generelle Codegenerierung
module Main where
import Control.Monad.Error
import LLVM.General.Module
import LLVM.General.Context
import qualified LLVM.General.AST as AST
--Create and write out an empty LLVM module
main :: IO()
main = writeModule (AST.defaultModule { AST.moduleName = "myModule" })
outputFile :: File
outputFile = File "output.ll"
writeModule :: AST.Module -> IO()
writeModule mod = withContext $ (\context ->
liftError $ withModuleFromAST context mod (\m ->
liftError $ writeLLVMAssemblyToFile outputFile m))
--perform the action, or fail on an error
liftError :: ErrorT String IO a -> IO a
liftError = runErrorT >=> either fail return
Ich vermute, das auf den folgenden Hinweis aus dem verknüpften Tutorial zusammenhängt:
Es ist sehr wichtig, daran zu erinnern, nicht Ressourcen zu übergeben oder versuchen, außerhalb der Halterung zu verwenden, da dies führen undefiniertes Verhalten und/oder segfaults.
Ich denke in diesem Zusammenhang wird die "Klammer" durch die withContext
Funktion implementiert, die es scheint, als ob alles behandelt werden sollte.
Wenn ich die Definition von writeModule
zu
writeModule mod = do assembly <- (withContext $ (\context ->
liftError $ withModuleFromAST context mod moduleLLVMAssembly))
putStrLn assembly
, dass anstelle von Schreiben in eine Datei, die ich aus der String-Darstellung des LLVM Montage nur drucken, wird kein segfault geworfen.
Hat jemand Erfahrung mit diesen Bindungen? Ich bin auch daran interessiert, die Fehlerfälle für die von mir zitierte Warnung zu kennen. Das heißt, wie würde man "vergessen", keine Ressourcen außerhalb der Klammer zu verwenden? Alle Funktionen, die eine Context
erfordern, benötigen einen. Ist diese Art von Ressourcen-Scoping-Problem nicht genau das, was Haskell gut für Sie handhaben kann?
Versionsinformationen:
llvm-general-3.4.3.0
LLVM version 3.4
Default target: x86_64-apple-darwin13.2.0
Ich denke, meine Intuition über die Bracketing Zeug wird von der Seite auf der [Klammer Muster] (http: //www.haskell.org/haskellwiki/Bracket_pattern), die besagt "Im Allgemeinen sind in den Bibliotheken viele Funktionen mit Namen beginnend mit' mit' definiert, um verschiedene Ressourcen auf diese Weise zu verwalten. " – Cardano
Ohne Bezug zu Ihrer Frage: Warum wickeln Sie alles in 'writeModule' in einen trivialen' do' Block? – dfeuer
Whoops, das ist wahrscheinlich ein Bearbeitungsfehler. – Cardano