From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 9048 invoked by alias); 26 Nov 2014 01:37:45 -0000 Mailing-List: contact jit-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Post: List-Help: List-Subscribe: Sender: jit-owner@gcc.gnu.org Received: (qmail 8859 invoked by uid 89); 26 Nov 2014 01:37:43 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Checked: by ClamAV 0.98.4 on sourceware.org X-Virus-Found: No X-Spam-SWARE-Status: No, score=-2.0 required=5.0 tests=AWL,BAYES_00,SPF_HELO_PASS,SPF_PASS,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-Spam-Status: No, score=-2.0 required=5.0 tests=AWL,BAYES_00,SPF_HELO_PASS,SPF_PASS,T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on sourceware.org X-Spam-Level: X-Spam-User: qpsmtpd, 2 recipients X-HELO: mx1.redhat.com From: David Malcolm To: gcc-patches@gcc.gnu.org, jit@gcc.gnu.org Cc: David Malcolm Subject: [PATCH 03/03] jit-playback: Move dso-creation into its own function Date: Wed, 01 Jan 2014 00:00:00 -0000 Message-Id: <1416966320-15713-4-git-send-email-dmalcolm@redhat.com> In-Reply-To: <1416966320-15713-1-git-send-email-dmalcolm@redhat.com> References: <1416966320-15713-1-git-send-email-dmalcolm@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.24 X-SW-Source: 2014-q4/txt/msg00215.txt.bz2 Continue to refactor playback::context::compile, moving the DSO-generation 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. --- gcc/jit/jit-playback.c | 150 ++++++++++++++++++++++++++----------------------- gcc/jit/jit-playback.h | 3 + 2 files changed, 82 insertions(+), 71 deletions(-) diff --git a/gcc/jit/jit-playback.c b/gcc/jit/jit-playback.c index b12584e..d16b3c4 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 5ffc869..25a4c28 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; -- 1.8.5.3