2014-09-10 17 views
9

Tôi có một ModulePass đang làm việc với công cụ chọn, nhưng tôi đang gặp khó khăn trong việc tìm ra cách để làm cho nó sẵn sàng để vuốt trên dòng lệnh. Công việc hiện tại của tôi cho việc sử dụng đường chuyền của tôi là:Tạo một LLVM ModulePass có sẵn trên dòng lệnh clang

  1. kêu vang -c -emit-llvm [file mã c nguồn]
  2. llvm-link [file llvm bitcode]
  3. opt -Load [PassName]. như vậy - [tên pass-] [liên kết tập tin llvm]
  4. llc [kết quả tập tin bitcode]
  5. gcc [kết quả tập lắp ráp] -o [mục tiêu]

tôi muốn để có được đường chuyền của tôi tích hợp với lệnh clang để nó có thể được gọi như là một phần của quá trình xây dựng phần mềm hiện có (ví dụ: C++ thư viện chuẩn) mà không cần phải làm lại toàn bộ hệ thống xây dựng cho mỗi thứ tôi biên dịch. Tôi đã nhìn thấy gợi ý về cách làm điều này, nhưng tôi đã không thể đặt các mảnh lại với nhau thành một thiết lập làm việc.

Run an LLVM Pass Automatically with Clang mô tả chính xác những gì tôi muốn, nhưng phương pháp dường như không được chấp nhận trong LLVM 3.4 (PassManagerBuilder đã được di chuyển sang không gian tên cũ).

LLVM - Run Own Pass automatically with clang dường như giải quyết vấn đề cơ bản, nhưng tôi hy vọng tôi có thể thực hiện việc này mà không phải sửa đổi clang (có vẻ như những gì được đề xuất ở đó).

Cách tốt nhất để tạo một thẻ mới có sẵn từ tiếng kêu bằng LLVM 3.4 là gì?

Trả lời

7

Clang vẫn sử dụng PassManagerBuilder kể từ 3.5 (xem lớp PassManagerBuilderWrapper trong BackendUtil.cpp). Vì vậy, tôi tin rằng mở rộng nó với RegisterStandardPasses, như trong bài đăng trên blog của tôi, vẫn là cách duy nhất để thêm đường chuyền cho người quản lý vượt qua của Clang.

Rất khó để tìm thấy bất kỳ thông tin nào về số cách không dùng cơ sở hạ tầng trình quản lý qua "cũ". Nhưng kể từ khi Clang vẫn đang sử dụng nó, nó không thể là rằng không được chấp nhận. :)

+0

Cảm ơn câu trả lời, tôi sẽ tiếp tục với thiết lập PassManagerBuilder sau đó. – Erik

+0

Nó hoạt động trên llvm-3.7. Một lưu ý để đăng ký ModulePass: thay đổi '' EP_EarlyAsPossible'' thành '' EP_ModuleOptimizerEarly'' nếu không llvm có thể coi nó như là một FunctionPass và cố gắng gọi '' runOnFunction''. – xywang

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