[PATCH] D36351: [lld][ELF] Add profile guided section layout
Rafael Ávila de Espíndola via Phabricator via llvm-commits
llvm-commits at lists.llvm.org
Thu Mar 8 04:47:15 PST 2018
rafael added a comment.
Michael Spencer via Phabricator via llvm-commits
<llvm-commits at lists.llvm.org> writes:
> @@ -1110,6 +1111,14 @@
>
> // If no layout was provided by linker script, we want to apply default
> // sorting for special input sections. This also handles --symbol-ordering-file.
> template <class ELFT> void Writer<ELFT>::sortInputSections() {
>
> + // Use the rarely used option -call-graph-ordering-file to sort sections.
> + if (!Config->CallGraphProfile.empty()) {
> + DenseMap<const InputSectionBase *, int> Order =
> + computeCallGraphProfileOrder();
> + for (BaseCommand *Base : Script->SectionCommands)
> + if (auto *Sec = dyn_cast<OutputSection>(Base))
> + sortSection(Sec, Order);
> + }
Instead of adding this if you can change buildSectionOrder:
static DenseMap<const InputSectionBase *, int> buildSectionOrder() {
if (!Config->CallGraphProfile.empty())
return computeCallGraphProfileOrder();
...
> + InputSectionBase *FromSec = SymbolSection.lookup(Fields[0]);
> + InputSectionBase *ToSec = SymbolSection.lookup(Fields[1]);
> + if (FromSec && ToSec)
> + Config->CallGraphProfile[std::make_pair(FromSec, ToSec)] = Count;
This should be "+=", no? If there are multiple calls from one section to
another I would expect us to use the total in the graph.
> +struct EdgeDenseMapInfo {
> + static Edge getEmptyKey() {
> + return {DenseMapInfo<SectionIndex>::getEmptyKey(),
> + DenseMapInfo<SectionIndex>::getEmptyKey(), 0, 0};
> + }
This doesn't build with clang:
/home/espindola/llvm/llvm/tools/lld/ELF/CallGraphSort.cpp:115:12: error:
no matching constructor for initialization of '(anonymous
namespace)::Edge'
return {DenseMapInfo<SectionIndex>::getEmptyKey(),
^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
/home/espindola/llvm/llvm/tools/lld/ELF/CallGraphSort.cpp:104:8: note:
candidate constructor (the implicit copy constructor) not viable:
requires 1 argument, but 4 were provided
struct Edge {
^
/home/espindola/llvm/llvm/tools/lld/ELF/CallGraphSort.cpp:104:8: note:
candidate constructor (the implicit move constructor) not viable:
requires 1 argument, but 4 were provided
/home/espindola/llvm/llvm/tools/lld/ELF/CallGraphSort.cpp:104:8: note:
candidate constructor (the implicit default constructor) not viable:
requires 0 arguments, but 4 were provided
Cheers,
Rafael
https://reviews.llvm.org/D36351
More information about the llvm-commits
mailing list