Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Propeller] Add new flag option '-basic-block-sections=listwithlabels=' to support to use Propeller iteratively. #76497

Closed
wants to merge 3 commits into from

Conversation

lifengxiang1025
Copy link
Contributor

@lifengxiang1025 lifengxiang1025 commented Dec 28, 2023

As discuss in https://discourse.llvm.org/t/is-it-possible-to-use-propeller-iteratively/67560. Add new option listwithlabels to emit llvm_bb_addr_map section when Propeller is enabled. This can be used for creating new profile by sampling executable which has enabled Propeller.

@llvmbot llvmbot added clang Clang issues not falling into any other category lld backend:X86 clang:driver 'clang' and 'clang++' user-facing binaries. Not 'clang-cl' clang:frontend Language frontend issues, e.g. anything involving "Sema" clang:codegen lld:ELF labels Dec 28, 2023
@llvmbot
Copy link
Member

llvmbot commented Dec 28, 2023

@llvm/pr-subscribers-lld
@llvm/pr-subscribers-backend-x86
@llvm/pr-subscribers-lld-elf
@llvm/pr-subscribers-clang-driver

@llvm/pr-subscribers-clang-codegen

Author: None (lifengxiang1025)

Changes

As discuss in https://discourse.llvm.org/t/is-it-possible-to-use-propeller-iteratively/67560. Add new option listwithlabels to emit llvm_bb_addr_map section when Propeller is enabled. This can be used for creating new profile by sampleing executable which has enabled Propeller.


Patch is 20.25 KiB, truncated to 20.00 KiB below, full version: https://github.com/llvm/llvm-project/pull/76497.diff

18 Files Affected:

  • (modified) clang/docs/UsersManual.rst (+1-1)
  • (modified) clang/include/clang/Basic/CodeGenOptions.h (+2)
  • (modified) clang/include/clang/Driver/Options.td (+1-1)
  • (modified) clang/lib/CodeGen/BackendUtil.cpp (+6-2)
  • (modified) clang/lib/Driver/ToolChains/Clang.cpp (+1-1)
  • (modified) clang/test/CodeGen/basic-block-sections.c (+2-1)
  • (modified) clang/test/Driver/fbasic-block-sections.c (+4)
  • (modified) lld/ELF/Driver.cpp (+1-1)
  • (modified) lld/ELF/LTO.cpp (+6-2)
  • (modified) llvm/include/llvm/CodeGen/MachineFunction.h (+4-2)
  • (modified) llvm/include/llvm/Target/TargetOptions.h (+2-1)
  • (modified) llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp (+31-19)
  • (modified) llvm/lib/CodeGen/BasicBlockPathCloning.cpp (+3-1)
  • (modified) llvm/lib/CodeGen/BasicBlockSections.cpp (+4-2)
  • (modified) llvm/lib/CodeGen/CommandFlags.cpp (+5-1)
  • (modified) llvm/lib/CodeGen/MachineFunction.cpp (+2-1)
  • (modified) llvm/lib/CodeGen/TargetPassConfig.cpp (+2-1)
  • (modified) llvm/test/CodeGen/X86/basic-block-sections-cold.ll (+8)
diff --git a/clang/docs/UsersManual.rst b/clang/docs/UsersManual.rst
index 2e658557b0e310..93ceaa62c785f3 100644
--- a/clang/docs/UsersManual.rst
+++ b/clang/docs/UsersManual.rst
@@ -2277,7 +2277,7 @@ are listed below.
      $ cd $P/bar && clang -c -funique-internal-linkage-names name_conflict.c
      $ cd $P && clang foo/name_conflict.o && bar/name_conflict.o
 
-.. option:: -fbasic-block-sections=[labels, all, list=<arg>, none]
+.. option:: -fbasic-block-sections=[labels, all, list=<arg>, listwithlabels=<arg>, none]
 
   Controls how Clang emits text sections for basic blocks. With values ``all``
   and ``list=<arg>``, each basic block or a subset of basic blocks can be placed
