Tôi đang cố gắng làm theo cùng với hướng dẫn LLVM bindingshere và chạy vào phân đoạn. Mã sau đây hoạt động theo nghĩa là nó in tiêu đề mô-đun thành output.ll
, nhưng nó cũng phân đoạn ở đâu đó.Phân đoạn trong Haskell LLVM-Tạo mã tổng hợp
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
Tôi nghi ngờ điều này có liên quan đến các gợi ý sau đây từ các hướng dẫn liên kết:
Nó là rất quan trọng cần nhớ không để vượt qua hoặc cố gắng sử dụng các nguồn lực bên ngoài của khung vì điều này sẽ dẫn đến hành vi và/hoặc segfaults không xác định.
Tôi nghĩ trong ngữ cảnh này, "khung" được thực hiện bởi hàm withContext
, điều này có vẻ như mọi thứ sẽ được xử lý.
Nếu tôi thay đổi định nghĩa của writeModule
để
writeModule mod = do assembly <- (withContext $ (\context ->
liftError $ withModuleFromAST context mod moduleLLVMAssembly))
putStrLn assembly
có nghĩa là, thay vì viết vào một tập tin tôi chỉ in ra chuỗi đại diện của lắp ráp LLVM, không segfault được ném.
Có ai có kinh nghiệm với các ràng buộc này không? Tôi cũng quan tâm để biết về các trường hợp thất bại cho cảnh báo tôi đã trích dẫn. Đó là, làm thế nào một "quên" không sử dụng các tài nguyên bên ngoài khung? Tất cả các chức năng dường như yêu cầu một Context
, tốt, yêu cầu một. Không phải là loại vấn đề phạm vi tài nguyên chính xác những gì Haskell là tốt xử lý cho bạn? thông tin
Version:
llvm-general-3.4.3.0
LLVM version 3.4
Default target: x86_64-apple-darwin13.2.0
Tôi đoán trực giác của tôi về nội dung xếp hạng được hỗ trợ bởi trang trên [mẫu khung] (http: //www.haskell.org/haskellwiki/Bracket_pattern), trong đó nói "Nhìn chung, trong các thư viện nhiều hàm có tên bắt đầu bằng' with' được định nghĩa để quản lý các tài nguyên khác nhau theo kiểu này. " – Cardano
Không liên quan đến câu hỏi của bạn: tại sao bạn bọc mọi thứ trong 'writeModule' trong một khối' do' tầm thường? – dfeuer
Rất tiếc, đó có thể là lỗi chỉnh sửa. – Cardano