summaryrefslogtreecommitdiff
path: root/gold/plugin.h
diff options
context:
space:
mode:
authorSriraman Tallam <tmsriram@google.com>2011-07-14 00:55:18 +0000
committerSriraman Tallam <tmsriram@google.com>2011-07-14 00:55:18 +0000
commite9552f7ebbcd2438fe50dbf1fb4b1926c96adb75 (patch)
tree3011912bed63e6f4668b55cafab0fd7c3efcc1e5 /gold/plugin.h
parent41d1d0bd9b0e58444eb9abedcf8bc02c78deaced (diff)
downloadbinutils-gdb-e9552f7ebbcd2438fe50dbf1fb4b1926c96adb75.tar.gz
2011-07-13 Sriraman Tallam <tmsriram@google.com>
* plugin-api.h (ld_plugin_section): New struct. (ld_plugin_get_section_count): New typedef. (ld_plugin_get_section_type): New typedef. (ld_plugin_get_section_name): New typedef. (ld_plugin_get_section_contents): New typedef. (ld_plugin_update_section_order): New typedef. (ld_plugin_allow_section_ordering): New typedef. (LDPT_GET_SECTION_COUNT): New enum value. (LDPT_GET_SECTION_TYPE): New enum value. (LDPT_GET_SECTION_NAME): New enum value. (LDPT_GET_SECTION_CONTENTS): New enum value. (LDPT_UPDATE_SECTION_ORDER): New enum value. (LDPT_ALLOW_SECTION_ORDERING): New enum value. (tv_get_section_count): New struct members. (tv_get_section_type): New struct members. (tv_get_section_name): New struct members. (tv_get_section_contents): New struct members. (tv_update_section_order): New struct members. (tv_allow_section_ordering): New struct members. * archive.cc (Archive::get_elf_object_for_member): Add extra parameter to claim_file call. * layout.cc (Layout::Layout): Initialize section_ordering_specified_, input_section_position_, and input_section_glob_. (read_layout_from_file): Call function section_ordering_specified. * layout.h (is_section_ordering_specified): New function. (section_ordering_specified): New function. (section_ordering_specified_): New boolean member. * main.cc(main): Call load_plugins after layout object is defined. * output.cc (Output_section::add_input_section): Use function section_ordering_specified to check if section ordering is needed. * output.cc (Output_section::add_relaxed_input_section): Use function section_ordering_specified to check if section ordering is needed. (Output_section::update_section_layout): New function. (Output_section::sort_attached_input_sections): Check if input section must be reordered. * output.h (Output_section::update_section_layout): New function. * plugin.cc (get_section_count): New function. (get_section_type): New function. (get_section_name): New function. (get_section_contents): New function. (update_section_order): New function. (allow_section_ordering): New function. (Plugin::load): Add the new interfaces to the transfer vector. (Plugin_manager::load_plugins): New parameter. (Plugin_manager::all_symbols_read): New parameter. (Plugin_manager::claim_file): New parameter. Save the elf object for unclaimed objects. (Plugin_manager::get_elf_object): New function. (Plugin_manager::get_view): Change to directly use the bool to check if get_view is called from claim_file_hook. * plugin.h (input_objects): New function (Plugin__manager::load_plugins): New parameter. (Plugin_manager::claim_file): New parameter. (Plugin_manager::get_elf_object): New function. (Plugin_manager::in_claim_file_handler): New function. (Plugin_manager::in_claim_file_handler_): New member. (layout): New function. * readsyms.cc (Read_symbols::do_read_symbols): Call the claim_file handler with an extra parameter. Make the elf object before calling claim_file handler. * testsuite/plugin_test.c (get_section_count): New function pointer. (get_section_type): New function pointer. (get_section_name): New function pointer. (get_section_contents): New function pointer. (update_section_order): New function pointer. (allow_section_ordering): New function pointer. (onload): Check if the new interfaces exist.
Diffstat (limited to 'gold/plugin.h')
-rw-r--r--gold/plugin.h35
1 files changed, 29 insertions, 6 deletions
diff --git a/gold/plugin.h b/gold/plugin.h
index 2ee0b5e8022..8f1db67d288 100644
--- a/gold/plugin.h
+++ b/gold/plugin.h
@@ -131,6 +131,7 @@ class Plugin_manager
: plugins_(), objects_(), deferred_layout_objects_(), input_file_(NULL),
plugin_input_file_(), rescannable_(), undefined_symbols_(),
any_claimed_(false), in_replacement_phase_(false), any_added_(false),
+ in_claim_file_handler_(false),
options_(options), workqueue_(NULL), task_(NULL), input_objects_(NULL),
symtab_(NULL), layout_(NULL), dirpath_(NULL), mapfile_(NULL),
this_blocker_(NULL), extra_search_path_()
@@ -153,11 +154,22 @@ class Plugin_manager
// Load all plugin libraries.
void
- load_plugins();
+ load_plugins(Layout* layout);
// Call the plugin claim-file handlers in turn to see if any claim the file.
Pluginobj*
- claim_file(Input_file* input_file, off_t offset, off_t filesize);
+ claim_file(Input_file* input_file, off_t offset, off_t filesize,
+ Object* elf_object);
+
+ // Get the object associated with the handle and check if it is an elf object.
+ // If it is not a Pluginobj, it is an elf object.
+ Object*
+ get_elf_object(const void* handle);
+
+ // True if the claim_file handler of the plugins is being called.
+ bool
+ in_claim_file_handler()
+ { return in_claim_file_handler_; }
// Let the plugin manager save an archive for later rescanning.
// This takes ownership of the Archive pointer.
@@ -173,7 +185,7 @@ class Plugin_manager
void
all_symbols_read(Workqueue* workqueue, Task* task,
Input_objects* input_objects, Symbol_table* symtab,
- Layout* layout, Dirsearch* dirpath, Mapfile* mapfile,
+ Dirsearch* dirpath, Mapfile* mapfile,
Task_token** last_blocker);
// Tell the plugin manager that we've a new undefined symbol which
@@ -218,8 +230,8 @@ class Plugin_manager
Pluginobj*
make_plugin_object(unsigned int handle);
- // Return the Pluginobj associated with the given HANDLE.
- Pluginobj*
+ // Return the object associated with the given HANDLE.
+ Object*
object(unsigned int handle) const
{
if (handle >= this->objects_.size())
@@ -265,6 +277,14 @@ class Plugin_manager
in_replacement_phase() const
{ return this->in_replacement_phase_; }
+ Input_objects*
+ input_objects() const
+ { return this->input_objects_; }
+
+ Layout*
+ layout()
+ { return this->layout_; }
+
private:
Plugin_manager(const Plugin_manager&);
Plugin_manager& operator=(const Plugin_manager&);
@@ -293,7 +313,7 @@ class Plugin_manager
};
typedef std::list<Plugin*> Plugin_list;
- typedef std::vector<Pluginobj*> Object_list;
+ typedef std::vector<Object*> Object_list;
typedef std::vector<Relobj*> Deferred_layout_list;
typedef std::vector<Rescannable> Rescannable_list;
typedef std::vector<Symbol*> Undefined_symbol_list;
@@ -340,6 +360,9 @@ class Plugin_manager
// Whether any input files or libraries were added by a plugin.
bool any_added_;
+ // Set to true when the claim_file handler of a plugin is called.
+ bool in_claim_file_handler_;
+
const General_options& options_;
Workqueue* workqueue_;
Task* task_;