Skip to content

Commit

Permalink
[ELF] Add --{,no-}call-graph-profile-sort (enabled by default)
Browse files Browse the repository at this point in the history
Summary: Add an option to disable sorting sections with call graph profile

Reviewers: ruiu, Bigcheese, espindola

Reviewed By: Bigcheese

Subscribers: grimar, emaste, arichardson, llvm-commits

Differential Revision: https://reviews.llvm.org/D53683

llvm-svn: 345332
  • Loading branch information
MaskRay committed Oct 25, 2018
1 parent 2b280ea commit cc18f8a
Show file tree
Hide file tree
Showing 4 changed files with 27 additions and 15 deletions.
1 change: 1 addition & 0 deletions lld/ELF/Config.h
Expand Up @@ -127,6 +127,7 @@ struct Configuration {
bool AsNeeded = false;
bool Bsymbolic;
bool BsymbolicFunctions;
bool CallGraphProfileSort;
bool CheckSections;
bool CompressDebugSections;
bool Cref;
Expand Down
12 changes: 8 additions & 4 deletions lld/ELF/Driver.cpp
Expand Up @@ -770,6 +770,8 @@ void LinkerDriver::readConfigs(opt::InputArgList &Args) {
Config->EhFrameHdr =
Args.hasFlag(OPT_eh_frame_hdr, OPT_no_eh_frame_hdr, false);
Config->EmitRelocs = Args.hasArg(OPT_emit_relocs);
Config->CallGraphProfileSort = Args.hasFlag(
OPT_call_graph_profile_sort, OPT_no_call_graph_profile_sort, true);
Config->EnableNewDtags =
Args.hasFlag(OPT_enable_new_dtags, OPT_disable_new_dtags, true);
Config->Entry = Args.getLastArgValue(OPT_entry);
Expand Down Expand Up @@ -1621,10 +1623,12 @@ template <class ELFT> void LinkerDriver::link(opt::InputArgList &Args) {
}

// Read the callgraph now that we know what was gced or icfed
if (auto *Arg = Args.getLastArg(OPT_call_graph_ordering_file))
if (Optional<MemoryBufferRef> Buffer = readFile(Arg->getValue()))
readCallGraph(*Buffer);
readCallGraphsFromObjectFiles<ELFT>();
if (Config->CallGraphProfileSort) {
if (auto *Arg = Args.getLastArg(OPT_call_graph_ordering_file))
if (Optional<MemoryBufferRef> Buffer = readFile(Arg->getValue()))
readCallGraph(*Buffer);
readCallGraphsFromObjectFiles<ELFT>();
}

// Write the result to the file.
writeResult<ELFT>();
Expand Down
4 changes: 4 additions & 0 deletions lld/ELF/Options.td
Expand Up @@ -74,6 +74,10 @@ defm as_needed: B<"as-needed",
defm call_graph_ordering_file:
Eq<"call-graph-ordering-file", "Layout sections to optimize the given callgraph">;

defm call_graph_profile_sort: B<"call-graph-profile-sort",
"Reorder sections with call graph profile (default)",
"Do not reorder sections with call graph profile">;

// -chroot doesn't have a help text because it is an internal option.
def chroot: Separate<["--", "-"], "chroot">;

Expand Down
25 changes: 14 additions & 11 deletions lld/test/ELF/cgprofile-obj.s
@@ -1,8 +1,10 @@
# REQUIRES: x86

# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t
# RUN: ld.lld -e A %t -o %t2
# RUN: llvm-readobj -symbols %t2 | FileCheck %s
# RUN: llvm-mc -filetype=obj -triple=x86_64-unknown-linux %s -o %t.o
# RUN: ld.lld -e A %t.o -o %t
# RUN: llvm-nm --no-sort %t | FileCheck %s
# RUN: ld.lld --no-call-graph-profile-sort -e A %t.o -o %t
# RUN: llvm-nm --no-sort %t | FileCheck %s --check-prefix=NO-CG

.section .text.D,"ax",@progbits
D:
Expand Down Expand Up @@ -31,11 +33,12 @@ Aa:
.cg_profile B, C, 30
.cg_profile C, D, 90

# CHECK: Name: D
# CHECK-NEXT: Value: 0x201003
# CHECK: Name: A
# CHECK-NEXT: Value: 0x201000
# CHECK: Name: B
# CHECK-NEXT: Value: 0x201001
# CHECK: Name: C
# CHECK-NEXT: Value: 0x201002
# CHECK: 0000000000201003 t D
# CHECK: 0000000000201000 T A
# CHECK: 0000000000201001 T B
# CHECK: 0000000000201002 T C

# NO-CG: 0000000000201000 t D
# NO-CG: 0000000000201003 T A
# NO-CG: 0000000000201002 T B
# NO-CG: 0000000000201001 T C

0 comments on commit cc18f8a

Please sign in to comment.