[PATCH] D18410: ELF: Split BitcodeCompiler::compile.

Mehdi Amini via llvm-commits llvm-commits at lists.llvm.org
Wed Mar 23 12:26:48 PDT 2016


> On Mar 23, 2016, at 11:38 AM, Rui Ueyama <ruiu at google.com> wrote:
> 
> ruiu created this revision.
> ruiu added a reviewer: davide.
> ruiu added a subscriber: llvm-commits.
> Herald added a subscriber: joker.eph.
> 
> ELF: Split BitcodeCompiler::compile.
> 
> http://reviews.llvm.org/D18410
> 
> Files:
>  ELF/LTO.cpp
>  ELF/LTO.h
> 
> Index: ELF/LTO.h
> ===================================================================
> --- ELF/LTO.h
> +++ ELF/LTO.h
> @@ -39,6 +39,8 @@
>   template <class ELFT> std::unique_ptr<ObjectFile<ELFT>> 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<TargetMachine> TM(
> -      TheTarget->createTargetMachine(TripleStr, "", "", Options, R));
> -
> +  std::unique_ptr<TargetMachine> TM(getTargetMachine());
>   runLTOPasses(Combined, *TM);
> 
>   raw_svector_ostream OS(OwningData);
> @@ -138,6 +122,22 @@
>   return std::unique_ptr<ObjectFile<ELFT>>(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.

My 2 cents for the "FIXME" (I know it is code motion): error is the only sane solution when a bitcode has been optimized for a Target (using some TTI) and the target backend is not available at link time.
Silently falling back to the host triple could lead to surprises for the user. I'm curious if I'm missing a real use case for that?

-- 
Mehdi


> +  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<elf::ObjectFile<ELF32LE>> BitcodeCompiler::compile();
> template std::unique_ptr<elf::ObjectFile<ELF32BE>> BitcodeCompiler::compile();
> template std::unique_ptr<elf::ObjectFile<ELF64LE>> BitcodeCompiler::compile();
> 
> 
> <D18410.51455.patch>



More information about the llvm-commits mailing list