clang: lib/Frontend/TestModuleFileExtension.cpp Source File (original) (raw)
1
2
3
4
5
6
7
11#include "llvm/ADT/Hashing.h"
12#include "llvm/Bitstream/BitstreamWriter.h"
13#include "llvm/Support/raw_ostream.h"
14#include
15using namespace clang;
17
19
20TestModuleFileExtension::Writer::~Writer() { }
21
22void TestModuleFileExtension::Writer::writeExtensionContents(
23 Sema &SemaRef,
24 llvm::BitstreamWriter &Stream) {
25 using namespace llvm;
26
27
28 auto Abv = std::make_sharedllvm::BitCodeAbbrev();
30 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6));
31 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob));
32 auto Abbrev = Stream.EmitAbbrev(std::move(Abv));
33
34
36 {
38 raw_svector_ostream OS(Message);
39 OS << "Hello from " << Ext->BlockName << " v" << Ext->MajorVersion << "."
40 << Ext->MinorVersion;
41 }
43 Stream.EmitRecordWithBlob(Abbrev, Record, Message);
44}
45
47 const llvm::BitstreamCursor &InStream)
49{
50
52 while (true) {
54 Stream.advanceSkippingSubblocks();
55 if (!MaybeEntry)
56 (void)MaybeEntry.takeError();
57 llvm::BitstreamEntry Entry = MaybeEntry.get();
58
59 switch (Entry.Kind) {
60 case llvm::BitstreamEntry::SubBlock:
61 case llvm::BitstreamEntry::EndBlock:
62 case llvm::BitstreamEntry::Error:
63 return;
64
65 case llvm::BitstreamEntry::Record:
66 break;
67 }
68
70 StringRef Blob;
72 Stream.readRecord(Entry.ID, Record, &Blob);
73 if (!MaybeRecCode)
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",
80 Message.str().c_str());
81 break;
82 }
83 }
84 }
85}
86
87TestModuleFileExtension::Reader::~Reader() { }
88
90
93 return { BlockName, MajorVersion, MinorVersion, UserInfo };
94}
95
97 ExtensionHashBuilder &HBuilder) const {
98 if (Hashed) {
99 HBuilder.add(BlockName);
100 HBuilder.add(MajorVersion);
101 HBuilder.add(MinorVersion);
102 HBuilder.add(UserInfo);
103 }
104}
105
106std::unique_ptr
108 return std::unique_ptr(new Writer(this));
109}
110
111std::unique_ptr
115 const llvm::BitstreamCursor &Stream)
116{
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;
124 return nullptr;
125 }
126
127 return std::unique_ptr(
128 new TestModuleFileExtension::Reader(this, Stream));
129}
130
132 std::string Buffer;
133 llvm::raw_string_ostream OS(Buffer);
134 OS << BlockName << ":" << MajorVersion << ":" << MinorVersion << ":" << Hashed
135 << ":" << UserInfo;
136 return Buffer;
137}
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.