diff --git a/lld/ELF/CallGraphSort.cpp b/lld/ELF/CallGraphSort.cpp --- a/lld/ELF/CallGraphSort.cpp +++ b/lld/ELF/CallGraphSort.cpp @@ -226,6 +226,16 @@ for (int SecIndex : C.Sections) OrderMap[Sections[SecIndex]] = CurOrder++; + if (errorHandler().Verbose) { + outs() << "Symbols ordered by call-chain clustering:\n"; + // Print the symbols ordered by C3, in the order of increasing CurOrder + // Instead of sorting all the OrderMap, just repeat the loops above. + for (const Cluster &C : Clusters) + for (int SecIndex : C.Sections) + if (!Sections[SecIndex]->Name.empty()) + outs() << Sections[SecIndex]->Name << "\n"; + } + return OrderMap; } diff --git a/lld/test/ELF/cgprofile-print.s b/lld/test/ELF/cgprofile-print.s new file mode 100644 --- /dev/null +++ b/lld/test/ELF/cgprofile-print.s @@ -0,0 +1,37 @@ +# REQUIRES: x86 + +# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t +# RUN: echo "A B 5" > %t.call_graph +# RUN: echo "B C 50" >> %t.call_graph +# RUN: echo "C D 40" >> %t.call_graph +# RUN: echo "D B 10" >> %t.call_graph +# RUN: ld.lld -e A %t --call-graph-ordering-file %t.call_graph -o %t2 --verbose | FileCheck %s + +# CHECK: Symbols ordered by call-chain clustering: +# CHECK-NEXT: .text.B +# CHECK-NEXT: .text.C +# CHECK-NEXT: .text.D +# CHECK-NEXT: .text.A + +.section .text.A,"ax",@progbits +.globl A +A: + nop + +.section .text.B,"ax",@progbits +.globl B +B: + nop + +.section .text.C,"ax",@progbits +.globl C +C: + nop + +.section .text.D,"ax",@progbits +.globl D +D: + nop + + +