mirror of
https://github.com/llvm/llvm-project.git
synced 2025-04-18 07:06:38 +00:00
[lld][InstrProf] Sort startup functions for compression (#107348)
This commit is contained in:
parent
cfc095118c
commit
ce91e2153f
@ -158,7 +158,8 @@ static SmallVector<std::pair<unsigned, UtilityNodes>> getUnsForCompression(
|
||||
|
||||
DenseMap<const InputSection *, size_t> lld::macho::runBalancedPartitioning(
|
||||
size_t &highestAvailablePriority, StringRef profilePath,
|
||||
bool forFunctionCompression, bool forDataCompression, bool verbose) {
|
||||
bool forFunctionCompression, bool forDataCompression,
|
||||
bool compressionSortStartupFunctions, bool verbose) {
|
||||
|
||||
SmallVector<const InputSection *> sections;
|
||||
DenseMap<const InputSection *, uint64_t> sectionToIdx;
|
||||
@ -268,8 +269,24 @@ DenseMap<const InputSection *, size_t> lld::macho::runBalancedPartitioning(
|
||||
}
|
||||
}
|
||||
|
||||
// Map a section index (to be ordered for compression) to a list of duplicate
|
||||
// section indices (not ordered for compression).
|
||||
if (compressionSortStartupFunctions) {
|
||||
SmallVector<unsigned> startupIdxs;
|
||||
for (auto &[sectionIdx, uns] : startupSectionIdxUNs)
|
||||
startupIdxs.push_back(sectionIdx);
|
||||
auto unsForStartupFunctionCompression =
|
||||
getUnsForCompression(sections, sectionToIdx, startupIdxs,
|
||||
/*duplicateSectionIdxs=*/nullptr, maxUN);
|
||||
for (auto &[sectionIdx, compressionUns] :
|
||||
unsForStartupFunctionCompression) {
|
||||
auto &uns = startupSectionIdxUNs[sectionIdx];
|
||||
uns.append(compressionUns);
|
||||
llvm::sort(uns);
|
||||
uns.erase(std::unique(uns.begin(), uns.end()), uns.end());
|
||||
}
|
||||
}
|
||||
|
||||
// Map a section index (order directly) to a list of duplicate section indices
|
||||
// (not ordered directly).
|
||||
DenseMap<unsigned, SmallVector<unsigned>> duplicateSectionIdxs;
|
||||
auto unsForFunctionCompression = getUnsForCompression(
|
||||
sections, sectionToIdx, sectionIdxsForFunctionCompression,
|
||||
|
@ -30,7 +30,7 @@ llvm::DenseMap<const lld::macho::InputSection *, size_t>
|
||||
runBalancedPartitioning(size_t &highestAvailablePriority,
|
||||
llvm::StringRef profilePath,
|
||||
bool forFunctionCompression, bool forDataCompression,
|
||||
bool verbose);
|
||||
bool compressionSortStartupFunctions, bool verbose);
|
||||
|
||||
} // namespace lld::macho
|
||||
|
||||
|
@ -219,6 +219,7 @@ struct Configuration {
|
||||
llvm::StringRef printSymbolOrder;
|
||||
|
||||
llvm::StringRef irpgoProfileSortProfilePath;
|
||||
bool compressionSortStartupFunctions = false;
|
||||
bool functionOrderForCompression = false;
|
||||
bool dataOrderForCompression = false;
|
||||
bool verboseBpSectionOrderer = false;
|
||||
|
@ -1778,6 +1778,13 @@ bool link(ArrayRef<const char *> argsArr, llvm::raw_ostream &stdoutOS,
|
||||
config->irpgoProfileSortProfilePath = arg->getValue();
|
||||
IncompatWithCGSort(arg->getSpelling());
|
||||
}
|
||||
config->compressionSortStartupFunctions =
|
||||
args.hasFlag(OPT_compression_sort_startup_functions,
|
||||
OPT_no_compression_sort_startup_functions, false);
|
||||
if (config->irpgoProfileSortProfilePath.empty() &&
|
||||
config->compressionSortStartupFunctions)
|
||||
error("--compression-sort-startup-functions must be used with "
|
||||
"--irpgo-profile-sort");
|
||||
if (const Arg *arg = args.getLastArg(OPT_compression_sort)) {
|
||||
StringRef compressionSortStr = arg->getValue();
|
||||
if (compressionSortStr == "function") {
|
||||
|
@ -131,6 +131,11 @@ def irpgo_profile_sort_eq: Joined<["--"], "irpgo-profile-sort=">,
|
||||
Alias<!cast<Separate>(irpgo_profile_sort)>, MetaVarName<"<profile>">,
|
||||
HelpText<"Read the IRPGO profile at <profile> to order sections to improve startup time">,
|
||||
Group<grp_lld>;
|
||||
def compression_sort_startup_functions: Flag<["--"], "compression-sort-startup-functions">,
|
||||
HelpText<"Order startup functions to improve compressed size in addition to startup time">,
|
||||
Group<grp_lld>;
|
||||
def no_compression_sort_startup_functions: Flag<["--"], "no-compression-sort-startup-functions">,
|
||||
HelpText<"Do not order startup function for compression">, Group<grp_lld>;
|
||||
def compression_sort: Joined<["--"], "compression-sort=">,
|
||||
MetaVarName<"[none,function,data,both]">,
|
||||
HelpText<"Order sections to improve compressed size">, Group<grp_lld>;
|
||||
|
@ -359,6 +359,7 @@ macho::PriorityBuilder::buildInputSectionPriorities() {
|
||||
sectionPriorities = runBalancedPartitioning(
|
||||
highestAvailablePriority, config->irpgoProfileSortProfilePath,
|
||||
config->functionOrderForCompression, config->dataOrderForCompression,
|
||||
config->compressionSortStartupFunctions,
|
||||
config->verboseBpSectionOrderer);
|
||||
} else if (config->callGraphProfileSort) {
|
||||
// Sort sections by the profile data provided by __LLVM,__cg_profile
|
||||
|
@ -7,3 +7,6 @@
|
||||
|
||||
# RUN: not %lld -o /dev/null --compression-sort=malformed 2>&1 | FileCheck %s --check-prefix=COMPRESSION-MALFORM
|
||||
# COMPRESSION-MALFORM: unknown value `malformed` for --compression-sort=
|
||||
|
||||
# RUN: not %lld -o /dev/null --compression-sort-startup-functions 2>&1 | FileCheck %s --check-prefix=STARTUP
|
||||
# STARTUP: --compression-sort-startup-functions must be used with --irpgo-profile-sort
|
||||
|
@ -7,8 +7,8 @@
|
||||
# RUN: llvm-mc -filetype=obj -triple=arm64-apple-darwin %t.s -o %t.o
|
||||
# RUN: llvm-profdata merge %t.proftext -o %t.profdata
|
||||
|
||||
# RUN: %lld -arch arm64 -lSystem -e _main --icf=all -o - %t.o --irpgo-profile-sort=%t.profdata --compression-sort=both | llvm-nm --numeric-sort --format=just-symbols - > %t.order1.txt
|
||||
# RUN: %lld -arch arm64 -lSystem -e _main --icf=all -o - %t.o --irpgo-profile-sort=%t.profdata --compression-sort=both | llvm-nm --numeric-sort --format=just-symbols - > %t.order2.txt
|
||||
# RUN: %lld -arch arm64 -lSystem -e _main --icf=all -o - %t.o --irpgo-profile-sort=%t.profdata --compression-sort-startup-functions --compression-sort=both | llvm-nm --numeric-sort --format=just-symbols - > %t.order1.txt
|
||||
# RUN: %lld -arch arm64 -lSystem -e _main --icf=all -o - %t.o --irpgo-profile-sort=%t.profdata --compression-sort-startup-functions --compression-sort=both | llvm-nm --numeric-sort --format=just-symbols - > %t.order2.txt
|
||||
# RUN: diff %t.order1.txt %t.order2.txt
|
||||
|
||||
import random
|
||||
|
Loading…
x
Reference in New Issue
Block a user