diff options
author | Stephen Crane <sjc@immunant.com> | 2017-12-11 14:58:38 -0800 |
---|---|---|
committer | Sriraman Tallam <tmsriram@google.com> | 2017-12-11 14:58:38 -0800 |
commit | c4e648430f3c5c135310f87280d45dba581aaa7b (patch) | |
tree | 026ea986bfbb2b5856062f4507404f4f00d2d27c /gold/plugin.h | |
parent | 4c5ae11b42433dbffc33fbde75c9e415594504d8 (diff) | |
download | binutils-c4e648430f3c5c135310f87280d45dba581aaa7b.zip binutils-c4e648430f3c5c135310f87280d45dba581aaa7b.tar.gz binutils-c4e648430f3c5c135310f87280d45dba581aaa7b.tar.bz2 |
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.
Diffstat (limited to 'gold/plugin.h')
-rw-r--r-- | gold/plugin.h | 19 |
1 files changed, 19 insertions, 0 deletions
diff --git a/gold/plugin.h b/gold/plugin.h index 7658668..d591d26 100644 --- a/gold/plugin.h +++ b/gold/plugin.h @@ -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) |