#include "llvm/IR/Module.h"
#include "llvm/IR/Verifier.h"
#include "llvm/MC/SubtargetFeature.h"
+#include "llvm/Object/FunctionIndexObjectFile.h"
#include "llvm/Support/CommandLine.h"
#include "llvm/Support/PrettyStackTrace.h"
#include "llvm/Support/TargetRegistry.h"
const clang::TargetOptions &TargetOpts;
const LangOptions &LangOpts;
Module *TheModule;
- std::unique_ptr<FunctionInfoIndex> FunctionIndex;
Timer CodeGenerationTime;
return PerFunctionPasses;
}
- void CreatePasses();
+ void CreatePasses(FunctionInfoIndex *FunctionIndex);
/// Generates the TargetMachine.
/// Returns Null if it is unable to create the target machine.
public:
EmitAssemblyHelper(DiagnosticsEngine &_Diags, const CodeGenOptions &CGOpts,
const clang::TargetOptions &TOpts,
- const LangOptions &LOpts, Module *M,
- std::unique_ptr<FunctionInfoIndex> Index)
+ const LangOptions &LOpts, Module *M)
: Diags(_Diags), CodeGenOpts(CGOpts), TargetOpts(TOpts), LangOpts(LOpts),
- TheModule(M), FunctionIndex(std::move(Index)),
- CodeGenerationTime("Code Generation Time"), CodeGenPasses(nullptr),
- PerModulePasses(nullptr), PerFunctionPasses(nullptr) {}
+ TheModule(M), CodeGenerationTime("Code Generation Time"),
+ CodeGenPasses(nullptr), PerModulePasses(nullptr),
+ PerFunctionPasses(nullptr) {}
~EmitAssemblyHelper() {
delete CodeGenPasses;
MPM->add(createRewriteSymbolsPass(DL));
}
-void EmitAssemblyHelper::CreatePasses() {
+void EmitAssemblyHelper::CreatePasses(FunctionInfoIndex *FunctionIndex) {
if (CodeGenOpts.DisableLLVMPasses)
return;
// If we are performing a ThinLTO importing compile, invoke the LTO
// pipeline and pass down the in-memory function index.
- if (!CodeGenOpts.ThinLTOIndexFile.empty()) {
- assert(FunctionIndex && "Expected non-empty function index");
- PMBuilder.FunctionIndex = FunctionIndex.get();
+ if (FunctionIndex) {
+ PMBuilder.FunctionIndex = FunctionIndex;
PMBuilder.populateLTOPassManager(*MPM);
return;
}
return;
if (TM)
TheModule->setDataLayout(TM->createDataLayout());
- CreatePasses();
+
+ // If we are performing a ThinLTO importing compile, load the function
+ // index into memory and pass it into CreatePasses, which will add it
+ // to the PassManagerBuilder and invoke LTO passes.
+ std::unique_ptr<FunctionInfoIndex> FunctionIndex;
+ if (!CodeGenOpts.ThinLTOIndexFile.empty()) {
+ ErrorOr<std::unique_ptr<FunctionInfoIndex>> IndexOrErr =
+ llvm::getFunctionIndexForFile(CodeGenOpts.ThinLTOIndexFile,
+ [&](const DiagnosticInfo &DI) {
+ TheModule->getContext().diagnose(DI);
+ });
+ if (std::error_code EC = IndexOrErr.getError()) {
+ std::string Error = EC.message();
+ errs() << "Error loading index file '" << CodeGenOpts.ThinLTOIndexFile
+ << "': " << Error << "\n";
+ return;
+ }
+ FunctionIndex = std::move(IndexOrErr.get());
+ assert(FunctionIndex && "Expected non-empty function index");
+ }
+
+ CreatePasses(FunctionIndex.get());
switch (Action) {
case Backend_EmitNothing:
const clang::TargetOptions &TOpts,
const LangOptions &LOpts, StringRef TDesc,
Module *M, BackendAction Action,
- raw_pwrite_stream *OS,
- std::unique_ptr<FunctionInfoIndex> Index) {
- EmitAssemblyHelper AsmHelper(Diags, CGOpts, TOpts, LOpts, M,
- std::move(Index));
+ raw_pwrite_stream *OS) {
+ EmitAssemblyHelper AsmHelper(Diags, CGOpts, TOpts, LOpts, M);
AsmHelper.EmitAssembly(Action, OS);
#include "llvm/IR/DebugInfo.h"
#include "llvm/IR/DiagnosticInfo.h"
#include "llvm/IR/DiagnosticPrinter.h"
-#include "llvm/IR/FunctionInfo.h"
#include "llvm/IR/LLVMContext.h"
#include "llvm/IR/Module.h"
#include "llvm/IRReader/IRReader.h"
#include "llvm/Linker/Linker.h"
-#include "llvm/Object/FunctionIndexObjectFile.h"
#include "llvm/Pass.h"
#include "llvm/Support/MemoryBuffer.h"
#include "llvm/Support/SourceMgr.h"
TheModule->setTargetTriple(TargetOpts.Triple);
}
- auto DiagHandler = [&](const DiagnosticInfo &DI) {
- TheModule->getContext().diagnose(DI);
- };
-
- // If we are performing ThinLTO importing compilation (indicated by
- // a non-empty index file option), then we need promote to global scope
- // and rename any local values that are potentially exported to other
- // modules. Do this early so that the rest of the compilation sees the
- // promoted symbols.
- std::unique_ptr<FunctionInfoIndex> Index;
- if (!CI.getCodeGenOpts().ThinLTOIndexFile.empty()) {
- ErrorOr<std::unique_ptr<FunctionInfoIndex>> IndexOrErr =
- llvm::getFunctionIndexForFile(CI.getCodeGenOpts().ThinLTOIndexFile,
- DiagHandler);
- if (std::error_code EC = IndexOrErr.getError()) {
- std::string Error = EC.message();
- errs() << "Error loading index file '"
- << CI.getCodeGenOpts().ThinLTOIndexFile << "': " << Error
- << "\n";
- return;
- }
- Index = std::move(IndexOrErr.get());
- assert(Index);
- // Currently this requires creating a new Module object.
- std::unique_ptr<llvm::Module> RenamedModule =
- renameModuleForThinLTO(std::move(TheModule), Index.get());
- if (!RenamedModule)
- return;
-
- TheModule = std::move(RenamedModule);
- }
-
LLVMContext &Ctx = TheModule->getContext();
Ctx.setInlineAsmDiagnosticHandler(BitcodeInlineAsmDiagHandler);
EmitBackendOutput(CI.getDiagnostics(), CI.getCodeGenOpts(), TargetOpts,
CI.getLangOpts(), CI.getTarget().getDataLayoutString(),
- TheModule.get(), BA, OS, std::move(Index));
+ TheModule.get(), BA, OS);
return;
}