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.
This commit is contained in:
Rafael Ávila de Espíndola 2011-03-23 14:13:27 +00:00
parent 55406e102f
commit 9c793f143c
3 changed files with 55 additions and 1 deletions

View File

@ -1,3 +1,9 @@
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.
2011-03-21 Ian Lance Taylor <iant@google.com>
* testsuite/final_layout.sh: Rewrite to not use dc.

View File

@ -68,6 +68,9 @@ add_symbols(void *handle, int nsyms, const struct ld_plugin_symbol *syms);
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);
@ -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];
@ -188,6 +191,10 @@ Plugin::load()
tv[i].tv_tag = LDPT_GET_INPUT_FILE;
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

View File

@ -245,6 +245,9 @@ class Plugin_manager
ld_plugin_status
get_input_file(unsigned int handle, struct ld_plugin_input_file* file);
ld_plugin_status
get_view(unsigned int handle, const void **viewp);
// Release an input file.
ld_plugin_status
release_input_file(unsigned int handle);