2012-01-26 30 views
54

Trong Haskell LLVM bindings, tôi đang cố định nghĩa một hàm với một số biến đối số (thực ra tôi có nghĩa là một số không đổi không biết tại thời gian biên dịch). Tôi tìm thấy this question và tôi đang cố gắng làm theo câu trả lời.Ràng buộc FFI và DSL

Tôi không muốn quay trở lại hoàn toàn để sử dụng FFI để tạo LLVM, tôi muốn sử dụng DSL nhiều nhất có thể và sử dụng FFI để chỉ thực hiện những điều tôi không thể thực hiện qua DSL.

Tôi đã quản lý để xác định loại qua functionType, tôi vẫn không thể thêm hàm vào mô-đun được tạo bằng cách gọi defineModule. Tôi cũng nghĩ rằng bước tiếp theo là thêm các khối cơ bản vào hàm thông qua FFI.appendBasicBlock mà tôi nghĩ là dễ dàng, nhưng làm cách nào để lấy các đối số qua FFI.getParam bên trong khối làm trong mẫu đơn CodeGenFunction.

Trả lời

2

Nếu kích thước của danh sách đối số không được biết đến 'cho đến khi chạy, bạn sẽ cần phải chuyển đổi hàm thành một cái gì đó hoạt động trên danh sách. Lưu ý rằng kiểu (IORef [Word32]) có nghĩa là một hành động IO sẽ đọc/ghi một danh sách Word32 (có thể thay đổi) trong khi thực hiện chương trình. Các chương trình Haskell chỉ phải nói cách biến đổi/đọc/ghi danh sách - do đó đơn vị IO().

Có một ví dụ/tệp List.hs trong dự án LLVM git mà bạn đã tham chiếu. Nó xây dựng một thói quen lắp ráp LLVM "arrayLoop",

arrayLoop :: 
    (Phi a, IsType b, 
    Num i, IsConst i, IsInteger i, IsFirstClass i, CmpRet i Bool) => 
    Value i -> Value (Ptr b) -> a -> 
    (Value (Ptr b) -> a -> CodeGenFunction r a) -> 
    CodeGenFunction r a 
arrayLoop len ptr start loopBody = do 

mà increments một con trỏ đến một danh sách các ints, p, và decrements chiều dài còn lại, i, trong mỗi lời gọi của khối 'body'. khối đó nhiều lần gọi 'loopBody' và lưu trữ kết quả trong 'vars', mà là cuối cùng trả lại (ảnh hưởng tại zero) để 's' bên trong hàm mList:

mList :: 
    CodeGenModule (Function 
     (StablePtr (IORef [Word32]) -> Word32 -> Ptr Word32 -> IO Int32)) 
mList = 
    createFunction ExternalLinkage $ \ ref size ptr -> do 
    next <- staticFunction nelem 
    let _ = next :: Function (StablePtr (IORef [Word32]) -> IO Word32) 
    s <- arrayLoop size ptr (valueOf 0) $ \ ptri y -> do 
     flip store ptri =<< call next ref 
     return y 
    ret (s :: Value Int32) 

Tất cả các công cụ bổ sung về nelem/NextListElement là được sử dụng bên trong ví dụ của họ cho 'loopBody,' mà thay đổi danh sách một lần sang trái. Repo đó cũng đề cập đến một danh sách gửi thư: [email protected]

GHC7 có thể biên dịch bằng LLVM, nhưng tôi đoán điều này sẽ không giúp ích trong chương trình Haskell diễn giải ngôn ngữ trừ khi GHC cũng biên dịch JIT - bất kỳ ai biết đây có phải là trường hợp không?