17330f729Sjoerg //===-- TestModuleFileExtension.h - Module Extension Tester -----*- C++ -*-===// 27330f729Sjoerg // 37330f729Sjoerg // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 47330f729Sjoerg // See https://llvm.org/LICENSE.txt for license information. 57330f729Sjoerg // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 67330f729Sjoerg // 77330f729Sjoerg //===----------------------------------------------------------------------===// 87330f729Sjoerg #ifndef LLVM_CLANG_FRONTEND_TESTMODULEFILEEXTENSION_H 97330f729Sjoerg #define LLVM_CLANG_FRONTEND_TESTMODULEFILEEXTENSION_H 107330f729Sjoerg 117330f729Sjoerg #include "clang/Serialization/ModuleFileExtension.h" 127330f729Sjoerg #include "clang/Basic/LLVM.h" 137330f729Sjoerg #include "llvm/ADT/StringRef.h" 147330f729Sjoerg #include "llvm/Bitstream/BitstreamReader.h" 157330f729Sjoerg #include <string> 167330f729Sjoerg 177330f729Sjoerg namespace clang { 187330f729Sjoerg 197330f729Sjoerg /// A module file extension used for testing purposes. 20*e038c9c4Sjoerg class TestModuleFileExtension 21*e038c9c4Sjoerg : public llvm::RTTIExtends<TestModuleFileExtension, ModuleFileExtension> { 227330f729Sjoerg std::string BlockName; 237330f729Sjoerg unsigned MajorVersion; 247330f729Sjoerg unsigned MinorVersion; 257330f729Sjoerg bool Hashed; 267330f729Sjoerg std::string UserInfo; 277330f729Sjoerg 287330f729Sjoerg class Writer : public ModuleFileExtensionWriter { 297330f729Sjoerg public: Writer(ModuleFileExtension * Ext)307330f729Sjoerg Writer(ModuleFileExtension *Ext) : ModuleFileExtensionWriter(Ext) { } 317330f729Sjoerg ~Writer() override; 327330f729Sjoerg 337330f729Sjoerg void writeExtensionContents(Sema &SemaRef, 347330f729Sjoerg llvm::BitstreamWriter &Stream) override; 357330f729Sjoerg }; 367330f729Sjoerg 377330f729Sjoerg class Reader : public ModuleFileExtensionReader { 387330f729Sjoerg llvm::BitstreamCursor Stream; 397330f729Sjoerg 407330f729Sjoerg public: 417330f729Sjoerg ~Reader() override; 427330f729Sjoerg 437330f729Sjoerg Reader(ModuleFileExtension *Ext, const llvm::BitstreamCursor &InStream); 447330f729Sjoerg }; 457330f729Sjoerg 467330f729Sjoerg public: 47*e038c9c4Sjoerg static char ID; 48*e038c9c4Sjoerg TestModuleFileExtension(StringRef BlockName,unsigned MajorVersion,unsigned MinorVersion,bool Hashed,StringRef UserInfo)49*e038c9c4Sjoerg TestModuleFileExtension(StringRef BlockName, unsigned MajorVersion, 50*e038c9c4Sjoerg unsigned MinorVersion, bool Hashed, 517330f729Sjoerg StringRef UserInfo) 52*e038c9c4Sjoerg : BlockName(BlockName), MajorVersion(MajorVersion), 53*e038c9c4Sjoerg MinorVersion(MinorVersion), Hashed(Hashed), UserInfo(UserInfo) {} 547330f729Sjoerg ~TestModuleFileExtension() override; 557330f729Sjoerg 567330f729Sjoerg ModuleFileExtensionMetadata getExtensionMetadata() const override; 577330f729Sjoerg 587330f729Sjoerg llvm::hash_code hashExtension(llvm::hash_code Code) const override; 597330f729Sjoerg 607330f729Sjoerg std::unique_ptr<ModuleFileExtensionWriter> 617330f729Sjoerg createExtensionWriter(ASTWriter &Writer) override; 627330f729Sjoerg 637330f729Sjoerg std::unique_ptr<ModuleFileExtensionReader> 647330f729Sjoerg createExtensionReader(const ModuleFileExtensionMetadata &Metadata, 657330f729Sjoerg ASTReader &Reader, serialization::ModuleFile &Mod, 667330f729Sjoerg const llvm::BitstreamCursor &Stream) override; 67*e038c9c4Sjoerg 68*e038c9c4Sjoerg std::string str() const; 697330f729Sjoerg }; 707330f729Sjoerg 717330f729Sjoerg } // end namespace clang 727330f729Sjoerg 737330f729Sjoerg #endif // LLVM_CLANG_FRONTEND_TESTMODULEFILEEXTENSION_H 74