[clang] 9e52db1 - When we run out of source locations, try to produce useful information

Richard Smith via cfe-commits cfe-commits at lists.llvm.org
Wed Nov 16 14:36:34 PST 2022


Author: Richard Smith
Date: 2022-11-16T14:36:16-08:00
New Revision: 9e52db182794d87bb8527dda313afd1ac491ab11

URL: https://github.com/llvm/llvm-project/commit/9e52db182794d87bb8527dda313afd1ac491ab11
DIFF: https://github.com/llvm/llvm-project/commit/9e52db182794d87bb8527dda313afd1ac491ab11.diff

LOG: When we run out of source locations, try to produce useful information
indicating why we ran out.

Added: 
    clang/test/Misc/sloc-usage.cpp

Modified: 
    clang/docs/ReleaseNotes.rst
    clang/include/clang/Basic/DiagnosticCommonKinds.td
    clang/include/clang/Basic/DiagnosticLexKinds.td
    clang/include/clang/Basic/SourceManager.h
    clang/lib/Basic/SourceManager.cpp
    clang/lib/Lex/Pragma.cpp
    clang/lib/Serialization/ASTReader.cpp
    clang/test/Lexer/Inputs/inc2.h
    clang/test/Lexer/SourceLocationsOverflow.c
    clang/test/Misc/Inputs/include.h
    clang/test/Misc/warning-flags-enabled.c

Removed: 
    


################################################################################
diff  --git a/clang/docs/ReleaseNotes.rst b/clang/docs/ReleaseNotes.rst
index 8e32a69f6935..640c52096c4a 100644
--- a/clang/docs/ReleaseNotes.rst
+++ b/clang/docs/ReleaseNotes.rst
@@ -390,6 +390,11 @@ Improvements to Clang's diagnostics
   suppressed for use of reserved names in a system header.
 - ``-Winteger-overflow`` will diagnose overflow in more cases. This fixes
   `Issue 58944 <https://github.com/llvm/llvm-project/issues/58944>`_.
+- Clang has an internal limit of 2GB of preprocessed source code per
+  compilation, including source reachable through imported AST files such as
+  PCH or modules. When Clang hits this limit, it now produces notes mentioning
+  which header and source files are consuming large amounts of this space.
+  ``#pragma clang __debug sloc_usage`` can also be used to request this report.
 
 Non-comprehensive list of changes in this release
 -------------------------------------------------

diff  --git a/clang/include/clang/Basic/DiagnosticCommonKinds.td b/clang/include/clang/Basic/DiagnosticCommonKinds.td
index 38cc8821f470..c8a1bae487d8 100644
--- a/clang/include/clang/Basic/DiagnosticCommonKinds.td
+++ b/clang/include/clang/Basic/DiagnosticCommonKinds.td
@@ -345,6 +345,17 @@ def err_unable_to_rename_temp : Error<
   "unable to rename temporary '%0' to output file '%1': '%2'">;
 def err_unable_to_make_temp : Error<
   "unable to make temporary file: %0">;
+def remark_sloc_usage : Remark<
+  "source manager location address space usage:">,
+  InGroup<DiagGroup<"sloc-usage">>, DefaultRemark, ShowInSystemHeader;
+def note_total_sloc_usage : Note<
+  "%0B in local locations, %1B in locations loaded from AST files, for a total "
+  "of %2B (%3%% of available space)">;
+def note_file_sloc_usage : Note<
+  "file entered %0 time%s0 using %1B of space"
+  "%plural{0:|: plus %2B for macro expansions}2">;
+def note_file_misc_sloc_usage : Note<
+  "%0 additional files entered using a total of %1B of space">;
 
 // Modules
 def err_module_format_unhandled : Error<

diff  --git a/clang/include/clang/Basic/DiagnosticLexKinds.td b/clang/include/clang/Basic/DiagnosticLexKinds.td
index fd5398fa0409..908f4489d9a3 100644
--- a/clang/include/clang/Basic/DiagnosticLexKinds.td
+++ b/clang/include/clang/Basic/DiagnosticLexKinds.td
@@ -648,10 +648,14 @@ def warn_pragma_diagnostic_unknown_warning :
    ExtWarn<"unknown warning group '%0', ignored">,
    InGroup<UnknownWarningOption>;
 // - #pragma __debug
