2010-10-13 13 views
13

Tôi đang phát triển một chương trình phụ trợ LLVM rất cơ bản mới cho máy RISC (có tên là Risco), dựa trên phần phụ trợ Sparc hiện có và this tutorial. Để đăng ký chương trình phụ trợ, tôi đã sử dụng phần sau.Cách đăng ký chương trình phụ trợ LLVM mới?

  • Tại RiscoTargetMachine.cpp:

    extern "C" void LLVMInitializeRiscoTarget() 
    { 
        // Register the target. 
        RegisterTargetMachine<RiscoSimulatorTargetMachine> X(TheRiscoTarget); 
        RegisterAsmInfo<RiscoMCAsmInfo> Y(TheRiscoTarget); 
    } 
    
  • Tại Risco.td:

    def : Processor<"simulator", NoItineraries, [FeatureA]>; 
    
    def Risco : Target { 
         // Pull in Instruction Info: 
         let InstructionSet = RiscoInstrInfo; 
    } 
    
  • Tại TargetInfo/RiscoTargetInfo.cpp:

    Target llvm::TheRiscoTarget; 
    
    extern "C" void LLVMInitializeRiscoTargetInfo() { 
         RegisterTarget<> X(TheRiscoTarget, "risco", "Risco"); 
    } 
    
  • Tại phía trên mức LLVM cấu hình kịch bản:

    # Added Risco to the TARGETS_TO_BUILD variable at line 4965 (from svn trunk): 
    all) TARGETS_TO_BUILD="X86 Sparc PowerPC Alpha ARM Mips CellSPU PIC16 XCore MSP430 SystemZ Blackfin CBackend CppBackend MBlaze PTX Risco" ;; 
    

Sau khi xây dựng, llc -version không hiển thị các mục tiêu mới. Ngay cả llc -march=risco test.ll cho biết đó là mục tiêu không hợp lệ. Tôi đang thiếu gì?

PS: Hiện tại, tôi đang bao gồm mục tiêu mới làm thư mục bên trong llvm/lib/Target. Làm cách nào để tôi có thể thay đổi điều đó để tôi có thể tạo mục tiêu riêng biệt và tải nó động với llc -load?

+3

Thật không may, kinh nghiệm của tôi với LLVM là trong khi tài liệu doxygen của dự án được cập nhật, các hướng dẫn của nó thì không. Ngay cả khi cố gắng để đi qua các hướng dẫn biên dịch là bực bội. – Zeke

Trả lời

4

default first template parameter cho RegisterTargetTriple::InvalidArch. Hãy thử điều này:

extern "C" void LLVMInitializeRiscoTargetInfo() { 
    RegisterTarget<Triple::UnknownArch> X(TheRiscoTarget, "risco", "Risco"); 
} 

Bạn cũng có thể cần phải đăng ký một máy in lắp ráp cho backend của bạn trong RiscoAsmPrinter.cpp:

extern "C" void LLVMInitializeRiscoAsmPrinter() { 
    RegisterAsmPrinter<RiscoAsmPrinter> X(TheRiscoTarget); 
} 

Tôi không hoàn toàn chắc chắn những gì bạn có ý nghĩa bởi các bit cuối cùng. Makefile của tôi có LOADABLE_MODULE=1 và tạo mục tiêu làm đối tượng được chia sẻ trong thư mục lib. Để xem mục tiêu Risco trong danh sách các mục tiêu đã đăng ký, tôi sẽ chạy một cái gì đó như ./bin/llc -load ./lib/libLLVMRisco.so -version giả sử bạn đang sử dụng Linux.

0

Bạn cần phải chỉnh sửa ít nhất 16 tập tin trong thư mục gốc của LLVM:

1) Trong CMakeLists.txt thêm mục tiêu của chúng tôi để: set (LLVM_ALL_TARGETS AArch64 ARM ...)

2) Thêm mục tiêu của bạn để Triple.h

3) Thêm HI/LO để llvm_root_dir/include/llvm/MC/MCExpr.h

...

16) ...

Có thể tìm thấy các bước hoàn chỉnh trong LLVMCookbook. Trang 228 đến 238. Xin lỗi tôi không thể sao chép/dán 10 trang hướng dẫn tại đây.

Sau khi chỉnh sửa tất cả những 16 tác phẩm, sau đó xây dựng các LLVM sử dụng cmake: $ cmake ~/llvm/src/-DLLVM_TARGETS_TO_BUILD = YourTargetName và sau đó $ make

Nếu bạn may mắn đủ sau đó xây dựng của bạn sẽ thành công, và bạn có thể thấy mục tiêu của bạn được thêm vào các công cụ llc bằng cách phát hành: $ llc –version