From eb3982c17ef6db63b43eda4b346f34d4a2bd2465 Mon Sep 17 00:00:00 2001 From: David Malcolm Date: Thu, 23 Jul 2015 21:19:07 +0000 Subject: jit: supply MULTILIB_DEFAULTS as arguments when invoking driver gcc/jit/ChangeLog: * jit-playback.c (invoke_driver): Convert local "argvec" to an auto_argvec, so that it owns copies of the strings, rather than borrows them, updating ADD_ARG to use xstrdup and special-casing the NULL terminator to avoid xstrdup (NULL). Call add_multilib_driver_arguments at the front of the arguments. (MULTILIB_DEFAULTS): Provide a default definition. (multilib_defaults_raw): New constant array. (gcc::jit::playback::context::add_multilib_driver_arguments): New method. * jit-playback.h (gcc::jit::playback::context::add_multilib_driver_arguments): New method. * docs/internals/test-hello-world.exe.log.txt: Update. * docs/_build/texinfo/libgccjit.texi: Regenerate. From-SVN: r226126 --- gcc/jit/jit-playback.c | 38 +++++++++++++++++++++++++++++++++++--- 1 file changed, 35 insertions(+), 3 deletions(-) (limited to 'gcc/jit/jit-playback.c') diff --git a/gcc/jit/jit-playback.c b/gcc/jit/jit-playback.c index 8d0c210..c469863 100644 --- a/gcc/jit/jit-playback.c +++ b/gcc/jit/jit-playback.c @@ -2382,14 +2382,16 @@ invoke_driver (const char *ctxt_progname, TV_ASSEMBLE. */ auto_timevar assemble_timevar (tv_id); const char *errmsg; - auto_vec argvec; -#define ADD_ARG(arg) argvec.safe_push (arg) + auto_argvec argvec; +#define ADD_ARG(arg) argvec.safe_push (xstrdup (arg)) int exit_status = 0; int err = 0; const char *gcc_driver_name = GCC_DRIVER_NAME; ADD_ARG (gcc_driver_name); + add_multilib_driver_arguments (&argvec); + if (shared) ADD_ARG ("-shared"); @@ -2410,7 +2412,7 @@ invoke_driver (const char *ctxt_progname, ADD_ARG ("-fno-use-linker-plugin"); /* pex argv arrays are NULL-terminated. */ - ADD_ARG (NULL); + argvec.safe_push (NULL); /* pex_one's error-handling requires pname to be non-NULL. */ gcc_assert (ctxt_progname); @@ -2451,6 +2453,36 @@ invoke_driver (const char *ctxt_progname, #undef ADD_ARG } +/* Extract the target-specific MULTILIB_DEFAULTS to + multilib_defaults_raw for use by + playback::context::add_multilib_driver_arguments (). */ + +#ifndef MULTILIB_DEFAULTS +#define MULTILIB_DEFAULTS { "" } +#endif + +static const char *const multilib_defaults_raw[] = MULTILIB_DEFAULTS; + +/* Helper function for playback::context::invoke_driver (). + + 32-bit and 64-bit multilib peer builds of libgccjit.so may share + a driver binary. We need to pass in options to the shared driver + to get the appropriate assembler/linker options for this multilib + peer. */ + +void +playback::context:: +add_multilib_driver_arguments (vec *argvec) +{ + JIT_LOG_SCOPE (get_logger ()); + + /* Add copies of the arguments in multilib_defaults_raw to argvec, + prepending each with a "-". */ + for (size_t i = 0; i < ARRAY_SIZE (multilib_defaults_raw); i++) + if (multilib_defaults_raw[i][0]) + argvec->safe_push (concat ("-", multilib_defaults_raw[i], NULL)); +} + /* Dynamically-link the built DSO file into this process, using dlopen. Wrap it up within a jit::result *, and return that. Return NULL if any errors occur, reporting them on this context. */ -- cgit v1.1