diff options
Diffstat (limited to 'lib/Serialization/ModuleManager.cpp')
| -rw-r--r-- | lib/Serialization/ModuleManager.cpp | 59 | 
1 files changed, 40 insertions, 19 deletions
| diff --git a/lib/Serialization/ModuleManager.cpp b/lib/Serialization/ModuleManager.cpp index 1dee4d069861..b512fa452cc1 100644 --- a/lib/Serialization/ModuleManager.cpp +++ b/lib/Serialization/ModuleManager.cpp @@ -1,4 +1,4 @@ -//===--- ModuleManager.cpp - Module Manager ---------------------*- C++ -*-===// +//===- ModuleManager.cpp - Module Manager ---------------------------------===//  //  //                     The LLVM Compiler Infrastructure  // @@ -11,24 +11,38 @@  //  modules for the ASTReader.  //  //===----------------------------------------------------------------------===// +  #include "clang/Serialization/ModuleManager.h" +#include "clang/Basic/FileManager.h" +#include "clang/Basic/LLVM.h"  #include "clang/Basic/MemoryBufferCache.h" +#include "clang/Basic/VirtualFileSystem.h"  #include "clang/Frontend/PCHContainerOperations.h"  #include "clang/Lex/HeaderSearch.h"  #include "clang/Lex/ModuleMap.h"  #include "clang/Serialization/GlobalModuleIndex.h" +#include "clang/Serialization/Module.h" +#include "llvm/ADT/STLExtras.h" +#include "llvm/ADT/SetVector.h" +#include "llvm/ADT/SmallPtrSet.h" +#include "llvm/ADT/SmallVector.h" +#include "llvm/ADT/StringRef.h" +#include "llvm/ADT/iterator.h" +#include "llvm/Support/Chrono.h" +#include "llvm/Support/DOTGraphTraits.h" +#include "llvm/Support/ErrorOr.h" +#include "llvm/Support/GraphWriter.h"  #include "llvm/Support/MemoryBuffer.h" -#include "llvm/Support/Path.h" +#include <algorithm> +#include <cassert> +#include <memory> +#include <string>  #include <system_error> -#ifndef NDEBUG -#include "llvm/Support/GraphWriter.h" -#endif -  using namespace clang;  using namespace serialization; -ModuleFile *ModuleManager::lookup(StringRef Name) const { +ModuleFile *ModuleManager::lookupByFileName(StringRef Name) const {    const FileEntry *Entry = FileMgr.getFile(Name, /*openFile=*/false,                                             /*cacheFailure=*/false);    if (Entry) @@ -37,6 +51,14 @@ ModuleFile *ModuleManager::lookup(StringRef Name) const {    return nullptr;  } +ModuleFile *ModuleManager::lookupByModuleName(StringRef Name) const { +  if (const Module *Mod = HeaderSearchInfo.getModuleMap().findModule(Name)) +    if (const FileEntry *File = Mod->getASTFile()) +      return lookup(File); + +  return nullptr; +} +  ModuleFile *ModuleManager::lookup(const FileEntry *File) const {    auto Known = Modules.find(File);    if (Known == Modules.end()) @@ -200,7 +222,6 @@ void ModuleManager::removeModules(    if (First == Last)      return; -    // Explicitly clear VisitOrder since we might not notice it is stale.    VisitOrder.clear(); @@ -259,7 +280,6 @@ void ModuleManager::removeModules(  void  ModuleManager::addInMemoryBuffer(StringRef FileName,                                   std::unique_ptr<llvm::MemoryBuffer> Buffer) { -    const FileEntry *Entry =        FileMgr.getVirtualFile(FileName, Buffer->getBufferSize(), 0);    InMemoryBuffers[Entry] = std::move(Buffer); @@ -306,9 +326,10 @@ void ModuleManager::moduleFileAccepted(ModuleFile *MF) {  }  ModuleManager::ModuleManager(FileManager &FileMgr, MemoryBufferCache &PCMCache, -                             const PCHContainerReader &PCHContainerRdr) +                             const PCHContainerReader &PCHContainerRdr, +                             const HeaderSearch& HeaderSearchInfo)      : FileMgr(FileMgr), PCMCache(&PCMCache), PCHContainerRdr(PCHContainerRdr), -      GlobalIndex(), FirstVisitState(nullptr) {} +      HeaderSearchInfo(HeaderSearchInfo) {}  ModuleManager::~ModuleManager() { delete FirstVisitState; } @@ -442,11 +463,12 @@ bool ModuleManager::lookupModuleFile(StringRef FileName,  #ifndef NDEBUG  namespace llvm { +    template<>    struct GraphTraits<ModuleManager> { -    typedef ModuleFile *NodeRef; -    typedef llvm::SetVector<ModuleFile *>::const_iterator ChildIteratorType; -    typedef pointer_iterator<ModuleManager::ModuleConstIterator> nodes_iterator; +    using NodeRef = ModuleFile *; +    using ChildIteratorType = llvm::SetVector<ModuleFile *>::const_iterator; +    using nodes_iterator = pointer_iterator<ModuleManager::ModuleConstIterator>;      static ChildIteratorType child_begin(NodeRef Node) {        return Node->Imports.begin(); @@ -468,17 +490,16 @@ namespace llvm {    template<>    struct DOTGraphTraits<ModuleManager> : public DefaultDOTGraphTraits {      explicit DOTGraphTraits(bool IsSimple = false) -      : DefaultDOTGraphTraits(IsSimple) { } +        : DefaultDOTGraphTraits(IsSimple) {} -    static bool renderGraphFromBottomUp() { -      return true; -    } +    static bool renderGraphFromBottomUp() { return true; }      std::string getNodeLabel(ModuleFile *M, const ModuleManager&) {        return M->ModuleName;      }    }; -} + +} // namespace llvm  void ModuleManager::viewGraph() {    llvm::ViewGraph(*this, "Modules"); | 
