* 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.
This commit is contained in:
Ian Lance Taylor 2010-08-02 13:34:33 +00:00
parent 93d90f466b
commit 88a4108bde
16 changed files with 255 additions and 76 deletions

View file

@ -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