[llvm] [llvm-profdata] Enabled functionality to write split-layout profile (PR #101795)

William Junda Huang via llvm-commits llvm-commits at lists.llvm.org
Fri Aug 2 22:54:08 PDT 2024


https://github.com/huangjd created https://github.com/llvm/llvm-project/pull/101795

Using the flag `-split_layout` in llvm-profdata merge, the output profile can write profiles with and without inlined function into two different extbinary sections (and their FuncOffsetTable too). The section without inlined functions are marked with `SecFlagFlat` and is skipped by ThinLTO because it provides no useful info.

The split layout feature was already implemented in SampleProfWriter but previously there is no way to use it from llvm-profdata.

>From 5b28323c83d67de48d53cdcfda448980bcc03615 Mon Sep 17 00:00:00 2001
From: William Huang <williamjhuang at google.com>
Date: Sat, 3 Aug 2024 01:15:55 -0400
Subject: [PATCH] [llvm-profdata] Enabled functionality to write split-layout
 profile

Using the flag `-split_layout` in llvm-profdata merge, the output
profile can write profiles with and without inlined function into two
different extbinary sections (and their FuncOffsetTable too). The
section without inlined functions are marked with `SecFlagFlat` and is
skipped by ThinLTO because it provides no useful info.

The split layout feature was already implemented in SampleProfWriter but previously
there is no way from the tool to use it.
---
 llvm/docs/CommandGuide/llvm-profdata.rst          |   6 ++++++
 .../llvm-profdata/Inputs/split-layout.profdata    | Bin 0 -> 521 bytes
 .../tools/llvm-profdata/sample-split-layout.test  |   2 ++
 llvm/tools/llvm-profdata/llvm-profdata.cpp        |  12 ++++++++++++
 4 files changed, 20 insertions(+)
 create mode 100644 llvm/test/tools/llvm-profdata/Inputs/split-layout.profdata
 create mode 100644 llvm/test/tools/llvm-profdata/sample-split-layout.test

diff --git a/llvm/docs/CommandGuide/llvm-profdata.rst b/llvm/docs/CommandGuide/llvm-profdata.rst
index acf016a6dbcd7..166f694a2a611 100644
--- a/llvm/docs/CommandGuide/llvm-profdata.rst
+++ b/llvm/docs/CommandGuide/llvm-profdata.rst
@@ -162,6 +162,12 @@ OPTIONS
  coverage for the optimized target. This option can only be used with
  sample-based profile in extbinary format.
 
+.. option:: --split_layout=[true|false]
+
+ Split the profile data section to two with one containing sample profiles with
+ inlined functions and the other not. This option can only be used with
+ sample-based profile in extbinary format.
+
 .. option:: --convert-sample-profile-layout=[nest|flat]
 
  Convert the merged profile into a profile with a new layout. Supported
diff --git a/llvm/test/tools/llvm-profdata/Inputs/split-layout.profdata b/llvm/test/tools/llvm-profdata/Inputs/split-layout.profdata
new file mode 100644
index 0000000000000000000000000000000000000000..bc473ae76558f16d2f46a5e35e4e62cad6bedd0a
GIT binary patch
literal 521
zcmZp9a$)0_lT%g%r*kks03(!!Q9 at 9G45$DTOae+*LFLt;d=@nM7f^X-sJH@}`~s-F
z2UHxUA7&2=l);LoA141As$UW+53>hm4JS+?Q~+iUF8Th{1p;%qxtRqf_$?4%T+qt~
zBoEBunIORQV7U;GY}hJsfuDK7A-TESEC<f3Z02Bla7PPBHoP);!Op(myV*1r?hk)0
zf#im5HbC;m9}sz`*%nA{YXOn_!6a*ZlyOpGQ6>YBPRq~FWXR0R$;?YNgwjR~xrv#1
z3=Axn=W?^NFic}%U||9htPGnu7+4vB1RKKw0S0!E1SbQ~Sq%HR8NahIaWOExU}t1x
xc)`xVz{S9Pfgi}ez|X+I$igs}o8jy{Mj#)^V0gsBINt`yegq6|U;r`l0svM#PiFuC

literal 0
HcmV?d00001

diff --git a/llvm/test/tools/llvm-profdata/sample-split-layout.test b/llvm/test/tools/llvm-profdata/sample-split-layout.test
new file mode 100644
index 0000000000000..60a194e108362
--- /dev/null
+++ b/llvm/test/tools/llvm-profdata/sample-split-layout.test
@@ -0,0 +1,2 @@
+RUN: llvm-profdata merge --sample --extbinary --split_layout %p/Inputs/sample-profile.proftext -o %t-output
+RUN: diff %t-output %p/Inputs/split-layout.profdata
diff --git a/llvm/tools/llvm-profdata/llvm-profdata.cpp b/llvm/tools/llvm-profdata/llvm-profdata.cpp
index 1f6c4c604d57b..1f6efa788b1b8 100644
--- a/llvm/tools/llvm-profdata/llvm-profdata.cpp
+++ b/llvm/tools/llvm-profdata/llvm-profdata.cpp
@@ -207,6 +207,12 @@ cl::opt<bool> GenPartialProfile(
     "gen-partial-profile", cl::init(false), cl::Hidden,
     cl::sub(MergeSubcommand),
     cl::desc("Generate a partial profile (only meaningful for -extbinary)"));
+cl::opt<bool> SplitLayout(
+    "split_layout", cl::init(false), cl::Hidden,
+    cl::sub(MergeSubcommand),
+    cl::desc("Split the profile to two sections with one containing sample "
+             "profiles with inlined functions and the another not (only "
+             "meaningful for -extbinary)"));
 cl::opt<std::string> SupplInstrWithSample(
     "supplement-instr-with-sample", cl::init(""), cl::Hidden,
     cl::sub(MergeSubcommand),
@@ -1492,6 +1498,12 @@ static void handleExtBinaryWriter(sampleprof::SampleProfileWriter &Writer,
     else
       Writer.setPartialProfile();
   }
+  if (SplitLayout) {
+    if (OutputFormat != PF_Ext_Binary)
+      warn("-split-layout is ignored. Specify -extbinary to enable it");
+    else
+      Writer.resetSecLayout(SectionLayout::CtxSplitLayout);
+  }
 }
 
 static void mergeSampleProfile(const WeightedFileVector &Inputs,



More information about the llvm-commits mailing list