summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/lib/Bitcode/Reader/BitcodeReader.cpp')
-rw-r--r--llvm/lib/Bitcode/Reader/BitcodeReader.cpp51
1 files changed, 51 insertions, 0 deletions
diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
index 321c775531e..e5fb51b1bed 100644
--- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
+++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp
@@ -5848,6 +5848,35 @@ std::error_code ModuleSummaryIndexBitcodeReader::parseEntireSummary() {
Info->setSummary(std::move(FS));
break;
}
+ // FS_ALIAS: [valueid, linkage, valueid]
+ // Aliases must be emitted (and parsed) after all FS_PERMODULE entries, as
+ // they expect all aliasee summaries to be available.
+ case bitc::FS_ALIAS: {
+ unsigned ValueID = Record[0];
+ uint64_t RawLinkage = Record[1];
+ unsigned AliaseeID = Record[2];
+ std::unique_ptr<AliasSummary> AS =
+ llvm::make_unique<AliasSummary>(getDecodedLinkage(RawLinkage));
+ // The module path string ref set in the summary must be owned by the
+ // index's module string table. Since we don't have a module path
+ // 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());
+
+ GlobalValue::GUID AliaseeGUID = getGUIDFromValueId(AliaseeID);
+ auto *AliaseeInfo = TheIndex->getGlobalValueInfo(AliaseeGUID);
+ if (!AliaseeInfo->summary())
+ return error("Alias expects aliasee summary to be parsed");
+ AS->setAliasee(AliaseeInfo->summary());
+
+ GlobalValue::GUID GUID = getGUIDFromValueId(ValueID);
+ auto *Info = TheIndex->getGlobalValueInfo(GUID);
+ assert(!Info->summary() && "Expected a single summary per VST entry");
+ Info->setSummary(std::move(AS));
+ break;
+ }
// FS_PERMODULE_GLOBALVAR_INIT_REFS: [valueid, linkage, n x valueid]
case bitc::FS_PERMODULE_GLOBALVAR_INIT_REFS: {
unsigned ValueID = Record[0];
@@ -5906,6 +5935,28 @@ std::error_code ModuleSummaryIndexBitcodeReader::parseEntireSummary() {
Combined = true;
break;
}
+ // FS_COMBINED_ALIAS: [modid, linkage, offset]
+ // Aliases must be emitted (and parsed) after all FS_PERMODULE entries, as
+ // they expect all aliasee summaries to be available.
+ case bitc::FS_COMBINED_ALIAS: {
+ uint64_t ModuleId = Record[0];
+ uint64_t RawLinkage = Record[1];
+ uint64_t AliaseeSummaryOffset = Record[2];
+ std::unique_ptr<AliasSummary> AS =
+ llvm::make_unique<AliasSummary>(getDecodedLinkage(RawLinkage));
+ AS->setModulePath(ModuleIdMap[ModuleId]);
+
+ auto *AliaseeInfo = getInfoFromSummaryOffset(AliaseeSummaryOffset);
+ if (!AliaseeInfo->summary())
+ return error("Alias expects aliasee summary to be parsed");
+ AS->setAliasee(AliaseeInfo->summary());
+
+ auto *Info = getInfoFromSummaryOffset(CurRecordBit);
+ assert(!Info->summary() && "Expected a single summary per VST entry");
+ Info->setSummary(std::move(AS));
+ Combined = true;
+ break;
+ }
// FS_COMBINED_GLOBALVAR_INIT_REFS: [modid, linkage, n x valueid]
case bitc::FS_COMBINED_GLOBALVAR_INIT_REFS: {
uint64_t ModuleId = Record[0];
OpenPOWER on IntegriCloud