diff options
author | Teresa Johnson <tejohnson@google.com> | 2016-05-23 22:54:06 +0000 |
---|---|---|
committer | Teresa Johnson <tejohnson@google.com> | 2016-05-23 22:54:06 +0000 |
commit | ad092ca1c9664766f457624b639667938d06353d (patch) | |
tree | 1002ddf78d2cdf52a04f723ee4cbf669c5abd04a | |
parent | 7e9fa84c679d1730d985a15d5157ab558da15587 (diff) |
[ThinLTO] Refactor module loader handling into new LTO file (NFC)
Moved the ModuleLoader and supporting helper loadModuleFromBuffer out of
ThinLTOCodeGenerator and into new LTO.h/LTO.cpp files. This is in
preparation for a patch that will utilize these in the gold-plugin.
Note that there are some other pending patches (D20268 and D20290) that
also plan to refactor common interfaces and functionality into this same
pair of new files.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@270509 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/LTO/LTO.h | 52 | ||||
-rw-r--r-- | lib/LTO/CMakeLists.txt | 1 | ||||
-rw-r--r-- | lib/LTO/LTO.cpp | 42 | ||||
-rw-r--r-- | lib/LTO/ThinLTOCodeGenerator.cpp | 44 |
4 files changed, 96 insertions, 43 deletions
diff --git a/include/llvm/LTO/LTO.h b/include/llvm/LTO/LTO.h new file mode 100644 index 00000000000..34c20f2074d --- /dev/null +++ b/include/llvm/LTO/LTO.h @@ -0,0 +1,52 @@ +//===-LTO.h - LLVM Link Time Optimizer ------------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file declares functions and classes used to support LTO. It is intended +// to be used both by LTO classes as well as by clients (gold-plugin) that +// don't utilize the LTO code generator interfaces. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_LTO_LTO_H +#define LLVM_LTO_LTO_H + +#include "llvm/ADT/StringMap.h" + +namespace llvm { + +class LLVMContext; +class MemoryBufferRef; +class Module; + +/// Helper to load a module from bitcode. +std::unique_ptr<Module> loadModuleFromBuffer(const MemoryBufferRef &Buffer, + LLVMContext &Context, bool Lazy); + +/// Provide a "loader" for the FunctionImporter to access function from other +/// modules. +class ModuleLoader { + /// The context that will be used for importing. + LLVMContext &Context; + + /// Map from Module identifier to MemoryBuffer. Used by clients like the + /// FunctionImported to request loading a Module. + StringMap<MemoryBufferRef> &ModuleMap; + +public: + ModuleLoader(LLVMContext &Context, StringMap<MemoryBufferRef> &ModuleMap) + : Context(Context), ModuleMap(ModuleMap) {} + + /// Load a module on demand. + std::unique_ptr<Module> operator()(StringRef Identifier) { + return loadModuleFromBuffer(ModuleMap[Identifier], Context, /*Lazy*/ true); + } +}; +} + +#endif diff --git a/lib/LTO/CMakeLists.txt b/lib/LTO/CMakeLists.txt index cf6a7d16d20..2007ef21a61 100644 --- a/lib/LTO/CMakeLists.txt +++ b/lib/LTO/CMakeLists.txt @@ -48,6 +48,7 @@ endif() add_llvm_library(LLVMLTO + LTO.cpp LTOModule.cpp LTOCodeGenerator.cpp UpdateCompilerUsed.cpp diff --git a/lib/LTO/LTO.cpp b/lib/LTO/LTO.cpp new file mode 100644 index 00000000000..5f89e5c95a7 --- /dev/null +++ b/lib/LTO/LTO.cpp @@ -0,0 +1,42 @@ +//===-LTO.cpp - LLVM Link Time Optimizer ----------------------------------===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// +// +// This file implements functions and classes used to support LTO. +// +//===----------------------------------------------------------------------===// + +#include "llvm/LTO/LTO.h" +#include "llvm/Bitcode/ReaderWriter.h" +#include "llvm/Support/MemoryBuffer.h" +#include "llvm/Support/SourceMgr.h" +#include "llvm/Support/raw_ostream.h" + +namespace llvm { + +// Simple helper to load a module from bitcode +std::unique_ptr<Module> loadModuleFromBuffer(const MemoryBufferRef &Buffer, + LLVMContext &Context, bool Lazy) { + SMDiagnostic Err; + ErrorOr<std::unique_ptr<Module>> ModuleOrErr(nullptr); + if (Lazy) { + ModuleOrErr = + getLazyBitcodeModule(MemoryBuffer::getMemBuffer(Buffer, false), Context, + /* ShouldLazyLoadMetadata */ Lazy); + } else { + ModuleOrErr = parseBitcodeFile(Buffer, Context); + } + if (std::error_code EC = ModuleOrErr.getError()) { + Err = SMDiagnostic(Buffer.getBufferIdentifier(), SourceMgr::DK_Error, + EC.message()); + Err.print("ThinLTO", errs()); + report_fatal_error("Can't load module, abort."); + } + return std::move(ModuleOrErr.get()); +} +} diff --git a/lib/LTO/ThinLTOCodeGenerator.cpp b/lib/LTO/ThinLTOCodeGenerator.cpp index 83eb14c1faf..b90d0d81b60 100644 --- a/lib/LTO/ThinLTOCodeGenerator.cpp +++ b/lib/LTO/ThinLTOCodeGenerator.cpp @@ -32,6 +32,7 @@ #include "llvm/IR/LegacyPassManager.h" #include "llvm/IR/Mangler.h" #include "llvm/IRReader/IRReader.h" +#include "llvm/LTO/LTO.h" #include "llvm/Linker/Linker.h" #include "llvm/MC/SubtargetFeature.h" #include "llvm/Object/IRObjectFile.h" @@ -41,7 +42,6 @@ #include "llvm/Support/Debug.h" #include "llvm/Support/Path.h" #include "llvm/Support/SHA1.h" -#include "llvm/Support/SourceMgr.h" #include "llvm/Support/TargetRegistry.h" #include "llvm/Support/ThreadPool.h" #include "llvm/Target/TargetMachine.h" @@ -74,28 +74,6 @@ static void diagnosticHandler(const DiagnosticInfo &DI) { errs() << '\n'; } -// Simple helper to load a module from bitcode -static std::unique_ptr<Module> -loadModuleFromBuffer(const MemoryBufferRef &Buffer, LLVMContext &Context, - bool Lazy) { - SMDiagnostic Err; - ErrorOr<std::unique_ptr<Module>> ModuleOrErr(nullptr); - if (Lazy) { - ModuleOrErr = - getLazyBitcodeModule(MemoryBuffer::getMemBuffer(Buffer, false), Context, - /* ShouldLazyLoadMetadata */ Lazy); - } else { - ModuleOrErr = parseBitcodeFile(Buffer, Context); - } - if (std::error_code EC = ModuleOrErr.getError()) { - Err = SMDiagnostic(Buffer.getBufferIdentifier(), SourceMgr::DK_Error, - EC.message()); - Err.print("ThinLTO", errs()); - report_fatal_error("Can't load module, abort."); - } - return std::move(ModuleOrErr.get()); -} - // Simple helper to save temporary files for debug. static void saveTempBitcode(const Module &TheModule, StringRef TempDir, unsigned count, StringRef Suffix) { @@ -260,26 +238,6 @@ generateModuleMap(const std::vector<MemoryBufferRef> &Modules) { return ModuleMap; } -/// Provide a "loader" for the FunctionImporter to access function from other -/// modules. -class ModuleLoader { - /// The context that will be used for importing. - LLVMContext &Context; - - /// Map from Module identifier to MemoryBuffer. Used by clients like the - /// FunctionImported to request loading a Module. - StringMap<MemoryBufferRef> &ModuleMap; - -public: - ModuleLoader(LLVMContext &Context, StringMap<MemoryBufferRef> &ModuleMap) - : Context(Context), ModuleMap(ModuleMap) {} - - /// Load a module on demand. - std::unique_ptr<Module> operator()(StringRef Identifier) { - return loadModuleFromBuffer(ModuleMap[Identifier], Context, /*Lazy*/ true); - } -}; - static void promoteModule(Module &TheModule, const ModuleSummaryIndex &Index) { if (renameModuleForThinLTO(TheModule, Index)) report_fatal_error("renameModuleForThinLTO failed"); |