16623e1f1SDouglas Gregor //===-- TestModuleFileExtension.h - Module Extension Tester -----*- C++ -*-===// 26623e1f1SDouglas Gregor // 32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information. 52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 66623e1f1SDouglas Gregor // 76623e1f1SDouglas Gregor //===----------------------------------------------------------------------===// 86623e1f1SDouglas Gregor #ifndef LLVM_CLANG_FRONTEND_TESTMODULEFILEEXTENSION_H 96623e1f1SDouglas Gregor #define LLVM_CLANG_FRONTEND_TESTMODULEFILEEXTENSION_H 106623e1f1SDouglas Gregor 116623e1f1SDouglas Gregor #include "clang/Serialization/ModuleFileExtension.h" 126623e1f1SDouglas Gregor #include "clang/Basic/LLVM.h" 136623e1f1SDouglas Gregor #include "llvm/ADT/StringRef.h" 14e0308279SFrancis Visoiu Mistrih #include "llvm/Bitstream/BitstreamReader.h" 156623e1f1SDouglas Gregor #include <string> 166623e1f1SDouglas Gregor 176623e1f1SDouglas Gregor namespace clang { 186623e1f1SDouglas Gregor 196623e1f1SDouglas Gregor /// A module file extension used for testing purposes. 204295ae96SJan Svoboda class TestModuleFileExtension 214295ae96SJan Svoboda : public llvm::RTTIExtends<TestModuleFileExtension, ModuleFileExtension> { 226623e1f1SDouglas Gregor std::string BlockName; 236623e1f1SDouglas Gregor unsigned MajorVersion; 246623e1f1SDouglas Gregor unsigned MinorVersion; 256623e1f1SDouglas Gregor bool Hashed; 266623e1f1SDouglas Gregor std::string UserInfo; 276623e1f1SDouglas Gregor 286623e1f1SDouglas Gregor class Writer : public ModuleFileExtensionWriter { 296623e1f1SDouglas Gregor public: Writer(ModuleFileExtension * Ext)306623e1f1SDouglas Gregor Writer(ModuleFileExtension *Ext) : ModuleFileExtensionWriter(Ext) { } 316623e1f1SDouglas Gregor ~Writer() override; 326623e1f1SDouglas Gregor 338f64ca15SDouglas Gregor void writeExtensionContents(Sema &SemaRef, 348f64ca15SDouglas Gregor llvm::BitstreamWriter &Stream) override; 356623e1f1SDouglas Gregor }; 366623e1f1SDouglas Gregor 376623e1f1SDouglas Gregor class Reader : public ModuleFileExtensionReader { 386623e1f1SDouglas Gregor llvm::BitstreamCursor Stream; 396623e1f1SDouglas Gregor 406623e1f1SDouglas Gregor public: 416623e1f1SDouglas Gregor ~Reader() override; 426623e1f1SDouglas Gregor 436623e1f1SDouglas Gregor Reader(ModuleFileExtension *Ext, const llvm::BitstreamCursor &InStream); 446623e1f1SDouglas Gregor }; 456623e1f1SDouglas Gregor 466623e1f1SDouglas Gregor public: 474295ae96SJan Svoboda static char ID; 484295ae96SJan Svoboda TestModuleFileExtension(StringRef BlockName,unsigned MajorVersion,unsigned MinorVersion,bool Hashed,StringRef UserInfo)494295ae96SJan Svoboda TestModuleFileExtension(StringRef BlockName, unsigned MajorVersion, 504295ae96SJan Svoboda unsigned MinorVersion, bool Hashed, 516623e1f1SDouglas Gregor StringRef UserInfo) 524295ae96SJan Svoboda : BlockName(BlockName), MajorVersion(MajorVersion), 534295ae96SJan Svoboda MinorVersion(MinorVersion), Hashed(Hashed), UserInfo(UserInfo) {} 546623e1f1SDouglas Gregor ~TestModuleFileExtension() override; 556623e1f1SDouglas Gregor 566623e1f1SDouglas Gregor ModuleFileExtensionMetadata getExtensionMetadata() const override; 576623e1f1SDouglas Gregor 58*655bea42SAlexandre Rames void hashExtension(ExtensionHashBuilder &HBuilder) const override; 596623e1f1SDouglas Gregor 606623e1f1SDouglas Gregor std::unique_ptr<ModuleFileExtensionWriter> 616623e1f1SDouglas Gregor createExtensionWriter(ASTWriter &Writer) override; 626623e1f1SDouglas Gregor 636623e1f1SDouglas Gregor std::unique_ptr<ModuleFileExtensionReader> 646623e1f1SDouglas Gregor createExtensionReader(const ModuleFileExtensionMetadata &Metadata, 656623e1f1SDouglas Gregor ASTReader &Reader, serialization::ModuleFile &Mod, 666623e1f1SDouglas Gregor const llvm::BitstreamCursor &Stream) override; 675e8a246aSJan Svoboda 6808ccea01SJan Svoboda std::string str() const; 696623e1f1SDouglas Gregor }; 706623e1f1SDouglas Gregor 716623e1f1SDouglas Gregor } // end namespace clang 726623e1f1SDouglas Gregor 736623e1f1SDouglas Gregor #endif // LLVM_CLANG_FRONTEND_TESTMODULEFILEEXTENSION_H 74