mirror of
https://github.com/RPCS3/llvm.git
synced 2026-01-31 01:25:19 +01:00
[ThinLTO] only emit used or referenced CFI records to index
Summary: We emit CFI_FUNCTION_DEFS and CFI_FUNCTION_DECLS to distributed ThinLTO indices to implement indirect function call checking. This change causes us to only emit entries for functions that are either defined or used by the module we're writing the index for (instead of all functions in the combined index), which can make the indices substantially smaller. Fixes PR42378. Reviewers: pcc, vitalybuka, eugenis Subscribers: mehdi_amini, hiraditya, dexonsmith, arphaman, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D63887 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@365537 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@@ -3973,9 +3973,13 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {
|
||||
NameVals.clear();
|
||||
};
|
||||
|
||||
std::set<GlobalValue::GUID> DefOrUseGUIDs;
|
||||
forEachSummary([&](GVInfo I, bool IsAliasee) {
|
||||
GlobalValueSummary *S = I.second;
|
||||
assert(S);
|
||||
DefOrUseGUIDs.insert(I.first);
|
||||
for (const ValueInfo &VI : S->refs())
|
||||
DefOrUseGUIDs.insert(VI.getGUID());
|
||||
|
||||
auto ValueId = getValueId(I.first);
|
||||
assert(ValueId);
|
||||
@@ -4120,20 +4124,30 @@ void IndexBitcodeWriter::writeCombinedGlobalValueSummary() {
|
||||
|
||||
if (!Index.cfiFunctionDefs().empty()) {
|
||||
for (auto &S : Index.cfiFunctionDefs()) {
|
||||
NameVals.push_back(StrtabBuilder.add(S));
|
||||
NameVals.push_back(S.size());
|
||||
if (DefOrUseGUIDs.count(
|
||||
GlobalValue::getGUID(GlobalValue::dropLLVMManglingEscape(S)))) {
|
||||
NameVals.push_back(StrtabBuilder.add(S));
|
||||
NameVals.push_back(S.size());
|
||||
}
|
||||
}
|
||||
if (!NameVals.empty()) {
|
||||
Stream.EmitRecord(bitc::FS_CFI_FUNCTION_DEFS, NameVals);
|
||||
NameVals.clear();
|
||||
}
|
||||
Stream.EmitRecord(bitc::FS_CFI_FUNCTION_DEFS, NameVals);
|
||||
NameVals.clear();
|
||||
}
|
||||
|
||||
if (!Index.cfiFunctionDecls().empty()) {
|
||||
for (auto &S : Index.cfiFunctionDecls()) {
|
||||
NameVals.push_back(StrtabBuilder.add(S));
|
||||
NameVals.push_back(S.size());
|
||||
if (DefOrUseGUIDs.count(
|
||||
GlobalValue::getGUID(GlobalValue::dropLLVMManglingEscape(S)))) {
|
||||
NameVals.push_back(StrtabBuilder.add(S));
|
||||
NameVals.push_back(S.size());
|
||||
}
|
||||
}
|
||||
if (!NameVals.empty()) {
|
||||
Stream.EmitRecord(bitc::FS_CFI_FUNCTION_DECLS, NameVals);
|
||||
NameVals.clear();
|
||||
}
|
||||
Stream.EmitRecord(bitc::FS_CFI_FUNCTION_DECLS, NameVals);
|
||||
NameVals.clear();
|
||||
}
|
||||
|
||||
// Walk the GUIDs that were referenced, and write the
|
||||
|
||||
Reference in New Issue
Block a user