2010-10-13 3 views
13

Je suis en train de développer un nouveau backend LLVM très basique pour une machine RISC (nommé Risco), basé sur le backend Sparc existant et this tutorial. Pour enregistrer le backend, j'ai utilisé ce qui suit.Comment enregistrer un nouveau backend LLVM?

  • A RiscoTargetMachine.cpp:

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

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

    Target llvm::TheRiscoTarget; 
    
    extern "C" void LLVMInitializeRiscoTargetInfo() { 
         RegisterTarget<> X(TheRiscoTarget, "risco", "Risco"); 
    } 
    
  • A le script de configuration de LLVM de haut niveau:

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

Après la construction, llc -version ne montre pas la nouvelle cible. Même llc -march=risco test.ll indique que c'est une cible invalide. Qu'est-ce que je rate? PS: Actuellement, j'inclus la nouvelle cible en tant que dossier dans llvm/lib/Target. Comment puis-je changer cela afin que je puisse construire la cible séparément, et le charger dynamique avec llc -load?

+3

Malheureusement, mon expérience avec LLVM a été que, bien que la documentation doxygen du projet soit à jour, ses didacticiels ne le sont pas. Même essayer de marcher à travers le tutoriel de compilation est frustrant. – Zeke

Répondre

4

Le default first template parameter pour RegisterTarget est Triple::InvalidArch. Essayez ceci:

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

Vous pourriez aussi avoir besoin d'enregistrer un pour votre back-end dans RiscoAsmPrinter.cpp imprimante de montage:

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

Je ne suis pas tout à fait sûr de ce que vous entendez par le dernier bit. Mon Makefile a LOADABLE_MODULE=1 et construit la cible en tant qu'objet partagé dans le dossier lib. Afin de voir la cible Risco dans la liste des cibles enregistrées, je voudrais exécuter quelque chose comme ./bin/llc -load ./lib/libLLVMRisco.so -version en supposant que vous êtes sur Linux.

0

Vous devez éditer au moins 16 fichiers dans le répertoire racine de LLVM:

1) CMakeLists.txt ajouter notre objectif: définir (LLVM_ALL_TARGETS AArch64 ARM ...)

2) Ajouter votre cible Triple.h

3) Ajouter HI/LO à llvm_root_dir/include/LLVM/MC/MCExpr.h

...

16) ...

Les étapes complètes peuvent être trouvées dans LLVMCookbook. Page 228 à 238. Désolé, je ne pouvais pas copier/coller 10 pages de tutoriel ici.

Après avoir modifié tous les 16 fichiers, puis construire le LLVM en utilisant CMake: $ cmake ~/LLVM/src/-DLLVM_TARGETS_TO_BUILD = YourTargetName puis $ make

Si vous êtes assez chanceux, votre construction sera couronnée de succès, et vous pouvez voir votre cible ajoutée aux outils llc en émettant: $ llc -version

Questions connexes