diff options
Diffstat (limited to 'lib/Frontend')
| -rw-r--r-- | lib/Frontend/CompilerInstance.cpp | 38 | ||||
| -rw-r--r-- | lib/Frontend/PrecompiledPreamble.cpp | 29 | 
2 files changed, 62 insertions, 5 deletions
diff --git a/lib/Frontend/CompilerInstance.cpp b/lib/Frontend/CompilerInstance.cpp index 32f1232bbe246..7208177aa0126 100644 --- a/lib/Frontend/CompilerInstance.cpp +++ b/lib/Frontend/CompilerInstance.cpp @@ -1854,6 +1854,7 @@ CompilerInstance::loadModule(SourceLocation ImportLoc,    // Verify that the rest of the module path actually corresponds to    // a submodule. +  bool MapPrivateSubModToTopLevel = false;    if (!getLangOpts().ModulesTS && Path.size() > 1) {      for (unsigned I = 1, N = Path.size(); I != N; ++I) {        StringRef Name = Path[I].first->getName(); @@ -1892,7 +1893,40 @@ CompilerInstance::loadModule(SourceLocation ImportLoc,            Sub = Module->findSubmodule(Best[0]);          }        } -       + +      // If the user is requesting Foo.Private and it doesn't exist, try to +      // match Foo_Private and emit a warning asking for the user to write +      // @import Foo_Private instead. FIXME: remove this when existing clients +      // migrate off of Foo.Private syntax. +      if (!Sub && PP->getLangOpts().ImplicitModules && Name == "Private" && +          Module == Module->getTopLevelModule()) { +        SmallString<128> PrivateModule(Module->Name); +        PrivateModule.append("_Private"); + +        SmallVector<std::pair<IdentifierInfo *, SourceLocation>, 2> PrivPath; +        auto &II = PP->getIdentifierTable().get( +            PrivateModule, PP->getIdentifierInfo(Module->Name)->getTokenID()); +        PrivPath.push_back(std::make_pair(&II, Path[0].second)); + +        if (PP->getHeaderSearchInfo().lookupModule(PrivateModule)) +          Sub = +              loadModule(ImportLoc, PrivPath, Visibility, IsInclusionDirective); +        if (Sub) { +          MapPrivateSubModToTopLevel = true; +          if (!getDiagnostics().isIgnored( +                  diag::warn_no_priv_submodule_use_toplevel, ImportLoc)) { +            getDiagnostics().Report(Path[I].second, +                                    diag::warn_no_priv_submodule_use_toplevel) +                << Path[I].first << Module->getFullModuleName() << PrivateModule +                << SourceRange(Path[0].second, Path[I].second) +                << FixItHint::CreateReplacement(SourceRange(Path[0].second), +                                                PrivateModule); +            getDiagnostics().Report(Sub->DefinitionLoc, +                                    diag::note_private_top_level_defined); +          } +        } +      } +        if (!Sub) {          // No submodule by this name. Complain, and don't look for further          // submodules. @@ -1909,7 +1943,7 @@ CompilerInstance::loadModule(SourceLocation ImportLoc,    // Make the named module visible, if it's not already part of the module    // we are parsing.    if (ModuleName != getLangOpts().CurrentModule) { -    if (!Module->IsFromModuleFile) { +    if (!Module->IsFromModuleFile && !MapPrivateSubModToTopLevel) {        // We have an umbrella header or directory that doesn't actually include        // all of the headers within the directory it covers. Complain about        // this missing submodule and recover by forgetting that we ever saw diff --git a/lib/Frontend/PrecompiledPreamble.cpp b/lib/Frontend/PrecompiledPreamble.cpp index f6964d02b2373..7e1323fd83bb9 100644 --- a/lib/Frontend/PrecompiledPreamble.cpp +++ b/lib/Frontend/PrecompiledPreamble.cpp @@ -30,7 +30,7 @@  #include "llvm/Support/Mutex.h"  #include "llvm/Support/MutexGuard.h"  #include "llvm/Support/Process.h" - +#include <limits>  #include <utility>  using namespace clang; @@ -333,6 +333,7 @@ llvm::ErrorOr<PrecompiledPreamble> PrecompiledPreamble::Build(    std::unique_ptr<PrecompilePreambleAction> Act;    Act.reset(new PrecompilePreambleAction(        StoreInMemory ? &Storage.asMemory().Data : nullptr, Callbacks)); +  Callbacks.BeforeExecute(*Clang);    if (!Act->BeginSourceFile(*Clang.get(), Clang->getFrontendOpts().Inputs[0]))      return BuildPreambleError::BeginSourceFileFailed; @@ -380,6 +381,27 @@ PreambleBounds PrecompiledPreamble::getBounds() const {    return PreambleBounds(PreambleBytes.size(), PreambleEndsAtStartOfLine);  } +std::size_t PrecompiledPreamble::getSize() const { +  switch (Storage.getKind()) { +  case PCHStorage::Kind::Empty: +    assert(false && "Calling getSize() on invalid PrecompiledPreamble. " +                    "Was it std::moved?"); +    return 0; +  case PCHStorage::Kind::InMemory: +    return Storage.asMemory().Data.size(); +  case PCHStorage::Kind::TempFile: { +    uint64_t Result; +    if (llvm::sys::fs::file_size(Storage.asFile().getFilePath(), Result)) +      return 0; + +    assert(Result <= std::numeric_limits<std::size_t>::max() && +           "file size did not fit into size_t"); +    return Result; +  } +  } +  llvm_unreachable("Unhandled storage kind"); +} +  bool PrecompiledPreamble::CanReuse(const CompilerInvocation &Invocation,                                     const llvm::MemoryBuffer *MainFileBuffer,                                     PreambleBounds Bounds, @@ -505,8 +527,8 @@ PrecompiledPreamble::TempPCHFile::createInSystemTempDir(const Twine &Prefix,                                                          StringRef Suffix) {    llvm::SmallString<64> File;    // Using a version of createTemporaryFile with a file descriptor guarantees -  // that we would never get a race condition in a multi-threaded setting (i.e., -  // multiple threads getting the same temporary path). +  // that we would never get a race condition in a multi-threaded setting +  // (i.e., multiple threads getting the same temporary path).    int FD;    auto EC = llvm::sys::fs::createTemporaryFile(Prefix, Suffix, FD, File);    if (EC) @@ -694,6 +716,7 @@ void PrecompiledPreamble::setupPreambleStorage(    }  } +void PreambleCallbacks::BeforeExecute(CompilerInstance &CI) {}  void PreambleCallbacks::AfterExecute(CompilerInstance &CI) {}  void PreambleCallbacks::AfterPCHEmitted(ASTWriter &Writer) {}  void PreambleCallbacks::HandleTopLevelDecl(DeclGroupRef DG) {}  | 
