annotate clang/lib/Frontend/TestModuleFileExtension.cpp @ 180:680fa57a2f20

fix compile errors.
author Shinji KONO <kono@ie.u-ryukyu.ac.jp>
date Sat, 30 May 2020 17:44:06 +0900
parents 1d019706d866
children 2e18cbf3894f
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
150
anatofuz
parents:
diff changeset
1 //===-- TestModuleFileExtension.cpp - Module Extension Tester -------------===//
anatofuz
parents:
diff changeset
2 //
anatofuz
parents:
diff changeset
3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
anatofuz
parents:
diff changeset
4 // See https://llvm.org/LICENSE.txt for license information.
anatofuz
parents:
diff changeset
5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
anatofuz
parents:
diff changeset
6 //
anatofuz
parents:
diff changeset
7 //===----------------------------------------------------------------------===//
anatofuz
parents:
diff changeset
8 #include "TestModuleFileExtension.h"
anatofuz
parents:
diff changeset
9 #include "clang/Frontend/FrontendDiagnostic.h"
anatofuz
parents:
diff changeset
10 #include "clang/Serialization/ASTReader.h"
anatofuz
parents:
diff changeset
11 #include "llvm/ADT/Hashing.h"
anatofuz
parents:
diff changeset
12 #include "llvm/Bitstream/BitstreamWriter.h"
anatofuz
parents:
diff changeset
13 #include "llvm/Support/raw_ostream.h"
anatofuz
parents:
diff changeset
14 #include <cstdio>
anatofuz
parents:
diff changeset
15 using namespace clang;
anatofuz
parents:
diff changeset
16 using namespace clang::serialization;
anatofuz
parents:
diff changeset
17
anatofuz
parents:
diff changeset
18 TestModuleFileExtension::Writer::~Writer() { }
anatofuz
parents:
diff changeset
19
anatofuz
parents:
diff changeset
20 void TestModuleFileExtension::Writer::writeExtensionContents(
anatofuz
parents:
diff changeset
21 Sema &SemaRef,
anatofuz
parents:
diff changeset
22 llvm::BitstreamWriter &Stream) {
anatofuz
parents:
diff changeset
23 using namespace llvm;
anatofuz
parents:
diff changeset
24
anatofuz
parents:
diff changeset
25 // Write an abbreviation for this record.
anatofuz
parents:
diff changeset
26 auto Abv = std::make_shared<llvm::BitCodeAbbrev>();
anatofuz
parents:
diff changeset
27 Abv->Add(BitCodeAbbrevOp(FIRST_EXTENSION_RECORD_ID));
anatofuz
parents:
diff changeset
28 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // # of characters
anatofuz
parents:
diff changeset
29 Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // message
anatofuz
parents:
diff changeset
30 auto Abbrev = Stream.EmitAbbrev(std::move(Abv));
anatofuz
parents:
diff changeset
31
anatofuz
parents:
diff changeset
32 // Write a message into the extension block.
anatofuz
parents:
diff changeset
33 SmallString<64> Message;
anatofuz
parents:
diff changeset
34 {
anatofuz
parents:
diff changeset
35 auto Ext = static_cast<TestModuleFileExtension *>(getExtension());
anatofuz
parents:
diff changeset
36 raw_svector_ostream OS(Message);
anatofuz
parents:
diff changeset
37 OS << "Hello from " << Ext->BlockName << " v" << Ext->MajorVersion << "."
anatofuz
parents:
diff changeset
38 << Ext->MinorVersion;
anatofuz
parents:
diff changeset
39 }
anatofuz
parents:
diff changeset
40 uint64_t Record[] = {FIRST_EXTENSION_RECORD_ID, Message.size()};
anatofuz
parents:
diff changeset
41 Stream.EmitRecordWithBlob(Abbrev, Record, Message);
anatofuz
parents:
diff changeset
42 }
anatofuz
parents:
diff changeset
43
anatofuz
parents:
diff changeset
44 TestModuleFileExtension::Reader::Reader(ModuleFileExtension *Ext,
anatofuz
parents:
diff changeset
45 const llvm::BitstreamCursor &InStream)
anatofuz
parents:
diff changeset
46 : ModuleFileExtensionReader(Ext), Stream(InStream)
anatofuz
parents:
diff changeset
47 {
anatofuz
parents:
diff changeset
48 // Read the extension block.
anatofuz
parents:
diff changeset
49 SmallVector<uint64_t, 4> Record;
anatofuz
parents:
diff changeset
50 while (true) {
anatofuz
parents:
diff changeset
51 llvm::Expected<llvm::BitstreamEntry> MaybeEntry =
anatofuz
parents:
diff changeset
52 Stream.advanceSkippingSubblocks();
anatofuz
parents:
diff changeset
53 if (!MaybeEntry)
anatofuz
parents:
diff changeset
54 (void)MaybeEntry.takeError();
anatofuz
parents:
diff changeset
55 llvm::BitstreamEntry Entry = MaybeEntry.get();
anatofuz
parents:
diff changeset
56
anatofuz
parents:
diff changeset
57 switch (Entry.Kind) {
anatofuz
parents:
diff changeset
58 case llvm::BitstreamEntry::SubBlock:
anatofuz
parents:
diff changeset
59 case llvm::BitstreamEntry::EndBlock:
anatofuz
parents:
diff changeset
60 case llvm::BitstreamEntry::Error:
anatofuz
parents:
diff changeset
61 return;
anatofuz
parents:
diff changeset
62
anatofuz
parents:
diff changeset
63 case llvm::BitstreamEntry::Record:
anatofuz
parents:
diff changeset
64 break;
anatofuz
parents:
diff changeset
65 }
anatofuz
parents:
diff changeset
66
anatofuz
parents:
diff changeset
67 Record.clear();
anatofuz
parents:
diff changeset
68 StringRef Blob;
anatofuz
parents:
diff changeset
69 Expected<unsigned> MaybeRecCode =
anatofuz
parents:
diff changeset
70 Stream.readRecord(Entry.ID, Record, &Blob);
anatofuz
parents:
diff changeset
71 if (!MaybeRecCode)
anatofuz
parents:
diff changeset
72 fprintf(stderr, "Failed reading rec code: %s\n",
anatofuz
parents:
diff changeset
73 toString(MaybeRecCode.takeError()).c_str());
anatofuz
parents:
diff changeset
74 switch (MaybeRecCode.get()) {
anatofuz
parents:
diff changeset
75 case FIRST_EXTENSION_RECORD_ID: {
anatofuz
parents:
diff changeset
76 StringRef Message = Blob.substr(0, Record[0]);
anatofuz
parents:
diff changeset
77 fprintf(stderr, "Read extension block message: %s\n",
anatofuz
parents:
diff changeset
78 Message.str().c_str());
anatofuz
parents:
diff changeset
79 break;
anatofuz
parents:
diff changeset
80 }
anatofuz
parents:
diff changeset
81 }
anatofuz
parents:
diff changeset
82 }
anatofuz
parents:
diff changeset
83 }
anatofuz
parents:
diff changeset
84
anatofuz
parents:
diff changeset
85 TestModuleFileExtension::Reader::~Reader() { }
anatofuz
parents:
diff changeset
86
anatofuz
parents:
diff changeset
87 TestModuleFileExtension::~TestModuleFileExtension() { }
anatofuz
parents:
diff changeset
88
anatofuz
parents:
diff changeset
89 ModuleFileExtensionMetadata
anatofuz
parents:
diff changeset
90 TestModuleFileExtension::getExtensionMetadata() const {
anatofuz
parents:
diff changeset
91 return { BlockName, MajorVersion, MinorVersion, UserInfo };
anatofuz
parents:
diff changeset
92 }
anatofuz
parents:
diff changeset
93
anatofuz
parents:
diff changeset
94 llvm::hash_code TestModuleFileExtension::hashExtension(
anatofuz
parents:
diff changeset
95 llvm::hash_code Code) const {
anatofuz
parents:
diff changeset
96 if (Hashed) {
anatofuz
parents:
diff changeset
97 Code = llvm::hash_combine(Code, BlockName);
anatofuz
parents:
diff changeset
98 Code = llvm::hash_combine(Code, MajorVersion);
anatofuz
parents:
diff changeset
99 Code = llvm::hash_combine(Code, MinorVersion);
anatofuz
parents:
diff changeset
100 Code = llvm::hash_combine(Code, UserInfo);
anatofuz
parents:
diff changeset
101 }
anatofuz
parents:
diff changeset
102
anatofuz
parents:
diff changeset
103 return Code;
anatofuz
parents:
diff changeset
104 }
anatofuz
parents:
diff changeset
105
anatofuz
parents:
diff changeset
106 std::unique_ptr<ModuleFileExtensionWriter>
anatofuz
parents:
diff changeset
107 TestModuleFileExtension::createExtensionWriter(ASTWriter &) {
anatofuz
parents:
diff changeset
108 return std::unique_ptr<ModuleFileExtensionWriter>(new Writer(this));
anatofuz
parents:
diff changeset
109 }
anatofuz
parents:
diff changeset
110
anatofuz
parents:
diff changeset
111 std::unique_ptr<ModuleFileExtensionReader>
anatofuz
parents:
diff changeset
112 TestModuleFileExtension::createExtensionReader(
anatofuz
parents:
diff changeset
113 const ModuleFileExtensionMetadata &Metadata,
anatofuz
parents:
diff changeset
114 ASTReader &Reader, serialization::ModuleFile &Mod,
anatofuz
parents:
diff changeset
115 const llvm::BitstreamCursor &Stream)
anatofuz
parents:
diff changeset
116 {
anatofuz
parents:
diff changeset
117 assert(Metadata.BlockName == BlockName && "Wrong block name");
anatofuz
parents:
diff changeset
118 if (std::make_pair(Metadata.MajorVersion, Metadata.MinorVersion) !=
anatofuz
parents:
diff changeset
119 std::make_pair(MajorVersion, MinorVersion)) {
anatofuz
parents:
diff changeset
120 Reader.getDiags().Report(Mod.ImportLoc,
anatofuz
parents:
diff changeset
121 diag::err_test_module_file_extension_version)
anatofuz
parents:
diff changeset
122 << BlockName << Metadata.MajorVersion << Metadata.MinorVersion
anatofuz
parents:
diff changeset
123 << MajorVersion << MinorVersion;
anatofuz
parents:
diff changeset
124 return nullptr;
anatofuz
parents:
diff changeset
125 }
anatofuz
parents:
diff changeset
126
anatofuz
parents:
diff changeset
127 return std::unique_ptr<ModuleFileExtensionReader>(
anatofuz
parents:
diff changeset
128 new TestModuleFileExtension::Reader(this, Stream));
anatofuz
parents:
diff changeset
129 }