aboutsummaryrefslogtreecommitdiff
path: root/gold/plugin.cc
diff options
context:
space:
mode:
authorRafael Ávila de Espíndola <respindola@mozilla.com>2011-03-23 14:13:27 +0000
committerRafael Ávila de Espíndola <respindola@mozilla.com>2011-03-23 14:13:27 +0000
commit9c793f143cd36b86c60929319fc0551948dc238d (patch)
tree307be20eefa41c4e2ead16c6cada2d49a0a12293 /gold/plugin.cc
parent55406e102f644f624c170133a678f42478b7feac (diff)
downloadfsf-binutils-gdb-9c793f143cd36b86c60929319fc0551948dc238d.zip
fsf-binutils-gdb-9c793f143cd36b86c60929319fc0551948dc238d.tar.gz
fsf-binutils-gdb-9c793f143cd36b86c60929319fc0551948dc238d.tar.bz2
2010-03-23 Rafael Ávila de Espíndola <respindola@mozilla.com>
* plugin.cc (get_view): New. (Plugin::load): Pass get_view to the plugin. (Plugin_manager::get_view): New.
Diffstat (limited to 'gold/plugin.cc')
-rw-r--r--gold/plugin.cc47
1 files changed, 46 insertions, 1 deletions
diff --git a/gold/plugin.cc b/gold/plugin.cc
index 214eff3..7e259e0 100644
--- a/gold/plugin.cc
+++ b/gold/plugin.cc
@@ -69,6 +69,9 @@ static enum ld_plugin_status
get_input_file(const void *handle, struct ld_plugin_input_file *file);
static enum ld_plugin_status
+get_view(const void *handle, const void **viewp);
+
+static enum ld_plugin_status
release_input_file(const void *handle);
static enum ld_plugin_status
@@ -130,7 +133,7 @@ Plugin::load()
sscanf(ver, "%d.%d", &major, &minor);
// Allocate and populate a transfer vector.
- const int tv_fixed_size = 16;
+ const int tv_fixed_size = 17;
int tv_size = this->args_.size() + tv_fixed_size;
ld_plugin_tv* tv = new ld_plugin_tv[tv_size];
@@ -189,6 +192,10 @@ Plugin::load()
tv[i].tv_u.tv_get_input_file = get_input_file;
++i;
+ tv[i].tv_tag = LDPT_GET_VIEW;
+ tv[i].tv_u.tv_get_view = get_view;
+
+ ++i;
tv[i].tv_tag = LDPT_RELEASE_INPUT_FILE;
tv[i].tv_u.tv_release_input_file = release_input_file;
@@ -635,6 +642,35 @@ Plugin_manager::release_input_file(unsigned int handle)
return LDPS_OK;
}
+ld_plugin_status
+Plugin_manager::get_view(unsigned int handle, const void **viewp)
+{
+ off_t offset;
+ size_t filesize;
+ Input_file *input_file;
+ if (this->objects_.size() == handle)
+ {
+ // We are being called from the claim_file hook.
+ const struct ld_plugin_input_file &f = this->plugin_input_file_;
+ offset = f.offset;
+ filesize = f.filesize;
+ input_file = this->input_file_;
+ }
+ else
+ {
+ // An already claimed file.
+ Pluginobj* obj = this->object(handle);
+ if (obj == NULL)
+ return LDPS_BAD_HANDLE;
+ offset = obj->offset();
+ filesize = obj->filesize();
+ input_file = obj->input_file();
+ }
+ *viewp = (void*) input_file->file().get_view(offset, 0, filesize, false,
+ false);
+ return LDPS_OK;
+}
+
// Add a new library path.
ld_plugin_status
@@ -1247,6 +1283,15 @@ release_input_file(const void* handle)
return parameters->options().plugins()->release_input_file(obj_index);
}
+static enum ld_plugin_status
+get_view(const void *handle, const void **viewp)
+{
+ gold_assert(parameters->options().has_plugins());
+ unsigned int obj_index =
+ static_cast<unsigned int>(reinterpret_cast<intptr_t>(handle));
+ return parameters->options().plugins()->get_view(obj_index, viewp);
+}
+
// Get the symbol resolution info for a plugin-claimed input file.
static enum ld_plugin_status