gcc/delete-auto-bolt-feature.patch
liyancheng 06c250f7e5 [AutoBOLT] Delete useless auto-bolt feature
GCC 7.3 does not fully support auto-bolt feature, so
remove the dead code.
2023-12-05 22:01:14 +08:00

481 lines
12 KiB
Diff

From 7a43777d1dec212a8e6fb4d30d3ad90298dc54f5 Mon Sep 17 00:00:00 2001
From: liyancheng <412998149@qq.com>
Date: Tue, 5 Dec 2023 20:28:15 +0800
Subject: [PATCH] delete auto-bolt
---
bolt-plugin/bolt-plugin.cc | 372 +------------------------------------
1 file changed, 4 insertions(+), 368 deletions(-)
diff --git a/bolt-plugin/bolt-plugin.cc b/bolt-plugin/bolt-plugin.cc
index f357b00dd..25cd637ea 100644
--- a/bolt-plugin/bolt-plugin.cc
+++ b/bolt-plugin/bolt-plugin.cc
@@ -215,28 +215,10 @@ struct plugin_objfile
const struct ld_plugin_input_file *file;
};
-struct jump_info
-{
- string des_func_name;
- string src_addr_offset;
- string dst_addr_offset;
- string count;
-};
-
-struct func_info
-{
- string function_name;
- string bind_type; /* "GLOBAL","WEAK","LOCAL","UNKNOWN". */
- string size;
- vector<jump_info> edges;
-};
-
/* Define feedback data type. */
enum feedback_type
{
NULL_TYPE, /* No feedback data. */
- PGO_TYPE, /* Feedback data from PGO. */
- AFDO_TYPE, /* Feedback data from AutoFDO. */
BOLT_TYPE, /* Feedback data from BOLT. */
};
@@ -246,10 +228,6 @@ enum feedback_type
/* The FDO section's special prefix names. */
#define ASM_FDO_SECTION_PREFIX ".text.fdo."
-#define ASM_FDO_CALLER_FLAG ".fdo.caller "
-#define ASM_FDO_CALLER_BIND_FLAG ".fdo.caller.bind "
-#define ASM_FDO_CALLER_SIZE_FLAG ".fdo.caller.size "
-#define ASM_FDO_CALLEE_FLAG ".fdo.callee "
static int linker_output_set;
@@ -277,9 +255,6 @@ static enum feedback_type fdo_type = feedback_type::NULL_TYPE;
static vector<string> gcc_options;
-/* Map of <weak_function_name, vector<function_info>> */
-static map<string, vector<struct func_info>> weak_functions;
-
/* Returns 1 if two strings have the same prefix. */
inline static int
@@ -369,14 +344,7 @@ generate_bolt_cmd ()
}
else
{
- if (fdo_type == feedback_type::AFDO_TYPE)
- {
- cmd = string ("llvm-bolt -reorder-functions=hfsort+ ")
- + tmp_out_file_name + " -o " + new_binary
- + " -data=" + bolt_profile_name;
- }
- else if (fdo_type == feedback_type::PGO_TYPE
- || fdo_type == feedback_type::BOLT_TYPE)
+ if (fdo_type == feedback_type::BOLT_TYPE)
{
cmd = string ("llvm-bolt -reorder-blocks=cache+ ")
+ string (" -reorder-functions=hfsort+ ")
@@ -386,12 +354,7 @@ generate_bolt_cmd ()
+ " -data=" + bolt_profile_name;
}
else
- {
- MSG_ERROR ("Invalid profile type!");
- return string ();
- }
- MSG_INFO ("Using the default llvm-bolt optimization option,"
- " manually specify this option by -fbolt-option. ");
+ MSG_ERROR ("Invalid profile type!");
}
return cmd;
}
@@ -460,201 +423,14 @@ cleanup_handler ()
return LDPS_OK;
}
-/* Open BOLT profile file generated by -fauto-bolt. */
-
-static void
-open_bolt_profile_file (const char *file_name)
-{
- if (file_name == NULL)
- {
- MSG_ERROR ("Empty BOLT profile name, exit!");
- }
-
- if (bolt_file_fd == NULL)
- {
- MSG_INFO ("Generate profile file for BOLT: %s", file_name);
- bolt_file_fd = fopen (file_name, "wt");
- if (!bolt_file_fd)
- {
- MSG_ERROR ("Failed to open the file: %s."
- " Please check whether the target path exists.",
- file_name);
- }
- return;
- }
- else
- {
- MSG_WARN ("BOLT profile file: %s is open, skip.", file_name);
- }
-}
-
-/* In BOLT profile, function with same name represent as func_name/file_name/1,
- also, `/` has been added in gcc/final.c, so add /1 if this function is same
- name function. */
-
-static string
-add_suffix (string str)
-{
- if (str.empty () || (strstr (str.c_str (), "/") == NULL))
- {
- return str;
- }
-
- return str + "/1";
-}
-
-/* Dump function info to BOLT profile, bolt_file_fd does not need
- to be closed here. */
-
-static void
-dump_func_to_bolt_profile_file (const struct func_info &func)
-{
- if (func.edges.empty ())
- {
- return;
- }
-
- if (!bolt_file_fd)
- {
- open_bolt_profile_file (bolt_profile_name.c_str ());
-
- /* Check whether the feedback data is from AutoFDO. */
- if (fdo_type == feedback_type::AFDO_TYPE)
- {
- fprintf (bolt_file_fd, "no_lbr cycles:u:\n");
- }
- }
-
- for (const auto &edge: func.edges)
- {
- if (fdo_type == feedback_type::PGO_TYPE)
- {
- fprintf (bolt_file_fd, "1 %s %s 1 %s %s 0 %s\n",
- add_suffix (func.function_name).c_str (),
- edge.src_addr_offset.c_str (),
- add_suffix (edge.des_func_name).c_str (),
- edge.dst_addr_offset.c_str (), edge.count.c_str ());
- }
- else if (fdo_type == feedback_type::AFDO_TYPE)
- {
- fprintf (bolt_file_fd, "1 %s %s %s\n",
- add_suffix (func.function_name).c_str (),
- edge.src_addr_offset.c_str (),
- edge.count.c_str ());
- }
- }
-
- fflush (bolt_file_fd);
-}
-
/* Called by the linker when all symbols have been read. */
static enum ld_plugin_status
all_symbols_read_handler ()
{
- for (const auto &functions: weak_functions)
- {
- /* More than one weak function. */
- if (functions.second.size () > 1)
- {
- MSG_WARN ("The weak function: %s is confusing, take the first one.",
- functions.first.c_str ());
- }
-
- dump_func_to_bolt_profile_file (functions.second[0]);
- }
return LDPS_OK;
}
-/* Move pointer p to end and return end. */
-
-static char *
-get_next_content (char *p, char *end)
-{
- while (*p && p < end)
- {
- p++;
- }
- p++;
-
- return p;
-}
-
-/* Process function head info. */
-
-static char *
-process_function_head (char *data , char *end, struct func_info *func)
-{
- CHECK (is_prefix_of (ASM_FDO_CALLER_FLAG, data), LDPL_FATAL,
- "The function name is missing.");
- func->function_name = xstrdup (data + strlen (ASM_FDO_CALLER_FLAG));
- data = get_next_content (data, end);
-
- CHECK (is_prefix_of (ASM_FDO_CALLER_SIZE_FLAG, data), LDPL_FATAL,
- "The function size is missing.");
- func->size = xstrdup (data + strlen (ASM_FDO_CALLER_SIZE_FLAG));
- data = get_next_content (data, end);
-
- CHECK (is_prefix_of (ASM_FDO_CALLER_BIND_FLAG, data), LDPL_FATAL,
- "The function bind type is missing.");
- func->bind_type = xstrdup (data + strlen (ASM_FDO_CALLER_BIND_FLAG));
- data = get_next_content (data, end);
- return data;
-}
-
-/* Read profile info from the symbol table located between data and end. */
-
-static void
-process_section (char *data, char *end)
-{
- struct func_info func;
-
- data = process_function_head (data, end, &func);
-
- while (*data && data < end)
- {
- struct jump_info jump;
-
- CHECK (data, LDPL_FATAL, "data is NULL");
- jump.src_addr_offset = xstrdup (data);
-
- data = get_next_content (data, end);
- CHECK (data, LDPL_FATAL, "data is NULL");
- if (is_prefix_of (ASM_FDO_CALLEE_FLAG, data))
- {
- jump.des_func_name = xstrdup (data + strlen (ASM_FDO_CALLEE_FLAG));
- jump.dst_addr_offset = "0";
- data = get_next_content (data, end);
- CHECK (data, LDPL_FATAL, "data is NULL");
- }
- else if (fdo_type == feedback_type::PGO_TYPE)
- {
- jump.des_func_name = func.function_name;
- jump.dst_addr_offset = xstrdup (data);
- data = get_next_content (data, end);
- CHECK (data, LDPL_FATAL, "data is NULL");
- }
- else
- {
- jump.des_func_name = func.function_name;
- }
-
- jump.count = xstrdup (data);
- data = get_next_content (data, end);
-
- func.edges.push_back (jump);
- }
-
- if (is_prefix_of ("WEAK", func.bind_type.c_str ()))
- {
- weak_functions[func.function_name].push_back (func);
- }
- else
- {
- dump_func_to_bolt_profile_file (func);
- }
-}
-
/* Process error when calling function process_symtab. */
static int
@@ -694,42 +470,8 @@ process_symtab (void *data, const char *name, off_t offset, off_t length)
{
return 1;
}
-
- secdata = secdatastart = (char *)xmalloc (length * sizeof (char));
- offset += obj->file->offset;
- if (offset != lseek (obj->file->fd, offset, SEEK_SET))
- {
- return process_symtab_error (obj, secdatastart);
- }
-
- do
- {
- ssize_t got = read (obj->file->fd, secdata, length);
-
- if (got == 0)
- {
- break;
- }
- else if (got > 0)
- {
- secdata += got;
- length -= got;
- }
- else if (errno != EINTR)
- {
- return process_symtab_error (obj, secdatastart);
- }
- }
- while (length > 0);
-
- if (length > 0)
- {
- return process_symtab_error (obj, secdatastart);
- }
-
- process_section (secdatastart, secdata);
- free (secdatastart);
- return 1;
+ MSG_ERROR ("-fauto-bolt is not support.");
+ return 0;
}
/* Callback used by gold to check if the plugin will claim FILE. Writes
@@ -769,74 +511,6 @@ claim_file_handler (const struct ld_plugin_input_file *file, int *claimed)
return LDPS_OK;
}
-/* Mangle filename path of BASE and output new allocated pointer with
- mangled path. */
-
-static string
-mangle_path (const string &base)
-{
- if (base.empty ())
- {
- return base;
- }
-
- /* Convert '/' to '#', convert '..' to '^',
- convert ':' to '~' on DOS based file system. */
-
- string new_path;
- int base_len = base.size ();
- int l = 0;
- int r = 0;
- while (l < base_len)
- {
- while (r < base_len && base[r] != '/')
- {
- r++;
- }
-
- int len = r - l;
- if (len == 2 && base[r - 2] == '.' && base[r - 1] == '.')
- {
- new_path += '^';
- }
- else
- {
- new_path += base.substr (l, r - l);
- }
- if (r < base_len)
- {
- new_path += '#';
- }
-
- r++;
- l = r;
- }
- return new_path;
-}
-
-/* Generate BOLT profile name from file_name. */
-
-static string
-generate_bolt_profile_name (string file_name)
-{
- if (!IS_ABSOLUTE_PATH (file_name.c_str ()))
- {
- if (!bolt_dir_path.empty ())
- {
- file_name = concat (get_current_dir_name (),
- separator, file_name.c_str (), NULL);
- file_name = mangle_path (file_name);
- }
- else
- {
- bolt_dir_path = DEFAULT_BOLT_OUT_DIR;
- }
- }
- file_name = concat (bolt_dir_path.c_str (), separator, file_name.c_str (),
- NULL);
- return file_name;
-}
-
/* Match option_prefix from gcc_options, return the index of gcc_options. */
static int
@@ -927,31 +601,6 @@ parser_bolt_optimize_option (string raw_string)
return raw_string;
}
-/* Process option -fauto-bolt. */
-
-static void
-process_auto_bolt_option (const string &flag_auto_bolt)
-{
- const int auto_bolt_index = match_gcc_option (flag_auto_bolt.c_str ());
-
- if (auto_bolt_index != -1)
- {
- if (gcc_options[auto_bolt_index] == "-fauto-bolt")
- {
- MSG_INFO ("Use default output directory %s, ", DEFAULT_BOLT_OUT_DIR);
- MSG_INFO ("Specify it using -fauto-bolt= if needed.");
- }
- else
- {
- string flag_auto_bolt_equal = "-fauto-bolt=";
- bolt_dir_path = lrealpath (gcc_options[auto_bolt_index].substr (
- flag_auto_bolt_equal.size ()).c_str ());
- MSG_INFO ("Get bolt profile path: %s", bolt_dir_path.c_str ());
- }
- bolt_profile_name = generate_bolt_profile_name(bolt_profile_name);
- }
-}
-
/* Process option -fbolt-use=. */
static void
@@ -1035,9 +684,6 @@ process_output_option (const string &flag_o)
static void
process_gcc_option ()
{
- string flag_profile_use = "-fprofile-use";
- string flag_auto_profile = "-fauto-profile";
- string flag_auto_bolt = "-fauto-bolt";
string flag_bolt_use = "-fbolt-use=";
string flag_bolt_target = "-fbolt-target=";
string flag_bolt_optimize_options = "-fbolt-option=";
@@ -1051,19 +697,9 @@ process_gcc_option ()
/* Function process_output_option should be processed before
process_auto_bolt_option to obtain correct bolt_profile_name. */
process_output_option (flag_o);
- process_auto_bolt_option (flag_auto_bolt);
process_bolt_use_option (flag_bolt_use);
process_bolt_target_option (flag_bolt_target);
process_bolt_option (flag_bolt_optimize_options);
-
- if (match_gcc_option (flag_profile_use.c_str ()) != -1)
- {
- fdo_type = feedback_type::PGO_TYPE;
- }
- else if (match_gcc_option (flag_auto_profile.c_str ()) != -1)
- {
- fdo_type = feedback_type::AFDO_TYPE;
- }
if (match_gcc_option (flag_bolt_use.c_str ()) != -1)
{
--
2.25.1