mirror of
https://github.com/espressif/binutils-gdb.git
synced 2025-06-28 07:08:01 +08:00
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:

committed by
Sriraman Tallam

parent
4c5ae11b42
commit
c4e648430f
@ -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)
|
||||
|
Reference in New Issue
Block a user