Ứng dụng của tôi cần chạy nhiều ngữ cảnh riêng biệt trong cùng một quy trình (đơn luồng). Tất cả đều chia sẻ một đơn LLVMContext
.đề xuất thiết kế: llvm nhiều ngữ cảnh thời gian chạy
Quy trình sẽ chạy nhiều ngữ cảnh (theo ý nghĩa luồng); nghĩa là, mỗi hàm chạy một hàm trong đối tượng tiếp tục dựa trên boost::context
(vẫn còn trên vòm, lib đã được phê duyệt trước), điều đó có nghĩa là mỗi ngữ cảnh có thể sinh lợi nhưng về cơ bản chúng chạy trong cùng một quy trình một luồng. Mỗi người nên chạy về cơ bản độc lập với nhau, và quan trọng hơn, một lỗi biên dịch trong mỗi một không nên ảnh hưởng đến việc thực hiện của những người khác.
Mỗi ngữ cảnh này, sẽ gọi mã động kéo dài nhiều đơn vị dịch (TU). một số đơn vị dịch thuật có thể được chia sẻ trong nhiều ngữ cảnh này. lỗi biên dịch trong một đơn vị dịch mới hoặc đã sửa đổi sẽ không ảnh hưởng đến các ngữ cảnh khác.
Làm rõ Chỉnh sửa: Ví dụ: T.U. A có thể được chia sẻ giữa hai bối cảnh, ngữ cảnh X và Y. chỉ vì có một bức tranh đầy đủ, cho phép nói rằng X cũng sẽ chạy mã từ các đơn vị dịch khác, Ie B và D, trong khi Y cũng sẽ có C. Tại một số điểm, X quyết định sửa đổi thành A, vì vậy nó tạo ra một TU A.1 mới, là bản sao của A và áp dụng sửa đổi ở đó, vì vậy chúng sẽ không ảnh hưởng đến bối cảnh Y. Hy vọng ví dụ này làm rõ yêu cầu.
xung ban đầu của tôi là kết hợp một llvm::Module
cho từng bối cảnh, nhưng vì không xác định của nó trong LLVM gì xảy ra với một mô-đun trong một trạng thái trung gian biên soạn, tôi quyết định thêm một llvm::Module
cho mỗi đơn vị dịch thuật (xem this question for the reason), cộng với chính sách copy-on-write mà tôi đã giải thích trước đây khi các sửa đổi của một đơn vị dịch diễn ra cục bộ trong một ngữ cảnh, để tránh một sửa đổi ảnh hưởng đến các ngữ cảnh khác.
Câu hỏi hai lần chính tôi đã có là:
Làm thế nào để liên kết với nhau các module khác nhau trong một bối cảnh để gọi chúng như một thư viện thống nhất? Tôi đang sử dụng api C++. Tôi đặc biệt cảnh giác với this nasty, old bug ảnh hưởng đến chức năng này. Liệu lỗi này có ảnh hưởng đến tôi không nếu tôi chuyển quyền sở hữu tất cả các mô-đun cho JIT bằng
ExecutionEngine::addModule()
?Các bước được yêu cầu khi sửa đổi trên một đơn vị dịch buộc phải cập nhật một trong các mô-đun là gì? sao tôi cần phải xóa/xóa đối tượng mô-đun cũ và tạo một đối tượng mới? Có chính sách tái chế nào mà tôi chưa đọc?
Một câu hỏi thứ tôi có về vấn đề này là:
- bao nhiêu
ExecutionEngine
nào tôi cần? một cho toàn bộ ứng dụng? một cho mỗi ngữ cảnh? mỗi mô-đun một?
Hy vọng phạm vi của câu hỏi không quá áp đảo.
Tôi không phải là một chuyên gia, nhưng tôi nghĩ rằng tôi có thể thêm một cái gì đó ở đây để ít nhất giúp bạn bắt đầu. Để đặt câu hỏi 1a: phần dưới cùng của [liên kết của bạn] (http://llvm.org/bugs/show_bug.cgi?id=2606) có vẻ khẳng định rằng việc ném các mô-đun của bạn vào JIT thực sự sẽ làm việc xung quanh lỗi này. Để 1b: [tài liệu API] (http://llvm.org/docs/doxygen/html/classllvm_1_1Module.html) đề xuất không tái chế tài nguyên, chỉ cần [cấu trúc vượt qua] (http://llvm.org/docs/WritingAnLLVMPass .html). Vì vậy, nó phụ thuộc vào sự đột biến của các mô-đun của bạn. Để 2: Tôi nói, hãy để thiết kế và nhu cầu của bạn xác định rằng, đưa ra các giải pháp cho hai câu hỏi đầu tiên của bạn. Chúc may mắn! – MrGomez
Và đó là một cách rõ ràng như tôi có thể làm cho câu trả lời giả của tôi. Hãy cho tôi biết nếu bạn muốn tôi chính thức hóa điều này thành một câu trả lời thực tế, mặc dù tôi thừa nhận sai lầm thông qua các ghi chú thiết kế, tài liệu, và lý thuyết trình biên dịch đằng sau cách LLVM hoạt động. – MrGomez