11 #include "llvm/ADT/Hashing.h"
12 #include "llvm/Bitstream/BitstreamWriter.h"
13 #include "llvm/Support/raw_ostream.h"
15 using namespace clang;
20 TestModuleFileExtension::Writer::~Writer() { }
22 void TestModuleFileExtension::Writer::writeExtensionContents(
24 llvm::BitstreamWriter &Stream) {
28 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
30 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
31 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
32 auto Abbrev = Stream.EmitAbbrev(std::move(Abv));
38 raw_svector_ostream
OS(Message);
39 OS <<
"Hello from " << Ext->BlockName <<
" v" << Ext->MajorVersion <<
"."
43 Stream.EmitRecordWithBlob(Abbrev, Record, Message);
47 const llvm::BitstreamCursor &InStream)
54 Stream.advanceSkippingSubblocks();
56 (void)MaybeEntry.takeError();
57 llvm::BitstreamEntry Entry = MaybeEntry.get();
60 case llvm::BitstreamEntry::SubBlock:
61 case llvm::BitstreamEntry::EndBlock:
65 case llvm::BitstreamEntry::Record:
72 Stream.readRecord(Entry.ID, Record, &Blob);
74 fprintf(stderr,
"Failed reading rec code: %s\n",
75 toString(MaybeRecCode.takeError()).c_str());
76 switch (MaybeRecCode.get()) {
78 StringRef
Message = Blob.substr(0, Record[0]);
79 fprintf(stderr,
"Read extension block message: %s\n",
87 TestModuleFileExtension::Reader::~Reader() { }
93 return { BlockName, MajorVersion, MinorVersion, UserInfo };
97 ExtensionHashBuilder &HBuilder)
const {
99 HBuilder.add(BlockName);
100 HBuilder.add(MajorVersion);
101 HBuilder.add(MinorVersion);
102 HBuilder.add(UserInfo);
106 std::unique_ptr<ModuleFileExtensionWriter>
108 return std::unique_ptr<ModuleFileExtensionWriter>(
new Writer(
this));
111 std::unique_ptr<ModuleFileExtensionReader>
115 const llvm::BitstreamCursor &Stream)
117 assert(Metadata.
BlockName == BlockName &&
"Wrong block name");
119 std::make_pair(MajorVersion, MinorVersion)) {
121 diag::err_test_module_file_extension_version)
123 << MajorVersion << MinorVersion;
127 return std::unique_ptr<ModuleFileExtensionReader>(
128 new TestModuleFileExtension::Reader(
this, Stream));
133 llvm::raw_string_ostream OS(Buffer);
134 OS << BlockName <<
":" << MajorVersion <<
":" << MinorVersion <<
":" << Hashed