diff options
author | Mehdi Amini <mehdi.amini@apple.com> | 2016-04-23 23:38:17 +0000 |
---|---|---|
committer | Mehdi Amini <mehdi.amini@apple.com> | 2016-04-23 23:38:17 +0000 |
commit | ae64eafd31781d6eee0b23a6d4d5f50d84d143ec (patch) | |
tree | bc8c443446d72c38213f5be27e2837d7ecc29009 /llvm/lib/Bitcode/Reader/BitcodeReader.cpp | |
parent | cb87494f4cbd4769c6769a752c2c9fb5c4e1bb00 (diff) | |
download | llvm-ae64eafd31781d6eee0b23a6d4d5f50d84d143ec.zip llvm-ae64eafd31781d6eee0b23a6d4d5f50d84d143ec.tar.gz llvm-ae64eafd31781d6eee0b23a6d4d5f50d84d143ec.tar.bz2 |
Store and emit original name in combined index
Summary:
As discussed in D18298, some local globals can't
be renamed/promoted (because they have a section, or because
they are referenced from inline assembly).
To be able to detect naming collision, we need to keep around
the "GUID" using their original name without taking the linkage
into account.
Reviewers: tejohnson
Subscribers: joker.eph, llvm-commits
Differential Revision: http://reviews.llvm.org/D19454
From: Mehdi Amini <mehdi.amini@apple.com>
llvm-svn: 267304
Diffstat (limited to 'llvm/lib/Bitcode/Reader/BitcodeReader.cpp')
-rw-r--r-- | llvm/lib/Bitcode/Reader/BitcodeReader.cpp | 88 |
1 files changed, 63 insertions, 25 deletions
diff --git a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp index 5212560..cbacf81 100644 --- a/llvm/lib/Bitcode/Reader/BitcodeReader.cpp +++ b/llvm/lib/Bitcode/Reader/BitcodeReader.cpp @@ -487,7 +487,10 @@ class ModuleSummaryIndexBitcodeReader { // call graph edges read from the function summary from referencing // callees by their ValueId to using the GUID instead, which is how // they are recorded in the summary index being built. - DenseMap<unsigned, GlobalValue::GUID> ValueIdToCallGraphGUIDMap; + // We save a second GUID which is the same as the first one, but ignoring the + // linkage, i.e. for value other than local linkage they are identical. + DenseMap<unsigned, std::pair<GlobalValue::GUID, GlobalValue::GUID>> + ValueIdToCallGraphGUIDMap; /// Map to save the association between summary offset in the VST to the /// GlobalValueInfo object created when parsing it. Used to access the @@ -543,7 +546,8 @@ private: std::error_code initStream(std::unique_ptr<DataStreamer> Streamer); std::error_code initStreamFromBuffer(); std::error_code initLazyStream(std::unique_ptr<DataStreamer> Streamer); - GlobalValue::GUID getGUIDFromValueId(unsigned ValueId); + std::pair<GlobalValue::GUID, GlobalValue::GUID> + getGUIDFromValueId(unsigned ValueId); GlobalValueInfo *getInfoFromSummaryOffset(uint64_t Offset); }; } // end anonymous namespace @@ -5699,7 +5703,7 @@ void ModuleSummaryIndexBitcodeReader::freeState() { Buffer = nullptr; } void ModuleSummaryIndexBitcodeReader::releaseBuffer() { Buffer.release(); } -GlobalValue::GUID +std::pair<GlobalValue::GUID, GlobalValue::GUID> ModuleSummaryIndexBitcodeReader::getGUIDFromValueId(unsigned ValueId) { auto VGI = ValueIdToCallGraphGUIDMap.find(ValueId); assert(VGI != ValueIdToCallGraphGUIDMap.end()); @@ -5763,13 +5767,19 @@ std::error_code ModuleSummaryIndexBitcodeReader::parseValueSymbolTable( auto VLI = ValueIdToLinkageMap.find(ValueID); assert(VLI != ValueIdToLinkageMap.end() && "No linkage found for VST entry?"); - std::string GlobalId = GlobalValue::getGlobalIdentifier( - ValueName, VLI->second, SourceFileName); + auto Linkage = VLI->second; + std::string GlobalId = + GlobalValue::getGlobalIdentifier(ValueName, Linkage, SourceFileName); auto ValueGUID = GlobalValue::getGUID(GlobalId); + auto OriginalNameID = ValueGUID; + if (GlobalValue::isLocalLinkage(Linkage)) + OriginalNameID = GlobalValue::getGUID(ValueName); if (PrintSummaryGUIDs) - dbgs() << "GUID " << ValueGUID << " is " << ValueName << "\n"; + dbgs() << "GUID " << ValueGUID << "(" << OriginalNameID << ") is " + << ValueName << "\n"; TheIndex->addGlobalValueInfo(ValueGUID, std::move(GlobalValInfo)); - ValueIdToCallGraphGUIDMap[ValueID] = ValueGUID; + ValueIdToCallGraphGUIDMap[ValueID] = + std::make_pair(ValueGUID, OriginalNameID); ValueName.clear(); break; } @@ -5785,13 +5795,19 @@ std::error_code ModuleSummaryIndexBitcodeReader::parseValueSymbolTable( auto VLI = ValueIdToLinkageMap.find(ValueID); assert(VLI != ValueIdToLinkageMap.end() && "No linkage found for VST entry?"); + auto Linkage = VLI->second; std::string FunctionGlobalId = GlobalValue::getGlobalIdentifier( ValueName, VLI->second, SourceFileName); auto FunctionGUID = GlobalValue::getGUID(FunctionGlobalId); + auto OriginalNameID = FunctionGUID; + if (GlobalValue::isLocalLinkage(Linkage)) + OriginalNameID = GlobalValue::getGUID(ValueName); if (PrintSummaryGUIDs) - dbgs() << "GUID " << FunctionGUID << " is " << ValueName << "\n"; + dbgs() << "GUID " << FunctionGUID << "(" << OriginalNameID << ") is " + << ValueName << "\n"; TheIndex->addGlobalValueInfo(FunctionGUID, std::move(FuncInfo)); - ValueIdToCallGraphGUIDMap[ValueID] = FunctionGUID; + ValueIdToCallGraphGUIDMap[ValueID] = + std::make_pair(FunctionGUID, OriginalNameID); ValueName.clear(); break; @@ -5805,14 +5821,19 @@ std::error_code ModuleSummaryIndexBitcodeReader::parseValueSymbolTable( llvm::make_unique<GlobalValueInfo>(GlobalValSummaryOffset); SummaryOffsetToInfoMap[GlobalValSummaryOffset] = GlobalValInfo.get(); TheIndex->addGlobalValueInfo(GlobalValGUID, std::move(GlobalValInfo)); - ValueIdToCallGraphGUIDMap[ValueID] = GlobalValGUID; + // The "original name", which is the second value of the pair will be + // overriden later by a FS_COMBINED_ORIGINAL_NAME in the combined index. + ValueIdToCallGraphGUIDMap[ValueID] = + std::make_pair(GlobalValGUID, GlobalValGUID); break; } case bitc::VST_CODE_COMBINED_ENTRY: { // VST_CODE_COMBINED_ENTRY: [valueid, refguid] unsigned ValueID = Record[0]; GlobalValue::GUID RefGUID = Record[1]; - ValueIdToCallGraphGUIDMap[ValueID] = RefGUID; + // The "original name", which is the second value of the pair will be + // overriden later by a FS_COMBINED_ORIGINAL_NAME in the combined index. + ValueIdToCallGraphGUIDMap[ValueID] = std::make_pair(RefGUID, RefGUID); break; } } @@ -5976,7 +5997,9 @@ std::error_code ModuleSummaryIndexBitcodeReader::parseEntireSummary() { return error("Invalid record"); SmallVector<uint64_t, 64> Record; - + // Keep around the last seen summary to be used when we see an optional + // "OriginalName" attachement. + GlobalValueSummary *LastSeenSummary = nullptr; bool Combined = false; while (1) { BitstreamEntry Entry = Stream.advanceSkippingSubblocks(); @@ -6041,7 +6064,7 @@ std::error_code ModuleSummaryIndexBitcodeReader::parseEntireSummary() { "Record size inconsistent with number of references"); for (unsigned I = 4, E = CallGraphEdgeStartIndex; I != E; ++I) { unsigned RefValueId = Record[I]; - GlobalValue::GUID RefGUID = getGUIDFromValueId(RefValueId); + GlobalValue::GUID RefGUID = getGUIDFromValueId(RefValueId).first; FS->addRefEdge(RefGUID); } bool HasProfile = (BitCode == bitc::FS_PERMODULE_PROFILE); @@ -6050,12 +6073,13 @@ std::error_code ModuleSummaryIndexBitcodeReader::parseEntireSummary() { unsigned CalleeValueId = Record[I]; unsigned CallsiteCount = Record[++I]; uint64_t ProfileCount = HasProfile ? Record[++I] : 0; - GlobalValue::GUID CalleeGUID = getGUIDFromValueId(CalleeValueId); + GlobalValue::GUID CalleeGUID = getGUIDFromValueId(CalleeValueId).first; FS->addCallGraphEdge(CalleeGUID, CalleeInfo(CallsiteCount, ProfileCount)); } - GlobalValue::GUID GUID = getGUIDFromValueId(ValueID); - auto *Info = TheIndex->getGlobalValueInfo(GUID); + auto GUID = getGUIDFromValueId(ValueID); + FS->setOriginalName(GUID.second); + auto *Info = TheIndex->getGlobalValueInfo(GUID.first); assert(!Info->summary() && "Expected a single summary per VST entry"); Info->setSummary(std::move(FS)); break; @@ -6077,14 +6101,15 @@ std::error_code ModuleSummaryIndexBitcodeReader::parseEntireSummary() { AS->setModulePath( TheIndex->addModulePath(Buffer->getBufferIdentifier(), 0)->first()); - GlobalValue::GUID AliaseeGUID = getGUIDFromValueId(AliaseeID); + GlobalValue::GUID AliaseeGUID = getGUIDFromValueId(AliaseeID).first; 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); + auto GUID = getGUIDFromValueId(ValueID); + AS->setOriginalName(GUID.second); + auto *Info = TheIndex->getGlobalValueInfo(GUID.first); assert(!Info->summary() && "Expected a single summary per VST entry"); Info->setSummary(std::move(AS)); break; @@ -6099,11 +6124,12 @@ std::error_code ModuleSummaryIndexBitcodeReader::parseEntireSummary() { TheIndex->addModulePath(Buffer->getBufferIdentifier(), 0)->first()); for (unsigned I = 2, E = Record.size(); I != E; ++I) { unsigned RefValueId = Record[I]; - GlobalValue::GUID RefGUID = getGUIDFromValueId(RefValueId); + GlobalValue::GUID RefGUID = getGUIDFromValueId(RefValueId).first; FS->addRefEdge(RefGUID); } - GlobalValue::GUID GUID = getGUIDFromValueId(ValueID); - auto *Info = TheIndex->getGlobalValueInfo(GUID); + auto GUID = getGUIDFromValueId(ValueID); + FS->setOriginalName(GUID.second); + auto *Info = TheIndex->getGlobalValueInfo(GUID.first); assert(!Info->summary() && "Expected a single summary per VST entry"); Info->setSummary(std::move(FS)); break; @@ -6121,6 +6147,7 @@ std::error_code ModuleSummaryIndexBitcodeReader::parseEntireSummary() { unsigned NumRefs = Record[3]; std::unique_ptr<FunctionSummary> FS = llvm::make_unique<FunctionSummary>( getDecodedLinkage(RawLinkage), InstCount); + LastSeenSummary = FS.get(); FS->setModulePath(ModuleIdMap[ModuleId]); static int RefListStartIndex = 4; int CallGraphEdgeStartIndex = RefListStartIndex + NumRefs; @@ -6128,7 +6155,7 @@ std::error_code ModuleSummaryIndexBitcodeReader::parseEntireSummary() { "Record size inconsistent with number of references"); for (unsigned I = 4, E = CallGraphEdgeStartIndex; I != E; ++I) { unsigned RefValueId = Record[I]; - GlobalValue::GUID RefGUID = getGUIDFromValueId(RefValueId); + GlobalValue::GUID RefGUID = getGUIDFromValueId(RefValueId).first; FS->addRefEdge(RefGUID); } bool HasProfile = (BitCode == bitc::FS_COMBINED_PROFILE); @@ -6137,7 +6164,7 @@ std::error_code ModuleSummaryIndexBitcodeReader::parseEntireSummary() { unsigned CalleeValueId = Record[I]; unsigned CallsiteCount = Record[++I]; uint64_t ProfileCount = HasProfile ? Record[++I] : 0; - GlobalValue::GUID CalleeGUID = getGUIDFromValueId(CalleeValueId); + GlobalValue::GUID CalleeGUID = getGUIDFromValueId(CalleeValueId).first; FS->addCallGraphEdge(CalleeGUID, CalleeInfo(CallsiteCount, ProfileCount)); } @@ -6156,6 +6183,7 @@ std::error_code ModuleSummaryIndexBitcodeReader::parseEntireSummary() { uint64_t AliaseeSummaryOffset = Record[2]; std::unique_ptr<AliasSummary> AS = llvm::make_unique<AliasSummary>(getDecodedLinkage(RawLinkage)); + LastSeenSummary = AS.get(); AS->setModulePath(ModuleIdMap[ModuleId]); auto *AliaseeInfo = getInfoFromSummaryOffset(AliaseeSummaryOffset); @@ -6175,10 +6203,11 @@ std::error_code ModuleSummaryIndexBitcodeReader::parseEntireSummary() { uint64_t RawLinkage = Record[1]; std::unique_ptr<GlobalVarSummary> FS = llvm::make_unique<GlobalVarSummary>(getDecodedLinkage(RawLinkage)); + LastSeenSummary = FS.get(); FS->setModulePath(ModuleIdMap[ModuleId]); for (unsigned I = 2, E = Record.size(); I != E; ++I) { unsigned RefValueId = Record[I]; - GlobalValue::GUID RefGUID = getGUIDFromValueId(RefValueId); + GlobalValue::GUID RefGUID = getGUIDFromValueId(RefValueId).first; FS->addRefEdge(RefGUID); } auto *Info = getInfoFromSummaryOffset(CurRecordBit); @@ -6187,6 +6216,15 @@ std::error_code ModuleSummaryIndexBitcodeReader::parseEntireSummary() { Combined = true; break; } + // FS_COMBINED_ORIGINAL_NAME: [original_name] + case bitc::FS_COMBINED_ORIGINAL_NAME: { + uint64_t OriginalName = Record[0]; + if (!LastSeenSummary) + return error("Name attachment that does not follow a combined record"); + LastSeenSummary->setOriginalName(OriginalName); + // Reset the LastSeenSummary + LastSeenSummary = nullptr; + } } } llvm_unreachable("Exit infinite loop"); |