14

既存の Sparc バックエンドとこのチュートリアルに基づいて、RISC マシン ( Riscoという名前) 用の非常に基本的な新しい 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ですか?

4

2 に答える 2

4

デフォルトの最初のテンプレート パラメータ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 を使用していると仮定して何かを実行します。

于 2010-11-21T19:13:52.343 に答える