11#include "llvm/Bitstream/BitstreamWriter.h"
12#include "llvm/Support/raw_ostream.h"
19TestModuleFileExtension::Writer::~Writer() { }
21void 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)
53 Stream.advanceSkippingSubblocks();
55 (void)MaybeEntry.takeError();
56 llvm::BitstreamEntry Entry = MaybeEntry.get();
59 case llvm::BitstreamEntry::SubBlock:
60 case llvm::BitstreamEntry::EndBlock:
61 case llvm::BitstreamEntry::Error:
64 case llvm::BitstreamEntry::Record:
71 Stream.readRecord(Entry.ID,
Record, &Blob);
73 fprintf(stderr,
"Failed reading rec code: %s\n",
74 toString(MaybeRecCode.takeError()).c_str());
75 switch (MaybeRecCode.get()) {
77 StringRef Message = Blob.substr(0,
Record[0]);
78 fprintf(stderr,
"Read extension block message: %s\n",
79 Message.str().c_str());
86TestModuleFileExtension::Reader::~Reader() { }
92 return { BlockName, MajorVersion, MinorVersion, UserInfo };
96 ExtensionHashBuilder &HBuilder)
const {
98 HBuilder.add(BlockName);
99 HBuilder.add(MajorVersion);
100 HBuilder.add(MinorVersion);
101 HBuilder.add(UserInfo);
105std::unique_ptr<ModuleFileExtensionWriter>
107 return std::unique_ptr<ModuleFileExtensionWriter>(
new Writer(
this));
110std::unique_ptr<ModuleFileExtensionReader>
114 const llvm::BitstreamCursor &Stream)
116 assert(Metadata.
BlockName == BlockName &&
"Wrong block name");
118 std::make_pair(MajorVersion, MinorVersion)) {
120 diag::err_test_module_file_extension_version)
122 << MajorVersion << MinorVersion;
126 return std::unique_ptr<ModuleFileExtensionReader>(
127 new TestModuleFileExtension::Reader(
this, Stream));
132 llvm::raw_string_ostream OS(Buffer);
133 OS << BlockName <<
":" << MajorVersion <<
":" << MinorVersion <<
":" << Hashed
llvm::MachO::Record Record
static std::string toString(const clang::SanitizerSet &Sanitizers)
Produce a string containing comma-separated names of sanitizers in Sanitizers set.
Reads an AST files chain containing the contents of a translation unit.
DiagnosticsEngine & getDiags() const
Writes an AST file containing the contents of a translation unit.
DiagnosticBuilder Report(SourceLocation Loc, unsigned DiagID)
Issue the message to the client.
Abstract base class that reads a module file extension block from a module file.
An abstract superclass that describes a custom extension to the module/precompiled header file format...
Sema - This implements semantic analysis and AST building for C.
A module file extension used for testing purposes.
ModuleFileExtensionMetadata getExtensionMetadata() const override
~TestModuleFileExtension() override
std::unique_ptr< ModuleFileExtensionWriter > createExtensionWriter(ASTWriter &Writer) override
void hashExtension(ExtensionHashBuilder &HBuilder) const override
std::unique_ptr< ModuleFileExtensionReader > createExtensionReader(const ModuleFileExtensionMetadata &Metadata, ASTReader &Reader, serialization::ModuleFile &Mod, const llvm::BitstreamCursor &Stream) override
Information about a module that has been loaded by the ASTReader.
SourceLocation ImportLoc
The source location where this module was first imported.
@ FIRST_EXTENSION_RECORD_ID
The first record ID allocated to the extensions themselves.
The JSON file list parser is used to communicate input to InstallAPI.
Diagnostic wrappers for TextAPI types for error reporting.