From e0b6e2e9d8226881886c28826a2fe2e55fd29511 Mon Sep 17 00:00:00 2001 From: zhenyu--zhao_admin Date: Sun, 29 Dec 2024 14:11:14 +0800 Subject: [PATCH] [Bugfix] Can not find fdata file. --- gcc/ai-optimizer.cc | 49 ++++++++++++++++++++++++++++++++++++--------- gcc/ai4c-infer.cc | 28 ++++---------------------- gcc/gcc.cc | 31 +++++++++++++++++++++++++--- gcc/gcc.h | 1 + 4 files changed, 73 insertions(+), 36 deletions(-) diff --git a/gcc/ai-optimizer.cc b/gcc/ai-optimizer.cc index c3d99dd85..70ff24077 100644 --- a/gcc/ai-optimizer.cc +++ b/gcc/ai-optimizer.cc @@ -284,19 +284,50 @@ static int graph_infer (int argc1, const char **argv1, const char *mops, int argc2, int64_t *argv2) { - char *gcc_exec_prefix = getenv ("ONNX_FDATA_PATH"); - if (gcc_exec_prefix == NULL) + char gcc_exec_prefix[512]; + ssize_t len = readlink ("/proc/self/exe", gcc_exec_prefix, + sizeof (gcc_exec_prefix) - 1); + if (len == -1) return 0; - char native_file[512]; - if (gcc_exec_prefix) + char native_file[512]; + strncpy (native_file, gcc_exec_prefix, sizeof (native_file) - 1); + const char *target = "bin/gcc"; + const char *target_cc1 = "cc1"; + const char *target_gpp = "bin/g++"; + const char *target_cc1plus = "cc1plus"; + const char *target_gfortran = "bin/gfortran"; + const char *target_f951 = "f951"; + const char *replacement = "../libexec/gcc/optimizer.fdata"; + const char *replacement_front_end = "../../optimizer.fdata"; + + /* Replace the part of the current executable file path after the last slash + to locate the model file. */ + if (strstr (native_file, target) != NULL || + strstr (native_file, target_gpp) != NULL || + strstr (native_file, target_gfortran) != NULL) { - const char *onnx_fdata = "optimizer.fdata"; - strncpy (native_file, gcc_exec_prefix, sizeof (native_file) - 1); - native_file[sizeof (native_file) - 1] = '\0'; char *last_slash = strrchr (native_file, '/'); - if (last_slash) - strcpy (last_slash + 1, onnx_fdata); + if (last_slash != NULL) + { + size_t prefix_len = last_slash - native_file + 1; + native_file[prefix_len] = '\0'; + strncat (native_file, replacement, sizeof (native_file) - + strlen (native_file) - 1); + } + } + else if (strstr (native_file, target_cc1) != NULL || + strstr (native_file, target_cc1plus) != NULL || + strstr (native_file, target_f951) != NULL) + { + char *last_slash = strrchr (native_file, '/'); + if (last_slash != NULL) + { + size_t prefix_len = last_slash - native_file + 1; + native_file[prefix_len] = '\0'; + strncat (native_file, replacement_front_end, sizeof (native_file) - + strlen (native_file) - 1); + } } if (access (native_file, F_OK) == 0) diff --git a/gcc/ai4c-infer.cc b/gcc/ai4c-infer.cc index 42922e1ca..4cd4bfb00 100644 --- a/gcc/ai4c-infer.cc +++ b/gcc/ai4c-infer.cc @@ -333,29 +333,11 @@ preprocess (int argc, int64_t *argv, int64_t *in_modes) static int graph_infer (int argc, const char *argv, int argc2, int64_t *argv2) { - char *gcc_exec_prefix = getenv ("ONNX_FDATA_PATH"); - if (gcc_exec_prefix == NULL) - return 0; - char file_name[512]; - - if (gcc_exec_prefix) - { - const char *onnx_fdata = "onnx.fdata"; - strncpy (file_name, gcc_exec_prefix, sizeof (file_name) - 1); - file_name[sizeof (file_name) - 1] = '\0'; - char *last_slash = strrchr (file_name, '/'); - if (last_slash) - strcpy (last_slash + 1, onnx_fdata); - } - + const char *file_name = getenv ("GCC_AI4C_ONNX_FDATA"); if (access (file_name, F_OK) == 0) - { - fill_node (file_name); - } + fill_node (file_name); else - { - return 0; - } + return 0; int64_t in_modes[M_MODE_SIZE]; @@ -441,9 +423,7 @@ int get_optimize_decision_from_ai4c () { if (initialized== 1) - { - return optimize_result; - } + return optimize_result; if (native_tune && (strchr (native_tune, '+') != NULL)) { char hash[65]; diff --git a/gcc/gcc.cc b/gcc/gcc.cc index 179d507f2..b4beb1957 100644 --- a/gcc/gcc.cc +++ b/gcc/gcc.cc @@ -8133,6 +8133,7 @@ driver::main (int argc, char **argv) putenv_COLLECT_GCC (argv[0]); maybe_putenv_COLLECT_LTO_WRAPPER (); maybe_putenv_OFFLOAD_TARGETS (); + putenv_ONNX_FDATA (); handle_unrecognized_options (); if (completion) @@ -8189,9 +8190,6 @@ driver::expand_at_files (int *argc, char ***argv) const void driver::decode_argv (int argc, const char **argv) { - const char* libexec_path = standard_libexec_prefix; - if (libexec_path) - setenv ("ONNX_FDATA_PATH", libexec_path, 1); init_opts_obstack (); init_options_struct (&global_options, &global_options_set); @@ -8590,6 +8588,33 @@ driver::maybe_putenv_COLLECT_LTO_WRAPPER () const } +/* Set up to remember the pathname of the onnx.fdata. */ + +void +driver::putenv_ONNX_FDATA () const +{ + char *lto_wrapper_file; + lto_wrapper_file = find_a_program ("lto-wrapper"); + + if (lto_wrapper_file) + { + lto_wrapper_file = convert_white_space (lto_wrapper_file); + char native_file[512]; + const char *onnx_fdata = "../../onnx.fdata"; + strncpy (native_file, lto_wrapper_file, sizeof (native_file) - 1); + native_file[sizeof (native_file) - 1] = '\0'; + char *last_slash = strrchr (native_file, '/'); + if (last_slash) + strcpy (last_slash + 1, onnx_fdata); + obstack_init (&collect_obstack); + obstack_grow (&collect_obstack, "GCC_AI4C_ONNX_FDATA=", + sizeof ("GCC_AI4C_ONNX_FDATA=") - 1); + obstack_grow (&collect_obstack, native_file, + strlen ( native_file) + 1); + xputenv (XOBFINISH (&collect_obstack, char *)); + } +} + /* Set up to remember the names of offload targets. */ void diff --git a/gcc/gcc.h b/gcc/gcc.h index 63231ddb3..ff3ae8bed 100644 --- a/gcc/gcc.h +++ b/gcc/gcc.h @@ -44,6 +44,7 @@ class driver void set_up_specs () const; void putenv_COLLECT_GCC (const char *argv0) const; void maybe_putenv_COLLECT_LTO_WRAPPER () const; + void putenv_ONNX_FDATA () const; void maybe_putenv_OFFLOAD_TARGETS () const; void handle_unrecognized_options (); int maybe_print_and_exit () const; -- 2.43.0