1e5dd7070Spatrick //===-- TestModuleFileExtension.h - Module Extension Tester -----*- C++ -*-===// 2e5dd7070Spatrick // 3e5dd7070Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4e5dd7070Spatrick // See https://llvm.org/LICENSE.txt for license information. 5e5dd7070Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6e5dd7070Spatrick // 7e5dd7070Spatrick //===----------------------------------------------------------------------===// 8e5dd7070Spatrick #ifndef LLVM_CLANG_FRONTEND_TESTMODULEFILEEXTENSION_H 9e5dd7070Spatrick #define LLVM_CLANG_FRONTEND_TESTMODULEFILEEXTENSION_H 10e5dd7070Spatrick 11e5dd7070Spatrick #include "clang/Serialization/ModuleFileExtension.h" 12e5dd7070Spatrick #include "clang/Basic/LLVM.h" 13e5dd7070Spatrick #include "llvm/ADT/StringRef.h" 14e5dd7070Spatrick #include "llvm/Bitstream/BitstreamReader.h" 15e5dd7070Spatrick #include <string> 16e5dd7070Spatrick 17e5dd7070Spatrick namespace clang { 18e5dd7070Spatrick 19e5dd7070Spatrick /// A module file extension used for testing purposes. 20a9ac8606Spatrick class TestModuleFileExtension 21a9ac8606Spatrick : public llvm::RTTIExtends<TestModuleFileExtension, ModuleFileExtension> { 22e5dd7070Spatrick std::string BlockName; 23e5dd7070Spatrick unsigned MajorVersion; 24e5dd7070Spatrick unsigned MinorVersion; 25e5dd7070Spatrick bool Hashed; 26e5dd7070Spatrick std::string UserInfo; 27e5dd7070Spatrick 28e5dd7070Spatrick class Writer : public ModuleFileExtensionWriter { 29e5dd7070Spatrick public: Writer(ModuleFileExtension * Ext)30e5dd7070Spatrick Writer(ModuleFileExtension *Ext) : ModuleFileExtensionWriter(Ext) { } 31e5dd7070Spatrick ~Writer() override; 32e5dd7070Spatrick 33e5dd7070Spatrick void writeExtensionContents(Sema &SemaRef, 34e5dd7070Spatrick llvm::BitstreamWriter &Stream) override; 35e5dd7070Spatrick }; 36e5dd7070Spatrick 37e5dd7070Spatrick class Reader : public ModuleFileExtensionReader { 38e5dd7070Spatrick llvm::BitstreamCursor Stream; 39e5dd7070Spatrick 40e5dd7070Spatrick public: 41e5dd7070Spatrick ~Reader() override; 42e5dd7070Spatrick 43e5dd7070Spatrick Reader(ModuleFileExtension *Ext, const llvm::BitstreamCursor &InStream); 44e5dd7070Spatrick }; 45e5dd7070Spatrick 46e5dd7070Spatrick public: 47a9ac8606Spatrick static char ID; 48a9ac8606Spatrick TestModuleFileExtension(StringRef BlockName,unsigned MajorVersion,unsigned MinorVersion,bool Hashed,StringRef UserInfo)49a9ac8606Spatrick TestModuleFileExtension(StringRef BlockName, unsigned MajorVersion, 50a9ac8606Spatrick unsigned MinorVersion, bool Hashed, 51e5dd7070Spatrick StringRef UserInfo) 52a9ac8606Spatrick : BlockName(BlockName), MajorVersion(MajorVersion), 53a9ac8606Spatrick MinorVersion(MinorVersion), Hashed(Hashed), UserInfo(UserInfo) {} 54e5dd7070Spatrick ~TestModuleFileExtension() override; 55e5dd7070Spatrick 56e5dd7070Spatrick ModuleFileExtensionMetadata getExtensionMetadata() const override; 57e5dd7070Spatrick 58*12c85518Srobert void hashExtension(ExtensionHashBuilder &HBuilder) const override; 59e5dd7070Spatrick 60e5dd7070Spatrick std::unique_ptr<ModuleFileExtensionWriter> 61e5dd7070Spatrick createExtensionWriter(ASTWriter &Writer) override; 62e5dd7070Spatrick 63e5dd7070Spatrick std::unique_ptr<ModuleFileExtensionReader> 64e5dd7070Spatrick createExtensionReader(const ModuleFileExtensionMetadata &Metadata, 65e5dd7070Spatrick ASTReader &Reader, serialization::ModuleFile &Mod, 66e5dd7070Spatrick const llvm::BitstreamCursor &Stream) override; 67a9ac8606Spatrick 68a9ac8606Spatrick std::string str() const; 69e5dd7070Spatrick }; 70e5dd7070Spatrick 71e5dd7070Spatrick } // end namespace clang 72e5dd7070Spatrick 73e5dd7070Spatrick #endif // LLVM_CLANG_FRONTEND_TESTMODULEFILEEXTENSION_H 74