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,17 @@ for (int SecIndex : C.Sections) OrderMap[Sections[SecIndex]] = CurOrder++; + if (errorHandler().Verbose) { + // If user passes --verbose to LLD , print out the symbols ordered by C3. + 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) + outs() << Sections[SecIndex]->Name << "\n"; + outs() << "**********************************************************\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,46 @@ +# 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-prefix=VERBOSE +# RUN: llvm-readobj -symbols %t2 | FileCheck %s + +# CHECK: Name: A +# CHECK-NEXT: Value: 0x201003 +# CHECK: Name: B +# CHECK-NEXT: Value: 0x201000 +# CHECK: Name: C +# CHECK-NEXT: Value: 0x201001 +# CHECK: Name: D +# CHECK-NEXT: Value: 0x201002 + +.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 + + +# VERBOSE: ******** Symbols ordered by call-chain clustering ******** +# VERBOSE-NEXT: .text.B +# VERBOSE-NEXT: .text.C +# VERBOSE-NEXT: .text.D +# VERBOSE-NEXT: .text.A +# VERBOSE-NEXT: **********************************************************