* symtab.cc (Symbol_table::add_from_object): Rename def parameter

to is_default_version.  Rename insdef to insdefault.
	(Symbol_table::add_from_relobj): Rename def to is_default_version
	and local to is_forced_local.
	(Symbol_table::add_from_pluginobj): Likewise.
	(Symbol_table::add_from_dynobj): Likewise.
	(Symbol_table::define_special_symbol): Rename insdef to
	insdefault.
This commit is contained in:
Ian Lance Taylor 2010-01-05 19:29:15 +00:00
parent 0d15807dcf
commit 8781f70964
2 changed files with 68 additions and 53 deletions

View File

@ -1,3 +1,14 @@
2010-01-05 Ian Lance Taylor <iant@google.com>
* symtab.cc (Symbol_table::add_from_object): Rename def parameter
to is_default_version. Rename insdef to insdefault.
(Symbol_table::add_from_relobj): Rename def to is_default_version
and local to is_forced_local.
(Symbol_table::add_from_pluginobj): Likewise.
(Symbol_table::add_from_dynobj): Likewise.
(Symbol_table::define_special_symbol): Rename insdef to
insdefault.
2010-01-04 Ian Lance Taylor <iant@google.com>
PR 10980

View File

@ -1,6 +1,6 @@
// symtab.cc -- the gold symbol table
// Copyright 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
// Copyright 2006, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
// Written by Ian Lance Taylor <iant@google.com>.
// This file is part of gold.
@ -813,13 +813,13 @@ Symbol_table::define_default_version(Sized_symbol<size>* sym,
// section index; IS_ORDINARY is whether this is a normal section
// rather than a special code.
// If DEF is true, then this is the definition of a default version of
// a symbol. That means that any lookup of NAME/NULL and any lookup
// of NAME/VERSION should always return the same symbol. This is
// obvious for references, but in particular we want to do this for
// definitions: overriding NAME/NULL should also override
// NAME/VERSION. If we don't do that, it would be very hard to
// override functions in a shared library which uses versioning.
// If IS_DEFAULT_VERSION is true, then this is the definition of a
// default version of a symbol. That means that any lookup of
// NAME/NULL and any lookup of NAME/VERSION should always return the
// same symbol. This is obvious for references, but in particular we
// want to do this for definitions: overriding NAME/NULL should also
// override NAME/VERSION. If we don't do that, it would be very hard
// to override functions in a shared library which uses versioning.
// We implement this by simply making both entries in the hash table
// point to the same Symbol structure. That is easy enough if this is
@ -844,7 +844,7 @@ Symbol_table::add_from_object(Object* object,
Stringpool::Key name_key,
const char *version,
Stringpool::Key version_key,
bool def,
bool is_default_version,
const elfcpp::Sym<size, big_endian>& sym,
unsigned int st_shndx,
bool is_ordinary,
@ -883,14 +883,14 @@ Symbol_table::add_from_object(Object* object,
this->table_.insert(std::make_pair(std::make_pair(name_key, version_key),
snull));
std::pair<typename Symbol_table_type::iterator, bool> insdef =
std::pair<typename Symbol_table_type::iterator, bool> insdefault =
std::make_pair(this->table_.end(), false);
if (def)
if (is_default_version)
{
const Stringpool::Key vnull_key = 0;
insdef = this->table_.insert(std::make_pair(std::make_pair(name_key,
vnull_key),
snull));
insdefault = this->table_.insert(std::make_pair(std::make_pair(name_key,
vnull_key),
snull));
}
// ins.first: an iterator, which is a pointer to a pair.
@ -915,20 +915,20 @@ Symbol_table::add_from_object(Object* object,
if (parameters->options().gc_sections())
this->gc_mark_dyn_syms(ret);
if (def)
this->define_default_version<size, big_endian>(ret, insdef.second,
insdef.first);
if (is_default_version)
this->define_default_version<size, big_endian>(ret, insdefault.second,
insdefault.first);
}
else
{
// This is the first time we have seen NAME/VERSION.
gold_assert(ins.first->second == NULL);
if (def && !insdef.second)
if (is_default_version && !insdefault.second)
{
// We already have an entry for NAME/NULL. If we override
// it, then change it to NAME/VERSION.
ret = this->get_sized_symbol<size>(insdef.first->second);
ret = this->get_sized_symbol<size>(insdefault.first->second);
was_undefined = ret->is_undefined();
was_common = ret->is_common();
@ -955,12 +955,12 @@ Symbol_table::add_from_object(Object* object,
{
// This means that we don't want a symbol table
// entry after all.
if (!def)
if (!is_default_version)
this->table_.erase(ins.first);
else
{
this->table_.erase(insdef.first);
// Inserting insdef invalidated ins.
this->table_.erase(insdefault.first);
// Inserting INSDEFAULT invalidated INS.
this->table_.erase(std::make_pair(name_key,
version_key));
}
@ -971,16 +971,16 @@ Symbol_table::add_from_object(Object* object,
ret->init_object(name, version, object, sym, st_shndx, is_ordinary);
ins.first->second = ret;
if (def)
if (is_default_version)
{
// This is the first time we have seen NAME/NULL. Point
// it at the new entry for NAME/VERSION.
gold_assert(insdef.second);
insdef.first->second = ret;
gold_assert(insdefault.second);
insdefault.first->second = ret;
}
}
if (def)
if (is_default_version)
ret->set_is_default();
}
@ -1081,9 +1081,10 @@ Symbol_table::add_from_relobj(
const char* ver = strchr(name, '@');
Stringpool::Key ver_key = 0;
int namelen = 0;
// DEF: is the version default? LOCAL: is the symbol forced local?
bool def = false;
bool local = false;
// IS_DEFAULT_VERSION: is the version default?
// IS_FORCED_LOCAL: is the symbol forced local?
bool is_default_version = false;
bool is_forced_local = false;
if (ver != NULL)
{
@ -1092,7 +1093,7 @@ Symbol_table::add_from_relobj(
++ver;
if (*ver == '@')
{
def = true;
is_default_version = true;
++ver;
}
ver = this->namepool_.add(ver, true, &ver_key);
@ -1119,11 +1120,11 @@ Symbol_table::add_from_relobj(
version.length(),
true,
&ver_key);
def = true;
is_default_version = true;
}
}
else if (this->version_script_.symbol_is_local(name))
local = true;
is_forced_local = true;
}
}
@ -1177,8 +1178,8 @@ Symbol_table::add_from_relobj(
Sized_symbol<size>* res;
res = this->add_from_object(relobj, name, name_key, ver, ver_key,
def, *psym, st_shndx, is_ordinary,
orig_st_shndx);
is_default_version, *psym, st_shndx,
is_ordinary, orig_st_shndx);
// If building a shared library using garbage collection, do not
// treat externally visible symbols as garbage.
@ -1186,7 +1187,7 @@ Symbol_table::add_from_relobj(
&& parameters->options().shared())
this->gc_mark_symbol_for_shlib(res);
if (local)
if (is_forced_local)
this->force_local(res);
(*sympointers)[i] = res;
@ -1207,8 +1208,8 @@ Symbol_table::add_from_pluginobj(
bool is_ordinary = st_shndx < elfcpp::SHN_LORESERVE;
Stringpool::Key ver_key = 0;
bool def = false;
bool local = false;
bool is_default_version = false;
bool is_forced_local = false;
if (ver != NULL)
{
@ -1235,11 +1236,11 @@ Symbol_table::add_from_pluginobj(
version.length(),
true,
&ver_key);
def = true;
is_default_version = true;
}
}
else if (this->version_script_.symbol_is_local(name))
local = true;
is_forced_local = true;
}
}
@ -1248,9 +1249,10 @@ Symbol_table::add_from_pluginobj(
Sized_symbol<size>* res;
res = this->add_from_object(obj, name, name_key, ver, ver_key,
def, *sym, st_shndx, is_ordinary, st_shndx);
is_default_version, *sym, st_shndx,
is_ordinary, st_shndx);
if (local)
if (is_forced_local)
this->force_local(res);
return res;
@ -1425,10 +1427,11 @@ Symbol_table::add_from_dynobj(
st_shndx);
else
{
const bool def = (!hidden
&& st_shndx != elfcpp::SHN_UNDEF);
const bool is_default_version =
!hidden && st_shndx != elfcpp::SHN_UNDEF;
res = this->add_from_object(dynobj, name, name_key, version,
version_key, def, *psym, st_shndx,
version_key, is_default_version,
*psym, st_shndx,
is_ordinary, st_shndx);
}
}
@ -1604,14 +1607,15 @@ Symbol_table::define_special_symbol(const char** pname, const char** pversion,
version_key),
snull));
std::pair<typename Symbol_table_type::iterator, bool> insdef =
std::pair<typename Symbol_table_type::iterator, bool> insdefault =
std::make_pair(this->table_.end(), false);
if (is_default_version)
{
const Stringpool::Key vnull = 0;
insdef = this->table_.insert(std::make_pair(std::make_pair(name_key,
vnull),
snull));
insdefault =
this->table_.insert(std::make_pair(std::make_pair(name_key,
vnull),
snull));
}
if (!ins.second)
@ -1625,8 +1629,8 @@ Symbol_table::define_special_symbol(const char** pname, const char** pversion,
Sized_symbol<size>* soldsym =
this->get_sized_symbol<size>(oldsym);
this->define_default_version<size, big_endian>(soldsym,
insdef.second,
insdef.first);
insdefault.second,
insdefault.first);
}
}
else
@ -1637,11 +1641,11 @@ Symbol_table::define_special_symbol(const char** pname, const char** pversion,
add_to_table = true;
add_loc = ins.first;
if (is_default_version && !insdef.second)
if (is_default_version && !insdefault.second)
{
// We are adding NAME/VERSION, and it is the default
// version. We already have an entry for NAME/NULL.
oldsym = insdef.first->second;
oldsym = insdefault.first->second;
*resolve_oldsym = true;
}
else
@ -1651,7 +1655,7 @@ Symbol_table::define_special_symbol(const char** pname, const char** pversion,
if (is_default_version)
{
add_def_to_table = true;
add_def_loc = insdef.first;
add_def_loc = insdefault.first;
}
}
}