diff options
Diffstat (limited to 'include/clang')
26 files changed, 247 insertions, 108 deletions
| diff --git a/include/clang/AST/ASTVector.h b/include/clang/AST/ASTVector.h index 6ec054582e26..79453bf10871 100644 --- a/include/clang/AST/ASTVector.h +++ b/include/clang/AST/ASTVector.h @@ -384,14 +384,15 @@ void ASTVector<T>::grow(const ASTContext &C, size_t MinSize) {    T *NewElts = new (C, llvm::alignOf<T>()) T[NewCapacity];    // Copy the elements over. -  if (std::is_class<T>::value) { -    std::uninitialized_copy(Begin, End, NewElts); -    // Destroy the original elements. -    destroy_range(Begin, End); -  } -  else { -    // Use memcpy for PODs (std::uninitialized_copy optimizes to memmove). -    memcpy(NewElts, Begin, CurSize * sizeof(T)); +  if (Begin != End) { +    if (std::is_class<T>::value) { +      std::uninitialized_copy(Begin, End, NewElts); +      // Destroy the original elements. +      destroy_range(Begin, End); +    } else { +      // Use memcpy for PODs (std::uninitialized_copy optimizes to memmove). +      memcpy(NewElts, Begin, CurSize * sizeof(T)); +    }    }    // ASTContext never frees any memory. diff --git a/include/clang/AST/NSAPI.h b/include/clang/AST/NSAPI.h index ce2c7cea9e02..583f9d9f1deb 100644 --- a/include/clang/AST/NSAPI.h +++ b/include/clang/AST/NSAPI.h @@ -16,6 +16,7 @@  namespace clang {    class ASTContext; +  class ObjCInterfaceDecl;    class QualType;    class Expr; @@ -35,11 +36,10 @@ public:      ClassId_NSMutableDictionary,      ClassId_NSNumber,      ClassId_NSMutableSet, -    ClassId_NSCountedSet,      ClassId_NSMutableOrderedSet,      ClassId_NSValue    }; -  static const unsigned NumClassIds = 11; +  static const unsigned NumClassIds = 10;    enum NSStringMethodKind {      NSStr_stringWithString, @@ -220,6 +220,10 @@ public:    /// \brief Returns \c true if \p Id is currently defined as a macro.    bool isMacroDefined(StringRef Id) const; +  /// \brief Returns \c true if \p InterfaceDecl is subclass of \p NSClassKind +  bool isSubclassOfNSClass(ObjCInterfaceDecl *InterfaceDecl, +                           NSClassIdKindKind NSClassKind) const; +  private:    bool isObjCTypedef(QualType T, StringRef name, IdentifierInfo *&II) const;    bool isObjCEnumerator(const Expr *E, diff --git a/include/clang/AST/StmtOpenMP.h b/include/clang/AST/StmtOpenMP.h index b412daaf2858..708b8667335e 100644 --- a/include/clang/AST/StmtOpenMP.h +++ b/include/clang/AST/StmtOpenMP.h @@ -312,18 +312,26 @@ class OMPLoopDirective : public OMPExecutableDirective {    }    /// \brief Get the updates storage. -  MutableArrayRef<Expr *> getUpdates() { +  MutableArrayRef<Expr *> getInits() {      Expr **Storage = reinterpret_cast<Expr **>(          &*std::next(child_begin(),                      getArraysOffset(getDirectiveKind()) + CollapsedNum));      return MutableArrayRef<Expr *>(Storage, CollapsedNum);    } +  /// \brief Get the updates storage. +  MutableArrayRef<Expr *> getUpdates() { +    Expr **Storage = reinterpret_cast<Expr **>( +        &*std::next(child_begin(), +                    getArraysOffset(getDirectiveKind()) + 2 * CollapsedNum)); +    return MutableArrayRef<Expr *>(Storage, CollapsedNum); +  } +    /// \brief Get the final counter updates storage.    MutableArrayRef<Expr *> getFinals() {      Expr **Storage = reinterpret_cast<Expr **>(          &*std::next(child_begin(), -                    getArraysOffset(getDirectiveKind()) + 2 * CollapsedNum)); +                    getArraysOffset(getDirectiveKind()) + 3 * CollapsedNum));      return MutableArrayRef<Expr *>(Storage, CollapsedNum);    } @@ -358,7 +366,7 @@ protected:    static unsigned numLoopChildren(unsigned CollapsedNum,                                    OpenMPDirectiveKind Kind) {      return getArraysOffset(Kind) + -           3 * CollapsedNum; // Counters, Updates and Finals +           4 * CollapsedNum; // Counters, Inits, Updates and Finals    }    void setIterationVariable(Expr *IV) { @@ -414,6 +422,7 @@ protected:      *std::next(child_begin(), NextUpperBoundOffset) = NUB;    }    void setCounters(ArrayRef<Expr *> A); +  void setInits(ArrayRef<Expr *> A);    void setUpdates(ArrayRef<Expr *> A);    void setFinals(ArrayRef<Expr *> A); @@ -453,6 +462,8 @@ public:      Expr *NUB;      /// \brief Counters Loop counters.      SmallVector<Expr *, 4> Counters; +    /// \brief Expressions for loop counters inits for CodeGen. +    SmallVector<Expr *, 4> Inits;      /// \brief Expressions for loop counters update for CodeGen.      SmallVector<Expr *, 4> Updates;      /// \brief Final loop counter values for GodeGen. @@ -484,10 +495,12 @@ public:        NLB = nullptr;        NUB = nullptr;        Counters.resize(Size); +      Inits.resize(Size);        Updates.resize(Size);        Finals.resize(Size);        for (unsigned i = 0; i < Size; ++i) {          Counters[i] = nullptr; +        Inits[i] = nullptr;          Updates[i] = nullptr;          Finals[i] = nullptr;        } @@ -584,6 +597,12 @@ public:      return const_cast<OMPLoopDirective *>(this)->getCounters();    } +  ArrayRef<Expr *> inits() { return getInits(); } + +  ArrayRef<Expr *> inits() const { +    return const_cast<OMPLoopDirective *>(this)->getInits(); +  } +    ArrayRef<Expr *> updates() { return getUpdates(); }    ArrayRef<Expr *> updates() const { diff --git a/include/clang/Analysis/Support/BumpVector.h b/include/clang/Analysis/Support/BumpVector.h index 841adf64557d..3abe32d79cce 100644 --- a/include/clang/Analysis/Support/BumpVector.h +++ b/include/clang/Analysis/Support/BumpVector.h @@ -223,14 +223,15 @@ void BumpVector<T>::grow(BumpVectorContext &C, size_t MinSize) {    T *NewElts = C.getAllocator().template Allocate<T>(NewCapacity);    // Copy the elements over. -  if (std::is_class<T>::value) { -    std::uninitialized_copy(Begin, End, NewElts); -    // Destroy the original elements. -    destroy_range(Begin, End); -  } -  else { -    // Use memcpy for PODs (std::uninitialized_copy optimizes to memmove). -    memcpy(NewElts, Begin, CurSize * sizeof(T)); +  if (Begin != End) { +    if (std::is_class<T>::value) { +      std::uninitialized_copy(Begin, End, NewElts); +      // Destroy the original elements. +      destroy_range(Begin, End); +    } else { +      // Use memcpy for PODs (std::uninitialized_copy optimizes to memmove). +      memcpy(NewElts, Begin, CurSize * sizeof(T)); +    }    }    // For now, leak 'Begin'.  We can add it back to a freelist in diff --git a/include/clang/Basic/Attr.td b/include/clang/Basic/Attr.td index fb1eb58dcc70..6187bcb2c4bf 100644 --- a/include/clang/Basic/Attr.td +++ b/include/clang/Basic/Attr.td @@ -1133,7 +1133,7 @@ def ObjCRuntimeName : Attr {  def ObjCBoxable : Attr {    let Spellings = [GNU<"objc_boxable">];    let Subjects = SubjectList<[Record], ErrorDiag, "ExpectedStructOrUnion">; -  let Documentation = [Undocumented]; +  let Documentation = [ObjCBoxableDocs];  }  def OptimizeNone : InheritableAttr { diff --git a/include/clang/Basic/AttrDocs.td b/include/clang/Basic/AttrDocs.td index e4ca0cb4778e..48660166f6c6 100644 --- a/include/clang/Basic/AttrDocs.td +++ b/include/clang/Basic/AttrDocs.td @@ -492,6 +492,34 @@ can only be placed before an @protocol or @interface declaration:      }];  } +def ObjCBoxableDocs : Documentation { +    let Category = DocCatFunction; +    let Content = [{ +Structs and unions marked with the ``objc_boxable`` attribute can be used  +with the Objective-C boxed expression syntax, ``@(...)``. + +**Usage**: ``__attribute__((objc_boxable))``. This attribute  +can only be placed on a declaration of a trivially-copyable struct or union: + +.. code-block:: objc + +  struct __attribute__((objc_boxable)) some_struct { +    int i; +  }; +  union __attribute__((objc_boxable)) some_union { +    int i; +    float f; +  }; +  typedef struct __attribute__((objc_boxable)) _some_struct some_struct; + +  // ... + +  some_struct ss; +  NSValue *boxed = @(ss); + +    }]; +} +  def AvailabilityDocs : Documentation {    let Category = DocCatFunction;    let Content = [{ diff --git a/include/clang/Basic/DiagnosticCommonKinds.td b/include/clang/Basic/DiagnosticCommonKinds.td index ff42683ecdde..fc3ca62113e5 100644 --- a/include/clang/Basic/DiagnosticCommonKinds.td +++ b/include/clang/Basic/DiagnosticCommonKinds.td @@ -195,6 +195,8 @@ def err_unable_to_make_temp : Error<  // Modules  def err_module_file_conflict : Error<"module '%0' found in both '%1' and '%2'">; +def err_module_format_unhandled : Error< +  "no handler registered for module format '%0'">;  // TransformActions  // TODO: Use a custom category name to distinguish rewriter errors. diff --git a/include/clang/Basic/DiagnosticParseKinds.td b/include/clang/Basic/DiagnosticParseKinds.td index 1364b982ecf1..e4f859943266 100644 --- a/include/clang/Basic/DiagnosticParseKinds.td +++ b/include/clang/Basic/DiagnosticParseKinds.td @@ -358,6 +358,10 @@ def err_invalid_pixel_decl_spec_combination : Error<    "'%0' declaration specifier not allowed here">;  def err_invalid_vector_bool_decl_spec : Error<    "cannot use '%0' with '__vector bool'">; +def err_invalid_vector_long_decl_spec : Error< +  "cannot use 'long' with '__vector'">; +def err_invalid_vector_float_decl_spec : Error< +  "cannot use 'float' with '__vector'">;  def err_invalid_vector_double_decl_spec : Error <    "use of 'double' with '__vector' requires VSX support to be enabled "    "(available on POWER7 or later)">; diff --git a/include/clang/Basic/DiagnosticSemaKinds.td b/include/clang/Basic/DiagnosticSemaKinds.td index fb1e3f1cb46e..82f512130885 100644 --- a/include/clang/Basic/DiagnosticSemaKinds.td +++ b/include/clang/Basic/DiagnosticSemaKinds.td @@ -5358,7 +5358,7 @@ def err_objc_object_catch : Error<  def err_incomplete_type_objc_at_encode : Error<    "'@encode' of incomplete type %0">;  def warn_objc_circular_container : Warning< -  "adding '%0' to '%0' might cause circular dependency in container">, +  "adding '%0' to '%1' might cause circular dependency in container">,    InGroup<DiagGroup<"objc-circular-container">>;  def note_objc_circular_container_declared_here : Note<"'%0' declared here">; diff --git a/include/clang/Basic/LangOptions.def b/include/clang/Basic/LangOptions.def index 8d606a12d046..c184df77c37e 100644 --- a/include/clang/Basic/LangOptions.def +++ b/include/clang/Basic/LangOptions.def @@ -104,6 +104,7 @@ LANGOPT(WritableStrings   , 1, 0, "writable string support")  LANGOPT(ConstStrings      , 1, 0, "const-qualified string support")  LANGOPT(LaxVectorConversions , 1, 1, "lax vector conversions")  LANGOPT(AltiVec           , 1, 0, "AltiVec-style vector initializers") +LANGOPT(ZVector           , 1, 0, "System z vector extensions")  LANGOPT(Exceptions        , 1, 0, "exception handling")  LANGOPT(ObjCExceptions    , 1, 0, "Objective-C exceptions")  LANGOPT(CXXExceptions     , 1, 0, "C++ exceptions") diff --git a/include/clang/Basic/TokenKinds.def b/include/clang/Basic/TokenKinds.def index 7a91c9f502b7..8333a4ccf8db 100644 --- a/include/clang/Basic/TokenKinds.def +++ b/include/clang/Basic/TokenKinds.def @@ -239,6 +239,8 @@ PUNCTUATOR(greatergreatergreater, ">>>")  //   KEYOPENCL  - This is a keyword in OpenCL  //   KEYNOOPENCL  - This is a keyword that is not supported in OpenCL  //   KEYALTIVEC - This is a keyword in AltiVec +//   KEYZVECTOR - This is a keyword for the System z vector extensions, +//                which are heavily based on AltiVec  //   KEYBORLAND - This is a keyword if Borland extensions are enabled  //   BOOLSUPPORT - This is a keyword if 'bool' is a built-in type  //   HALFSUPPORT - This is a keyword if 'half' is a built-in type @@ -501,7 +503,7 @@ ALIAS("write_only", __write_only    , KEYOPENCL)  ALIAS("read_write", __read_write    , KEYOPENCL)  // OpenCL builtins  KEYWORD(__builtin_astype            , KEYOPENCL) -KEYWORD(vec_step                    , KEYOPENCL|KEYALTIVEC) +KEYWORD(vec_step                    , KEYOPENCL|KEYALTIVEC|KEYZVECTOR)  // OpenMP Type Traits  KEYWORD(__builtin_omp_required_simd_align, KEYALL) @@ -510,9 +512,9 @@ KEYWORD(__builtin_omp_required_simd_align, KEYALL)  KEYWORD(__pascal                    , KEYALL)  // Altivec Extension. -KEYWORD(__vector                    , KEYALTIVEC) +KEYWORD(__vector                    , KEYALTIVEC|KEYZVECTOR)  KEYWORD(__pixel                     , KEYALTIVEC) -KEYWORD(__bool                      , KEYALTIVEC) +KEYWORD(__bool                      , KEYALTIVEC|KEYZVECTOR)  // ARM NEON extensions.  ALIAS("__fp16", half                , KEYALL) diff --git a/include/clang/CodeGen/ObjectFilePCHContainerOperations.h b/include/clang/CodeGen/ObjectFilePCHContainerOperations.h index 4540efb29781..e82aab787515 100644 --- a/include/clang/CodeGen/ObjectFilePCHContainerOperations.h +++ b/include/clang/CodeGen/ObjectFilePCHContainerOperations.h @@ -14,30 +14,32 @@  namespace clang { -/// \brief A PCHContainerOperations implementation that uses LLVM to +/// A PCHContainerWriter implementation that uses LLVM to  /// wraps Clang modules inside a COFF, ELF, or Mach-O container. -class ObjectFilePCHContainerOperations -  : public PCHContainerOperations { -  /// \brief Return an ASTConsumer that can be chained with a +class ObjectFilePCHContainerWriter : public PCHContainerWriter { +  StringRef getFormat() const override { return "obj"; } + +  /// Return an ASTConsumer that can be chained with a    /// PCHGenerator that produces a wrapper file format    /// that also contains full debug info for the module. -  std::unique_ptr<ASTConsumer> -    CreatePCHContainerGenerator( +  std::unique_ptr<ASTConsumer> CreatePCHContainerGenerator(        DiagnosticsEngine &Diags, const HeaderSearchOptions &HSO,        const PreprocessorOptions &PPO, const TargetOptions &TO,        const LangOptions &LO, const std::string &MainFileName,        const std::string &OutputFileName, llvm::raw_pwrite_stream *OS,        std::shared_ptr<PCHBuffer> Buffer) const override; +}; + +/// A PCHContainerReader implementation that uses LLVM to +/// wraps Clang modules inside a COFF, ELF, or Mach-O container. +class ObjectFilePCHContainerReader : public PCHContainerReader { +  StringRef getFormat() const override { return "obj"; } -  /// \brief Initialize an llvm::BitstreamReader with the serialized +  /// Initialize an llvm::BitstreamReader with the serialized    /// AST inside the PCH container Buffer.    void ExtractPCH(llvm::MemoryBufferRef Buffer,                    llvm::BitstreamReader &StreamFile) const override; - -  }; -  } -  #endif diff --git a/include/clang/Driver/CC1Options.td b/include/clang/Driver/CC1Options.td index 60cc6ec11568..d2f0d05eedb8 100644 --- a/include/clang/Driver/CC1Options.td +++ b/include/clang/Driver/CC1Options.td @@ -369,6 +369,9 @@ def fmodules_local_submodule_visibility :    Flag<["-"], "fmodules-local-submodule-visibility">,    HelpText<"Enforce name visibility rules across submodules of the same "             "top-level module.">; +def fmodule_format_EQ : Joined<["-"], "fmodule-format=">, +  HelpText<"Select the container format for clang modules and PCH. " +           "Supported options are 'raw' and 'obj'.">;  def fno_modules_hide_internal_linkage :    Flag<["-"], "fno-modules-hide-internal-linkage">,    HelpText<"Make all declarations visible to redeclaration lookup, " diff --git a/include/clang/Driver/Options.td b/include/clang/Driver/Options.td index 6e5dbf225bb6..9d3e2cfccdc7 100644 --- a/include/clang/Driver/Options.td +++ b/include/clang/Driver/Options.td @@ -1351,6 +1351,13 @@ def mno_altivec : Flag<["-"], "mno-altivec">, Alias<fno_altivec>;  def mvx : Flag<["-"], "mvx">, Group<m_Group>;  def mno_vx : Flag<["-"], "mno-vx">, Group<m_Group>; +def fzvector : Flag<["-"], "fzvector">, Group<f_Group>, Flags<[CC1Option]>, +  HelpText<"Enable System z vector language extension">; +def fno_zvector : Flag<["-"], "fno-zvector">, Group<f_Group>, +  Flags<[CC1Option]>; +def mzvector : Flag<["-"], "mzvector">, Alias<fzvector>; +def mno_zvector : Flag<["-"], "mno-zvector">, Alias<fno_zvector>; +  def mno_warn_nonportable_cfstrings : Flag<["-"], "mno-warn-nonportable-cfstrings">, Group<m_Group>;  def mno_omit_leaf_frame_pointer : Flag<["-"], "mno-omit-leaf-frame-pointer">, Group<m_Group>;  def momit_leaf_frame_pointer : Flag<["-"], "momit-leaf-frame-pointer">, Group<m_Group>, diff --git a/include/clang/Frontend/ASTUnit.h b/include/clang/Frontend/ASTUnit.h index 2d38352d22a8..fa4bcf2edd22 100644 --- a/include/clang/Frontend/ASTUnit.h +++ b/include/clang/Frontend/ASTUnit.h @@ -57,6 +57,7 @@ class FileManager;  class HeaderSearch;  class Preprocessor;  class PCHContainerOperations; +class PCHContainerReader;  class SourceManager;  class TargetInfo;  class ASTFrontendAction; @@ -725,8 +726,7 @@ public:    ///    /// \returns - The initialized ASTUnit or null if the AST failed to load.    static std::unique_ptr<ASTUnit> LoadFromASTFile( -      const std::string &Filename, -      std::shared_ptr<PCHContainerOperations> PCHContainerOps, +      const std::string &Filename, const PCHContainerReader &PCHContainerRdr,        IntrusiveRefCntPtr<DiagnosticsEngine> Diags,        const FileSystemOptions &FileSystemOpts, bool OnlyLocalDecls = false,        ArrayRef<RemappedFile> RemappedFiles = None, diff --git a/include/clang/Frontend/CompilerInstance.h b/include/clang/Frontend/CompilerInstance.h index 2f3e1b6cebb1..45e5ed12046f 100644 --- a/include/clang/Frontend/CompilerInstance.h +++ b/include/clang/Frontend/CompilerInstance.h @@ -183,7 +183,7 @@ class CompilerInstance : public ModuleLoader {  public:    explicit CompilerInstance(        std::shared_ptr<PCHContainerOperations> PCHContainerOps = -          std::make_shared<RawPCHContainerOperations>(), +          std::make_shared<PCHContainerOperations>(),        bool BuildingModule = false);    ~CompilerInstance() override; @@ -508,6 +508,34 @@ public:      return ThePCHContainerOperations;    } +  /// Return the appropriate PCHContainerWriter depending on the +  /// current CodeGenOptions. +  const PCHContainerWriter &getPCHContainerWriter() const { +    assert(Invocation && "cannot determine module format without invocation"); +    StringRef Format = getHeaderSearchOpts().ModuleFormat; +    auto *Writer = ThePCHContainerOperations->getWriterOrNull(Format); +    if (!Writer) { +      if (Diagnostics) +        Diagnostics->Report(diag::err_module_format_unhandled) << Format; +      llvm::report_fatal_error("unknown module format"); +    } +    return *Writer; +  } + +  /// Return the appropriate PCHContainerReader depending on the +  /// current CodeGenOptions. +  const PCHContainerReader &getPCHContainerReader() const { +    assert(Invocation && "cannot determine module format without invocation"); +    StringRef Format = getHeaderSearchOpts().ModuleFormat; +    auto *Reader = ThePCHContainerOperations->getReaderOrNull(Format); +    if (!Reader) { +      if (Diagnostics) +        Diagnostics->Report(diag::err_module_format_unhandled) << Format; +      llvm::report_fatal_error("unknown module format"); +    } +    return *Reader; +  } +    /// }    /// @name Code Completion    /// { @@ -621,7 +649,7 @@ public:    static IntrusiveRefCntPtr<ASTReader> createPCHExternalASTSource(        StringRef Path, StringRef Sysroot, bool DisablePCHValidation,        bool AllowPCHWithCompilerErrors, Preprocessor &PP, ASTContext &Context, -      const PCHContainerOperations &PCHContainerOps, +      const PCHContainerReader &PCHContainerRdr,        void *DeserializationListener, bool OwnDeserializationListener,        bool Preamble, bool UseGlobalModuleIndex); diff --git a/include/clang/Frontend/PCHContainerOperations.h b/include/clang/Frontend/PCHContainerOperations.h index 949ee63c615d..868ea6866ad6 100644 --- a/include/clang/Frontend/PCHContainerOperations.h +++ b/include/clang/Frontend/PCHContainerOperations.h @@ -11,6 +11,7 @@  #define LLVM_CLANG_PCH_CONTAINER_OPERATIONS_H  #include "llvm/ADT/SmallVector.h" +#include "llvm/ADT/StringMap.h"  #include "llvm/Support/MemoryBuffer.h"  #include <memory> @@ -19,6 +20,8 @@ class raw_pwrite_stream;  class BitstreamReader;  } +using llvm::StringRef; +  namespace clang {  class ASTConsumer; @@ -33,14 +36,16 @@ struct PCHBuffer {    bool IsComplete;    llvm::SmallVector<char, 0> Data;  }; +   +/// This abstract interface provides operations for creating +/// containers for serialized ASTs (precompiled headers and clang +/// modules). +class PCHContainerWriter { +public:  +  virtual ~PCHContainerWriter() = 0; +  virtual StringRef getFormat() const = 0; -/// \brief This abstract interface provides operations for creating -/// and unwrapping containers for serialized ASTs (precompiled headers -/// and clang modules). -class PCHContainerOperations { -public: -  virtual ~PCHContainerOperations(); -  /// \brief Return an ASTConsumer that can be chained with a +  /// Return an ASTConsumer that can be chained with a    /// PCHGenerator that produces a wrapper file format containing a    /// serialized AST bitstream.    virtual std::unique_ptr<ASTConsumer> CreatePCHContainerGenerator( @@ -49,16 +54,28 @@ public:        const LangOptions &LO, const std::string &MainFileName,        const std::string &OutputFileName, llvm::raw_pwrite_stream *OS,        std::shared_ptr<PCHBuffer> Buffer) const = 0; +}; -  /// \brief Initialize an llvm::BitstreamReader with the serialized AST inside +/// This abstract interface provides operations for unwrapping +/// containers for serialized ASTs (precompiled headers and clang +/// modules). +class PCHContainerReader { +public:  +  virtual ~PCHContainerReader() = 0; +  /// Equivalent to the format passed to -fmodule-format= +  virtual StringRef getFormat() const = 0; + +  /// Initialize an llvm::BitstreamReader with the serialized AST inside    /// the PCH container Buffer.    virtual void ExtractPCH(llvm::MemoryBufferRef Buffer,                            llvm::BitstreamReader &StreamFile) const = 0;  }; -/// \brief Implements a raw pass-through PCH container. -class RawPCHContainerOperations : public PCHContainerOperations { -  /// \brief Return an ASTConsumer that can be chained with a +/// Implements write operations for a raw pass-through PCH container. +class RawPCHContainerWriter : public PCHContainerWriter { +  StringRef getFormat() const override { return "raw"; } + +  /// Return an ASTConsumer that can be chained with a    /// PCHGenerator that writes the module to a flat file.    std::unique_ptr<ASTConsumer> CreatePCHContainerGenerator(        DiagnosticsEngine &Diags, const HeaderSearchOptions &HSO, @@ -66,11 +83,42 @@ class RawPCHContainerOperations : public PCHContainerOperations {        const LangOptions &LO, const std::string &MainFileName,        const std::string &OutputFileName, llvm::raw_pwrite_stream *OS,        std::shared_ptr<PCHBuffer> Buffer) const override; +}; -  /// \brief Initialize an llvm::BitstreamReader with Buffer. +/// Implements read operations for a raw pass-through PCH container. +class RawPCHContainerReader : public PCHContainerReader { +  StringRef getFormat() const override { return "raw"; } + +  /// Initialize an llvm::BitstreamReader with Buffer.    void ExtractPCH(llvm::MemoryBufferRef Buffer,                    llvm::BitstreamReader &StreamFile) const override;  }; + +/// A registry of PCHContainerWriter and -Reader objects for different formats. +class PCHContainerOperations { +  llvm::StringMap<std::unique_ptr<PCHContainerWriter>> Writers; +  llvm::StringMap<std::unique_ptr<PCHContainerReader>> Readers; +public: +  /// Automatically registers a RawPCHContainerWriter and +  /// RawPCHContainerReader. +  PCHContainerOperations(); +  void registerWriter(std::unique_ptr<PCHContainerWriter> Writer) { +    Writers[Writer->getFormat()] = std::move(Writer); +  } +  void registerReader(std::unique_ptr<PCHContainerReader> Reader) { +    Readers[Reader->getFormat()] = std::move(Reader); +  }   +  const PCHContainerWriter *getWriterOrNull(StringRef Format) { +    return Writers[Format].get(); +  } +  const PCHContainerReader *getReaderOrNull(StringRef Format) { +    return Readers[Format].get(); +  } +  const PCHContainerReader &getRawReader() { +    return *getReaderOrNull("raw"); +  } +}; +  }  #endif diff --git a/include/clang/Frontend/Utils.h b/include/clang/Frontend/Utils.h index 639965343c45..aa567b4c0279 100644 --- a/include/clang/Frontend/Utils.h +++ b/include/clang/Frontend/Utils.h @@ -45,7 +45,7 @@ class HeaderSearch;  class HeaderSearchOptions;  class IdentifierTable;  class LangOptions; -class PCHContainerOperations; +class PCHContainerReader;  class Preprocessor;  class PreprocessorOptions;  class PreprocessorOutputOptions; @@ -63,7 +63,7 @@ void ApplyHeaderSearchOptions(HeaderSearch &HS,  /// InitializePreprocessor - Initialize the preprocessor getting it and the  /// environment ready to process a single file.  void InitializePreprocessor(Preprocessor &PP, const PreprocessorOptions &PPOpts, -                            const PCHContainerOperations &PCHContainerOps, +                            const PCHContainerReader &PCHContainerRdr,                              const FrontendOptions &FEOpts);  /// DoPrintPreprocessedInput - Implement -E mode. diff --git a/include/clang/Lex/HeaderSearchOptions.h b/include/clang/Lex/HeaderSearchOptions.h index c9c32609f19b..12f0447a1169 100644 --- a/include/clang/Lex/HeaderSearchOptions.h +++ b/include/clang/Lex/HeaderSearchOptions.h @@ -92,6 +92,9 @@ public:    /// \brief The directory used for a user build.    std::string ModuleUserBuildPath; +  /// The module/pch container format. +  std::string ModuleFormat; +    /// \brief Whether we should disable the use of the hash string within the    /// module cache.    /// @@ -167,16 +170,14 @@ public:  public:    HeaderSearchOptions(StringRef _Sysroot = "/") -    : Sysroot(_Sysroot), DisableModuleHash(0), ImplicitModuleMaps(0), -      ModuleMapFileHomeIsCwd(0), -      ModuleCachePruneInterval(7*24*60*60), -      ModuleCachePruneAfter(31*24*60*60), -      BuildSessionTimestamp(0), -      UseBuiltinIncludes(true), -      UseStandardSystemIncludes(true), UseStandardCXXIncludes(true), -      UseLibcxx(false), Verbose(false), -      ModulesValidateOncePerBuildSession(false), -      ModulesValidateSystemHeaders(false) {} +      : Sysroot(_Sysroot), ModuleFormat("raw"), DisableModuleHash(0), +        ImplicitModuleMaps(0), ModuleMapFileHomeIsCwd(0), +        ModuleCachePruneInterval(7 * 24 * 60 * 60), +        ModuleCachePruneAfter(31 * 24 * 60 * 60), BuildSessionTimestamp(0), +        UseBuiltinIncludes(true), UseStandardSystemIncludes(true), +        UseStandardCXXIncludes(true), UseLibcxx(false), Verbose(false), +        ModulesValidateOncePerBuildSession(false), +        ModulesValidateSystemHeaders(false) {}    /// AddPath - Add the \p Path path to the specified \p Group list.    void AddPath(StringRef Path, frontend::IncludeDirGroup Group, diff --git a/include/clang/Parse/Parser.h b/include/clang/Parse/Parser.h index fb9eb8ff5af8..8719555be914 100644 --- a/include/clang/Parse/Parser.h +++ b/include/clang/Parse/Parser.h @@ -108,12 +108,13 @@ class Parser : public CodeCompletionHandler {    /// Ident_super - IdentifierInfo for "super", to support fast    /// comparison.    IdentifierInfo *Ident_super; -  /// Ident_vector, Ident_pixel, Ident_bool - cached IdentifierInfo's -  /// for "vector", "pixel", and "bool" fast comparison.  Only present -  /// if AltiVec enabled. +  /// Ident_vector, Ident_bool - cached IdentifierInfos for "vector" and +  /// "bool" fast comparison.  Only present if AltiVec or ZVector are enabled.    IdentifierInfo *Ident_vector; -  IdentifierInfo *Ident_pixel;    IdentifierInfo *Ident_bool; +  /// Ident_pixel - cached IdentifierInfos for "pixel" fast comparison. +  /// Only present if AltiVec enabled. +  IdentifierInfo *Ident_pixel;    /// Objective-C contextual keywords.    mutable IdentifierInfo *Ident_instancetype; @@ -605,10 +606,12 @@ private:    bool TryAltiVecToken(DeclSpec &DS, SourceLocation Loc,                         const char *&PrevSpec, unsigned &DiagID,                         bool &isInvalid) { -    if (!getLangOpts().AltiVec || -        (Tok.getIdentifierInfo() != Ident_vector && -         Tok.getIdentifierInfo() != Ident_pixel && -         Tok.getIdentifierInfo() != Ident_bool)) +    if (!getLangOpts().AltiVec && !getLangOpts().ZVector) +      return false; + +    if (Tok.getIdentifierInfo() != Ident_vector && +        Tok.getIdentifierInfo() != Ident_bool && +        (!getLangOpts().AltiVec || Tok.getIdentifierInfo() != Ident_pixel))        return false;      return TryAltiVecTokenOutOfLine(DS, Loc, PrevSpec, DiagID, isInvalid); @@ -618,7 +621,7 @@ private:    /// identifier token, replacing it with the non-context-sensitive __vector.    /// This returns true if the token was replaced.    bool TryAltiVecVectorToken() { -    if (!getLangOpts().AltiVec || +    if ((!getLangOpts().AltiVec && !getLangOpts().ZVector) ||          Tok.getIdentifierInfo() != Ident_vector) return false;      return TryAltiVecVectorTokenOutOfLine();    } diff --git a/include/clang/Sema/Sema.h b/include/clang/Sema/Sema.h index db7b6f954c1b..72044336a83b 100644 --- a/include/clang/Sema/Sema.h +++ b/include/clang/Sema/Sema.h @@ -729,27 +729,12 @@ public:    /// \brief The declaration of the Objective-C NSArray class.    ObjCInterfaceDecl *NSArrayDecl; -  /// \brief Pointer to NSMutableArray type (NSMutableArray *). -  QualType NSMutableArrayPointer; -    /// \brief The declaration of the arrayWithObjects:count: method.    ObjCMethodDecl *ArrayWithObjectsMethod;    /// \brief The declaration of the Objective-C NSDictionary class.    ObjCInterfaceDecl *NSDictionaryDecl; -  /// \brief Pointer to NSMutableDictionary type (NSMutableDictionary *). -  QualType NSMutableDictionaryPointer; - -  /// \brief Pointer to NSMutableSet type (NSMutableSet *). -  QualType NSMutableSetPointer; - -  /// \brief Pointer to NSCountedSet type (NSCountedSet *). -  QualType NSCountedSetPointer; - -  /// \brief Pointer to NSMutableOrderedSet type (NSMutableOrderedSet *). -  QualType NSMutableOrderedSetPointer; -    /// \brief The declaration of the dictionaryWithObjects:forKeys:count: method.    ObjCMethodDecl *DictionaryWithObjectsMethod; @@ -8363,7 +8348,8 @@ public:    /// type checking for vector binary operators.    QualType CheckVectorOperands(ExprResult &LHS, ExprResult &RHS, -                               SourceLocation Loc, bool IsCompAssign); +                               SourceLocation Loc, bool IsCompAssign, +                               bool AllowBothBool, bool AllowBoolConversion);    QualType GetSignedVectorType(QualType V);    QualType CheckVectorCompareOperands(ExprResult &LHS, ExprResult &RHS,                                        SourceLocation Loc, bool isRelational); diff --git a/include/clang/Serialization/ASTReader.h b/include/clang/Serialization/ASTReader.h index 9377dfac99cc..840655ea43e3 100644 --- a/include/clang/Serialization/ASTReader.h +++ b/include/clang/Serialization/ASTReader.h @@ -362,7 +362,7 @@ private:    SourceManager &SourceMgr;    FileManager &FileMgr; -  const PCHContainerOperations &PCHContainerOps; +  const PCHContainerReader &PCHContainerRdr;    DiagnosticsEngine &Diags;    /// \brief The semantic analysis object that will be processing the @@ -1289,7 +1289,7 @@ public:    /// \param ReadTimer If non-null, a timer used to track the time spent    /// deserializing.    ASTReader(Preprocessor &PP, ASTContext &Context, -            const PCHContainerOperations &PCHContainerOps, +            const PCHContainerReader &PCHContainerRdr,              StringRef isysroot = "", bool DisableValidation = false,              bool AllowASTWithCompilerErrors = false,              bool AllowConfigurationMismatch = false, @@ -1458,7 +1458,7 @@ public:    /// the AST file, without actually loading the AST file.    static std::string    getOriginalSourceFile(const std::string &ASTFileName, FileManager &FileMgr, -                        const PCHContainerOperations &PCHContainerOps, +                        const PCHContainerReader &PCHContainerRdr,                          DiagnosticsEngine &Diags);    /// \brief Read the control block for the named AST file. @@ -1466,13 +1466,13 @@ public:    /// \returns true if an error occurred, false otherwise.    static bool    readASTFileControlBlock(StringRef Filename, FileManager &FileMgr, -                          const PCHContainerOperations &PCHContainerOps, +                          const PCHContainerReader &PCHContainerRdr,                            ASTReaderListener &Listener);    /// \brief Determine whether the given AST file is acceptable to load into a    /// translation unit with the given language and target options.    static bool isAcceptableASTFile(StringRef Filename, FileManager &FileMgr, -                                  const PCHContainerOperations &PCHContainerOps, +                                  const PCHContainerReader &PCHContainerRdr,                                    const LangOptions &LangOpts,                                    const TargetOptions &TargetOpts,                                    const PreprocessorOptions &PPOpts, diff --git a/include/clang/Serialization/GlobalModuleIndex.h b/include/clang/Serialization/GlobalModuleIndex.h index 7e205106c4ee..ba4f7e216aec 100644 --- a/include/clang/Serialization/GlobalModuleIndex.h +++ b/include/clang/Serialization/GlobalModuleIndex.h @@ -198,10 +198,9 @@ public:    /// \param Path The path to the directory containing module files, into    /// which the global index will be written.    static ErrorCode writeIndex(FileManager &FileMgr, -                              const PCHContainerOperations &PCHContainerOps, +                              const PCHContainerReader &PCHContainerRdr,                                StringRef Path);  }; -  }  #endif diff --git a/include/clang/Serialization/ModuleManager.h b/include/clang/Serialization/ModuleManager.h index ea4b57fa3ace..ab39aefa940b 100644 --- a/include/clang/Serialization/ModuleManager.h +++ b/include/clang/Serialization/ModuleManager.h @@ -24,7 +24,7 @@ namespace clang {  class GlobalModuleIndex;  class ModuleMap; -class PCHContainerOperations; +class PCHContainerReader;  namespace serialization { @@ -52,7 +52,7 @@ class ModuleManager {    FileManager &FileMgr;    /// \brief Knows how to unwrap module containers. -  const PCHContainerOperations &PCHContainerOps; +  const PCHContainerReader &PCHContainerRdr;    /// \brief A lookup of in-memory (virtual file) buffers    llvm::DenseMap<const FileEntry *, std::unique_ptr<llvm::MemoryBuffer>> @@ -118,9 +118,9 @@ public:    typedef std::pair<uint32_t, StringRef> ModuleOffset;    explicit ModuleManager(FileManager &FileMgr, -                         const PCHContainerOperations &PCHContainerOps); +                         const PCHContainerReader &PCHContainerRdr);    ~ModuleManager(); -   +    /// \brief Forward iterator to traverse all loaded modules.  This is reverse    /// source-order.    ModuleIterator begin() { return Chain.begin(); } diff --git a/include/clang/Tooling/Refactoring.h b/include/clang/Tooling/Refactoring.h index 944fd41f85c1..54deff6e3661 100644 --- a/include/clang/Tooling/Refactoring.h +++ b/include/clang/Tooling/Refactoring.h @@ -40,7 +40,7 @@ public:    RefactoringTool(const CompilationDatabase &Compilations,                    ArrayRef<std::string> SourcePaths,                    std::shared_ptr<PCHContainerOperations> PCHContainerOps = -                      std::make_shared<RawPCHContainerOperations>()); +                      std::make_shared<PCHContainerOperations>());    /// \brief Returns the set of replacements to which replacements should    /// be added during the run of the tool. diff --git a/include/clang/Tooling/Tooling.h b/include/clang/Tooling/Tooling.h index fb887e1df9e8..92e9065c6a8a 100644 --- a/include/clang/Tooling/Tooling.h +++ b/include/clang/Tooling/Tooling.h @@ -150,7 +150,7 @@ inline std::unique_ptr<FrontendActionFactory> newFrontendActionFactory(  bool runToolOnCode(clang::FrontendAction *ToolAction, const Twine &Code,                     const Twine &FileName = "input.cc",                     std::shared_ptr<PCHContainerOperations> PCHContainerOps = -                       std::make_shared<RawPCHContainerOperations>()); +                       std::make_shared<PCHContainerOperations>());  /// The first part of the pair is the filename, the second part the  /// file-content. @@ -171,7 +171,7 @@ bool runToolOnCodeWithArgs(      clang::FrontendAction *ToolAction, const Twine &Code,      const std::vector<std::string> &Args, const Twine &FileName = "input.cc",      std::shared_ptr<PCHContainerOperations> PCHContainerOps = -        std::make_shared<RawPCHContainerOperations>(), +        std::make_shared<PCHContainerOperations>(),      const FileContentMappings &VirtualMappedFiles = FileContentMappings());  /// \brief Builds an AST for 'Code'. @@ -185,7 +185,7 @@ bool runToolOnCodeWithArgs(  std::unique_ptr<ASTUnit>  buildASTFromCode(const Twine &Code, const Twine &FileName = "input.cc",                   std::shared_ptr<PCHContainerOperations> PCHContainerOps = -                     std::make_shared<RawPCHContainerOperations>()); +                     std::make_shared<PCHContainerOperations>());  /// \brief Builds an AST for 'Code' with additional flags.  /// @@ -200,7 +200,7 @@ std::unique_ptr<ASTUnit> buildASTFromCodeWithArgs(      const Twine &Code, const std::vector<std::string> &Args,      const Twine &FileName = "input.cc",      std::shared_ptr<PCHContainerOperations> PCHContainerOps = -        std::make_shared<RawPCHContainerOperations>()); +        std::make_shared<PCHContainerOperations>());  /// \brief Utility to run a FrontendAction in a single clang invocation.  class ToolInvocation { @@ -219,7 +219,7 @@ public:    ToolInvocation(std::vector<std::string> CommandLine, FrontendAction *FAction,                   FileManager *Files,                   std::shared_ptr<PCHContainerOperations> PCHContainerOps = -                     std::make_shared<RawPCHContainerOperations>()); +                     std::make_shared<PCHContainerOperations>());    /// \brief Create a tool invocation.    /// @@ -288,7 +288,7 @@ class ClangTool {    ClangTool(const CompilationDatabase &Compilations,              ArrayRef<std::string> SourcePaths,              std::shared_ptr<PCHContainerOperations> PCHContainerOps = -                std::make_shared<RawPCHContainerOperations>()); +                std::make_shared<PCHContainerOperations>());    ~ClangTool(); | 
