xref: /llvm-project/clang/lib/Frontend/TestModuleFileExtension.h (revision 655bea4226b401a11164f99c6344e38d8742b8e4)
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