Add plugin API for processing plugin-added input files

Gold plugins may wish to further process an input file added by a plugin. For
example, the plugin may need to assign a unique segment for sections in a
plugin-generated input file. This patch adds a plugin callback that the linker
will call when reading symbols from a new input file added after the
all_symbols_read event (i.e. an input file added by a plugin).

2017-12-11  Stephen Crane  <sjc@immunant.com>

	* plugin-api.h: Add new plugin hook to allow processing of input
	files added by a plugin.
	(ld_plugin_new_input_handler): New function hook type.
	(ld_plugin_register_new_input): New interface.
	(LDPT_REGISTER_NEW_INPUT_HOOK): New enum val.
	(tv_register_new_input): New member.

	* plugin.cc (Plugin::load): Include hooks for register_new_input
	in transfer vector.
	(Plugin::new_input): New function.
	(register_new_input): New function.
	(Plugin_manager::claim_file): Call Plugin::new_input if in
	replacement phase.
	* plugin.h (Plugin::set_new_input_handler): New function.
	* testsuite/plugin_new_section_layout.c: New plugin to test
	new_input plugin API.
	* testsuite/plugin_final_layout.sh: Add new input test.
	* testsuite/Makefile.am (plugin_layout_new_file): New test case.
	* testsuite/Makefile.in: Regenerate.
This commit is contained in:
Stephen Crane
2017-12-11 14:58:38 -08:00
committed by Sriraman Tallam
parent 4c5ae11b42
commit c4e648430f
9 changed files with 333 additions and 20 deletions

View File

@ -60,6 +60,7 @@ class Plugin
claim_file_handler_(NULL),
all_symbols_read_handler_(NULL),
cleanup_handler_(NULL),
new_input_handler_(NULL),
cleanup_done_(false)
{ }
@ -78,6 +79,10 @@ class Plugin
void
all_symbols_read();
// Call the new_input handler.
void
new_input(struct ld_plugin_input_file* plugin_input_file);
// Call the cleanup handler.
void
cleanup();
@ -97,6 +102,11 @@ class Plugin
set_cleanup_handler(ld_plugin_cleanup_handler handler)
{ this->cleanup_handler_ = handler; }
// Register a new_input handler.
void
set_new_input_handler(ld_plugin_new_input_handler handler)
{ this->new_input_handler_ = handler; }
// Add an argument
void
add_option(const char* arg)
@ -118,6 +128,7 @@ class Plugin
ld_plugin_claim_file_handler claim_file_handler_;
ld_plugin_all_symbols_read_handler all_symbols_read_handler_;
ld_plugin_cleanup_handler cleanup_handler_;
ld_plugin_new_input_handler new_input_handler_;
// TRUE if the cleanup handlers have been called.
bool cleanup_done_;
};
@ -218,6 +229,14 @@ class Plugin_manager
(*this->current_)->set_all_symbols_read_handler(handler);
}
// Register a new_input handler.
void
set_new_input_handler(ld_plugin_new_input_handler handler)
{
gold_assert(this->current_ != plugins_.end());
(*this->current_)->set_new_input_handler(handler);
}
// Register a claim-file handler.
void
set_cleanup_handler(ld_plugin_cleanup_handler handler)