[lld] [clang] [llvm] [Propeller] Add new flag option '-basic-block-sections=listwithlabels=' to support to use Propeller iteratively. (PR #76497)
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)
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