Skip to content

Commit ce91e21

Browse files
authored
[lld][InstrProf] Sort startup functions for compression (#107348)
1 parent cfc0951 commit ce91e21

File tree

8 files changed

+40
-6
lines changed

8 files changed

+40
-6
lines changed

lld/MachO/BPSectionOrderer.cpp

Lines changed: 20 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,8 @@ static SmallVector<std::pair<unsigned, UtilityNodes>> getUnsForCompression(
158158

159159
DenseMap<const InputSection *, size_t> lld::macho::runBalancedPartitioning(
160160
size_t &highestAvailablePriority, StringRef profilePath,
161-
bool forFunctionCompression, bool forDataCompression, bool verbose) {
161+
bool forFunctionCompression, bool forDataCompression,
162+
bool compressionSortStartupFunctions, bool verbose) {
162163

163164
SmallVector<const InputSection *> sections;
164165
DenseMap<const InputSection *, uint64_t> sectionToIdx;
@@ -268,8 +269,24 @@ DenseMap<const InputSection *, size_t> lld::macho::runBalancedPartitioning(
268269
}
269270
}
270271

271-
// Map a section index (to be ordered for compression) to a list of duplicate
272-
// section indices (not ordered for compression).
272+
if (compressionSortStartupFunctions) {
273+
SmallVector<unsigned> startupIdxs;
274+
for (auto &[sectionIdx, uns] : startupSectionIdxUNs)
275+
startupIdxs.push_back(sectionIdx);
276+
auto unsForStartupFunctionCompression =
277+
getUnsForCompression(sections, sectionToIdx, startupIdxs,
278+
/*duplicateSectionIdxs=*/nullptr, maxUN);
279+
for (auto &[sectionIdx, compressionUns] :
280+
unsForStartupFunctionCompression) {
281+
auto &uns = startupSectionIdxUNs[sectionIdx];
282+
uns.append(compressionUns);
283+
llvm::sort(uns);
284+
uns.erase(std::unique(uns.begin(), uns.end()), uns.end());
285+
}
286+
}
287+
288+
// Map a section index (order directly) to a list of duplicate section indices
289+
// (not ordered directly).
273290
DenseMap<unsigned, SmallVector<unsigned>> duplicateSectionIdxs;
274291
auto unsForFunctionCompression = getUnsForCompression(
275292
sections, sectionToIdx, sectionIdxsForFunctionCompression,

lld/MachO/BPSectionOrderer.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ llvm::DenseMap<const lld::macho::InputSection *, size_t>
3030
runBalancedPartitioning(size_t &highestAvailablePriority,
3131
llvm::StringRef profilePath,
3232
bool forFunctionCompression, bool forDataCompression,
33-
bool verbose);
33+
bool compressionSortStartupFunctions, bool verbose);
3434

3535
} // namespace lld::macho
3636

lld/MachO/Config.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -219,6 +219,7 @@ struct Configuration {
219219
llvm::StringRef printSymbolOrder;
220220

221221
llvm::StringRef irpgoProfileSortProfilePath;
222+
bool compressionSortStartupFunctions = false;
222223
bool functionOrderForCompression = false;
223224
bool dataOrderForCompression = false;
224225
bool verboseBpSectionOrderer = false;

lld/MachO/Driver.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1778,6 +1778,13 @@ bool link(ArrayRef<const char *> argsArr, llvm::raw_ostream &stdoutOS,
17781778
config->irpgoProfileSortProfilePath = arg->getValue();
17791779
IncompatWithCGSort(arg->getSpelling());
17801780
}
1781+
config->compressionSortStartupFunctions =
1782+
args.hasFlag(OPT_compression_sort_startup_functions,
1783+
OPT_no_compression_sort_startup_functions, false);
1784+
if (config->irpgoProfileSortProfilePath.empty() &&
1785+
config->compressionSortStartupFunctions)
1786+
error("--compression-sort-startup-functions must be used with "
1787+
"--irpgo-profile-sort");
17811788
if (const Arg *arg = args.getLastArg(OPT_compression_sort)) {
17821789
StringRef compressionSortStr = arg->getValue();
17831790
if (compressionSortStr == "function") {

lld/MachO/Options.td

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,11 @@ def irpgo_profile_sort_eq: Joined<["--"], "irpgo-profile-sort=">,
131131
Alias<!cast<Separate>(irpgo_profile_sort)>, MetaVarName<"<profile>">,
132132
HelpText<"Read the IRPGO profile at <profile> to order sections to improve startup time">,
133133
Group<grp_lld>;
134+
def compression_sort_startup_functions: Flag<["--"], "compression-sort-startup-functions">,
135+
HelpText<"Order startup functions to improve compressed size in addition to startup time">,
136+
Group<grp_lld>;
137+
def no_compression_sort_startup_functions: Flag<["--"], "no-compression-sort-startup-functions">,
138+
HelpText<"Do not order startup function for compression">, Group<grp_lld>;
134139
def compression_sort: Joined<["--"], "compression-sort=">,
135140
MetaVarName<"[none,function,data,both]">,
136141
HelpText<"Order sections to improve compressed size">, Group<grp_lld>;

lld/MachO/SectionPriorities.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,7 @@ macho::PriorityBuilder::buildInputSectionPriorities() {
359359
sectionPriorities = runBalancedPartitioning(
360360
highestAvailablePriority, config->irpgoProfileSortProfilePath,
361361
config->functionOrderForCompression, config->dataOrderForCompression,
362+
config->compressionSortStartupFunctions,
362363
config->verboseBpSectionOrderer);
363364
} else if (config->callGraphProfileSort) {
364365
// Sort sections by the profile data provided by __LLVM,__cg_profile

lld/test/MachO/bp-section-orderer-errs.s

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,3 +7,6 @@
77

88
# RUN: not %lld -o /dev/null --compression-sort=malformed 2>&1 | FileCheck %s --check-prefix=COMPRESSION-MALFORM
99
# COMPRESSION-MALFORM: unknown value `malformed` for --compression-sort=
10+
11+
# RUN: not %lld -o /dev/null --compression-sort-startup-functions 2>&1 | FileCheck %s --check-prefix=STARTUP
12+
# STARTUP: --compression-sort-startup-functions must be used with --irpgo-profile-sort

lld/test/MachO/bp-section-orderer-stress.s

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,8 +7,8 @@
77
# RUN: llvm-mc -filetype=obj -triple=arm64-apple-darwin %t.s -o %t.o
88
# RUN: llvm-profdata merge %t.proftext -o %t.profdata
99

10-
# 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
11-
# 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
10+
# 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
11+
# 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
1212
# RUN: diff %t.order1.txt %t.order2.txt
1313

1414
import random

0 commit comments

Comments
 (0)