diff options
author | Sriraman Tallam <tmsriram@google.com> | 2018-02-22 13:56:46 -0800 |
---|---|---|
committer | Sriraman Tallam <tmsriram@google.com> | 2018-02-22 13:56:46 -0800 |
commit | 0b65c07b97c43e8891c2e14061270878a85222c8 (patch) | |
tree | a9c9e130a0045291605c400a0d086d99b1c515b0 /gold/plugin.cc | |
parent | 0bccfb2994d307601ceba5c3a6223b7ca7cf5338 (diff) | |
download | gdb-0b65c07b97c43e8891c2e14061270878a85222c8.zip gdb-0b65c07b97c43e8891c2e14061270878a85222c8.tar.gz gdb-0b65c07b97c43e8891c2e14061270878a85222c8.tar.bz2 |
New plugin interface to get list of symbols wrapped with --wrap option.
2018-02-22 Sriraman Tallam <tmsriram@google.com>
* plugin.cc (get_wrap_symbols): New plugin interface.
(load): Add get_wrap_symbols to transfer vector.
* plugin-api.h (ld_plugin_get_wrap_symbols): New plugin interface.
* testsuite/plugin_test.c (onload): Call and check get_wrap_symbols
interface.
* testsuite/plugin_test_wrap_symbols.sh: New test script.
* testsuite/plugin_test_wrap_symbols_1.cc: New file.
* testsuite/plugin_test_wrap_symbols_2.cc: New file.
* testsuite/Makefile.am (plugin_test_wrap_symbols): New test.
* testsuite/Makefile.in: Regenerate.
Diffstat (limited to 'gold/plugin.cc')
-rw-r--r-- | gold/plugin.cc | 28 |
1 files changed, 27 insertions, 1 deletions
diff --git a/gold/plugin.cc b/gold/plugin.cc index 566f1b7..442eda0 100644 --- a/gold/plugin.cc +++ b/gold/plugin.cc @@ -170,6 +170,9 @@ get_input_section_size(const struct ld_plugin_section section, static enum ld_plugin_status register_new_input(ld_plugin_new_input_handler handler); +static enum ld_plugin_status +get_wrap_symbols(uint64_t *num_symbols, const char ***wrap_symbol_list); + }; #endif // ENABLE_PLUGINS @@ -214,7 +217,7 @@ Plugin::load() sscanf(ver, "%d.%d", &major, &minor); // Allocate and populate a transfer vector. - const int tv_fixed_size = 30; + const int tv_fixed_size = 31; int tv_size = this->args_.size() + tv_fixed_size; ld_plugin_tv* tv = new ld_plugin_tv[tv_size]; @@ -353,6 +356,10 @@ Plugin::load() tv[i].tv_u.tv_register_new_input = register_new_input; ++i; + tv[i].tv_tag = LDPT_GET_WRAP_SYMBOLS; + tv[i].tv_u.tv_get_wrap_symbols = get_wrap_symbols; + + ++i; tv[i].tv_tag = LDPT_NULL; tv[i].tv_u.tv_val = 0; @@ -1833,6 +1840,25 @@ get_input_section_size(const struct ld_plugin_section section, return LDPS_OK; } +static enum ld_plugin_status +get_wrap_symbols(uint64_t *count, const char ***wrap_symbols) +{ + gold_assert(parameters->options().has_plugins()); + *count = parameters->options().wrap_size(); + + if (*count == 0) + return LDPS_OK; + + *wrap_symbols = new const char *[*count]; + int i = 0; + for (options::String_set::const_iterator + it = parameters->options().wrap_begin(); + it != parameters->options().wrap_end(); ++it, ++i) { + (*wrap_symbols)[i] = it->c_str(); + } + return LDPS_OK; +} + // Specify the ordering of sections in the final layout. The sections are // specified as (handle,shndx) pairs in the two arrays in the order in |