@@ -38,9 +38,6 @@ using namespace lld::macho;
3838PriorityBuilder macho::priorityBuilder;
3939
4040namespace {
41-
42- size_t highestAvailablePriority = std::numeric_limits<size_t >::max();
43-
4441struct Edge {
4542 int from;
4643 uint64_t weight;
@@ -67,7 +64,7 @@ class CallGraphSort {
6764public:
6865 CallGraphSort (const MapVector<SectionPair, uint64_t > &profile);
6966
70- DenseMap<const InputSection *, size_t > run ();
67+ DenseMap<const InputSection *, int > run ();
7168
7269private:
7370 std::vector<Cluster> clusters;
@@ -157,7 +154,7 @@ static void mergeClusters(std::vector<Cluster> &cs, Cluster &into, int intoIdx,
157154
158155// Group InputSections into clusters using the Call-Chain Clustering heuristic
159156// then sort the clusters by density.
160- DenseMap<const InputSection *, size_t > CallGraphSort::run () {
157+ DenseMap<const InputSection *, int > CallGraphSort::run () {
161158 const uint64_t maxClusterSize = target->getPageSize ();
162159
163160 // Cluster indices sorted by density.
@@ -205,16 +202,14 @@ DenseMap<const InputSection *, size_t> CallGraphSort::run() {
205202 return clusters[a].getDensity () > clusters[b].getDensity ();
206203 });
207204
208- DenseMap<const InputSection *, size_t > orderMap;
205+ DenseMap<const InputSection *, int > orderMap;
209206
210207 // Sections will be sorted by decreasing order. Absent sections will have
211208 // priority 0 and be placed at the end of sections.
212- // NB: This is opposite from COFF/ELF to be compatible with the existing
213- // order-file code.
214- int curOrder = highestAvailablePriority;
209+ int curOrder = -clusters.size ();
215210 for (int leader : sorted) {
216211 for (int i = leader;;) {
217- orderMap[sections[i]] = curOrder-- ;
212+ orderMap[sections[i]] = curOrder++ ;
218213 i = clusters[i].next ;
219214 if (i == leader)
220215 break ;
@@ -250,7 +245,7 @@ DenseMap<const InputSection *, size_t> CallGraphSort::run() {
250245 return orderMap;
251246}
252247
253- std::optional<size_t >
248+ std::optional<int >
254249macho::PriorityBuilder::getSymbolPriority (const Defined *sym) {
255250 if (sym->isAbsolute ())
256251 return std::nullopt ;
@@ -270,7 +265,7 @@ macho::PriorityBuilder::getSymbolPriority(const Defined *sym) {
270265 else
271266 filename = saver ().save (path::filename (f->archiveName ) + " (" +
272267 path::filename (f->getName ()) + " )" );
273- return std::max (entry.objectFiles .lookup (filename), entry.anyObjectFile );
268+ return std::min (entry.objectFiles .lookup (filename), entry.anyObjectFile );
274269}
275270
276271void macho::PriorityBuilder::extractCallGraphProfile () {
@@ -302,6 +297,7 @@ void macho::PriorityBuilder::parseOrderFile(StringRef path) {
302297 return ;
303298 }
304299
300+ int prio = std::numeric_limits<int >::min ();
305301 MemoryBufferRef mbref = *buffer;
306302 for (StringRef line : args::getLines (mbref)) {
307303 StringRef objectFile, symbol;
@@ -339,25 +335,22 @@ void macho::PriorityBuilder::parseOrderFile(StringRef path) {
339335 if (!symbol.empty ()) {
340336 SymbolPriorityEntry &entry = priorities[symbol];
341337 if (!objectFile.empty ())
342- entry.objectFiles .insert (
343- std::make_pair (objectFile, highestAvailablePriority));
338+ entry.objectFiles .insert (std::make_pair (objectFile, prio));
344339 else
345- entry.anyObjectFile =
346- std::max (entry.anyObjectFile , highestAvailablePriority);
340+ entry.anyObjectFile = std::min (entry.anyObjectFile , prio);
347341 }
348342
349- --highestAvailablePriority ;
343+ ++prio ;
350344 }
351345}
352346
353- DenseMap<const InputSection *, size_t >
347+ DenseMap<const InputSection *, int >
354348macho::PriorityBuilder::buildInputSectionPriorities () {
355- DenseMap<const InputSection *, size_t > sectionPriorities;
349+ DenseMap<const InputSection *, int > sectionPriorities;
356350 if (config->bpStartupFunctionSort || config->bpFunctionOrderForCompression ||
357351 config->bpDataOrderForCompression ) {
358352 TimeTraceScope timeScope (" Balanced Partitioning Section Orderer" );
359353 sectionPriorities = runBalancedPartitioning (
360- highestAvailablePriority,
361354 config->bpStartupFunctionSort ? config->irpgoProfilePath : " " ,
362355 config->bpFunctionOrderForCompression ,
363356 config->bpDataOrderForCompression ,
@@ -378,11 +371,11 @@ macho::PriorityBuilder::buildInputSectionPriorities() {
378371 return sectionPriorities;
379372
380373 auto addSym = [&](const Defined *sym) {
381- std::optional<size_t > symbolPriority = getSymbolPriority (sym);
374+ std::optional<int > symbolPriority = getSymbolPriority (sym);
382375 if (!symbolPriority)
383376 return ;
384- size_t &priority = sectionPriorities[sym->isec ()];
385- priority = std::max (priority, *symbolPriority);
377+ int &priority = sectionPriorities[sym->isec ()];
378+ priority = std::min (priority, *symbolPriority);
386379 };
387380
388381 // TODO: Make sure this handles weak symbols correctly.
0 commit comments