diff options
Diffstat (limited to 'include/clang')
| -rw-r--r-- | include/clang/Basic/DiagnosticLexKinds.td | 6 | ||||
| -rw-r--r-- | include/clang/Basic/DiagnosticSemaKinds.td | 4 | ||||
| -rw-r--r-- | include/clang/Basic/DiagnosticSerializationKinds.td | 12 | ||||
| -rw-r--r-- | include/clang/Basic/Module.h | 10 | ||||
| -rw-r--r-- | include/clang/Basic/Sanitizers.h | 10 | ||||
| -rw-r--r-- | include/clang/Driver/CC1Options.td | 3 | ||||
| -rw-r--r-- | include/clang/Frontend/CodeGenOptions.def | 1 | ||||
| -rw-r--r-- | include/clang/Lex/ModuleMap.h | 45 | 
8 files changed, 74 insertions, 17 deletions
diff --git a/include/clang/Basic/DiagnosticLexKinds.td b/include/clang/Basic/DiagnosticLexKinds.td index b393ce5f1545..447f06945660 100644 --- a/include/clang/Basic/DiagnosticLexKinds.td +++ b/include/clang/Basic/DiagnosticLexKinds.td @@ -664,6 +664,12 @@ def warn_mmap_mismatched_top_level_private : Warning<    InGroup<PrivateModule>;  def note_mmap_rename_top_level_private_as_submodule : Note<    "make '%0' a submodule of '%1' to ensure it can be found by name">; +def err_mmap_duplicate_header_attribute : Error< +  "header attribute '%0' specified multiple times">; +def err_mmap_invalid_header_attribute_value : Error< +  "expected integer literal as value for header attribute '%0'">; +def err_mmap_expected_header_attribute : Error< +  "expected a header attribute name ('size' or 'mtime')">;  def warn_auto_module_import : Warning<    "treating #%select{include|import|include_next|__include_macros}0 as an " diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index 4de4f47b8a5a..a5a5c74afe69 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -4584,7 +4584,7 @@ def warn_missing_prototype : Warning<  def note_declaration_not_a_prototype : Note<    "this declaration is not a prototype; add 'void' to make it a prototype for a zero-parameter function">;   def warn_strict_prototypes : Warning< -  "this %select{function declaration is not|" +  "this %select{function declaration is not|block declaration is not|"    "old-style function definition is not preceded by}0 a prototype">,    InGroup<DiagGroup<"strict-prototypes">>, DefaultIgnore;  def warn_missing_variable_declarations : Warning< @@ -7268,7 +7268,7 @@ def err_invalid_conversion_between_vector_and_integer : Error<    "invalid conversion between vector type %0 and integer type %1 "    "of different size">; -def err_opencl_function_pointer_variable : Error< +def err_opencl_function_pointer : Error<    "pointers to functions are not allowed">;  def err_opencl_taking_function_address : Error< diff --git a/include/clang/Basic/DiagnosticSerializationKinds.td b/include/clang/Basic/DiagnosticSerializationKinds.td index 35e2f67e24b6..f9e7b8fa9b56 100644 --- a/include/clang/Basic/DiagnosticSerializationKinds.td +++ b/include/clang/Basic/DiagnosticSerializationKinds.td @@ -174,10 +174,6 @@ def note_module_odr_violation_mismatch_decl_diff : Note<"but in '%0' found "    "method %2 with %ordinal3 parameter of type %4%select{| decayed from %6}5|"    "method %2 with %ordinal3 parameter named %4}1">; -def warn_module_uses_date_time : Warning< -  "%select{precompiled header|module}0 uses __DATE__ or __TIME__">, -  InGroup<DiagGroup<"pch-date-time">>; -  def warn_duplicate_module_file_extension : Warning<    "duplicate module file extension block name '%0'">,    InGroup<ModuleFileExtension>; @@ -186,7 +182,15 @@ def warn_module_system_bit_conflict : Warning<    "module file '%0' was validated as a system module and is now being imported "    "as a non-system module; any difference in diagnostic options will be ignored">,    InGroup<ModuleConflict>; +} // let CategoryName +let CategoryName = "AST Serialization Issue" in { +def warn_module_uses_date_time : Warning< +  "%select{precompiled header|module}0 uses __DATE__ or __TIME__">, +  InGroup<DiagGroup<"pch-date-time">>; +def err_module_no_size_mtime_for_header : Error< +  "cannot emit module %0: %select{size|mtime}1 must be explicitly specified " +  "for missing header file \"%2\"">;  } // let CategoryName  } // let Component diff --git a/include/clang/Basic/Module.h b/include/clang/Basic/Module.h index 326d84eeb6c2..1e52b29367b2 100644 --- a/include/clang/Basic/Module.h +++ b/include/clang/Basic/Module.h @@ -154,11 +154,19 @@ public:    /// \brief Stored information about a header directive that was found in the    /// module map file but has not been resolved to a file.    struct UnresolvedHeaderDirective { +    HeaderKind Kind = HK_Normal;      SourceLocation FileNameLoc;      std::string FileName; -    bool IsUmbrella; +    bool IsUmbrella = false; +    bool HasBuiltinHeader = false; +    Optional<off_t> Size; +    Optional<time_t> ModTime;    }; +  /// Headers that are mentioned in the module map file but that we have not +  /// yet attempted to resolve to a file on the file system. +  SmallVector<UnresolvedHeaderDirective, 1> UnresolvedHeaders; +    /// \brief Headers that are mentioned in the module map file but could not be    /// found on the file system.    SmallVector<UnresolvedHeaderDirective, 1> MissingHeaders; diff --git a/include/clang/Basic/Sanitizers.h b/include/clang/Basic/Sanitizers.h index bfa8e516edd3..5317720095e0 100644 --- a/include/clang/Basic/Sanitizers.h +++ b/include/clang/Basic/Sanitizers.h @@ -61,8 +61,8 @@ struct SanitizerSet {      Mask = Value ? (Mask | K) : (Mask & ~K);    } -  /// \brief Disable all sanitizers. -  void clear() { Mask = 0; } +  /// Disable the sanitizers specified in \p K. +  void clear(SanitizerMask K = SanitizerKind::All) { Mask &= ~K; }    /// \brief Returns true if at least one sanitizer is enabled.    bool empty() const { return Mask == 0; } @@ -79,6 +79,12 @@ SanitizerMask parseSanitizerValue(StringRef Value, bool AllowGroups);  /// this group enables.  SanitizerMask expandSanitizerGroups(SanitizerMask Kinds); +/// Return the sanitizers which do not affect preprocessing. +static inline SanitizerMask getPPTransparentSanitizers() { +  return SanitizerKind::CFI | SanitizerKind::Integer | +         SanitizerKind::Nullability | SanitizerKind::Undefined; +} +  }  // end namespace clang  #endif diff --git a/include/clang/Driver/CC1Options.td b/include/clang/Driver/CC1Options.td index b55289dc35a1..1132d1345f60 100644 --- a/include/clang/Driver/CC1Options.td +++ b/include/clang/Driver/CC1Options.td @@ -293,6 +293,9 @@ def fsanitize_coverage_trace_gep  def fsanitize_coverage_8bit_counters      : Flag<["-"], "fsanitize-coverage-8bit-counters">,        HelpText<"Enable frequency counters in sanitizer coverage">; +def fsanitize_coverage_inline_8bit_counters +    : Flag<["-"], "fsanitize-coverage-inline-8bit-counters">, +      HelpText<"Enable inline 8-bit counters in sanitizer coverage">;  def fsanitize_coverage_trace_pc      : Flag<["-"], "fsanitize-coverage-trace-pc">,        HelpText<"Enable PC tracing in sanitizer coverage">; diff --git a/include/clang/Frontend/CodeGenOptions.def b/include/clang/Frontend/CodeGenOptions.def index 9a13854671d2..d7cd805fa10a 100644 --- a/include/clang/Frontend/CodeGenOptions.def +++ b/include/clang/Frontend/CodeGenOptions.def @@ -163,6 +163,7 @@ CODEGENOPT(SanitizeCoverageTracePC, 1, 0) ///< Enable PC tracing                                            ///< in sanitizer coverage.  CODEGENOPT(SanitizeCoverageTracePCGuard, 1, 0) ///< Enable PC tracing with guard                                                 ///< in sanitizer coverage. +CODEGENOPT(SanitizeCoverageInline8bitCounters, 1, 0) ///< Use inline 8bit counters.  CODEGENOPT(SanitizeCoverageNoPrune, 1, 0) ///< Disable coverage pruning.  CODEGENOPT(SanitizeStats     , 1, 0) ///< Collect statistics for sanitizers.  CODEGENOPT(SimplifyLibCalls  , 1, 1) ///< Set when -fbuiltin is enabled. diff --git a/include/clang/Lex/ModuleMap.h b/include/clang/Lex/ModuleMap.h index c05faa4a8201..11506939f9b1 100644 --- a/include/clang/Lex/ModuleMap.h +++ b/include/clang/Lex/ModuleMap.h @@ -26,6 +26,7 @@  #include "llvm/ADT/SmallVector.h"  #include "llvm/ADT/StringMap.h"  #include "llvm/ADT/StringRef.h" +#include "llvm/ADT/TinyPtrVector.h"  #include "llvm/ADT/Twine.h"  #include <algorithm>  #include <memory> @@ -116,6 +117,11 @@ public:      // Adjust ModuleMap::addHeader.    }; +  /// Convert a header kind to a role. Requires Kind to not be HK_Excluded. +  static ModuleHeaderRole headerKindToRole(Module::HeaderKind Kind); +  /// Convert a header role to a kind. +  static Module::HeaderKind headerRoleToKind(ModuleHeaderRole Role); +    /// \brief A header that is known to reside within a given module,    /// whether it was included or excluded.    class KnownHeader { @@ -165,7 +171,13 @@ private:    /// \brief Mapping from each header to the module that owns the contents of    /// that header.    HeadersMap Headers; -   + +  /// Map from file sizes to modules with lazy header directives of that size. +  mutable llvm::DenseMap<off_t, llvm::TinyPtrVector<Module*>> LazyHeadersBySize; +  /// Map from mtimes to modules with lazy header directives with those mtimes. +  mutable llvm::DenseMap<time_t, llvm::TinyPtrVector<Module*>> +              LazyHeadersByModTime; +    /// \brief Mapping from directories with umbrella headers to the module    /// that is generated from the umbrella header.    /// @@ -257,22 +269,30 @@ private:    /// resolved.    Module *resolveModuleId(const ModuleId &Id, Module *Mod, bool Complain) const; -  /// Resolve the given header directive to an actual header file. +  /// Add an unresolved header to a module. +  void addUnresolvedHeader(Module *Mod, +                           Module::UnresolvedHeaderDirective Header); + +  /// Look up the given header directive to find an actual header file.    ///    /// \param M The module in which we're resolving the header directive.    /// \param Header The header directive to resolve.    /// \param RelativePathName Filled in with the relative path name from the    ///        module to the resolved header.    /// \return The resolved file, if any. -  const FileEntry *resolveHeader(Module *M, -                                 Module::UnresolvedHeaderDirective Header, -                                 SmallVectorImpl<char> &RelativePathName); +  const FileEntry *findHeader(Module *M, +                              const Module::UnresolvedHeaderDirective &Header, +                              SmallVectorImpl<char> &RelativePathName); + +  /// Resolve the given header directive. +  void resolveHeader(Module *M, +                     const Module::UnresolvedHeaderDirective &Header);    /// Attempt to resolve the specified header directive as naming a builtin    /// header. -  const FileEntry * -  resolveAsBuiltinHeader(Module *M, Module::UnresolvedHeaderDirective Header, -                         SmallVectorImpl<char> &BuiltinPathName); +  /// \return \c true if a corresponding builtin header was found. +  bool resolveAsBuiltinHeader(Module *M, +                              const Module::UnresolvedHeaderDirective &Header);    /// \brief Looks up the modules that \p File corresponds to.    /// @@ -368,6 +388,15 @@ public:    /// the preferred module for the header.    ArrayRef<KnownHeader> findAllModulesForHeader(const FileEntry *File) const; +  /// Resolve all lazy header directives for the specified file. +  /// +  /// This ensures that the HeaderFileInfo on HeaderSearch is up to date. This +  /// is effectively internal, but is exposed so HeaderSearch can call it. +  void resolveHeaderDirectives(const FileEntry *File) const; + +  /// Resolve all lazy header directives for the specified module. +  void resolveHeaderDirectives(Module *Mod) const; +    /// \brief Reports errors if a module must not include a specific file.    ///    /// \param RequestingModule The module including a file.  | 
