aboutsummaryrefslogtreecommitdiff
path: root/gold/target.h
diff options
context:
space:
mode:
authorDoug Kwan <dougkwan@google.com>2009-08-18 23:49:29 +0000
committerDoug Kwan <dougkwan@google.com>2009-08-18 23:49:29 +0000
commitf733487b048b9822fb648be60633061d610b40f3 (patch)
tree4df42b83ffd58eecbf028b2b8ed33ebb487843b5 /gold/target.h
parent688805f3b82d345b056810e08842224bfea3a879 (diff)
downloadgdb-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.h46
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&);