xref: /aosp_15_r20/external/clang/lib/Frontend/TestModuleFileExtension.h (revision 67e74705e28f6214e480b399dd47ea732279e315)
1*67e74705SXin Li //===-- TestModuleFileExtension.h - Module Extension Tester -----*- C++ -*-===//
2*67e74705SXin Li //
3*67e74705SXin Li //                     The LLVM Compiler Infrastructure
4*67e74705SXin Li //
5*67e74705SXin Li // This file is distributed under the University of Illinois Open Source
6*67e74705SXin Li // License. See LICENSE.TXT for details.
7*67e74705SXin Li //
8*67e74705SXin Li //===----------------------------------------------------------------------===//
9*67e74705SXin Li #ifndef LLVM_CLANG_FRONTEND_TESTMODULEFILEEXTENSION_H
10*67e74705SXin Li #define LLVM_CLANG_FRONTEND_TESTMODULEFILEEXTENSION_H
11*67e74705SXin Li 
12*67e74705SXin Li #include "clang/Serialization/ModuleFileExtension.h"
13*67e74705SXin Li #include "clang/Basic/LLVM.h"
14*67e74705SXin Li #include "llvm/ADT/StringRef.h"
15*67e74705SXin Li #include "llvm/Bitcode/BitstreamReader.h"
16*67e74705SXin Li #include <string>
17*67e74705SXin Li 
18*67e74705SXin Li namespace clang {
19*67e74705SXin Li 
20*67e74705SXin Li /// A module file extension used for testing purposes.
21*67e74705SXin Li class TestModuleFileExtension : public ModuleFileExtension {
22*67e74705SXin Li   std::string BlockName;
23*67e74705SXin Li   unsigned MajorVersion;
24*67e74705SXin Li   unsigned MinorVersion;
25*67e74705SXin Li   bool Hashed;
26*67e74705SXin Li   std::string UserInfo;
27*67e74705SXin Li 
28*67e74705SXin Li   class Writer : public ModuleFileExtensionWriter {
29*67e74705SXin Li   public:
Writer(ModuleFileExtension * Ext)30*67e74705SXin Li     Writer(ModuleFileExtension *Ext) : ModuleFileExtensionWriter(Ext) { }
31*67e74705SXin Li     ~Writer() override;
32*67e74705SXin Li 
33*67e74705SXin Li     void writeExtensionContents(Sema &SemaRef,
34*67e74705SXin Li                                 llvm::BitstreamWriter &Stream) override;
35*67e74705SXin Li   };
36*67e74705SXin Li 
37*67e74705SXin Li   class Reader : public ModuleFileExtensionReader {
38*67e74705SXin Li     llvm::BitstreamCursor Stream;
39*67e74705SXin Li 
40*67e74705SXin Li   public:
41*67e74705SXin Li     ~Reader() override;
42*67e74705SXin Li 
43*67e74705SXin Li     Reader(ModuleFileExtension *Ext, const llvm::BitstreamCursor &InStream);
44*67e74705SXin Li   };
45*67e74705SXin Li 
46*67e74705SXin Li public:
TestModuleFileExtension(StringRef BlockName,unsigned MajorVersion,unsigned MinorVersion,bool Hashed,StringRef UserInfo)47*67e74705SXin Li   TestModuleFileExtension(StringRef BlockName,
48*67e74705SXin Li                           unsigned MajorVersion,
49*67e74705SXin Li                           unsigned MinorVersion,
50*67e74705SXin Li                           bool Hashed,
51*67e74705SXin Li                           StringRef UserInfo)
52*67e74705SXin Li     : BlockName(BlockName),
53*67e74705SXin Li       MajorVersion(MajorVersion), MinorVersion(MinorVersion),
54*67e74705SXin Li       Hashed(Hashed), UserInfo(UserInfo) { }
55*67e74705SXin Li   ~TestModuleFileExtension() override;
56*67e74705SXin Li 
57*67e74705SXin Li   ModuleFileExtensionMetadata getExtensionMetadata() const override;
58*67e74705SXin Li 
59*67e74705SXin Li   llvm::hash_code hashExtension(llvm::hash_code Code) const override;
60*67e74705SXin Li 
61*67e74705SXin Li   std::unique_ptr<ModuleFileExtensionWriter>
62*67e74705SXin Li   createExtensionWriter(ASTWriter &Writer) override;
63*67e74705SXin Li 
64*67e74705SXin Li   std::unique_ptr<ModuleFileExtensionReader>
65*67e74705SXin Li   createExtensionReader(const ModuleFileExtensionMetadata &Metadata,
66*67e74705SXin Li                         ASTReader &Reader, serialization::ModuleFile &Mod,
67*67e74705SXin Li                         const llvm::BitstreamCursor &Stream) override;
68*67e74705SXin Li };
69*67e74705SXin Li 
70*67e74705SXin Li } // end namespace clang
71*67e74705SXin Li 
72*67e74705SXin Li #endif // LLVM_CLANG_FRONTEND_TESTMODULEFILEEXTENSION_H
73