2012-03-03 25 views
6

Tôi cố gắng để sử dụng llvm như một mã thế hệ back-end để phần mềm của tôi và chỉ nhận ra rằng llvm đã được biên soạn mà không cần sự hỗ trợ cho C++ xử lý ngoại lệ (đối với hiệu quả). Tuy nhiên, trong phần mềm của tôi, tôi sử dụng xử lý ngoại lệ rộng rãi.Liên kết với mã mà không hỗ trợ xử lý ngoại lệ (C++/LLVM)

Nếu tôi bọc tất cả chức năng gọi lại của mình trong các khối try-catch (để không có ngoại lệ nào cần được truyền "thông qua" mã llvm), thì tôi có thể xóa an toàn "-fno-exceptions" (cho GCC) từ cờ linker của tôi? (cờ này thường được yêu cầu khi liên kết với llvm, khi nó quay lên khi thực hiện llvm-config --cxxflags).

Nếu không, không thay đổi tình hình nếu tôi quấn chức năng llvm với chức năng khai báo với "ném()"? Việc thực hiện các hàm này có thể được biên dịch bằng -fno-exception.

+0

tôi sẽ không đặt cược vào ABI compability, nhưng ai mà biết được? Nó có thể dễ dàng hơn và an toàn hơn để biên dịch LLVM cho mình với các ngoại lệ được kích hoạt. – delnan

+0

@delnan Biên dịch llvm không phải là một lựa chọn. Phần mềm của tôi được nhiều người sử dụng trên các nền tảng khác nhau (linux, mac, windows) và tôi cần phải dựa vào cài đặt llvm mặc định mà bạn nhận được, ví dụ: từ apt-get. – Joel

+0

@ delnan: Tôi không biết nhiều về khả năng tương thích của ABI, nhưng tôi có nhận được nó trong trường hợp này nếu các hàm được khai báo với ném()? Tôi đã sửa đổi câu hỏi cho phù hợp. – Joel

Trả lời

3

Nếu tôi bọc tất cả chức năng gọi lại trong các khối try-catch (để không có ngoại lệ nào cần được truyền "qua" mã llvm), thì tôi có thể xóa "-fno-exceptions" một cách an toàn (đối với GCC) từ cờ linker của tôi?

Có, giả sử bạn có cách báo cáo phù hợp với bất kỳ điều kiện nào gây ra ngoại lệ.

-fexceptions là mặc định cho C++. -fno-exceptions là mặc định cho C. Không có vấn đề gì cả trộn C++ mã biên dịch với các tùy chọn mặc định cùng với mã C biên soạn với các tùy chọn mặc định, do đó không thể là một vấn đề trộn -fexceptions với -fno-exceptions.

Nhưng hãy cân nhắc thêm -fexceptions thay vì xóa -fno-exceptions: phân tích cú pháp các tùy chọn dòng lệnh giống như cách GCC phức tạp và không cần bạn cố gắng làm như vậy.

+0

OK! Đó là tất cả những gì tôi cần biết. Đã không nghĩ về song song với C. Cảm ơn! – Joel