Index: ELF/LTO.h =================================================================== --- ELF/LTO.h +++ ELF/LTO.h @@ -39,6 +39,8 @@ template std::unique_ptr> compile(); private: + llvm::TargetMachine *getTargetMachine(); + llvm::LLVMContext Context; llvm::Module Combined{"ld-temp.o", Context}; llvm::IRMover Mover{Combined}; Index: ELF/LTO.cpp =================================================================== --- ELF/LTO.cpp +++ ELF/LTO.cpp @@ -103,23 +103,7 @@ if (Config->SaveTemps) saveBCFile(Combined, ".lto.bc"); - StringRef TripleStr = Combined.getTargetTriple(); - Triple TheTriple(TripleStr); - - // FIXME: Should we have a default triple? The gold plugin uses - // sys::getDefaultTargetTriple(), but that is probably wrong given that this - // might be a cross linker. - - std::string ErrMsg; - const Target *TheTarget = TargetRegistry::lookupTarget(TripleStr, ErrMsg); - if (!TheTarget) - fatal("target not found: " + ErrMsg); - - TargetOptions Options; - Reloc::Model R = Config->Pic ? Reloc::PIC_ : Reloc::Static; - std::unique_ptr TM( - TheTarget->createTargetMachine(TripleStr, "", "", Options, R)); - + std::unique_ptr TM(getTargetMachine()); runLTOPasses(Combined, *TM); raw_svector_ostream OS(OwningData); @@ -138,6 +122,22 @@ return std::unique_ptr>(OF); } +TargetMachine *BitcodeCompiler::getTargetMachine() { + StringRef TripleStr = Combined.getTargetTriple(); + + // FIXME: Should we have a default triple? The gold plugin uses + // sys::getDefaultTargetTriple(), but that is probably wrong given that this + // might be a cross linker. + std::string Msg; + const Target *T = TargetRegistry::lookupTarget(TripleStr, Msg); + if (!T) + fatal("target not found: " + Msg); + + TargetOptions Options; + Reloc::Model R = Config->Pic ? Reloc::PIC_ : Reloc::Static; + return T->createTargetMachine(TripleStr, "", "", Options, R); +} + template std::unique_ptr> BitcodeCompiler::compile(); template std::unique_ptr> BitcodeCompiler::compile(); template std::unique_ptr> BitcodeCompiler::compile();