Path: blob/main/contrib/llvm-project/clang/lib/Frontend/TestModuleFileExtension.cpp
35232 views
//===-- TestModuleFileExtension.cpp - Module Extension Tester -------------===//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7#include "TestModuleFileExtension.h"8#include "clang/Frontend/FrontendDiagnostic.h"9#include "clang/Serialization/ASTReader.h"10#include "llvm/ADT/Hashing.h"11#include "llvm/Bitstream/BitstreamWriter.h"12#include "llvm/Support/raw_ostream.h"13#include <cstdio>14using namespace clang;15using namespace clang::serialization;1617char TestModuleFileExtension::ID = 0;1819TestModuleFileExtension::Writer::~Writer() { }2021void TestModuleFileExtension::Writer::writeExtensionContents(22Sema &SemaRef,23llvm::BitstreamWriter &Stream) {24using namespace llvm;2526// Write an abbreviation for this record.27auto Abv = std::make_shared<llvm::BitCodeAbbrev>();28Abv->Add(BitCodeAbbrevOp(FIRST_EXTENSION_RECORD_ID));29Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::VBR, 6)); // # of characters30Abv->Add(BitCodeAbbrevOp(BitCodeAbbrevOp::Blob)); // message31auto Abbrev = Stream.EmitAbbrev(std::move(Abv));3233// Write a message into the extension block.34SmallString<64> Message;35{36auto Ext = static_cast<TestModuleFileExtension *>(getExtension());37raw_svector_ostream OS(Message);38OS << "Hello from " << Ext->BlockName << " v" << Ext->MajorVersion << "."39<< Ext->MinorVersion;40}41uint64_t Record[] = {FIRST_EXTENSION_RECORD_ID, Message.size()};42Stream.EmitRecordWithBlob(Abbrev, Record, Message);43}4445TestModuleFileExtension::Reader::Reader(ModuleFileExtension *Ext,46const llvm::BitstreamCursor &InStream)47: ModuleFileExtensionReader(Ext), Stream(InStream)48{49// Read the extension block.50SmallVector<uint64_t, 4> Record;51while (true) {52llvm::Expected<llvm::BitstreamEntry> MaybeEntry =53Stream.advanceSkippingSubblocks();54if (!MaybeEntry)55(void)MaybeEntry.takeError();56llvm::BitstreamEntry Entry = MaybeEntry.get();5758switch (Entry.Kind) {59case llvm::BitstreamEntry::SubBlock:60case llvm::BitstreamEntry::EndBlock:61case llvm::BitstreamEntry::Error:62return;6364case llvm::BitstreamEntry::Record:65break;66}6768Record.clear();69StringRef Blob;70Expected<unsigned> MaybeRecCode =71Stream.readRecord(Entry.ID, Record, &Blob);72if (!MaybeRecCode)73fprintf(stderr, "Failed reading rec code: %s\n",74toString(MaybeRecCode.takeError()).c_str());75switch (MaybeRecCode.get()) {76case FIRST_EXTENSION_RECORD_ID: {77StringRef Message = Blob.substr(0, Record[0]);78fprintf(stderr, "Read extension block message: %s\n",79Message.str().c_str());80break;81}82}83}84}8586TestModuleFileExtension::Reader::~Reader() { }8788TestModuleFileExtension::~TestModuleFileExtension() { }8990ModuleFileExtensionMetadata91TestModuleFileExtension::getExtensionMetadata() const {92return { BlockName, MajorVersion, MinorVersion, UserInfo };93}9495void TestModuleFileExtension::hashExtension(96ExtensionHashBuilder &HBuilder) const {97if (Hashed) {98HBuilder.add(BlockName);99HBuilder.add(MajorVersion);100HBuilder.add(MinorVersion);101HBuilder.add(UserInfo);102}103}104105std::unique_ptr<ModuleFileExtensionWriter>106TestModuleFileExtension::createExtensionWriter(ASTWriter &) {107return std::unique_ptr<ModuleFileExtensionWriter>(new Writer(this));108}109110std::unique_ptr<ModuleFileExtensionReader>111TestModuleFileExtension::createExtensionReader(112const ModuleFileExtensionMetadata &Metadata,113ASTReader &Reader, serialization::ModuleFile &Mod,114const llvm::BitstreamCursor &Stream)115{116assert(Metadata.BlockName == BlockName && "Wrong block name");117if (std::make_pair(Metadata.MajorVersion, Metadata.MinorVersion) !=118std::make_pair(MajorVersion, MinorVersion)) {119Reader.getDiags().Report(Mod.ImportLoc,120diag::err_test_module_file_extension_version)121<< BlockName << Metadata.MajorVersion << Metadata.MinorVersion122<< MajorVersion << MinorVersion;123return nullptr;124}125126return std::unique_ptr<ModuleFileExtensionReader>(127new TestModuleFileExtension::Reader(this, Stream));128}129130std::string TestModuleFileExtension::str() const {131std::string Buffer;132llvm::raw_string_ostream OS(Buffer);133OS << BlockName << ":" << MajorVersion << ":" << MinorVersion << ":" << Hashed134<< ":" << UserInfo;135return Buffer;136}137138139