2010-10-13 3 views
13

Я разрабатываю базовый новый LLVM-сервер для RISC-машины (названный Risco), основанный на существующем бэкэнде Sparc и this tutorial. Чтобы зарегистрировать бэкэнд, я использовал следующее.Как зарегистрировать новый LLVM-сервер?

  • В RiscoTargetMachine.cpp:

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

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

    Target llvm::TheRiscoTarget; 
    
    extern "C" void LLVMInitializeRiscoTargetInfo() { 
         RegisterTarget<> X(TheRiscoTarget, "risco", "Risco"); 
    } 
    
  • В верхний уровень LLVM скрипта конфигурации:

    # 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" ;; 
    

После сборки, llc -version не показывает новую цель. Даже llc -march=risco test.ll говорит, что это недопустимая цель. Что мне не хватает?

PS: В настоящее время я включаю новую цель как папку внутри llvm/lib/Target. Как я могу изменить это, чтобы я мог создать цель отдельно и загружать ее динамически с помощью llc -load?

+3

К сожалению, мой опыт работы с LLVM состоял в том, что, хотя документация по doxygen проекта обновлена, ее учебники не являются. Даже попытка пройти учебник по сборке вызывает разочарование. – Zeke

ответ

4

default first template parameter для RegisterTarget является Triple::InvalidArch. Попробуйте это:

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

Вам также может потребоваться зарегистрировать принтер сборки для вашего внутреннего интерфейса в RiscoAsmPrinter.cpp:

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

Я не совсем уверен, что вы подразумеваете под последним битом. Мой файл Makefile имеет LOADABLE_MODULE=1 и создает цель как общий объект в папке lib. Чтобы увидеть цель Risco в списке зарегистрированных целей, я бы запускал что-то вроде ./bin/llc -load ./lib/libLLVMRisco.so -version, предполагая, что вы находитесь в Linux.

0

Вы должны изменить, по крайней мере 16 файлов в корневом каталоге LLVM:

1) В CMakeLists.txt добавить нашу цель: набор (LLVM_ALL_TARGETS AArch64 ARM ...)

2) Добавить ваша цель, чтобы Triple.h

3) Добавить HI/LO для llvm_root_dir/включить/LLVM/MC/MCExpr.h

...

16) ...

Полные шаги можно найти в LLVMCookbook. Страница 228 - 238. Извините, я не мог скопировать/вставить 10 страниц учебника здесь.

После редактирования все эти 16 файлов, а затем построить LLVM с помощью CMake: $ CMake ~/LLVM/SRC/-DLLVM_TARGETS_TO_BUILD = YourTargetName, а затем $ сделать

Если вам повезет, то ваш билд будет успешным, и вы можете увидеть, что ваша цель добавлена ​​в инструменты llc, выпуская: $ llc -version

Смежные вопросы