2016-06-12 12 views
5

Thẳng đến điểm - Tôi đang cố liên kết hai (hoặc nhiều) mô-đun llvm với nhau, và tôi đang đối mặt với một lỗi lẻ nhất định từ LLVM.Các loại IR LLVM bị sụp đổ sai khi liên kết (C++ API)

Tôi không muốn đăng quá nhiều mã, vì vậy tôi sẽ sử dụng một nhóm giả ở đây.

Tôi có 3 mô-đun, giả sử A, B và C. A là mô-đun chính; Tôi khởi tạo llvm::Linker với nó. B và C là các mô đun phụ; Tôi gọi số linker.linkInModule(B and C).

Tất cả 3 module đã, trong số những thứ khác, hai loại định nghĩa:

%String = type { i8*, i64 } 
%Character = type { i8*, i64 } 

Lưu ý rằng họ có các loại thành viên cùng. Hơn nữa, một chức năng foo được định nghĩa như vậy (trong mô-đun B):

define i1 @_ZN9Character7hasDataEv(%Character*) { } 

Chức năng này được khai báo trong module A và C. Bây giờ, tất cả dường như tốt và tốt - chức năng này được gọi từ cả hai module A và C, và IR trông bình thường, như vậy:

%21 = call i1 @_ZN9Character7hasDataEv(%Character* %4) 

Ở đây có vấn đề: khi tất cả 3 mô-đun được liên kết với nhau, một cái gì đó xảy ra với các loại sau:

  1. Họ mất tên, trở thành %2 (%String) và %3 (%Character).
  2. Chúng dường như được hợp nhất với nhau.

Thật lạ, trong khi chuyển đổi này xảy ra trong cả hai mô-đun A và C, lỗi chỉ xảy ra trong C - lưu ý rằng A là mô-đun "chính".

Định nghĩa chức năng của tập tin liên kết tại là

define i1 @_ZN9Character7hasDataEv(%2*) 

Lưu ý cách %Character, hoặc %3, đã biến thành %2. Hơn nữa, tại callsite, trong những gì có lẽ là một nỗ lực để hủy hợp nhất các loại, tôi có được điều này:

%10 = call i1 bitcast (i1 (%2*)* @_ZN9Character7hasDataEv to i1 (%3*)*)(%2* %2) 

Thật kỳ lạ, mặc dù hàm được đúc i1 (%2*)-%3 (%2*), lập luận thông qua (. Arg 1) vẫn thuộc loại %2. Chuyện gì vậy?

Lưu ý rằng trong mô-đun A, bất kỳ điều gì đang diễn ra đều được thực hiện đúng cách và không có lỗi. Điều này xảy ra đối với một số chức năng, nhưng chỉ trong mô-đun C.

tôi đã cố gắng tái tạo nó bằng cách copy-dán này để .ll tập tin và gọi llvm-link Tiếp theo llvm-dis, nhưng 1. các loại không sáp nhập, và 2 không có lỗi như vậy.

Cảm ơn ...?

+0

Bạn đã cố tắt tất cả các tối ưu hóa chưa? Liệu có tạo sự khác biệt nếu bạn sử dụng các tối ưu hóa khác nhau không? Điều đầu tiên tôi nghi ngờ nếu tôi gặp phải lỗi lạ là tối ưu hóa đi mà mess với mã của tôi. – user2600312

+0

Tôi đã tắt tất cả các lần tối ưu hóa. Tôi đã tìm được giải pháp, tôi sẽ chỉnh sửa nó thành câu hỏi. – zhiayang

Trả lời

1

Được rồi, hóa ra là, sau khi một số poking xung quanh trong kênh IRV llvm, llvm :: Linker có nghĩa là được sử dụng với một mô-đun llvm rỗng :: Module làm mô đun khởi động.

Ngoài ra, trong trường hợp sử dụng của tôi, tôi đang sử dụng cùng một llvm :: Loại (điều thực tế trong bộ nhớ) trên các mô-đun khác nhau mà tôi liên kết với nhau. Họ nói rằng nó không phải là bất hợp pháp, nhưng nó chưa bao giờ được kiểm tra, vì vậy ... ¯ \ _ (ツ) _/¯

Vì vậy, dù sao, vấn đề đã được khắc phục bằng cách bắt đầu với một mô-đun rỗng để chuyển đến trình liên kết .