Compare commits

...

1 Commits

Author SHA1 Message Date
H.J. Lu
58002c6409 Support -plugin-opt=disable-output
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().
2015-02-11 15:30:03 -08:00
4 changed files with 48 additions and 0 deletions

View File

@@ -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

12
ld/configure vendored
View File

@@ -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`

View File

@@ -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

View File

@@ -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