diff --git a/clang/include/clang/Basic/CodeGenOptions.h b/clang/include/clang/Basic/CodeGenOptions.h
index b202d01af0ed6c..165c885118e7a0 100644
--- a/clang/include/clang/Basic/CodeGenOptions.h
+++ b/clang/include/clang/Basic/CodeGenOptions.h
@@ -117,6 +117,8 @@ class CodeGenOptions : public CodeGenOptionsBase {
   // "list=<file>": Generate basic block sections for a subset of basic blocks.
   //                The functions and the machine basic block ids are specified
   //                in the file.
+  // "listwithlabels=<file>":
+  //                Mix of list and labels.
   // "none":        Disable sections/labels for basic blocks.
   std::string BBSections;
 
diff --git a/clang/include/clang/Driver/Options.td b/clang/include/clang/Driver/Options.td
index b2f2bcb6ac3791..e4f9dab333452f 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -3913,7 +3913,7 @@ def fbasic_block_sections_EQ : Joined<["-"], "fbasic-block-sections=">, Group<f_
   Visibility<[ClangOption, CC1Option, CC1AsOption]>,
   HelpText<"Place each function's basic blocks in unique sections (ELF Only)">,
   DocBrief<[{Generate labels for each basic block or place each basic block or a subset of basic blocks in its own section.}]>,
-  Values<"all,labels,none,list=">,
+  Values<"all,labels,none,list=,listwithlabels=">,
   MarshallingInfoString<CodeGenOpts<"BBSections">, [{"none"}]>;
 defm data_sections : BoolFOption<"data-sections",
   CodeGenOpts<"DataSections">, DefaultFalse,
diff --git a/clang/lib/CodeGen/BackendUtil.cpp b/clang/lib/CodeGen/BackendUtil.cpp
index a7a47d17723cb7..e82978599f9f49 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -375,11 +375,15 @@ static bool initTargetOptions(DiagnosticsEngine &Diags,
           .Case("labels", llvm::BasicBlockSection::Labels)
           .StartsWith("list=", llvm::BasicBlockSection::List)
           .Case("none", llvm::BasicBlockSection::None)
+          .StartsWith("listwithlabels=",
+                      llvm::BasicBlockSection::ListWithLabels)
           .Default(llvm::BasicBlockSection::None);
 
-  if (Options.BBSections == llvm::BasicBlockSection::List) {
+  if (Options.BBSections == llvm::BasicBlockSection::List ||
+      Options.BBSections == llvm::BasicBlockSection::ListWithLabels) {
     ErrorOr<std::unique_ptr<MemoryBuffer>> MBOrErr =
-        MemoryBuffer::getFile(CodeGenOpts.BBSections.substr(5));
+        MemoryBuffer::getFile(CodeGenOpts.BBSections.substr(
+            Options.BBSections == llvm::BasicBlockSection::List ? 5 : 15));
     if (!MBOrErr) {
       Diags.Report(diag::err_fe_unable_to_load_basic_block_sections_file)
           << MBOrErr.getError().message();
diff --git a/clang/lib/Driver/ToolChains/Clang.cpp b/clang/lib/Driver/ToolChains/Clang.cpp
index 6dec117aed1056..3ca1147a64c4fd 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -5931,7 +5931,7 @@ void Clang::ConstructJob(Compilation &C, const JobAction &JA,
     StringRef Val = A->getValue();
     if (Triple.isX86() && Triple.isOSBinFormatELF()) {
       if (Val != "all" && Val != "labels" && Val != "none" &&
-          !Val.startswith("list="))
+          !Val.startswith("list=") && !Val.startswith("listwithlabels="))
         D.Diag(diag::err_drv_invalid_value)
             << A->getAsString(Args) << A->getValue();
       else
diff --git a/clang/test/CodeGen/basic-block-sections.c b/clang/test/CodeGen/basic-block-sections.c
index a61b8dd4ac376f..e0e275fca662dd 100644
--- a/clang/test/CodeGen/basic-block-sections.c
+++ b/clang/test/CodeGen/basic-block-sections.c
@@ -10,6 +10,8 @@
 // RUN: not %clang_cc1 -fbasic-block-sections=list= -emit-obj -o %t %s 2>&1 | FileCheck -DMSG=%errc_ENOENT %s --check-prefix=ERROR
 // RUN: not ls %t
 
+// RUN: %clang_cc1 -triple x86_64 -S -fbasic-block-sections=listwithlabels=%S/Inputs/basic-block-sections.funcnames -o - < %s | FileCheck %s --check-prefix=BB_WORLD  --check-prefix=BB_LIST
+
 int world(int a) {
   if (a > 10)
     return 10;
@@ -37,7 +39,6 @@ int another(int a) {
 // BB_LIST-NOT: .section .text.another,"ax",@progbits
 // BB_LIST: another:
 // BB_LIST-NOT: another.__part.1:
-//
 // UNIQUE: .section .text.world.world.__part.1,
 // UNIQUE: .section .text.another.another.__part.1,
 // ERROR: error:  unable to load basic block sections function list: '[[MSG]]'
diff --git a/clang/test/Driver/fbasic-block-sections.c b/clang/test/Driver/fbasic-block-sections.c
index 417cf9b6319bde..7dc66ad0cb32b7 100644
--- a/clang/test/Driver/fbasic-block-sections.c
+++ b/clang/test/Driver/fbasic-block-sections.c
@@ -1,6 +1,7 @@
 // RUN: %clang -### -target x86_64 -fbasic-block-sections=none %s -S 2>&1 | FileCheck -check-prefix=CHECK-OPT-NONE %s
 // RUN: %clang -### -target x86_64 -fbasic-block-sections=all %s -S 2>&1 | FileCheck -check-prefix=CHECK-OPT-ALL %s
 // RUN: %clang -### -target x86_64 -fbasic-block-sections=list=%s %s -S 2>&1 | FileCheck -check-prefix=CHECK-OPT-LIST %s
+// RUN: %clang -### -target x86_64 -fbasic-block-sections=listwithlabels=%s %s -S 2>&1 | FileCheck -check-prefix=CHECK-OPT-LISTWITHLABELS %s
 // RUN: %clang -### -target x86_64 -fbasic-block-sections=labels %s -S 2>&1 | FileCheck -check-prefix=CHECK-OPT-LABELS %s
 // RUN: not %clang -c -target arm-unknown-linux -fbasic-block-sections=all %s -S 2>&1 | FileCheck -check-prefix=CHECK-TRIPLE %s
 // RUN: %clang -### -target arm-unknown-linux -fbasic-block-sections=all -fbasic-block-sections=none %s -S 2>&1 \
@@ -8,7 +9,9 @@
 // RUN: not %clang -c -target x86_64-apple-darwin10 -fbasic-block-sections=all %s -S 2>&1 | FileCheck -check-prefix=CHECK-TRIPLE %s
 // RUN: not %clang -### -target x86_64 -fbasic-block-sections=alll %s -S 2>&1 | FileCheck -check-prefix=CHECK-INVALID-VALUE %s
 // RUN: not %clang -### -target x86_64 -fbasic-block-sections=list %s -S 2>&1 | FileCheck -check-prefix=CHECK-INVALID-VALUE %s
+// RUN: not %clang -### -target x86_64 -fbasic-block-sections=listwithlabels %s -S 2>&1 | FileCheck -check-prefix=CHECK-INVALID-VALUE %s
 // RUN: %clang -### -target x86_64 -fbasic-block-sections=list= %s -S 2>&1 | FileCheck -check-prefix=CHECK-OPT-NULL-LIST %s
+// RUN: %clang -### -target x86_64 -fbasic-block-sections=listwithlabels= %s -S 2>&1 | FileCheck -check-prefix=CHECK-OPT-NULL-LIST %s
 // RUN: %clang -### -target x86_64 -fbasic-block-sections=none %s -S 2>&1 | FileCheck -check-prefix=CHECK-OPT-NONE %s
 // RUN: %clang -### -x cuda -nocudainc -nocudalib --target=x86_64 -fbasic-block-sections=all --cuda-path=%S/Inputs/CUDA/usr/local/cuda %s -c 2>&1 \
 // RUN:   | FileCheck -check-prefix=CHECK-CUDA %s
@@ -18,6 +21,7 @@
 // CHECK-OPT-NONE:   "-fbasic-block-sections=none"
 // CHECK-OPT-ALL:    "-fbasic-block-sections=all"
 // CHECK-OPT-LIST:   "-fbasic-block-sections={{[^ ]*}}fbasic-block-sections.c"
+// CHECK-OPT-LISTWITHLABELS:   "-fbasic-block-sections={{[^ ]*}}fbasic-block-sections.c"
 // CHECK-OPT-LABELS: "-fbasic-block-sections=labels"
 // CHECK-TRIPLE:     error: unsupported option '-fbasic-block-sections=all' for target
 // CHECK-INVALID-VALUE: error: invalid value {{[^ ]*}} in '-fbasic-block-sections={{.*}}'
diff --git a/lld/ELF/Driver.cpp b/lld/ELF/Driver.cpp
index 6290880c43d3b9..d0624942d1ae27 100644
--- a/lld/ELF/Driver.cpp
+++ b/lld/ELF/Driver.cpp
@@ -1320,7 +1320,7 @@ static void readConfigs(opt::InputArgList &args) {
   config->ltoPartitions = args::getInteger(args, OPT_lto_partitions, 1);
   config->ltoSampleProfile = args.getLastArgValue(OPT_lto_sample_profile);
   config->ltoBasicBlockSections =
-      args.getLastArgValue(OPT_lto_basic_block_sections);
+      args.getArgString(OPT_lto_basic_block_sections);
   config->ltoUniqueBasicBlockSectionNames =
       args.hasFlag(OPT_lto_unique_basic_block_section_names,
                    OPT_no_lto_unique_basic_block_section_names, false);
diff --git a/lld/ELF/LTO.cpp b/lld/ELF/LTO.cpp
index 504c12aac6c569..3c0fb2b945a60d 100644
--- a/lld/ELF/LTO.cpp
+++ b/lld/ELF/LTO.cpp
@@ -71,15 +71,19 @@ static lto::Config createConfig() {
     } else if (config->ltoBasicBlockSections == "none") {
       c.Options.BBSections = BasicBlockSection::None;
     } else {
+      if (config->ltoBasicBlockSections.startswith("listwithlabels"))
+        c.Options.BBSections = BasicBlockSection::ListWithLabels;
+      else
+        c.Options.BBSections = BasicBlockSection::List;
       ErrorOr<std::unique_ptr<MemoryBuffer>> MBOrErr =
-          MemoryBuffer::getFile(config->ltoBasicBlockSections.str());
+          MemoryBuffer::getFile(config->ltoBasicBlockSections.substr(
+              c.Options.BBSections == BasicBlockSection::List ? 0 : 15));
       if (!MBOrErr) {
         error("cannot open " + config->ltoBasicBlockSections + ":" +
               MBOrErr.getError().message());
       } else {
         c.Options.BBSectionsFuncListBuf = std::move(*MBOrErr);
       }
-      c.Options.BBSections = BasicBlockSection::List;
     }
   }
 
diff --git a/llvm/include/llvm/CodeGen/MachineFunction.h b/llvm/include/llvm/CodeGen/MachineFunction.h
index 05c9b14a423cda..74e2a044dc1117 100644
--- a/llvm/include/llvm/CodeGen/MachineFunction.h
+++ b/llvm/include/llvm/CodeGen/MachineFunction.h
@@ -694,12 +694,14 @@ class LLVM_EXTERNAL_VISIBILITY MachineFunction {
   bool hasBBSections() const {
     return (BBSectionsType == BasicBlockSection::All ||
             BBSectionsType == BasicBlockSection::List ||
-            BBSectionsType == BasicBlockSection::Preset);
+            BBSectionsType == BasicBlockSection::Preset ||
+            BBSectionsType == BasicBlockSection::ListWithLabels);
   }
 
   /// Returns true if basic block labels are to be generated for this function.
   bool hasBBLabels() const {
-    return BBSectionsType == BasicBlockSection::Labels;
+    return BBSectionsType == BasicBlockSection::Labels ||
+           BBSectionsType == BasicBlockSection::ListWithLabels;
   }
 
   void setBBSectionsType(BasicBlockSection V) { BBSectionsType = V; }
diff --git a/llvm/include/llvm/Target/TargetOptions.h b/llvm/include/llvm/Target/TargetOptions.h
index d6d767f3d22c73..457417cdfcc76d 100644
--- a/llvm/include/llvm/Target/TargetOptions.h
+++ b/llvm/include/llvm/Target/TargetOptions.h
@@ -70,7 +70,8 @@ namespace llvm {
     Preset, // Similar to list but the blocks are identified by passes which
             // seek to use Basic Block Sections, e.g. MachineFunctionSplitter.
             // This option cannot be set via the command line.
-    None    // Do not use Basic Block Sections.
+    ListWithLabels, // Mix of list and labels.
+    None            // Do not use Basic Block Sections.
   };
 
   enum class EABI {
diff --git a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
index 15ff3988368036..874316acdcd954 100644
--- a/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
+++ b/llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp
@@ -126,7 +126,6 @@
 #include <string>
 #include <utility>
 #include <vector>
-
 using namespace llvm;
 
 #define DEBUG_TYPE "asm-printer"
@@ -1357,25 +1356,35 @@ void AsmPrinter::emitBBAddrMapSection(const MachineFunction &MF) {
   MCSection *BBAddrMapSection =
       getObjFileLowering().getBBAddrMapSection(*MF.getSection());
   assert(BBAddrMapSection && ".llvm_bb_addr_map section is not initialized.");
-
-  const MCSymbol *FunctionSymbol = getFunctionBegin();
-
-  OutStreamer->pushSection();
-  OutStreamer->switchSection(BBAddrMapSection);
-  OutStreamer->AddComment("version");
   uint8_t BBAddrMapVersion = OutStreamer->getContext().getBBAddrMapVersion();
-  OutStreamer->emitInt8(BBAddrMapVersion);
-  OutStreamer->AddComment("feature");
-  OutStreamer->emitInt8(0);
-  OutStreamer->AddComment("function address");
-  OutStreamer->emitSymbolValue(FunctionSymbol, getPointerSize());
-  OutStreamer->AddComment("number of basic blocks");
-  OutStreamer->emitULEB128IntValue(MF.size());
-  const MCSymbol *PrevMBBEndSymbol = FunctionSymbol;
-  // Emit BB Information for each basic block in the function.
+  std::unordered_map<MCSymbol *, uint64_t> SectionSize;
+  MCSymbol *BeginMBBSymbol = nullptr;
+  MCSymbol *PrevMBBEndSymbol = nullptr;
   for (const MachineBasicBlock &MBB : MF) {
-    const MCSymbol *MBBSymbol =
-        MBB.isEntryBlock() ? FunctionSymbol : MBB.getSymbol();
+    if (MBB.isBeginSection() || MBB.isEntryBlock()) {
+      BeginMBBSymbol =
+          MBB.isEntryBlock() ? getFunctionBegin() : MBB.getSymbol();
+    }
+    SectionSize[BeginMBBSymbol]++;
+  }
+  unsigned int i = 0;
+  for (const MachineBasicBlock &MBB : MF) {
+    MCSymbol *MBBSymbol =
+        MBB.isEntryBlock() ? getFunctionBegin() : MBB.getSymbol();
+    if (MBB.isBeginSection() || MBB.isEntryBlock()) {
+      OutStreamer->pushSection();
+      OutStreamer->switchSection(BBAddrMapSection);
+      OutStreamer->AddComment("version");
+      OutStreamer->emitInt8(BBAddrMapVersion);
+      OutStreamer->AddComment("feature");
+      OutStreamer->emitInt8(0);
+      OutStreamer->AddComment("function address");
+      OutStreamer->emitSymbolValue(MBBSymbol, getPointerSize());
+      OutStreamer->AddComment("number of basic blocks");
+      OutStreamer->emitULEB128IntValue(SectionSize[MBBSymbol]);
+      BeginMBBSymbol = MBBSymbol;
+      PrevMBBEndSymbol = MBBSymbol;
+    }
     // TODO: Remove this check when version 1 is deprecated.
     if (BBAddrMapVersion > 1) {
       OutStreamer->AddComment("BB id");
@@ -1395,8 +1404,11 @@ void AsmPrinter::emitBBAddrMapSection(const MachineFunction &MF) {
     // Emit the Metadata.
     OutStreamer->emitULEB128IntValue(getBBAddrMapMetadata(MBB));
     PrevMBBEndSymbol = MBB.getEndSymbol();
+    if (MBB.isEndSection() || i == MF.size() - 1) {
+      OutStreamer->popSection();
+    }
+    ++i;
   }
-  OutStreamer->popSection();
 }
 
 void AsmPrinter::emitKCFITrapEntry(const MachineFunction &MF,
diff --git a/llvm/lib/CodeGen/BasicBlockPathCloning.cpp b/llvm/lib/CodeGen/BasicBlockPathCloning.cpp
index 5d5f3c3da48160..92591e493b7532 100644
--- a/llvm/lib/CodeGen/BasicBlockPathCloning.cpp
+++ b/llvm/lib/CodeGen/BasicBlockPathCloning.cpp
@@ -225,7 +225,9 @@ INITIALIZE_PASS_END(
     false)
 
 bool BasicBlockPathCloning::runOnMachineFunction(MachineFunction &MF) {
-  assert(MF.getTarget().getBBSectionsType() == BasicBlockSection::List &&
+  assert((MF.getTarget().getBBSectionsType() == BasicBlockSection::List ||
+          MF.getTarget().getBBSectionsType() ==
+              BasicBlockSection::ListWithLabels) &&
          "BB Sections list not enabled!");
   if (hasInstrProfHashMismatch(MF))
     return false;
diff --git a/llvm/lib/CodeGen/BasicBlockSections.cpp b/llvm/lib/CodeGen/BasicBlockSections.cpp
index 42997d2287d61d..7f0e93eb225cfd 100644
--- a/llvm/lib/CodeGen/BasicBlockSections.cpp
+++ b/llvm/lib/CodeGen/BasicBlockSections.cpp
@@ -291,7 +291,8 @@ bool BasicBlockSections::runOnMachineFunction(MachineFunction &MF) {
   // clusters of basic blocks using basic block ids. Source drift can
   // invalidate these groupings leading to sub-optimal code generation with
   // regards to performance.
-  if (BBSectionsType == BasicBlockSection::List &&
+  if ((BBSectionsType == BasicBlockSection::List ||
+       BBSectionsType == BasicBlockSection::ListWithLabels) &&
       hasInstrProfHashMismatch(MF))
     return false;
   // Renumber blocks before sorting them. This is useful for accessing the
@@ -304,7 +305,8 @@ bool BasicBlockSections::runOnMachineFunction(MachineFunction &MF) {
   }
 
   DenseMap<UniqueBBID, BBClusterInfo> FuncClusterInfo;
-  if (BBSectionsType == BasicBlockSection::List) {
+  if (BBSectionsType == BasicBlockSection::List ||
+      BBSectionsType == BasicBlockSection::ListWithLabels) {
     auto [HasProfile, ClusterInfo] =
         getAnalysis<BasicBlockSectionsProfileReader>()
             .getClusterInfoForFunction(MF.getName());
diff --git a/llvm/lib/CodeGen/CommandFlags.cpp b/llvm/lib/CodeGen/CommandFlags.cpp
index c6d7827f36dfd6..1bfcbb47c4cfbc 100644
--- a/llvm/lib/CodeGen/CommandFlags.cpp
+++ b/llvm/lib/CodeGen/CommandFlags.cpp
@@ -517,13 +517,17 @@ codegen::getBBSectionsMode(llvm::TargetOptions &Options) {
     return BasicBlockSection::None;
   else {
     ErrorOr<std::unique_ptr<MemoryBuffer>> MBOrErr =
-        MemoryBuffer::getFile(getBBSections());
+        MemoryBuffer::getFile(getBBSections().substr(
+            getBBSections().find("listwithlabels=") == std::string::npos ? 0
+                                                                         : 15));
     if (!MBOrErr) {
       errs() << "Error loading basic block sections function list file: "
              << MBOrErr.getError().message() << "\n";
     } else {
       Options.BBSectionsFuncListBuf = std::move(*MBOrErr);
     }
+    if (getBBSections().find("listwithlabels=") != std::string::npos)
+      return BasicBlockSection::ListWithLabels;
     return BasicBlockSection::List;
   }
 }
diff --git a/llvm/lib/CodeGen/MachineFunction.cpp b/llvm/lib/CodeGen/MachineFunction.cpp
index 07eb0ba7f45c2e..e795774341dfc9 100644
--- a/llvm/lib/CodeGen/MachineFunction.cpp
+++ b/llvm/lib/CodeGen/MachineFunction.cpp
@@ -466,7 +466,8 @@ MachineFunction::CreateMachineBasicBlock(const BasicBlock *BB,
   // `-basic-block-sections=list` to allow robust mapping of profiles to basic
   // blocks.
   if (Target.getBBSectionsType() == BasicBlockSection::Labels ||
-      Target.getBBSectionsType() == BasicBlockSection::List)
+      Target.getBBSectionsType() == BasicBlockSection::List ||
+      Target.getBBSectionsType() == BasicBlockSection::ListWithLabels)
     MBB->setBBID(BBID.has_value() ? *BBID : UniqueBBID{NextBBID++, 0});
   return MBB;
 }
diff --git a/llvm/lib/CodeGen/TargetPassConfig.cpp b/llvm/lib/CodeGen/TargetPassConfig.cpp
index 1f7c949cd6031b..a7da21e847df84 100644
--- a/llvm/lib/CodeGen/TargetPassConfig.cpp
+++ b/llvm/lib/CodeGen/TargetPassConfig.cpp
@@ -1264,7 +1264,8 @@ void TargetPassConfig::addMachinePasses() {
   // FIXME: In principle, BasicBlockSection::Labels and splitting can used
   // together. Update this check once we have addressed any issues.
   if (TM->getBBSectionsType() != llvm::BasicBlockSection::None) {
-    if (TM->getBBSectionsType() == llvm::BasicBlockSection::List) {
+    if (TM->getBBSectionsType() == llvm::BasicBlockSection::List ||
+        TM->getBBSectionsType() == llvm::BasicBlockSection::ListWithLabels) {
       addPass(llvm::createBasicBlockSectionsProfileReaderPass(
           TM->getBBSectionsFuncListBuf()));
       addPass(llvm::createBasicBlockPathCloningPass());
diff --git a/llvm/test/CodeGen/X86/basic-block-sections-cold.ll b/llvm/test/CodeGen/X86/basic-block-sections-cold.ll
index 58cec1b658c1e6..e498710c1be0f1 100644
--- a/llvm/test/CodeGen/X86/basic-block-sections-cold.ll
+++ b/llvm/test/CodeGen/X86/basic-block-sections-cold.ll
@@ -13,6 +13,7 @@
 ; RUN: llc < %s -mtriple=x86_64 -function-sections -basic-block-sections=%t1 -unique-basic-block-section-names | FileCheck %s -check-prefix=LINUX-SECTIONS
 ; RUN: llc < %s -mtriple=x86_64 -function-sections -basic-block-sections=%t2 -unique-basic-block-section-names | FileCheck %s -check-prefix=LINUX-SECTIONS
 ; RUN: llc < %s -mtriple=x86_64 -function-sections -basic-block-sections=%t1 -unique-basic-block-section-names -bbsections-cold-text-prefix=".text.unlikely." | FileCheck %s -check-prefix=LINUX-SPLIT
+; RUN: llc < %s -mtriple=x86_64 -function-sections -basic-block-sections=listwithlabels=%t1 -unique-basic-block-section-names | FileCheck %s -check-prefix=LINUX-SECTIONS -check-prefix=LABELS
 
 define void @_Z3bazb(i1 zeroext %0) nounwind {
   br i1 %0, label %2, label %4
@@ -49,3 +50,10 @@ declare i32 @_Z3foov() #1
 ; LINUX-SPLIT-NEXT:   callq _Z3barv
 ; LINUX-SPLIT:      .LBB0_2:
 ; LINUX-SPLIT:      .LBB_END0_2:
+
+; LABELS: .ul...
[truncated]

@rlavaee
Copy link
Contributor

rlavaee commented Jan 2, 2024

Thanks for looking into this. I didn't know you're still working on it. I have a complete PR (including changes to llvm-objdump, llvm-readobj, etc.) ready here : https://github.com/rlavaee/llvm-project/tree/bb-addr-map

@lifengxiang1025
Copy link
Contributor Author

lifengxiang1025 commented Jan 3, 2024

Thanks for looking into this. I didn't know you're still working on it. I have a complete PR (including changes to llvm-objdump, llvm-readobj, etc.) ready here : https://github.com/rlavaee/llvm-project/tree/bb-addr-map

@rlavaee It's ok. This PR doesn't take me long time. As a propeller user, I just want to use propeller iteratively as soon as possible.
So when do you plan to merge your PR?
BTW, there is another question about profiling tool google/autofdo#182.
(I'm focusing on enabling propeller in our service recently. Maybe I can do something if you need assistance.)

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
backend:X86 clang:codegen clang:driver 'clang' and 'clang++' user-facing binaries. Not 'clang-cl' clang:frontend Language frontend issues, e.g. anything involving "Sema" clang Clang issues not falling into any other category lld:ELF lld
Projects
None yet
Development

Successfully merging this pull request may close these issues.

3 participants