summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorH.J. Lu <hjl.tools@gmail.com>2015-02-11 15:22:10 -0800
committerH.J. Lu <hjl.tools@gmail.com>2015-02-11 15:30:03 -0800
commit58002c640995105459cd2c84343a430679e57eac (patch)
treed87e0f63d152b7f2d4328decda5573681adb367f
parent88b9e2eb547b002431ae7e4b7799f1a06241da3c (diff)
downloadbinutils-gdb-users/hjl/pr17878.tar.gz
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.in3
-rwxr-xr-xld/configure12
-rw-r--r--ld/configure.ac2
-rw-r--r--ld/plugin.c31
4 files changed, 48 insertions, 0 deletions
diff --git a/ld/config.in b/ld/config.in
index ad015fe1a16..fe6592d5448 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 7af2626d5bc..fd2fedbe5a2 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 e926c03dbfc..2f7d626b13b 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 4fee305b698..4640d38978b 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