2013-01-10 37 views
12

Chỉ cần chắc chắn: Nền tảng bitcoin LLVM có đa nền tảng không? Theo đó tôi có nghĩa là, tập tin IR (".bc") được tạo ra có được phân tách và diễn giải/JIT trên các nền tảng khác nhau không?BitVM bitcode đa nền tảng

Nếu có, Clang chuyển đổi C++ thành mã độc lập nền tảng như thế nào? Trong khi trong chính ngôn ngữ C++, các bộ tiền xử lý để xác định nền tảng đích của nó được sử dụng trước khi nó thực sự biên dịch.

+0

Nếu đối tượng hoàn toàn khép kín, nó có thể được diễn giải trên một nền tảng khác. Nhưng kể từ khi ABI sẽ khác nhau, nó sẽ có một thời gian khó khăn bằng cách sử dụng phần còn lại của hệ thống. –

+0

Tôi giả định rằng http://llvm.org/docs/LangRef.html sẽ hoàn toàn nền tảng độc lập. Điều gì làm bạn có nghĩa là chính xác bởi 'thời gian hart sử dụng phần còn lại của hệ thống'? – Tim

+1

@Tim - Mã sẽ sử dụng bất kỳ cuộc gọi hệ điều hành nào? Họ di động như thế nào? –

Trả lời

17

LLVM IR có thể là nền tảng chéo, với các trường hợp ngoại lệ rõ ràng mà những người khác đã liệt kê. Tuy nhiên, điều đó không có nghĩa là Clang tạo mã đa nền tảng. Như bạn lưu ý, bộ tiền xử lý hầu như được sử dụng phổ biến để chỉ chuyển các phần của mã tới trình biên dịch C/C++, tùy thuộc vào nền tảng. Ngay cả khi điều này không được thực hiện trong mã người dùng, nhiều tiêu đề hệ thống bao gồm một hoặc hai nền tảng cụ thể, chẳng hạn như typedef s. Ví dụ, nếu bạn biên dịch mã C bằng cách sử dụng size_t để LLVM IR trên nền tảng nơi size_t là 32 bit, LLVM IR hiện sử dụng i32 cho điều đó và không có cách nào trong địa ngục bạn có thể đảo ngược kỹ sư để sửa lỗi đó.

Dự án Portable Native Client của Google (nhờ @willglynn cho liên kết), nếu tôi hiểu chính xác, đạt được tính di động bằng cách sửa ABI cho tất cả các nền tảng đích. Vì vậy, trong ý nghĩa đó, nó không giải quyết được các vấn đề nói trên: LLVM IR không thể di chuyển đến nền tảng với một ABI khác. Lý do duy nhất này là di động hơn là các khách hàng cung cấp một lớp phù hợp với ABI PNaCl ABI thực tế. Nói cách khác, mã PNaCl không di động với nhiều nền tảng, "PNaCl VM" là. Vì vậy, điểm mấu chốt: Nếu bạn rất cẩn thận, bạn có thể sử dụng LLVM IR trên nhiều nền tảng, nhưng không phải làm công việc bổ sung đáng kể (mà Clang không làm) để trừu tượng hóa sự khác biệt của ABI.

9

Với tệp IR, tôi có thể chắc chắn tệp có thể biên dịch cho mục tiêu của mình không?

Bạn có thể không giả định tệp IR tùy ý sẽ luôn là nền tảng chéo, vì có những thứ trong một tệp nhất định có thể không độc lập với nền tảng. Ví dụ đáng chú ý nhất là IR có thể chứa các trình tự lắp ráp thực tế (thông qua các phân đoạn lắp ráp module-level hoặc inline), nhưng có các ví dụ khác - ví dụ: việc sử dụng các nội dung cụ thể hoặc quy ước gọi cụ thể chỉ được hỗ trợ trên một số mục tiêu.

Tôi có thể tạo tệp IR được đảm bảo để biên dịch trên tất cả các mục tiêu không?

Tôi không biết, nhưng tôi tin bạn có thể, đặc biệt là nếu bạn tránh chỉ định những thứ như lắp ráp nội tuyến, gọi quy ước, ABI yêu cầu/ưa thích cho các loại, v.v. Nó có thể ảnh hưởng đến việc tối ưu hóa trình biên dịch .

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