+def warn_pragma_debug_missing_command : Warning<
+  "missing debug command">, InGroup<IgnoredPragmas>;
 def warn_pragma_debug_unexpected_command : Warning<
   "unexpected debug command '%0'">, InGroup<IgnoredPragmas>;
 def warn_pragma_debug_missing_argument : Warning<
   "missing argument to debug command '%0'">, InGroup<IgnoredPragmas>;
+def warn_pragma_debug_unexpected_argument : Warning<
+  "unexpected argument to debug command">, InGroup<IgnoredPragmas>;
 def warn_pragma_debug_unknown_module : Warning<
   "unknown module '%0'">, InGroup<IgnoredPragmas>;
 // #pragma module

diff  --git a/clang/include/clang/Basic/SourceManager.h b/clang/include/clang/Basic/SourceManager.h
index d5d5af461fc3..8ab519f8431f 100644
--- a/clang/include/clang/Basic/SourceManager.h
+++ b/clang/include/clang/Basic/SourceManager.h
@@ -710,7 +710,7 @@ class SourceManager : public RefCountedBase<SourceManager> {
   /// not have been loaded, so that value would be unknown.
   SourceLocation::UIntTy CurrentLoadedOffset;
 
-  /// The highest possible offset is 2^32-1 (2^63-1 for 64-bit source
+  /// The highest possible offset is 2^31-1 (2^63-1 for 64-bit source
   /// locations), so CurrentLoadedOffset starts at 2^31 (2^63 resp.).
   static const SourceLocation::UIntTy MaxLoadedOffset =
       1ULL << (8 * sizeof(SourceLocation::UIntTy) - 1);
@@ -1691,6 +1691,10 @@ class SourceManager : public RefCountedBase<SourceManager> {
 
   void dump() const;
 
+  // Produce notes describing the current source location address space usage.
+  void noteSLocAddressSpaceUsage(DiagnosticsEngine &Diag,
+                                 Optional<unsigned> MaxNotes = 32) const;
+
   /// Get the number of local SLocEntries we have.
   unsigned local_sloc_entry_size() const { return LocalSLocEntryTable.size(); }
 

diff  --git a/clang/lib/Basic/SourceManager.cpp b/clang/lib/Basic/SourceManager.cpp
index caa557314ba8..ecb771a48e64 100644
--- a/clang/lib/Basic/SourceManager.cpp
+++ b/clang/lib/Basic/SourceManager.cpp
@@ -17,6 +17,7 @@
 #include "clang/Basic/SourceLocation.h"
 #include "clang/Basic/SourceManagerInternals.h"
 #include "llvm/ADT/DenseMap.h"
+#include "llvm/ADT/MapVector.h"
 #include "llvm/ADT/None.h"
 #include "llvm/ADT/Optional.h"
 #include "llvm/ADT/STLExtras.h"
@@ -615,6 +616,7 @@ FileID SourceManager::createFileIDImpl(ContentCache &File, StringRef Filename,
   if (!(NextLocalOffset + FileSize + 1 > NextLocalOffset &&
         NextLocalOffset + FileSize + 1 <= CurrentLoadedOffset)) {
     Diag.Report(IncludePos, diag::err_include_too_large);
+    noteSLocAddressSpaceUsage(Diag);
     return FileID();
   }
   LocalSLocEntryTable.push_back(
@@ -671,6 +673,7 @@ SourceManager::createExpansionLocImpl(const ExpansionInfo &Info,
     return SourceLocation::getMacroLoc(LoadedOffset);
   }
   LocalSLocEntryTable.push_back(SLocEntry::get(NextLocalOffset, Info));
+  // FIXME: Produce a proper diagnostic for this case.
   assert(NextLocalOffset + Length + 1 > NextLocalOffset &&
          NextLocalOffset + Length + 1 <= CurrentLoadedOffset &&
          "Ran out of source locations!");
@@ -2230,6 +2233,94 @@ LLVM_DUMP_METHOD void SourceManager::dump() const {
   }
 }
 
+void SourceManager::noteSLocAddressSpaceUsage(
+    DiagnosticsEngine &Diag, Optional<unsigned> MaxNotes) const {
+  struct Info {
+    // A location where this file was entered.
+    SourceLocation Loc;
+    // Number of times this FileEntry was entered.
+    unsigned Inclusions = 0;
+    // Size usage from the file itself.
+    uint64_t DirectSize = 0;
+    // Total size usage from the file and its macro expansions.
+    uint64_t TotalSize = 0;
+  };
+  using UsageMap = llvm::MapVector<const FileEntry*, Info>;
+
+  UsageMap Usage;
+  uint64_t CountedSize = 0;
+
+  auto AddUsageForFileID = [&](FileID ID) {
+    // The +1 here is because getFileIDSize doesn't include the extra byte for
+    // the one-past-the-end location.
+    unsigned Size = getFileIDSize(ID) + 1;
+
+    // Find the file that used this address space, either directly or by
+    // macro expansion.
+    SourceLocation FileStart = getFileLoc(getComposedLoc(ID, 0));
+    FileID FileLocID = getFileID(FileStart);
+    const FileEntry *Entry = getFileEntryForID(FileLocID);
+
+    Info &EntryInfo = Usage[Entry];
+    if (EntryInfo.Loc.isInvalid())
+      EntryInfo.Loc = FileStart;
+    if (ID == FileLocID) {
+      ++EntryInfo.Inclusions;
+      EntryInfo.DirectSize += Size;
+    }
+    EntryInfo.TotalSize += Size;
+    CountedSize += Size;
+  };
+
+  // Loaded SLocEntries have indexes counting downwards from -2.
+  for (size_t Index = 0; Index != LoadedSLocEntryTable.size(); ++Index) {
+    AddUsageForFileID(FileID::get(-2 - Index));
+  }
+  // Local SLocEntries have indexes counting upwards from 0.
+  for (size_t Index = 0; Index != LocalSLocEntryTable.size(); ++Index) {
+    AddUsageForFileID(FileID::get(Index));
+  }
+
+  // Sort the usage by size from largest to smallest. Break ties by raw source
+  // location.
+  auto SortedUsage = Usage.takeVector();
+  auto Cmp = [](const UsageMap::value_type &A, const UsageMap::value_type &B) {
+    return A.second.TotalSize > B.second.TotalSize ||
+           (A.second.TotalSize == B.second.TotalSize &&
+            A.second.Loc < B.second.Loc);
+  };
+  auto SortedEnd = SortedUsage.end();
+  if (MaxNotes && SortedUsage.size() > *MaxNotes) {
+    SortedEnd = SortedUsage.begin() + *MaxNotes;
+    std::nth_element(SortedUsage.begin(), SortedEnd, SortedUsage.end(), Cmp);
+  }
+  std::sort(SortedUsage.begin(), SortedEnd, Cmp);
+
+  // Produce note on sloc address space usage total.
+  uint64_t LocalUsage = NextLocalOffset;
+  uint64_t LoadedUsage = MaxLoadedOffset - CurrentLoadedOffset;
+  int UsagePercent = static_cast<int>(100.0 * double(LocalUsage + LoadedUsage) /
+                                      MaxLoadedOffset);
+  Diag.Report(SourceLocation(), diag::note_total_sloc_usage)
+    << LocalUsage << LoadedUsage << (LocalUsage + LoadedUsage) << UsagePercent;
+
+  // Produce notes on sloc address space usage for each file with a high usage.
+  uint64_t ReportedSize = 0;
+  for (auto &[Entry, FileInfo] :
+       llvm::make_range(SortedUsage.begin(), SortedEnd)) {
+    Diag.Report(FileInfo.Loc, diag::note_file_sloc_usage)
+        << FileInfo.Inclusions << FileInfo.DirectSize
+        << (FileInfo.TotalSize - FileInfo.DirectSize);
+    ReportedSize += FileInfo.TotalSize;
+  }
+
+  // Describe any remaining usage not reported in the per-file usage.
+  if (ReportedSize != CountedSize) {
+    Diag.Report(SourceLocation(), diag::note_file_misc_sloc_usage)
+        << (SortedUsage.end() - SortedEnd) << CountedSize - ReportedSize;
+  }
+}
+
 ExternalSLocEntrySource::~ExternalSLocEntrySource() = default;
 
 /// Return the amount of memory used by memory buffers, breaking down

diff  --git a/clang/lib/Lex/Pragma.cpp b/clang/lib/Lex/Pragma.cpp
index fb4f2dc45758..747447e3ab39 100644
--- a/clang/lib/Lex/Pragma.cpp
+++ b/clang/lib/Lex/Pragma.cpp
@@ -1043,7 +1043,7 @@ struct PragmaDebugHandler : public PragmaHandler {
     Token Tok;
     PP.LexUnexpandedToken(Tok);
     if (Tok.isNot(tok::identifier)) {
-      PP.Diag(Tok, diag::warn_pragma_diagnostic_invalid);
+      PP.Diag(Tok, diag::warn_pragma_debug_missing_command);
       return;
     }
     IdentifierInfo *II = Tok.getIdentifierInfo();
@@ -1181,6 +1181,23 @@ struct PragmaDebugHandler : public PragmaHandler {
         PP.Diag(Tok, diag::warn_pragma_debug_unexpected_command)
           << DumpII->getName();
       }
+    } else if (II->isStr("sloc_usage")) {
+      // An optional integer literal argument specifies the number of files to
+      // specifically report information about.
+      Optional<unsigned> MaxNotes;
+      Token ArgToken;
+      PP.Lex(ArgToken);
+      uint64_t Value;
+      if (ArgToken.is(tok::numeric_constant) &&
+          PP.parseSimpleIntegerLiteral(ArgToken, Value)) {
+        MaxNotes = Value;
+      } else if (ArgToken.isNot(tok::eod)) {
+        PP.Diag(ArgToken, diag::warn_pragma_debug_unexpected_argument);
+      }
+
+      PP.Diag(Tok, diag::remark_sloc_usage);
+      PP.getSourceManager().noteSLocAddressSpaceUsage(PP.getDiagnostics(),
+                                                      MaxNotes);
     } else {
       PP.Diag(Tok, diag::warn_pragma_debug_unexpected_command)
         << II->getName();

diff  --git a/clang/lib/Serialization/ASTReader.cpp b/clang/lib/Serialization/ASTReader.cpp
index af361dfe8511..7b3d0592f8c0 100644
--- a/clang/lib/Serialization/ASTReader.cpp
+++ b/clang/lib/Serialization/ASTReader.cpp
@@ -3401,9 +3401,14 @@ llvm::Error ASTReader::ReadASTBlock(ModuleFile &F,
       std::tie(F.SLocEntryBaseID, F.SLocEntryBaseOffset) =
           SourceMgr.AllocateLoadedSLocEntries(F.LocalNumSLocEntries,
                                               SLocSpaceSize);
-      if (!F.SLocEntryBaseID)
+      if (!F.SLocEntryBaseID) {
+        if (!Diags.isDiagnosticInFlight()) {
+          Diags.Report(SourceLocation(), diag::remark_sloc_usage);
+          SourceMgr.noteSLocAddressSpaceUsage(Diags);
+        }
         return llvm::createStringError(std::errc::invalid_argument,
                                        "ran out of source locations");
+      }
       // Make our entry in the range map. BaseID is negative and growing, so
       // we invert it. Because we invert it, though, we need the other end of
       // the range.

diff  --git a/clang/test/Lexer/Inputs/inc2.h b/clang/test/Lexer/Inputs/inc2.h
index a827dc7fc0d0..7ad031658f9c 100644
--- a/clang/test/Lexer/Inputs/inc2.h
+++ b/clang/test/Lexer/Inputs/inc2.h
@@ -1,1000 +1,1000 @@
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
-/*...............................................................................................*/
+/*.................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+...................................................................................................
+.................................................................................................*/

diff  --git a/clang/test/Lexer/SourceLocationsOverflow.c b/clang/test/Lexer/SourceLocationsOverflow.c
index d2313ea4324d..2b838ca4e861 100644
--- a/clang/test/Lexer/SourceLocationsOverflow.c
+++ b/clang/test/Lexer/SourceLocationsOverflow.c
@@ -3,6 +3,19 @@
 // CHECK-NEXT: inc1.h{{.*}}: fatal error: sorry, this include generates a translation unit too large for Clang to process.
 // CHECK-NEXT: #include "inc2.h"
 // CHECK-NEXT:          ^
+// CHECK-NEXT: note: 214{{.......}}B in local locations, 0B in locations loaded from AST files, for a total of 214{{.......}}B (99% of available space)
+// CHECK-NEXT: {{.*}}inc2.h:1:1: note: file entered 214{{..}} times using 214{{.......}}B of space
+// CHECK-NEXT: /*.................................................................................................
+// CHECK-NEXT: ^
+// CHECK-NEXT: {{.*}}inc1.h:1:1: note: file entered 15 times using 39{{....}}B of space
+// CHECK-NEXT: #include "inc2.h"
+// CHECK-NEXT: ^
+// CHECK-NEXT: <built-in>:1:1: note: file entered {{.*}} times using {{.*}}B of space
+// CHECK-NEXT: # {{.*}}
+// CHECK-NEXT: ^
+// CHECK-NEXT: {{.*}}SourceLocationsOverflow.c:1:1: note: file entered 1 time using {{.*}}B of space
+// CHECK-NEXT: // RUN: not %clang %s -S -o - 2>&1 | FileCheck %s
+// CHECK-NEXT: ^
 // CHECK-NEXT: 1 error generated.
 #include "Inputs/inc1.h"
 #include "Inputs/inc1.h"

diff  --git a/clang/test/Misc/Inputs/include.h b/clang/test/Misc/Inputs/include.h
index 72835e90a551..fe179e9a3a2e 100644
--- a/clang/test/Misc/Inputs/include.h
+++ b/clang/test/Misc/Inputs/include.h
@@ -1,3 +1,8 @@
 #define EQUALS(a,b) a == b
 
+// It's important for sloc_usage.cpp that this file does not have proper
+// include guards.
+#ifndef FOO_DEFINED
+#define FOO_DEFINED
 int foo(int x) { return x; }
+#endif

diff  --git a/clang/test/Misc/sloc-usage.cpp b/clang/test/Misc/sloc-usage.cpp
new file mode 100644
index 000000000000..18bd94f8b9dc
--- /dev/null
+++ b/clang/test/Misc/sloc-usage.cpp
@@ -0,0 +1,14 @@
+// RUN: %clang_cc1 -fsyntax-only -verify %s -include %S/Inputs/include.h
+
+#include "Inputs/include.h"
+#include "Inputs/include.h"
+
+#define FOO(x) x + x
+int k = FOO(FOO(123));
+bool b = EQUALS(k, k);
+
+#pragma clang __debug sloc_usage // expected-remark {{address space usage}}
+// expected-note@* {{(0% of available space)}}
+// (this file)     expected-note-re at 1 {{file entered 1 time using {{.*}}B of space plus 51B for macro expansions}}
+// (included file) expected-note-re at Inputs/include.h:1 {{file entered 3 times using {{.*}}B of space{{$}}}}
+// (builtins file) expected-note@* {{file entered}}

diff  --git a/clang/test/Misc/warning-flags-enabled.c b/clang/test/Misc/warning-flags-enabled.c
index b809465a0ebf..9f210674b126 100644
--- a/clang/test/Misc/warning-flags-enabled.c
+++ b/clang/test/Misc/warning-flags-enabled.c
@@ -8,7 +8,7 @@
 // CHECK: warn_null_arg
 
 
-// RUN: diagtool show-enabled -Wno-everything %s | count 0
+// RUN: diagtool show-enabled -Wno-everything -Rno-everything %s | count 0
 
 
 // RUN: diagtool show-enabled -Wno-everything -Wobjc-root-class %s | FileCheck -check-prefix CHECK-WARN %s
@@ -21,9 +21,9 @@
 
 // RUN: diagtool show-enabled --no-levels -Wno-everything -Wobjc-root-class %s | FileCheck -check-prefix CHECK-NO-LEVELS %s
 //
-// CHECK-NO-LEVELS-NOT: W
-// CHECK-NO-LEVELS-NOT: E
-// CHECK-NO-LEVELS-NOT: F
+// CHECK-NO-LEVELS-NOT: {{^W }}
+// CHECK-NO-LEVELS-NOT: {{^E }}
+// CHECK-NO-LEVELS-NOT: {{^F }}
 // CHECK-NO-LEVELS: warn_objc_root_class_missing [-Wobjc-root-class]
 
 // Test if EnumConversion is a subgroup of -Wconversion.


        


More information about the cfe-commits mailing list