From: David Malcolm Date: Mon, 1 Dec 2014 18:02:45 +0000 (+0000) Subject: jit-playback: Move dso-creation into its own function X-Git-Url: https://git.libre-soc.org/?a=commitdiff_plain;h=c6760a13178f56f5aea081b0f88fa7695a9daf58;p=gcc.git jit-playback: Move dso-creation into its own function gcc/jit/ChangeLog: * jit-playback.c (gcc::jit::playback::context::compile): Move DSO creation code into... (gcc::jit::playback::context::convert_to_dso): New function. * jit-playback.h (gcc::jit::playback::context::convert_to_dso): New function. From-SVN: r218238 --- diff --git a/gcc/jit/ChangeLog b/gcc/jit/ChangeLog index 5035693e1bf..36fcc7692e2 100644 --- a/gcc/jit/ChangeLog +++ b/gcc/jit/ChangeLog @@ -1,3 +1,11 @@ +2014-12-01 David Malcolm + + * jit-playback.c (gcc::jit::playback::context::compile): Move DSO + creation code into... + (gcc::jit::playback::context::convert_to_dso): New function. + * jit-playback.h (gcc::jit::playback::context::convert_to_dso): + New function. + 2014-12-01 David Malcolm * jit-playback.c (gcc::jit::playback::context::compile): Use an diff --git a/gcc/jit/jit-playback.c b/gcc/jit/jit-playback.c index b12584ec749..d16b3c46fd3 100644 --- a/gcc/jit/jit-playback.c +++ b/gcc/jit/jit-playback.c @@ -1590,78 +1590,11 @@ compile () return NULL; if (get_bool_option (GCC_JIT_BOOL_OPTION_DUMP_GENERATED_CODE)) - dump_generated_code (); - - /* Gross hacks follow: - We have a .s file; we want a .so file. - We could reuse parts of gcc/gcc.c to do this. - For now, just use the driver binary from the install, as - named in gcc-driver-name.h - e.g. "x86_64-unknown-linux-gnu-gcc-5.0.0". - */ - { - auto_timevar assemble_timevar (TV_ASSEMBLE); - const char *errmsg; - const char *argv[7]; - int exit_status = 0; - int err = 0; - const char *gcc_driver_name = GCC_DRIVER_NAME; - - argv[0] = gcc_driver_name; - argv[1] = "-shared"; - /* The input: assembler. */ - argv[2] = m_path_s_file; - /* The output: shared library. */ - argv[3] = "-o"; - argv[4] = m_path_so_file; - - /* Don't use the linker plugin. - If running with just a "make" and not a "make install", then we'd - run into - "fatal error: -fuse-linker-plugin, but liblto_plugin.so not found" - libto_plugin is a .la at build time, with it becoming installed with - ".so" suffix: i.e. it doesn't exist with a .so suffix until install - time. */ - argv[5] = "-fno-use-linker-plugin"; - - /* pex argv arrays are NULL-terminated. */ - argv[6] = NULL; - - /* pex_one's error-handling requires pname to be non-NULL. */ - gcc_assert (ctxt_progname); - - errmsg = pex_one (PEX_SEARCH, /* int flags, */ - gcc_driver_name, - const_cast (argv), - ctxt_progname, /* const char *pname */ - NULL, /* const char *outname */ - NULL, /* const char *errname */ - &exit_status, /* int *status */ - &err); /* int *err*/ - if (errmsg) - { - add_error (NULL, "error invoking gcc driver: %s", errmsg); - return NULL; - } + dump_generated_code (); - /* pex_one can return a NULL errmsg when the executable wasn't - found (or doesn't exist), so trap these cases also. */ - if (exit_status || err) - { - add_error (NULL, - "error invoking gcc driver: exit_status: %i err: %i", - exit_status, err); - add_error (NULL, - "whilst attempting to run a driver named: %s", - gcc_driver_name); - add_error (NULL, - "PATH was: %s", - getenv ("PATH")); - return NULL; - } - } - - // TODO: split out assembles vs linker + convert_to_dso (ctxt_progname); + if (errors_occurred ()) + return NULL; /* dlopen the .so file. */ { @@ -1757,6 +1690,81 @@ make_fake_args (auto_vec *argvec, #undef ADD_ARG } +/* Part of playback::context::compile (). + + We have a .s file; we want a .so file. + We could reuse parts of gcc/gcc.c to do this. + For now, just use the driver binary from the install, as + named in gcc-driver-name.h + e.g. "x86_64-unknown-linux-gnu-gcc-5.0.0". */ + +void +playback::context:: +convert_to_dso (const char *ctxt_progname) +{ + /* Currently this lumps together both assembling and linking into + TV_ASSEMBLE. */ + auto_timevar assemble_timevar (TV_ASSEMBLE); + const char *errmsg; + const char *argv[7]; + int exit_status = 0; + int err = 0; + const char *gcc_driver_name = GCC_DRIVER_NAME; + + argv[0] = gcc_driver_name; + argv[1] = "-shared"; + /* The input: assembler. */ + argv[2] = m_path_s_file; + /* The output: shared library. */ + argv[3] = "-o"; + argv[4] = m_path_so_file; + + /* Don't use the linker plugin. + If running with just a "make" and not a "make install", then we'd + run into + "fatal error: -fuse-linker-plugin, but liblto_plugin.so not found" + libto_plugin is a .la at build time, with it becoming installed with + ".so" suffix: i.e. it doesn't exist with a .so suffix until install + time. */ + argv[5] = "-fno-use-linker-plugin"; + + /* pex argv arrays are NULL-terminated. */ + argv[6] = NULL; + + /* pex_one's error-handling requires pname to be non-NULL. */ + gcc_assert (ctxt_progname); + + errmsg = pex_one (PEX_SEARCH, /* int flags, */ + gcc_driver_name, + const_cast (argv), + ctxt_progname, /* const char *pname */ + NULL, /* const char *outname */ + NULL, /* const char *errname */ + &exit_status, /* int *status */ + &err); /* int *err*/ + if (errmsg) + { + add_error (NULL, "error invoking gcc driver: %s", errmsg); + return; + } + + /* pex_one can return a NULL errmsg when the executable wasn't + found (or doesn't exist), so trap these cases also. */ + if (exit_status || err) + { + add_error (NULL, + "error invoking gcc driver: exit_status: %i err: %i", + exit_status, err); + add_error (NULL, + "whilst attempting to run a driver named: %s", + gcc_driver_name); + add_error (NULL, + "PATH was: %s", + getenv ("PATH")); + return; + } +} + /* Top-level hook for playing back a recording context. This plays back m_recording_ctxt, and, if no errors diff --git a/gcc/jit/jit-playback.h b/gcc/jit/jit-playback.h index 5ffc8690a89..25a4c287d7c 100644 --- a/gcc/jit/jit-playback.h +++ b/gcc/jit/jit-playback.h @@ -234,6 +234,9 @@ private: make_fake_args (auto_vec *argvec, const char *ctxt_progname); + void + convert_to_dso (const char *ctxt_progname); + private: ::gcc::jit::recording::context *m_recording_ctxt;