481 lines
12 KiB
Diff
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
|
|
|