123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168 |
- #pragma once
- #ifdef __GNUC__
- #pragma GCC diagnostic push
- #pragma GCC diagnostic ignored "-Wunused-parameter"
- #endif
- //===-- ModuleFileExtension.h - Module File Extensions ----------*- C++ -*-===//
- //
- // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
- // See https://llvm.org/LICENSE.txt for license information.
- // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
- //
- //===----------------------------------------------------------------------===//
- #ifndef LLVM_CLANG_SERIALIZATION_MODULEFILEEXTENSION_H
- #define LLVM_CLANG_SERIALIZATION_MODULEFILEEXTENSION_H
- #include "llvm/ADT/IntrusiveRefCntPtr.h"
- #include "llvm/Support/ExtensibleRTTI.h"
- #include "llvm/Support/HashBuilder.h"
- #include "llvm/Support/MD5.h"
- #include <memory>
- #include <string>
- namespace llvm {
- class BitstreamCursor;
- class BitstreamWriter;
- class raw_ostream;
- }
- namespace clang {
- class ASTReader;
- class ASTWriter;
- class Sema;
- namespace serialization {
- class ModuleFile;
- } // end namespace serialization
- /// Metadata for a module file extension.
- struct ModuleFileExtensionMetadata {
- /// The name used to identify this particular extension block within
- /// the resulting module file. It should be unique to the particular
- /// extension, because this name will be used to match the name of
- /// an extension block to the appropriate reader.
- std::string BlockName;
- /// The major version of the extension data.
- unsigned MajorVersion;
- /// The minor version of the extension data.
- unsigned MinorVersion;
- /// A string containing additional user information that will be
- /// stored with the metadata.
- std::string UserInfo;
- };
- class ModuleFileExtensionReader;
- class ModuleFileExtensionWriter;
- /// An abstract superclass that describes a custom extension to the
- /// module/precompiled header file format.
- ///
- /// A module file extension can introduce additional information into
- /// compiled module files (.pcm) and precompiled headers (.pch) via a
- /// custom writer that can then be accessed via a custom reader when
- /// the module file or precompiled header is loaded.
- ///
- /// Subclasses must use LLVM RTTI for open class hierarchies.
- class ModuleFileExtension
- : public llvm::RTTIExtends<ModuleFileExtension, llvm::RTTIRoot> {
- public:
- /// Discriminator for LLVM RTTI.
- static char ID;
- virtual ~ModuleFileExtension();
- /// Retrieves the metadata for this module file extension.
- virtual ModuleFileExtensionMetadata getExtensionMetadata() const = 0;
- /// Hash information about the presence of this extension into the
- /// module hash.
- ///
- /// The module hash is used to distinguish different variants of a module that
- /// are incompatible. If the presence, absence, or version of the module file
- /// extension should force the creation of a separate set of module files,
- /// override this method to combine that distinguishing information into the
- /// module hash.
- ///
- /// The default implementation of this function simply does nothing, so the
- /// presence/absence of this extension does not distinguish module files.
- using ExtensionHashBuilder =
- llvm::HashBuilderImpl<llvm::MD5,
- llvm::support::endian::system_endianness()>;
- virtual void hashExtension(ExtensionHashBuilder &HBuilder) const;
- /// Create a new module file extension writer, which will be
- /// responsible for writing the extension contents into a particular
- /// module file.
- virtual std::unique_ptr<ModuleFileExtensionWriter>
- createExtensionWriter(ASTWriter &Writer) = 0;
- /// Create a new module file extension reader, given the
- /// metadata read from the block and the cursor into the extension
- /// block.
- ///
- /// May return null to indicate that an extension block with the
- /// given metadata cannot be read.
- virtual std::unique_ptr<ModuleFileExtensionReader>
- createExtensionReader(const ModuleFileExtensionMetadata &Metadata,
- ASTReader &Reader, serialization::ModuleFile &Mod,
- const llvm::BitstreamCursor &Stream) = 0;
- };
- /// Abstract base class that writes a module file extension block into
- /// a module file.
- class ModuleFileExtensionWriter {
- ModuleFileExtension *Extension;
- protected:
- ModuleFileExtensionWriter(ModuleFileExtension *Extension)
- : Extension(Extension) { }
- public:
- virtual ~ModuleFileExtensionWriter();
- /// Retrieve the module file extension with which this writer is
- /// associated.
- ModuleFileExtension *getExtension() const { return Extension; }
- /// Write the contents of the extension block into the given bitstream.
- ///
- /// Responsible for writing the contents of the extension into the
- /// given stream. All of the contents should be written into custom
- /// records with IDs >= FIRST_EXTENSION_RECORD_ID.
- virtual void writeExtensionContents(Sema &SemaRef,
- llvm::BitstreamWriter &Stream) = 0;
- };
- /// Abstract base class that reads a module file extension block from
- /// a module file.
- ///
- /// Subclasses
- class ModuleFileExtensionReader {
- ModuleFileExtension *Extension;
- protected:
- ModuleFileExtensionReader(ModuleFileExtension *Extension)
- : Extension(Extension) { }
- public:
- /// Retrieve the module file extension with which this reader is
- /// associated.
- ModuleFileExtension *getExtension() const { return Extension; }
- virtual ~ModuleFileExtensionReader();
- };
- } // end namespace clang
- #endif // LLVM_CLANG_SERIALIZATION_MODULEFILEEXTENSION_H
- #ifdef __GNUC__
- #pragma GCC diagnostic pop
- #endif
|