aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gold/dynobj.cc165
-rw-r--r--gold/dynobj.h15
-rw-r--r--gold/gold.h5
-rw-r--r--gold/layout.cc50
-rw-r--r--gold/layout.h3
5 files changed, 135 insertions, 103 deletions
diff --git a/gold/dynobj.cc b/gold/dynobj.cc
index 9871bde..7afaaa5 100644
--- a/gold/dynobj.cc
+++ b/gold/dynobj.cc
@@ -1050,7 +1050,8 @@ Dynobj::sized_create_gnu_hash_table(
template<int size, bool big_endian>
unsigned char*
-Verdef::write(const Stringpool* dynpool, bool is_last, unsigned char* pb) const
+Verdef::write(const Stringpool* dynpool, bool is_last, unsigned char* pb
+ ACCEPT_SIZE_ENDIAN) const
{
const int verdef_size = elfcpp::Elf_sizes<size>::verdef_size;
const int verdaux_size = elfcpp::Elf_sizes<size>::verdaux_size;
@@ -1129,7 +1130,7 @@ Verneed::finalize(unsigned int index)
template<int size, bool big_endian>
unsigned char*
Verneed::write(const Stringpool* dynpool, bool is_last,
- unsigned char* pb) const
+ unsigned char* pb ACCEPT_SIZE_ENDIAN) const
{
const int verneed_size = elfcpp::Elf_sizes<size>::verneed_size;
const int vernaux_size = elfcpp::Elf_sizes<size>::vernaux_size;
@@ -1367,12 +1368,9 @@ Versions::version_index(const Stringpool* dynpool, const Symbol* sym) const
const char* version = dynpool->find(sym->version(), &version_key);
gold_assert(version != NULL);
- Version_table::const_iterator p;
+ Key k;
if (!sym->is_from_dynobj())
- {
- Key k(version_key, 0);
- p = this->version_table_.find(k);
- }
+ k = Key(version_key, 0);
else
{
Object* object = sym->object();
@@ -1383,10 +1381,10 @@ Versions::version_index(const Stringpool* dynpool, const Symbol* sym) const
const char* filename = dynpool->find(dynobj->soname(), &filename_key);
gold_assert(filename != NULL);
- Key k(version_key, filename_key);
- p = this->version_table_.find(k);
+ k = Key(version_key, filename_key);
}
+ Version_table::const_iterator p = this->version_table_.find(k);
gold_assert(p != this->version_table_.end());
return p->second->index();
@@ -1401,7 +1399,8 @@ Versions::symbol_section_contents(const Stringpool* dynpool,
unsigned int local_symcount,
const std::vector<Symbol*>& syms,
unsigned char** pp,
- unsigned int* psize) const
+ unsigned int* psize
+ ACCEPT_SIZE_ENDIAN) const
{
gold_assert(this->is_finalized_);
@@ -1437,7 +1436,8 @@ template<int size, bool big_endian>
void
Versions::def_section_contents(const Stringpool* dynpool,
unsigned char** pp, unsigned int* psize,
- unsigned int* pentries) const
+ unsigned int* pentries
+ ACCEPT_SIZE_ENDIAN) const
{
gold_assert(this->is_finalized_);
gold_assert(!this->defs_.empty());
@@ -1462,9 +1462,9 @@ Versions::def_section_contents(const Stringpool* dynpool,
for (p = this->defs_.begin(), i = 0;
p != this->defs_.end();
++p, ++i)
- pb = (*p)->write<size, big_endian>(dynpool,
- i + 1 >= this->defs_.size(),
- pb);
+ pb = (*p)->write SELECT_SIZE_ENDIAN_NAME(size, big_endian)(
+ dynpool, i + 1 >= this->defs_.size(), pb
+ SELECT_SIZE_ENDIAN(size, big_endian));
gold_assert(static_cast<unsigned int>(pb - pbuf) == sz);
@@ -1480,7 +1480,8 @@ template<int size, bool big_endian>
void
Versions::need_section_contents(const Stringpool* dynpool,
unsigned char** pp, unsigned int *psize,
- unsigned int *pentries) const
+ unsigned int *pentries
+ ACCEPT_SIZE_ENDIAN) const
{
gold_assert(this->is_finalized_);
gold_assert(!this->needs_.empty());
@@ -1505,9 +1506,9 @@ Versions::need_section_contents(const Stringpool* dynpool,
for (p = this->needs_.begin(), i = 0;
p != this->needs_.end();
++p, ++i)
- pb = (*p)->write<size, big_endian>(dynpool,
- i + 1 >= this->needs_.size(),
- pb);
+ pb = (*p)->write SELECT_SIZE_ENDIAN_NAME(size, big_endian)(
+ dynpool, i + 1 >= this->needs_.size(), pb
+ SELECT_SIZE_ENDIAN(size, big_endian));
gold_assert(static_cast<unsigned int>(pb - pbuf) == sz);
@@ -1533,90 +1534,114 @@ class Sized_dynobj<64, true>;
template
void
-Versions::symbol_section_contents<32, false>(const Stringpool*,
- unsigned int,
- const std::vector<Symbol*>&,
- unsigned char**,
- unsigned int*) const;
+Versions::symbol_section_contents<32, false>(
+ const Stringpool*,
+ unsigned int,
+ const std::vector<Symbol*>&,
+ unsigned char**,
+ unsigned int*
+ ACCEPT_SIZE_ENDIAN_EXPLICIT(32, false)) const;
template
void
-Versions::symbol_section_contents<32, true>(const Stringpool*,
- unsigned int,
- const std::vector<Symbol*>&,
- unsigned char**,
- unsigned int*) const;
+Versions::symbol_section_contents<32, true>(
+ const Stringpool*,
+ unsigned int,
+ const std::vector<Symbol*>&,
+ unsigned char**,
+ unsigned int*
+ ACCEPT_SIZE_ENDIAN_EXPLICIT(32, true)) const;
template
void
-Versions::symbol_section_contents<64, false>(const Stringpool*,
- unsigned int,
- const std::vector<Symbol*>&,
- unsigned char**,
- unsigned int*) const;
+Versions::symbol_section_contents<64, false>(
+ const Stringpool*,
+ unsigned int,
+ const std::vector<Symbol*>&,
+ unsigned char**,
+ unsigned int*
+ ACCEPT_SIZE_ENDIAN_EXPLICIT(64, false)) const;
template
void
-Versions::symbol_section_contents<64, true>(const Stringpool*,
- unsigned int,
- const std::vector<Symbol*>&,
- unsigned char**,
- unsigned int*) const;
+Versions::symbol_section_contents<64, true>(
+ const Stringpool*,
+ unsigned int,
+ const std::vector<Symbol*>&,
+ unsigned char**,
+ unsigned int*
+ ACCEPT_SIZE_ENDIAN_EXPLICIT(64, true)) const;
template
void
-Versions::def_section_contents<32, false>(const Stringpool*,
- unsigned char**,
- unsigned int*,
- unsigned int*) const;
+Versions::def_section_contents<32, false>(
+ const Stringpool*,
+ unsigned char**,
+ unsigned int*,
+ unsigned int*
+ ACCEPT_SIZE_ENDIAN_EXPLICIT(32, false)) const;
template
void
-Versions::def_section_contents<32, true>(const Stringpool*,
- unsigned char**,
- unsigned int*,
- unsigned int*) const;
+Versions::def_section_contents<32, true>(
+ const Stringpool*,
+ unsigned char**,
+ unsigned int*,
+ unsigned int*
+ ACCEPT_SIZE_ENDIAN_EXPLICIT(32, true)) const;
template
void
-Versions::def_section_contents<64, false>(const Stringpool*,
- unsigned char**,
- unsigned int*,
- unsigned int*) const;
+Versions::def_section_contents<64, false>(
+ const Stringpool*,
+ unsigned char**,
+ unsigned int*,
+ unsigned int*
+ ACCEPT_SIZE_ENDIAN_EXPLICIT(64, false)) const;
template
void
-Versions::def_section_contents<64, true>(const Stringpool*,
- unsigned char**,
- unsigned int*,
- unsigned int*) const;
+Versions::def_section_contents<64, true>(
+ const Stringpool*,
+ unsigned char**,
+ unsigned int*,
+ unsigned int*
+ ACCEPT_SIZE_ENDIAN_EXPLICIT(64, true)) const;
template
void
-Versions::need_section_contents<32, false>(const Stringpool*,
- unsigned char**,
- unsigned int*,
- unsigned int*) const;
+Versions::need_section_contents<32, false>(
+ const Stringpool*,
+ unsigned char**,
+ unsigned int*,
+ unsigned int*
+ ACCEPT_SIZE_ENDIAN_EXPLICIT(32, false)) const;
template
void
-Versions::need_section_contents<32, true>(const Stringpool*,
- unsigned char**,
- unsigned int*,
- unsigned int*) const;
+Versions::need_section_contents<32, true>(
+ const Stringpool*,
+ unsigned char**,
+ unsigned int*,
+ unsigned int*
+ ACCEPT_SIZE_ENDIAN_EXPLICIT(32, true)) const;
template
void
-Versions::need_section_contents<64, false>(const Stringpool*,
- unsigned char**,
- unsigned int*,
- unsigned int*) const;
+Versions::need_section_contents<64, false>(
+ const Stringpool*,
+ unsigned char**,
+ unsigned int*,
+ unsigned int*
+ ACCEPT_SIZE_ENDIAN_EXPLICIT(64, false)) const;
template
void
-Versions::need_section_contents<64, true>(const Stringpool*,
- unsigned char**,
- unsigned int*,
- unsigned int*) const;
+Versions::need_section_contents<64, true>(
+ const Stringpool*,
+ unsigned char**,
+ unsigned int*,
+ unsigned int*
+ ACCEPT_SIZE_ENDIAN_EXPLICIT(64, true)) const;
} // End namespace gold.
diff --git a/gold/dynobj.h b/gold/dynobj.h
index 9e5dd43..476b602 100644
--- a/gold/dynobj.h
+++ b/gold/dynobj.h
@@ -274,7 +274,8 @@ class Verdef : public Version_base
// Write contents to buffer.
template<int size, bool big_endian>
unsigned char*
- write(const Stringpool*, bool is_last, unsigned char*) const;
+ write(const Stringpool*, bool is_last, unsigned char*
+ ACCEPT_SIZE_ENDIAN) const;
private:
Verdef(const Verdef&);
@@ -359,7 +360,8 @@ class Verneed
// Write contents to buffer.
template<int size, bool big_endian>
unsigned char*
- write(const Stringpool*, bool is_last, unsigned char*) const;
+ write(const Stringpool*, bool is_last, unsigned char*
+ ACCEPT_SIZE_ENDIAN) const;
private:
Verneed(const Verneed&);
@@ -416,21 +418,24 @@ class Versions
void
symbol_section_contents(const Stringpool*, unsigned int local_symcount,
const std::vector<Symbol*>& syms,
- unsigned char**, unsigned int*) const;
+ unsigned char**, unsigned int*
+ ACCEPT_SIZE_ENDIAN) const;
// Build an allocated buffer holding the contents of the version
// definition section (.gnu.version_d).
template<int size, bool big_endian>
void
def_section_contents(const Stringpool*, unsigned char**,
- unsigned int* psize, unsigned int* pentries) const;
+ unsigned int* psize, unsigned int* pentries
+ ACCEPT_SIZE_ENDIAN) const;
// Build an allocated buffer holding the contents of the version
// reference section (.gnu.version_r).
template<int size, bool big_endian>
void
need_section_contents(const Stringpool*, unsigned char**,
- unsigned int* psize, unsigned int* pentries) const;
+ unsigned int* psize, unsigned int* pentries
+ ACCEPT_SIZE_ENDIAN) const;
private:
// The type of the list of version definitions.
diff --git a/gold/gold.h b/gold/gold.h
index e4cd786..288d9eb 100644
--- a/gold/gold.h
+++ b/gold/gold.h
@@ -101,12 +101,14 @@ namespace gold
#define SELECT_SIZE_ONLY(size)
#define ACCEPT_SIZE
#define ACCEPT_SIZE_ONLY
+#define ACCEPT_SIZE_EXPLICIT(size)
#define SELECT_SIZE_ENDIAN_NAME(size, big_endian) <size, big_endian>
#define SELECT_SIZE_ENDIAN(size, big_endian)
#define SELECT_SIZE_ENDIAN_ONLY(size, big_endian)
#define ACCEPT_SIZE_ENDIAN
#define ACCEPT_SIZE_ENDIAN_ONLY
+#define ACCEPT_SIZE_ENDIAN_EXPLICIT(size, big_endian)
#else // !defined(HAVE_MEMBER_TEMPLATE_SPECIFICATIONS)
@@ -120,6 +122,7 @@ class Select_size_endian { };
#define SELECT_SIZE_ONLY(size) Select_size<size>()
#define ACCEPT_SIZE , Select_size<size>
#define ACCEPT_SIZE_ONLY Select_size<size>
+#define ACCEPT_SIZE_EXPLICIT(size) , Select_size<size>
#define SELECT_SIZE_ENDIAN_NAME(size, big_endian)
#define SELECT_SIZE_ENDIAN(size, big_endian) \
@@ -128,6 +131,8 @@ class Select_size_endian { };
Select_size_endian<size, big_endian>()
#define ACCEPT_SIZE_ENDIAN , Select_size_endian<size, big_endian>
#define ACCEPT_SIZE_ENDIAN_ONLY Select_size_endian<size, big_endian>
+#define ACCEPT_SIZE_ENDIAN_EXPLICIT(size, big_endian) \
+ , Select_size_endian<size, big_endian>
#endif // !defined(HAVE_MEMBER_TEMPLATE_SPECIFICATIONS)
diff --git a/gold/layout.cc b/gold/layout.cc
index 2d7a3fa..c150707 100644
--- a/gold/layout.cc
+++ b/gold/layout.cc
@@ -979,28 +979,24 @@ Layout::create_version_sections(const Target* target, const Versions* versions,
if (target->get_size() == 32)
{
if (target->is_big_endian())
- this->sized_create_version_sections<32, true>(versions,
- local_symcount,
- dynamic_symbols,
- dynstr);
+ this->sized_create_version_sections SELECT_SIZE_ENDIAN_NAME(32, true)(
+ versions, local_symcount, dynamic_symbols, dynstr
+ SELECT_SIZE_ENDIAN(32, true));
else
- this->sized_create_version_sections<32, false>(versions,
- local_symcount,
- dynamic_symbols,
- dynstr);
+ this->sized_create_version_sections SELECT_SIZE_ENDIAN_NAME(32, false)(
+ versions, local_symcount, dynamic_symbols, dynstr
+ SELECT_SIZE_ENDIAN(32, false));
}
else if (target->get_size() == 64)
{
if (target->is_big_endian())
- this->sized_create_version_sections<64, true>(versions,
- local_symcount,
- dynamic_symbols,
- dynstr);
+ this->sized_create_version_sections SELECT_SIZE_ENDIAN_NAME(64, true)(
+ versions, local_symcount, dynamic_symbols, dynstr
+ SELECT_SIZE_ENDIAN(64, true));
else
- this->sized_create_version_sections<64, false>(versions,
- local_symcount,
- dynamic_symbols,
- dynstr);
+ this->sized_create_version_sections SELECT_SIZE_ENDIAN_NAME(64, false)(
+ versions, local_symcount, dynamic_symbols, dynstr
+ SELECT_SIZE_ENDIAN(64, false));
}
else
gold_unreachable();
@@ -1014,7 +1010,8 @@ Layout::sized_create_version_sections(
const Versions* versions,
unsigned int local_symcount,
const std::vector<Symbol*>& dynamic_symbols,
- const Output_section* dynstr)
+ const Output_section* dynstr
+ ACCEPT_SIZE_ENDIAN)
{
const char* vname = this->namepool_.add(".gnu.version", NULL);
Output_section* vsec = this->make_output_section(vname,
@@ -1023,10 +1020,9 @@ Layout::sized_create_version_sections(
unsigned char* vbuf;
unsigned int vsize;
- versions->symbol_section_contents<size, big_endian>(&this->dynpool_,
- local_symcount,
- dynamic_symbols,
- &vbuf, &vsize);
+ versions->symbol_section_contents SELECT_SIZE_ENDIAN_NAME(size, big_endian)(
+ &this->dynpool_, local_symcount, dynamic_symbols, &vbuf, &vsize
+ SELECT_SIZE_ENDIAN(size, big_endian));
Output_section_data* vdata = new Output_data_const_buffer(vbuf, vsize, 2);
@@ -1047,9 +1043,9 @@ Layout::sized_create_version_sections(
unsigned char* vdbuf;
unsigned int vdsize;
unsigned int vdentries;
- versions->def_section_contents<size, big_endian>(&this->dynpool_,
- &vdbuf, &vdsize,
- &vdentries);
+ versions->def_section_contents SELECT_SIZE_ENDIAN_NAME(size, big_endian)(
+ &this->dynpool_, &vdbuf, &vdsize, &vdentries
+ SELECT_SIZE_ENDIAN(size, big_endian));
Output_section_data* vddata = new Output_data_const_buffer(vdbuf,
vdsize,
@@ -1073,9 +1069,9 @@ Layout::sized_create_version_sections(
unsigned char* vnbuf;
unsigned int vnsize;
unsigned int vnentries;
- versions->need_section_contents<size, big_endian>(&this->dynpool_,
- &vnbuf, &vnsize,
- &vnentries);
+ versions->need_section_contents SELECT_SIZE_ENDIAN_NAME(size, big_endian)
+ (&this->dynpool_, &vnbuf, &vnsize, &vnentries
+ SELECT_SIZE_ENDIAN(size, big_endian));
Output_section_data* vndata = new Output_data_const_buffer(vnbuf,
vnsize,
diff --git a/gold/layout.h b/gold/layout.h
index 44f9f4e..8b349cc 100644
--- a/gold/layout.h
+++ b/gold/layout.h
@@ -227,7 +227,8 @@ class Layout
sized_create_version_sections(const Versions* versions,
unsigned int local_symcount,
const std::vector<Symbol*>& dynamic_symbols,
- const Output_section* dynstr);
+ const Output_section* dynstr
+ ACCEPT_SIZE_ENDIAN);
// Return whether to include this section in the link.
template<int size, bool big_endian>