diff options
| author | Fangrui Song <maskray@google.com> | 2018-10-25 23:15:23 +0000 | 
|---|---|---|
| committer | Fangrui Song <maskray@google.com> | 2018-10-25 23:15:23 +0000 | 
| commit | cc18f8aa0f3ca35295419e1f4f0322a6cbe3c70b (patch) | |
| tree | 71bf1606b0c06d79b012d1a99b51f0c0cc34b280 | |
| parent | 2b280ea604aabe286daef9f24d8eb0ffeb5f078e (diff) | |
| download | bcm5719-llvm-cc18f8aa0f3ca35295419e1f4f0322a6cbe3c70b.tar.gz bcm5719-llvm-cc18f8aa0f3ca35295419e1f4f0322a6cbe3c70b.zip  | |
[ELF] Add --{,no-}call-graph-profile-sort (enabled by default)
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
| -rw-r--r-- | lld/ELF/Config.h | 1 | ||||
| -rw-r--r-- | lld/ELF/Driver.cpp | 12 | ||||
| -rw-r--r-- | lld/ELF/Options.td | 4 | ||||
| -rw-r--r-- | lld/test/ELF/cgprofile-obj.s | 25 | 
4 files changed, 27 insertions, 15 deletions
diff --git a/lld/ELF/Config.h b/lld/ELF/Config.h index de751afd002..c669a04ecf3 100644 --- a/lld/ELF/Config.h +++ b/lld/ELF/Config.h @@ -127,6 +127,7 @@ struct Configuration {    bool AsNeeded = false;    bool Bsymbolic;    bool BsymbolicFunctions; +  bool CallGraphProfileSort;    bool CheckSections;    bool CompressDebugSections;    bool Cref; diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp index 556a6aa0015..02220fa83ba 100644 --- a/lld/ELF/Driver.cpp +++ b/lld/ELF/Driver.cpp @@ -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); @@ -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>(); diff --git a/lld/ELF/Options.td b/lld/ELF/Options.td index 1ff1abe0bf2..27cbade418a 100644 --- a/lld/ELF/Options.td +++ b/lld/ELF/Options.td @@ -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">; diff --git a/lld/test/ELF/cgprofile-obj.s b/lld/test/ELF/cgprofile-obj.s index 90cd0f46133..4b7f465328c 100644 --- a/lld/test/ELF/cgprofile-obj.s +++ b/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: @@ -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  | 

