2014-06-21 13 views
5

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
+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

+0

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

+0

Rất tiếc, đó có thể là lỗi chỉnh sửa. – Cardano

Trả lời

3

Nó sẽ giúp đỡ nếu bạn chia sẻ LLVM của bạn và môi trường cabal, LLVM là nổi tiếng vì ngược không phù hợp với bản thân để có thể có vấn đề với việc sử dụng các phiên bản mới nhất của các ràng buộc.

Phía sau hậu trường writeLLVMAssemblyToFile đang sử dụng cuộc gọi C++ để thực hiện thao tác IO tệp và tôi suy đoán rằng nó đang giữ tham chiếu đến mô-đun LLVM như là kết quả của việc hoàn thành tài nguyên tệp.

Hãy thử hiển thị mô-đun cho một chuỗi bằng cách sử dụng moduleString và sau đó chỉ nâng vào đơn nguyên IO để gọi writeFile từ Haskell thay vì đi qua C++ để ghi.

import LLVM.General.Context 
import LLVM.General.Module as Mod 
import qualified LLVM.General.AST as AST 

import Control.Monad.Error 

main :: IO() 
main = do 
    writeModule (AST.defaultModule { AST.moduleName = "myModule" }) 
    return() 

writeModule :: AST.Module -> IO (Either String()) 
writeModule ast = 
    withContext $ \ctx -> 
    runErrorT $ withModuleFromAST ctx ast $ \m -> do 
     asm <- moduleString m 
     liftIO $ writeFile "output.ll" asm 

Các ràng buộc có thể vẫn khá giòn trong kinh nghiệm của tôi, bạn nên hỏi issue tracker nếu sự cố vẫn tiếp diễn.

EDIT: Đây là giải pháp cho phiên bản cũ đã được khắc phục sau đó. Xem: https://github.com/bscarlet/llvm-general/issues/109

Các vấn đề liên quan