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.