aboutsummaryrefslogtreecommitdiff
path: root/gold/target-select.cc
diff options
context:
space:
mode:
Diffstat (limited to 'gold/target-select.cc')
-rw-r--r--gold/target-select.cc52
1 files changed, 52 insertions, 0 deletions
diff --git a/gold/target-select.cc b/gold/target-select.cc
new file mode 100644
index 0000000..28b7527
--- /dev/null
+++ b/gold/target-select.cc
@@ -0,0 +1,52 @@
+// target-select.cc -- select a target for an object file
+
+#include "gold.h"
+
+#include "elfcpp.h"
+#include "target-select.h"
+
+namespace
+{
+
+// The start of the list of target selectors.
+
+gold::Target_selector* target_selectors;
+
+} // End anonymous namespace.
+
+namespace gold
+{
+
+// Construct a Target_selector, which means adding it to the linked
+// list. This runs at global constructor time, so we want it to be
+// fast.
+
+Target_selector::Target_selector(int machine, int size, bool big_endian)
+ : machine_(machine), size_(size), big_endian_(big_endian)
+{
+ this->next_ = target_selectors;
+ target_selectors = this;
+}
+
+// Find the target for an ELF file.
+
+extern Target*
+select_target(int machine, int size, bool big_endian, int osabi,
+ int abiversion)
+{
+ for (const Target_selector* p = target_selectors; p != NULL; p = p->next())
+ {
+ int pmach = p->machine();
+ if ((pmach == machine || pmach == elfcpp::EM_NONE)
+ && p->size() == size
+ && p->big_endian() ? big_endian : !big_endian)
+ {
+ Target* ret = p->recognize(machine, osabi, abiversion);
+ if (ret != NULL)
+ return ret;
+ }
+ }
+ return NULL;
+}
+
+} // End namespace gold.