[llvm] r286622 - Bitcode: Prepare to move bitcode readers to free functions.
Peter Collingbourne via llvm-commits
llvm-commits at lists.llvm.org
Fri Nov 11 11:50:10 PST 2016
Author: pcc
Date: Fri Nov 11 13:50:10 2016
New Revision: 286622
URL: http://llvm.org/viewvc/llvm-project?rev=286622&view=rev
Log:
Bitcode: Prepare to move bitcode readers to free functions.
Make initStream() a free function, and change BitcodeReaderBase ctor to take
a BitstreamCursor.
Modified:
llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
Modified: llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp?rev=286622&r1=286621&r2=286622&view=diff
==============================================================================
--- llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp (original)
+++ llvm/trunk/lib/Bitcode/Reader/BitcodeReader.cpp Fri Nov 11 13:50:10 2016
@@ -228,15 +228,54 @@ private:
Metadata *resolveTypeRefArray(Metadata *MaybeTuple);
};
+Error error(const Twine &Message) {
+ return make_error<StringError>(
+ Message, make_error_code(BitcodeError::CorruptedBitcode));
+}
+
+/// Helper to read the header common to all bitcode files.
+bool hasValidBitcodeHeader(BitstreamCursor &Stream) {
+ // Sniff for the signature.
+ if (!Stream.canSkipToPos(4) ||
+ Stream.Read(8) != 'B' ||
+ Stream.Read(8) != 'C' ||
+ Stream.Read(4) != 0x0 ||
+ Stream.Read(4) != 0xC ||
+ Stream.Read(4) != 0xE ||
+ Stream.Read(4) != 0xD)
+ return false;
+ return true;
+}
+
+Expected<BitstreamCursor> initStream(MemoryBufferRef Buffer) {
+ const unsigned char *BufPtr = (const unsigned char *)Buffer.getBufferStart();
+ const unsigned char *BufEnd = BufPtr + Buffer.getBufferSize();
+
+ if (Buffer.getBufferSize() & 3)
+ return error("Invalid bitcode signature");
+
+ // If we have a wrapper header, parse it and ignore the non-bc file contents.
+ // The magic number is 0x0B17C0DE stored in little endian.
+ if (isBitcodeWrapper(BufPtr, BufEnd))
+ if (SkipBitcodeWrapperHeader(BufPtr, BufEnd, true))
+ return error("Invalid bitcode wrapper header");
+
+ BitstreamCursor Stream(ArrayRef<uint8_t>(BufPtr, BufEnd));
+ if (!hasValidBitcodeHeader(Stream))
+ return error("Invalid bitcode signature");
+
+ return std::move(Stream);
+}
+
class BitcodeReaderBase {
protected:
- BitcodeReaderBase(MemoryBufferRef Buffer) : Buffer(Buffer) {}
+ BitcodeReaderBase(BitstreamCursor Stream) : Stream(std::move(Stream)) {
+ this->Stream.setBlockInfo(&BlockInfo);
+ }
- MemoryBufferRef Buffer;
BitstreamBlockInfo BlockInfo;
BitstreamCursor Stream;
- Error initStream();
bool readBlockInfo();
// Contains an arbitrary and optional string identifying the bitcode producer
@@ -250,27 +289,7 @@ Error BitcodeReaderBase::error(const Twi
if (!ProducerIdentification.empty())
FullMsg += " (Producer: '" + ProducerIdentification + "' Reader: 'LLVM " +
LLVM_VERSION_STRING "')";
- return make_error<StringError>(
- FullMsg, make_error_code(BitcodeError::CorruptedBitcode));
-}
-
-Error BitcodeReaderBase::initStream() {
- const unsigned char *BufPtr = (const unsigned char*)Buffer.getBufferStart();
- const unsigned char *BufEnd = BufPtr+Buffer.getBufferSize();
-
- if (Buffer.getBufferSize() & 3)
- return error("Invalid bitcode signature");
-
- // If we have a wrapper header, parse it and ignore the non-bc file contents.
- // The magic number is 0x0B17C0DE stored in little endian.
- if (isBitcodeWrapper(BufPtr, BufEnd))
- if (SkipBitcodeWrapperHeader(BufPtr, BufEnd, true))
- return error("Invalid bitcode wrapper header");
-
- Stream = BitstreamCursor(ArrayRef<uint8_t>(BufPtr, BufEnd));
- Stream.setBlockInfo(&BlockInfo);
-
- return Error::success();
+ return ::error(FullMsg);
}
class BitcodeReader : public BitcodeReaderBase, public GVMaterializer {
@@ -366,7 +385,7 @@ class BitcodeReader : public BitcodeRead
std::vector<std::string> BundleTags;
public:
- BitcodeReader(MemoryBufferRef Buffer, LLVMContext &Context);
+ BitcodeReader(BitstreamCursor Stream, LLVMContext &Context);
Error materializeForwardReferencedFunctions();
@@ -579,21 +598,21 @@ class ModuleSummaryIndexBitcodeReader :
public:
ModuleSummaryIndexBitcodeReader(
- MemoryBufferRef Buffer, bool CheckGlobalValSummaryPresenceOnly = false);
+ BitstreamCursor Stream, bool CheckGlobalValSummaryPresenceOnly = false);
/// Check if the parser has encountered a summary section.
bool foundGlobalValSummary() { return SeenGlobalValSummary; }
/// \brief Main interface to parsing a bitcode buffer.
/// \returns true if an error occurred.
- Error parseSummaryIndexInto(ModuleSummaryIndex *I);
+ Error parseSummaryIndexInto(ModuleSummaryIndex *I, StringRef ModulePath);
private:
- Error parseModule();
+ Error parseModule(StringRef ModulePath);
Error parseValueSymbolTable(
uint64_t Offset,
DenseMap<unsigned, GlobalValue::LinkageTypes> &ValueIdToLinkageMap);
- Error parseEntireSummary();
+ Error parseEntireSummary(StringRef ModulePath);
Error parseModuleStringTable();
std::pair<GlobalValue::GUID, GlobalValue::GUID>
@@ -647,8 +666,8 @@ expectedToErrorOrAndEmitErrors(const Dia
} // end anonymous namespace
-BitcodeReader::BitcodeReader(MemoryBufferRef Buffer, LLVMContext &Context)
- : BitcodeReaderBase(Buffer), Context(Context), ValueList(Context),
+BitcodeReader::BitcodeReader(BitstreamCursor Stream, LLVMContext &Context)
+ : BitcodeReaderBase(std::move(Stream)), Context(Context), ValueList(Context),
MetadataList(Context) {}
Error BitcodeReader::materializeForwardReferencedFunctions() {
@@ -4222,30 +4241,9 @@ Error BitcodeReader::parseModule(uint64_
}
}
-/// Helper to read the header common to all bitcode files.
-static bool hasValidBitcodeHeader(BitstreamCursor &Stream) {
- // Sniff for the signature.
- if (!Stream.canSkipToPos(4) ||
- Stream.Read(8) != 'B' ||
- Stream.Read(8) != 'C' ||
- Stream.Read(4) != 0x0 ||
- Stream.Read(4) != 0xC ||
- Stream.Read(4) != 0xE ||
- Stream.Read(4) != 0xD)
- return false;
- return true;
-}
-
Error BitcodeReader::parseBitcodeInto(Module *M, bool ShouldLazyLoadMetadata) {
TheModule = M;
- if (Error Err = initStream())
- return Err;
-
- // Sniff for the signature.
- if (!hasValidBitcodeHeader(Stream))
- return error("Invalid bitcode signature");
-
// We expect a number of well-defined blocks, though we don't necessarily
// need to understand them all.
while (true) {
@@ -4314,13 +4312,6 @@ Expected<std::string> BitcodeReader::par
}
Expected<std::string> BitcodeReader::parseTriple() {
- if (Error Err = initStream())
- return std::move(Err);
-
- // Sniff for the signature.
- if (!hasValidBitcodeHeader(Stream))
- return error("Invalid bitcode signature");
-
// We expect a number of well-defined blocks, though we don't necessarily
// need to understand them all.
while (true) {
@@ -4349,13 +4340,6 @@ Expected<std::string> BitcodeReader::par
}
Expected<std::string> BitcodeReader::parseIdentificationBlock() {
- if (Error Err = initStream())
- return std::move(Err);
-
- // Sniff for the signature.
- if (!hasValidBitcodeHeader(Stream))
- return error("Invalid bitcode signature");
-
// We expect a number of well-defined blocks, though we don't necessarily
// need to understand them all.
while (true) {
@@ -4405,13 +4389,6 @@ Error BitcodeReader::parseGlobalObjectAt
}
Expected<bool> BitcodeReader::hasObjCCategory() {
- if (Error Err = initStream())
- return std::move(Err);
-
- // Sniff for the signature.
- if (!hasValidBitcodeHeader(Stream))
- return error("Invalid bitcode signature");
-
// We expect a number of well-defined blocks, though we don't necessarily
// need to understand them all.
while (true) {
@@ -5981,8 +5958,8 @@ std::vector<StructType *> BitcodeReader:
}
ModuleSummaryIndexBitcodeReader::ModuleSummaryIndexBitcodeReader(
- MemoryBufferRef Buffer, bool CheckGlobalValSummaryPresenceOnly)
- : BitcodeReaderBase(Buffer),
+ BitstreamCursor Cursor, bool CheckGlobalValSummaryPresenceOnly)
+ : BitcodeReaderBase(std::move(Cursor)),
CheckGlobalValSummaryPresenceOnly(CheckGlobalValSummaryPresenceOnly) {}
std::pair<GlobalValue::GUID, GlobalValue::GUID>
@@ -6094,7 +6071,7 @@ Error ModuleSummaryIndexBitcodeReader::p
// Parse just the blocks needed for building the index out of the module.
// At the end of this routine the module Index is populated with a map
// from global value id to GlobalValueSummary objects.
-Error ModuleSummaryIndexBitcodeReader::parseModule() {
+Error ModuleSummaryIndexBitcodeReader::parseModule(StringRef ModulePath) {
if (Stream.EnterSubBlock(bitc::MODULE_BLOCK_ID))
return error("Invalid record");
@@ -6155,7 +6132,7 @@ Error ModuleSummaryIndexBitcodeReader::p
SeenValueSymbolTable = true;
}
SeenGlobalValSummary = true;
- if (Error Err = parseEntireSummary())
+ if (Error Err = parseEntireSummary(ModulePath))
return Err;
break;
case bitc::MODULE_STRTAB_BLOCK_ID:
@@ -6187,7 +6164,7 @@ Error ModuleSummaryIndexBitcodeReader::p
break;
if (TheIndex->modulePaths().empty())
// We always seed the index with the module.
- TheIndex->addModulePath(Buffer.getBufferIdentifier(), 0);
+ TheIndex->addModulePath(ModulePath, 0);
if (TheIndex->modulePaths().size() != 1)
return error("Don't expect multiple modules defined?");
auto &Hash = TheIndex->modulePaths().begin()->second.second;
@@ -6246,7 +6223,8 @@ Error ModuleSummaryIndexBitcodeReader::p
// Eagerly parse the entire summary block. This populates the GlobalValueSummary
// objects in the index.
-Error ModuleSummaryIndexBitcodeReader::parseEntireSummary() {
+Error ModuleSummaryIndexBitcodeReader::parseEntireSummary(
+ StringRef ModulePath) {
if (Stream.EnterSubBlock(bitc::GLOBALVAL_SUMMARY_BLOCK_ID))
return error("Invalid record");
SmallVector<uint64_t, 64> Record;
@@ -6326,8 +6304,7 @@ Error ModuleSummaryIndexBitcodeReader::p
// string table section in the per-module index, we create a single
// module path string table entry with an empty (0) ID to take
// ownership.
- FS->setModulePath(
- TheIndex->addModulePath(Buffer.getBufferIdentifier(), 0)->first());
+ FS->setModulePath(TheIndex->addModulePath(ModulePath, 0)->first());
static int RefListStartIndex = 4;
int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs;
assert(Record.size() >= RefListStartIndex + NumRefs &&
@@ -6365,8 +6342,7 @@ Error ModuleSummaryIndexBitcodeReader::p
// string table section in the per-module index, we create a single
// module path string table entry with an empty (0) ID to take
// ownership.
- AS->setModulePath(
- TheIndex->addModulePath(Buffer.getBufferIdentifier(), 0)->first());
+ AS->setModulePath(TheIndex->addModulePath(ModulePath, 0)->first());
GlobalValue::GUID AliaseeGUID = getGUIDFromValueId(AliaseeID).first;
auto *AliaseeSummary = TheIndex->getGlobalValueSummary(AliaseeGUID);
@@ -6386,8 +6362,7 @@ Error ModuleSummaryIndexBitcodeReader::p
auto Flags = getDecodedGVSummaryFlags(RawFlags, Version);
std::unique_ptr<GlobalVarSummary> FS =
llvm::make_unique<GlobalVarSummary>(Flags);
- FS->setModulePath(
- TheIndex->addModulePath(Buffer.getBufferIdentifier(), 0)->first());
+ FS->setModulePath(TheIndex->addModulePath(ModulePath, 0)->first());
for (unsigned I = 2, E = Record.size(); I != E; ++I) {
unsigned RefValueId = Record[I];
GlobalValue::GUID RefGUID = getGUIDFromValueId(RefValueId).first;
@@ -6577,17 +6552,10 @@ Error ModuleSummaryIndexBitcodeReader::p
}
// Parse the function info index from the bitcode streamer into the given index.
-Error
-ModuleSummaryIndexBitcodeReader::parseSummaryIndexInto(ModuleSummaryIndex *I) {
+Error ModuleSummaryIndexBitcodeReader::parseSummaryIndexInto(
+ ModuleSummaryIndex *I, StringRef ModulePath) {
TheIndex = I;
- if (Error Err = initStream())
- return Err;
-
- // Sniff for the signature.
- if (!hasValidBitcodeHeader(Stream))
- return error("Invalid bitcode signature");
-
// We expect a number of well-defined blocks, though we don't necessarily
// need to understand them all.
while (true) {
@@ -6605,7 +6573,7 @@ ModuleSummaryIndexBitcodeReader::parseSu
// If we see a MODULE_BLOCK, parse it to find the blocks needed for
// building the function summary index.
if (Entry.ID == bitc::MODULE_BLOCK_ID)
- return parseModule();
+ return parseModule(ModulePath);
if (Stream.SkipBlock())
return error("Invalid record");
@@ -6655,7 +6623,11 @@ static ErrorOr<std::unique_ptr<Module>>
getLazyBitcodeModuleImpl(MemoryBufferRef Buffer, LLVMContext &Context,
bool MaterializeAll,
bool ShouldLazyLoadMetadata = false) {
- BitcodeReader *R = new BitcodeReader(Buffer, Context);
+ Expected<BitstreamCursor> StreamOrErr = initStream(Buffer);
+ if (!StreamOrErr)
+ return errorToErrorCodeAndEmitErrors(Context, StreamOrErr.takeError());
+
+ BitcodeReader *R = new BitcodeReader(std::move(*StreamOrErr), Context);
std::unique_ptr<Module> M =
llvm::make_unique<Module>(Buffer.getBufferIdentifier(), Context);
@@ -6703,7 +6675,12 @@ ErrorOr<std::unique_ptr<Module>> llvm::p
std::string llvm::getBitcodeTargetTriple(MemoryBufferRef Buffer,
LLVMContext &Context) {
- BitcodeReader R(Buffer, Context);
+ ErrorOr<BitstreamCursor> StreamOrErr =
+ expectedToErrorOrAndEmitErrors(Context, initStream(Buffer));
+ if (!StreamOrErr)
+ return "";
+
+ BitcodeReader R(std::move(*StreamOrErr), Context);
ErrorOr<std::string> Triple =
expectedToErrorOrAndEmitErrors(Context, R.parseTriple());
if (Triple.getError())
@@ -6713,7 +6690,12 @@ std::string llvm::getBitcodeTargetTriple
bool llvm::isBitcodeContainingObjCCategory(MemoryBufferRef Buffer,
LLVMContext &Context) {
- BitcodeReader R(Buffer, Context);
+ ErrorOr<BitstreamCursor> StreamOrErr =
+ expectedToErrorOrAndEmitErrors(Context, initStream(Buffer));
+ if (!StreamOrErr)
+ return false;
+
+ BitcodeReader R(std::move(*StreamOrErr), Context);
ErrorOr<bool> hasObjCCategory =
expectedToErrorOrAndEmitErrors(Context, R.hasObjCCategory());
if (hasObjCCategory.getError())
@@ -6723,7 +6705,12 @@ bool llvm::isBitcodeContainingObjCCatego
std::string llvm::getBitcodeProducerString(MemoryBufferRef Buffer,
LLVMContext &Context) {
- BitcodeReader R(Buffer, Context);
+ ErrorOr<BitstreamCursor> StreamOrErr =
+ expectedToErrorOrAndEmitErrors(Context, initStream(Buffer));
+ if (!StreamOrErr)
+ return "";
+
+ BitcodeReader R(std::move(*StreamOrErr), Context);
ErrorOr<std::string> ProducerString =
expectedToErrorOrAndEmitErrors(Context, R.parseIdentificationBlock());
if (ProducerString.getError())
@@ -6735,12 +6722,18 @@ std::string llvm::getBitcodeProducerStri
ErrorOr<std::unique_ptr<ModuleSummaryIndex>> llvm::getModuleSummaryIndex(
MemoryBufferRef Buffer,
const DiagnosticHandlerFunction &DiagnosticHandler) {
- ModuleSummaryIndexBitcodeReader R(Buffer);
+ Expected<BitstreamCursor> StreamOrErr = initStream(Buffer);
+ if (!StreamOrErr)
+ return errorToErrorCodeAndEmitErrors(DiagnosticHandler,
+ StreamOrErr.takeError());
+
+ ModuleSummaryIndexBitcodeReader R(std::move(*StreamOrErr));
auto Index = llvm::make_unique<ModuleSummaryIndex>();
if (std::error_code EC = errorToErrorCodeAndEmitErrors(
- DiagnosticHandler, R.parseSummaryIndexInto(Index.get())))
+ DiagnosticHandler,
+ R.parseSummaryIndexInto(Index.get(), Buffer.getBufferIdentifier())))
return EC;
return std::move(Index);
@@ -6750,10 +6743,15 @@ ErrorOr<std::unique_ptr<ModuleSummaryInd
bool llvm::hasGlobalValueSummary(
MemoryBufferRef Buffer,
const DiagnosticHandlerFunction &DiagnosticHandler) {
- ModuleSummaryIndexBitcodeReader R(Buffer, true);
+ ErrorOr<BitstreamCursor> StreamOrErr = expectedToErrorOrAndEmitErrors(
+ DiagnosticHandler, initStream(Buffer));
+ if (!StreamOrErr)
+ return false;
- if (errorToErrorCodeAndEmitErrors(DiagnosticHandler,
- R.parseSummaryIndexInto(nullptr)))
+ ModuleSummaryIndexBitcodeReader R(std::move(*StreamOrErr), true);
+ if (errorToErrorCodeAndEmitErrors(
+ DiagnosticHandler,
+ R.parseSummaryIndexInto(nullptr, Buffer.getBufferIdentifier())))
return false;
return R.foundGlobalValSummary();
More information about the llvm-commits
mailing list