xref: /freebsd-src/contrib/llvm-project/clang/lib/Frontend/TestModuleFileExtension.h (revision 349cc55c9796c4596a5b9904cd3281af295f878f)
10b57cec5SDimitry Andric //===-- TestModuleFileExtension.h - Module Extension Tester -----*- C++ -*-===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric #ifndef LLVM_CLANG_FRONTEND_TESTMODULEFILEEXTENSION_H
90b57cec5SDimitry Andric #define LLVM_CLANG_FRONTEND_TESTMODULEFILEEXTENSION_H
100b57cec5SDimitry Andric 
110b57cec5SDimitry Andric #include "clang/Serialization/ModuleFileExtension.h"
120b57cec5SDimitry Andric #include "clang/Basic/LLVM.h"
130b57cec5SDimitry Andric #include "llvm/ADT/StringRef.h"
140b57cec5SDimitry Andric #include "llvm/Bitstream/BitstreamReader.h"
150b57cec5SDimitry Andric #include <string>
160b57cec5SDimitry Andric 
170b57cec5SDimitry Andric namespace clang {
180b57cec5SDimitry Andric 
190b57cec5SDimitry Andric /// A module file extension used for testing purposes.
20fe6060f1SDimitry Andric class TestModuleFileExtension
21fe6060f1SDimitry Andric     : public llvm::RTTIExtends<TestModuleFileExtension, ModuleFileExtension> {
220b57cec5SDimitry Andric   std::string BlockName;
230b57cec5SDimitry Andric   unsigned MajorVersion;
240b57cec5SDimitry Andric   unsigned MinorVersion;
250b57cec5SDimitry Andric   bool Hashed;
260b57cec5SDimitry Andric   std::string UserInfo;
270b57cec5SDimitry Andric 
280b57cec5SDimitry Andric   class Writer : public ModuleFileExtensionWriter {
290b57cec5SDimitry Andric   public:
Writer(ModuleFileExtension * Ext)300b57cec5SDimitry Andric     Writer(ModuleFileExtension *Ext) : ModuleFileExtensionWriter(Ext) { }
310b57cec5SDimitry Andric     ~Writer() override;
320b57cec5SDimitry Andric 
330b57cec5SDimitry Andric     void writeExtensionContents(Sema &SemaRef,
340b57cec5SDimitry Andric                                 llvm::BitstreamWriter &Stream) override;
350b57cec5SDimitry Andric   };
360b57cec5SDimitry Andric 
370b57cec5SDimitry Andric   class Reader : public ModuleFileExtensionReader {
380b57cec5SDimitry Andric     llvm::BitstreamCursor Stream;
390b57cec5SDimitry Andric 
400b57cec5SDimitry Andric   public:
410b57cec5SDimitry Andric     ~Reader() override;
420b57cec5SDimitry Andric 
430b57cec5SDimitry Andric     Reader(ModuleFileExtension *Ext, const llvm::BitstreamCursor &InStream);
440b57cec5SDimitry Andric   };
450b57cec5SDimitry Andric 
460b57cec5SDimitry Andric public:
47fe6060f1SDimitry Andric   static char ID;
48fe6060f1SDimitry Andric 
TestModuleFileExtension(StringRef BlockName,unsigned MajorVersion,unsigned MinorVersion,bool Hashed,StringRef UserInfo)49fe6060f1SDimitry Andric   TestModuleFileExtension(StringRef BlockName, unsigned MajorVersion,
50fe6060f1SDimitry Andric                           unsigned MinorVersion, bool Hashed,
510b57cec5SDimitry Andric                           StringRef UserInfo)
52fe6060f1SDimitry Andric       : BlockName(BlockName), MajorVersion(MajorVersion),
53fe6060f1SDimitry Andric         MinorVersion(MinorVersion), Hashed(Hashed), UserInfo(UserInfo) {}
540b57cec5SDimitry Andric   ~TestModuleFileExtension() override;
550b57cec5SDimitry Andric 
560b57cec5SDimitry Andric   ModuleFileExtensionMetadata getExtensionMetadata() const override;
570b57cec5SDimitry Andric 
58*349cc55cSDimitry Andric   void hashExtension(ExtensionHashBuilder &HBuilder) const override;
590b57cec5SDimitry Andric 
600b57cec5SDimitry Andric   std::unique_ptr<ModuleFileExtensionWriter>
610b57cec5SDimitry Andric   createExtensionWriter(ASTWriter &Writer) override;
620b57cec5SDimitry Andric 
630b57cec5SDimitry Andric   std::unique_ptr<ModuleFileExtensionReader>
640b57cec5SDimitry Andric   createExtensionReader(const ModuleFileExtensionMetadata &Metadata,
650b57cec5SDimitry Andric                         ASTReader &Reader, serialization::ModuleFile &Mod,
660b57cec5SDimitry Andric                         const llvm::BitstreamCursor &Stream) override;
67fe6060f1SDimitry Andric 
68fe6060f1SDimitry Andric   std::string str() const;
690b57cec5SDimitry Andric };
700b57cec5SDimitry Andric 
710b57cec5SDimitry Andric } // end namespace clang
720b57cec5SDimitry Andric 
730b57cec5SDimitry Andric #endif // LLVM_CLANG_FRONTEND_TESTMODULEFILEEXTENSION_H
74