diff options
author | Ian Lance Taylor <ian@airs.com> | 2010-08-02 13:34:33 +0000 |
---|---|---|
committer | Ian Lance Taylor <ian@airs.com> | 2010-08-02 13:34:33 +0000 |
commit | 88a4108bde4d02cccd632048b45458e84bc8b40b (patch) | |
tree | e020b29ea8793617ea774963998d2de40cd349fe /gold/script.cc | |
parent | PR gas/11867 (diff) | |
download | binutils-gdb-88a4108bde4d02cccd632048b45458e84bc8b40b.tar.gz binutils-gdb-88a4108bde4d02cccd632048b45458e84bc8b40b.tar.bz2 binutils-gdb-88a4108bde4d02cccd632048b45458e84bc8b40b.zip |
PR 11855
* script.cc (Script_options::Script_options): Initialize
symbol_definitions_ and symbol_references_.
(Script_options::add_symbol_assignment): Update
symbol_definitions_ and symbol_references_.
(Script_options::add_symbol_reference): New function.
(script_symbol): New function.
* script.h (class Script_options): Add symbol_definitions_ and
symbol_references_ fields.
(Script_options::referenced_const_iterator): New type.
(Script_options::referenced_begin): New function.
(Script_options::referenced_end): New function.
(Script_options::is_referenced): New function.
(Script_options::any_unreferenced): New function.
* script-c.h (script_symbol): Declare.
* yyscript.y (exp): Call script_symbol.
* symtab.cc: Include "script.h".
(Symbol_table::gc_mark_undef_symbols): Add layout parameter.
Change all callers. Check symbols referenced by scripts.
(Symbol_table::add_undefined_symbols_from_command_line): Add
layout parameter. Change all callers.
(Symbol_table::do_add_undefined_symbols_from_command_line):
Likewise. Break out loop body. Check symbols referenced by
scripts.
(Symbol_table::add_undefined_symbol_from_command_line): New
function broken out of
do_add_undefined_symbols_from_command_line.
* symtab.h (class Symbol_table): Update declarations.
* archive.cc: Include "layout.h".
(Archive::should_include_member): Add layout parameter. Change
all callers. Check for symbol mentioned in expression.
* archive.h (class Archive): Update declaration.
* object.cc (Sized_relobj::do_should_include_member): Add layout
parameter.
* object.h (Object::should_include_member): Add layout parameter.
Change all callers.
(Object::do_should_include_member): Add layout parameter.
(class Sized_relobj): Update declaration.
* dynobj.cc (Sized_dynobj::do_should_include_member): Add layout
parameter.
* dynobj.h (class Sized_dynobj): Update declaration.
* plugin.cc (Sized_pluginobj::do_should_include_member): Add
layout parameter.
* plugin.h (class Sized_pluginobj): Update declaration.
Diffstat (limited to 'gold/script.cc')
-rw-r--r-- | gold/script.cc | 35 |
1 files changed, 33 insertions, 2 deletions
diff --git a/gold/script.cc b/gold/script.cc index 2cdaae6384e..e0b9359abdc 100644 --- a/gold/script.cc +++ b/gold/script.cc @@ -1045,8 +1045,8 @@ Script_assertion::print(FILE* f) const // Class Script_options. Script_options::Script_options() - : entry_(), symbol_assignments_(), version_script_info_(), - script_sections_() + : entry_(), symbol_assignments_(), symbol_definitions_(), + symbol_references_(), version_script_info_(), script_sections_() { } @@ -1071,6 +1071,13 @@ Script_options::add_symbol_assignment(const char* name, size_t length, value, provide, hidden); this->symbol_assignments_.push_back(p); } + + if (!provide) + { + std::string n(name, length); + this->symbol_definitions_.insert(n); + this->symbol_references_.erase(n); + } } else { @@ -1084,6 +1091,19 @@ Script_options::add_symbol_assignment(const char* name, size_t length, } } +// Add a reference to a symbol. + +void +Script_options::add_symbol_reference(const char* name, size_t length) +{ + if (length != 1 || name[0] != '.') + { + std::string n(name, length); + if (this->symbol_definitions_.find(n) == this->symbol_definitions_.end()) + this->symbol_references_.insert(n); + } +} + // Add an assertion. void @@ -2679,6 +2699,17 @@ script_set_common_allocation(void* closurev, int set) script_parse_option(closurev, arg, strlen(arg)); } +// Called by the bison parser to refer to a symbol. + +extern "C" Expression* +script_symbol(void *closurev, const char* name, size_t length) +{ + Parser_closure* closure = static_cast<Parser_closure*>(closurev); + if (length != 1 || name[0] != '.') + closure->script_options()->add_symbol_reference(name, length); + return script_exp_string(name, length); +} + // Called by the bison parser to define a symbol. extern "C" void |