diff options
author | H.J. Lu <hjl.tools@gmail.com> | 2015-02-11 15:22:10 -0800 |
---|---|---|
committer | H.J. Lu <hjl.tools@gmail.com> | 2015-02-11 15:30:03 -0800 |
commit | 58002c640995105459cd2c84343a430679e57eac (patch) | |
tree | d87e0f63d152b7f2d4328decda5573681adb367f | |
parent | 88b9e2eb547b002431ae7e4b7799f1a06241da3c (diff) | |
download | gdb-users/hjl/pr17878.zip gdb-users/hjl/pr17878.tar.gz gdb-users/hjl/pr17878.tar.bz2 |
Support -plugin-opt=disable-outputusers/hjl/pr17878
LLVM plugin uses --plugin-opt=disable-output to disable output.
all_symbols_read_hook() calls exit() to disable output when
--plugin-opt=disable-output is passed to LLVM plugin. This patch
registers plugin_cleanup() with atexit(), which removes output file
if --plugin-opt=disable-output is used.
PR ld/17878
* configure.ac: Check if atexit exists.
* config.in: Regenerated.
* configure: Likewise.
* plugin.c (plugin_t): Add disable_output.
(plugin_opt_plugin_arg): Set disable_output for disable-output.
(plugin_cleanup): New.
(plugin_load_plugins): Register plugin_cleanup() with atexit().
-rw-r--r-- | ld/config.in | 3 | ||||
-rwxr-xr-x | ld/configure | 12 | ||||
-rw-r--r-- | ld/configure.ac | 2 | ||||
-rw-r--r-- | ld/plugin.c | 31 |
4 files changed, 48 insertions, 0 deletions
diff --git a/ld/config.in b/ld/config.in index ad015fe..fe6592d 100644 --- a/ld/config.in +++ b/ld/config.in @@ -17,6 +17,9 @@ /* Define to choose default GOT handling scheme */ #undef GOT_HANDLING_DEFAULT +/* Define to 1 if you have the `atexit' function. */ +#undef HAVE_ATEXIT + /* Define to 1 if you have the `close' function. */ #undef HAVE_CLOSE diff --git a/ld/configure b/ld/configure index 7af2626..fd2fedb 100755 --- a/ld/configure +++ b/ld/configure @@ -16549,6 +16549,18 @@ fi fi +for ac_func in atexit +do : + ac_fn_c_check_func "$LINENO" "atexit" "ac_cv_func_atexit" +if test "x$ac_cv_func_atexit" = x""yes; then : + cat >>confdefs.h <<_ACEOF +#define HAVE_ATEXIT 1 +_ACEOF + +fi +done + + for ac_header in stdlib.h unistd.h do : as_ac_Header=`$as_echo "ac_cv_header_$ac_header" | $as_tr_sh` diff --git a/ld/configure.ac b/ld/configure.ac index e926c03..2f7d626 100644 --- a/ld/configure.ac +++ b/ld/configure.ac @@ -195,6 +195,8 @@ AC_CHECK_FUNCS(glob mkstemp realpath sbrk setlocale waitpid) AC_CHECK_FUNCS(open lseek close) AC_HEADER_DIRENT +AC_CHECK_FUNCS(atexit) + dnl AC_CHECK_HEADERS(sys/mman.h) AC_FUNC_MMAP diff --git a/ld/plugin.c b/ld/plugin.c index 4fee305..4640d38 100644 --- a/ld/plugin.c +++ b/ld/plugin.c @@ -88,6 +88,8 @@ typedef struct plugin ld_plugin_cleanup_handler cleanup_handler; /* TRUE if the cleanup handlers have been called. */ bfd_boolean cleanup_done; + /* TRUE if output should be disabled. */ + bfd_boolean disable_output; } plugin_t; typedef struct view_buffer @@ -283,6 +285,11 @@ plugin_opt_plugin_arg (const char *arg) *last_plugin_args_tail_chain_ptr = newarg; last_plugin_args_tail_chain_ptr = &newarg->next; last_plugin->n_args++; + + /* LLVM plugin uses --plugin-opt=disable-output to disable output. */ + if (strcmp (arg, "disable-output") == 0) + last_plugin->disable_output = TRUE; + return 0; } @@ -934,6 +941,24 @@ set_tv_plugin_args (plugin_t *plugin, struct ld_plugin_tv *tv) tv->tv_u.tv_val = 0; } +#if HAVE_ATEXIT +static void +plugin_cleanup (void) +{ + plugin_t *curplug = plugins_list; + while (curplug) + { + if (curplug->all_symbols_read_handler + && curplug->disable_output) + { + unlink_if_ordinary (output_filename); + break; + } + curplug = curplug->next; + } +} +#endif + /* Load up and initialise all plugins after argument parsing. */ void plugin_load_plugins (void) @@ -994,6 +1019,12 @@ plugin_load_plugins (void) register_ld_plugin_object_p (plugin_object_p); +#if HAVE_ATEXIT + /* Since all_symbols_read_hook() in LLVM plugin calls exit() to + disable output, we must register plugin_cleanup() with atexit(). */ + atexit (plugin_cleanup); +#endif + #if HAVE_MMAP && HAVE_GETPAGESIZE plugin_pagesize = getpagesize ();; #endif |