[lld] [clang] [llvm] [Propeller] Add new flag option '-basic-block-sections=listwithlabels=' to support to use Propeller iteratively. (PR #76497)

2024-01-01 Thread via cfe-commits

https://github.com/lifengxiang1025 updated 
https://github.com/llvm/llvm-project/pull/76497

>From 4ae12256cfe621e3051ac4deee60cd1da6c54a65 Mon Sep 17 00:00:00 2001
From: lifengxiang 
Date: Thu, 28 Dec 2023 16:57:54 +0800
Subject: [PATCH 1/2] [Propeller] Add new flag option
 '-basic-block-sections=listwithlabels=' to support to use Propeller
 iteratively.

---
 clang/docs/UsersManual.rst|  2 +-
 clang/include/clang/Basic/CodeGenOptions.h|  2 +
 clang/include/clang/Driver/Options.td |  2 +-
 clang/lib/CodeGen/BackendUtil.cpp |  8 ++-
 clang/lib/Driver/ToolChains/Clang.cpp |  2 +-
 clang/test/CodeGen/basic-block-sections.c |  3 +-
 clang/test/Driver/fbasic-block-sections.c | 26 ++
 lld/ELF/Driver.cpp|  2 +-
 lld/ELF/LTO.cpp   |  8 ++-
 llvm/include/llvm/CodeGen/MachineFunction.h   |  6 ++-
 llvm/include/llvm/Target/TargetOptions.h  |  3 +-
 llvm/lib/CodeGen/AsmPrinter/AsmPrinter.cpp| 50 ---
 llvm/lib/CodeGen/BasicBlockPathCloning.cpp|  4 +-
 llvm/lib/CodeGen/BasicBlockSections.cpp   |  6 ++-
 llvm/lib/CodeGen/CommandFlags.cpp |  6 ++-
 llvm/lib/CodeGen/MachineFunction.cpp  |  3 +-
 llvm/lib/CodeGen/TargetPassConfig.cpp |  3 +-
 .../CodeGen/X86/basic-block-sections-cold.ll  |  8 +++
 18 files changed, 96 insertions(+), 48 deletions(-)

diff --git a/clang/docs/UsersManual.rst b/clang/docs/UsersManual.rst
index 7c30570437e8b0..0a8a2381082a3f 100644
--- a/clang/docs/UsersManual.rst
+++ b/clang/docs/UsersManual.rst
@@ -2292,7 +2292,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=, none]
+.. option:: -fbasic-block-sections=[labels, all, list=, 
listwithlabels=, none]
 
   Controls how Clang emits text sections for basic blocks. With values ``all``
   and ``list=``, 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 6952b48e898a81..dbf550a6d1df24 100644
--- a/clang/include/clang/Basic/CodeGenOptions.h
+++ b/clang/include/clang/Basic/CodeGenOptions.h
@@ -117,6 +117,8 @@ class CodeGenOptions : public CodeGenOptionsBase {
   // "list=": Generate basic block sections for a subset of basic blocks.
   //The functions and the machine basic block ids are specified
   //in the file.
+  // "listwithlabels=":
+  //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 2b93ddf033499c..286956122f424e 100644
--- a/clang/include/clang/Driver/Options.td
+++ b/clang/include/clang/Driver/Options.td
@@ -3956,7 +3956,7 @@ def fbasic_block_sections_EQ : Joined<["-"], 
"fbasic-block-sections=">, Group,
   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, [{"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 a6142d99f3b688..b248ae3c56ae78 100644
--- a/clang/lib/CodeGen/BackendUtil.cpp
+++ b/clang/lib/CodeGen/BackendUtil.cpp
@@ -380,11 +380,15 @@ static bool initTargetOptions(DiagnosticsEngine ,
   .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> 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 acfa119805068d..038c24d46fdd36 100644
--- a/clang/lib/Driver/ToolChains/Clang.cpp
+++ b/clang/lib/Driver/ToolChains/Clang.cpp
@@ -5888,7 +5888,7 @@ void 

[lld] [clang] [llvm] [Propeller] Add new flag option '-basic-block-sections=listwithlabels=' to support to use Propeller iteratively. (PR #76497)

2023-12-28 Thread via cfe-commits

llvmbot wrote:



@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
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=, none]
+.. option:: -fbasic-block-sections=[labels, all, list=, 
listwithlabels=, none]
 
   Controls how Clang emits text sections for basic blocks. With values ``all``
   and ``list=``, 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=": Generate basic block sections for a subset of basic blocks.
   //The functions and the machine basic block ids are specified
   //in the file.
+  // "listwithlabels=":
+  //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,
   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, [{"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 ,
   .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> 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