12 #include "llvm/ADT/Hashing.h" 13 #include "llvm/Bitcode/BitstreamWriter.h" 14 #include "llvm/Support/raw_ostream.h" 16 using namespace clang;
19 TestModuleFileExtension::Writer::~Writer() { }
21 void TestModuleFileExtension::Writer::writeExtensionContents(
23 llvm::BitstreamWriter &Stream) {
27 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
29 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
30 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
31 auto Abbrev = Stream.EmitAbbrev(std::move(Abv));
37 raw_svector_ostream OS(Message);
38 OS <<
"Hello from " << Ext->BlockName <<
" v" << Ext->MajorVersion <<
"." 42 Stream.EmitRecordWithBlob(Abbrev, Record, Message);
46 const llvm::BitstreamCursor &InStream)
52 llvm::BitstreamEntry Entry = Stream.advanceSkippingSubblocks();
54 case llvm::BitstreamEntry::SubBlock:
55 case llvm::BitstreamEntry::EndBlock:
59 case llvm::BitstreamEntry::Record:
65 unsigned RecCode = Stream.readRecord(Entry.ID, Record, &Blob);
68 StringRef Message = Blob.substr(0, Record[0]);
69 fprintf(stderr,
"Read extension block message: %s\n",
70 Message.str().c_str());
77 TestModuleFileExtension::Reader::~Reader() { }
83 return { BlockName, MajorVersion, MinorVersion, UserInfo };
87 llvm::hash_code Code)
const {
98 std::unique_ptr<ModuleFileExtensionWriter>
100 return std::unique_ptr<ModuleFileExtensionWriter>(
new Writer(
this));
103 std::unique_ptr<ModuleFileExtensionReader>
107 const llvm::BitstreamCursor &Stream)
109 assert(Metadata.
BlockName == BlockName &&
"Wrong block name");
111 std::make_pair(MajorVersion, MinorVersion)) {
113 diag::err_test_module_file_extension_version)
115 << MajorVersion << MinorVersion;
119 return std::unique_ptr<ModuleFileExtensionReader>(
120 new TestModuleFileExtension::Reader(
this, Stream));
DominatorTree GraphTraits specialization so the DominatorTree can be iterable by generic graph iterat...
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
std::unique_ptr< ModuleFileExtensionWriter > createExtensionWriter(ASTWriter &Writer) override
Create a new module file extension writer, which will be responsible for writing the extension conten...
SourceLocation ImportLoc
The source location where this module was first imported.
A module file extension used for testing purposes.
The first record ID allocated to the extensions themselves.
Sema - This implements semantic analysis and AST building for C.
~TestModuleFileExtension() override
Abstract base class that reads a module file extension block from a module file.
std::unique_ptr< ModuleFileExtensionReader > createExtensionReader(const ModuleFileExtensionMetadata &Metadata, ASTReader &Reader, serialization::ModuleFile &Mod, const llvm::BitstreamCursor &Stream) override
Create a new module file extension reader, given the metadata read from the block and the cursor into...
llvm::hash_code hashExtension(llvm::hash_code Code) const override
Hash information about the presence of this extension into the module hash code.
ModuleFileExtensionMetadata getExtensionMetadata() const override
Retrieves the metadata for this module file extension.
Information about a module that has been loaded by the ASTReader.
DiagnosticsEngine & getDiags() const
Dataflow Directional Tag Classes.
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...