diff options
author | Doug Kwan <dougkwan@google.com> | 2009-08-18 23:49:29 +0000 |
---|---|---|
committer | Doug Kwan <dougkwan@google.com> | 2009-08-18 23:49:29 +0000 |
commit | f733487b048b9822fb648be60633061d610b40f3 (patch) | |
tree | 4df42b83ffd58eecbf028b2b8ed33ebb487843b5 /gold/target.h | |
parent | 688805f3b82d345b056810e08842224bfea3a879 (diff) | |
download | gdb-f733487b048b9822fb648be60633061d610b40f3.zip gdb-f733487b048b9822fb648be60633061d610b40f3.tar.gz gdb-f733487b048b9822fb648be60633061d610b40f3.tar.bz2 |
2009-08-18 Doug Kwan <dougkwan@google.com>
* dynobj.cc (Sized_dynobj::setup): Take a Target object instead of
an elcpp::Ehdr as parameter. Adjust call to set_target.
* dynobj.h (Sized_dynobj::setup): Take a Target object instead of
an elfcpp::Ehdr as parameter.
* object.cc (Object::set_target): Remove the version that looks up
a target and sets it.
(Sized_relobj::setup): Take a Target object instead of
an elfcpp::Ehdr as parameter. Adjust call to set_target.
(make_elf_sized_object): Find target and ask target to
make an ELF object.
* object.h: (Object::set_target): Remove the version that looks up
a target and sets it.
(Sized_relobj::setup): Take a Target object instead of
an elfcpp:Ehdr as parameter.
* target.cc: Include dynobj.h.
(Target::do_make_elf_object_implementation): New.
(Target::do_make_elf_object): New.
* target.h (Target::make_elf_object): New template declaration.
(Target::do_make_elf_object): New method declarations.
(Target::do_make_elf_object_implementation): New template declaration.
Diffstat (limited to 'gold/target.h')
-rw-r--r-- | gold/target.h | 46 |
1 files changed, 46 insertions, 0 deletions
diff --git a/gold/target.h b/gold/target.h index 597a4f9..c9b07a8 100644 --- a/gold/target.h +++ b/gold/target.h @@ -216,6 +216,13 @@ class Target is_local_label_name(const char* name) const { return this->do_is_local_label_name(name); } + // Make an ELF object. + template<int size, bool big_endian> + Object* + make_elf_object(const std::string& name, Input_file* input_file, + off_t offset, const elfcpp::Ehdr<size, big_endian>& ehdr) + { return this->do_make_elf_object(name, input_file, offset, ehdr); } + protected: // This struct holds the constant information for a child class. We // use a struct to avoid the overhead of virtual function calls for @@ -301,7 +308,46 @@ class Target virtual bool do_is_local_label_name(const char*) const; + // make_elf_object hooks. There are four versions of these for + // different address sizes and endianities. + +#ifdef HAVE_TARGET_32_LITTLE + // Virtual functions which may be overriden by the child class. + virtual Object* + do_make_elf_object(const std::string&, Input_file*, off_t, + const elfcpp::Ehdr<32, false>&); +#endif + +#ifdef HAVE_TARGET_32_BIG + // Virtual functions which may be overriden by the child class. + virtual Object* + do_make_elf_object(const std::string&, Input_file*, off_t, + const elfcpp::Ehdr<32, true>&); +#endif + +#ifdef HAVE_TARGET_64_LITTLE + // Virtual functions which may be overriden by the child class. + virtual Object* + do_make_elf_object(const std::string&, Input_file*, off_t, + const elfcpp::Ehdr<64, false>& ehdr); +#endif + +#ifdef HAVE_TARGET_64_BIG + // Virtual functions which may be overriden by the child class. + virtual Object* + do_make_elf_object(const std::string& name, Input_file* input_file, + off_t offset, const elfcpp::Ehdr<64, true>& ehdr); +#endif + private: + // The implementations of the four do_make_elf_object virtual functions are + // almost identical except for their sizes and endianity. We use a template. + // for their implementations. + template<int size, bool big_endian> + inline Object* + do_make_elf_object_implementation(const std::string&, Input_file*, off_t, + const elfcpp::Ehdr<size, big_endian>&); + Target(const Target&); Target& operator=(const Target&); |