12 #include "llvm/ADT/Hashing.h"
13 #include "llvm/Bitcode/BitstreamWriter.h"
14 #include "llvm/Support/raw_ostream.h"
16 using namespace clang;
17 using namespace clang::serialization;
19 TestModuleFileExtension::Writer::~Writer() { }
21 void TestModuleFileExtension::Writer::writeExtensionContents(
23 llvm::BitstreamWriter &Stream) {
27 BitCodeAbbrev *Abv =
new llvm::BitCodeAbbrev();
29 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
30 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
31 auto Abbrev = Stream.EmitAbbrev(Abv);
37 raw_svector_ostream OS(Message);
38 OS <<
"Hello from " << Ext->BlockName <<
" v" << Ext->MajorVersion <<
"."
43 Record.push_back(Message.size());
44 Stream.EmitRecordWithBlob(Abbrev, Record, Message);
48 const llvm::BitstreamCursor &InStream)
54 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
56 case llvm::BitstreamEntry::SubBlock:
57 case llvm::BitstreamEntry::EndBlock:
61 case llvm::BitstreamEntry::Record:
67 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
70 StringRef Message = Blob.substr(0, Record[0]);
71 fprintf(stderr,
"Read extension block message: %s\n",
72 Message.str().c_str());
79 TestModuleFileExtension::Reader::~Reader() { }
81 TestModuleFileExtension::~TestModuleFileExtension() { }
84 TestModuleFileExtension::getExtensionMetadata()
const {
85 return { BlockName, MajorVersion, MinorVersion, UserInfo };
88 llvm::hash_code TestModuleFileExtension::hashExtension(
89 llvm::hash_code Code)
const {
91 Code = llvm::hash_combine(Code, BlockName);
92 Code = llvm::hash_combine(Code, MajorVersion);
93 Code = llvm::hash_combine(Code, MinorVersion);
94 Code = llvm::hash_combine(Code, UserInfo);
100 std::unique_ptr<ModuleFileExtensionWriter>
101 TestModuleFileExtension::createExtensionWriter(
ASTWriter &) {
102 return std::unique_ptr<ModuleFileExtensionWriter>(
new Writer(
this));
105 std::unique_ptr<ModuleFileExtensionReader>
106 TestModuleFileExtension::createExtensionReader(
109 const llvm::BitstreamCursor &Stream)
111 assert(Metadata.
BlockName == BlockName &&
"Wrong block name");
113 std::make_pair(MajorVersion, MinorVersion)) {
115 diag::err_test_module_file_extension_version)
117 << MajorVersion << MinorVersion;
121 return std::unique_ptr<ModuleFileExtensionReader>(
122 new TestModuleFileExtension::Reader(
this, Stream));
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
SourceLocation ImportLoc
The source location where this module was first imported.
A module file extension used for testing purposes.
DiagnosticsEngine & getDiags() const
The first record ID allocated to the extensions themselves.
Sema - This implements semantic analysis and AST building for C.
Abstract base class that reads a module file extension block from a module file.
Information about a module that has been loaded by the ASTReader.
Reads an AST files chain containing the contents of a translation unit.
Writes an AST file containing the contents of a translation unit.
An abstract superclass that describes a custom extension to the module/precompiled header file format...