X-Git-Url: https://repo.jachan.dev/binutils.git/blobdiff_plain/0daa6f62c88fe4d1dd680b09e855c4b8b7811403..084e2665e2f76ce0106595e62bd31bd33d9c6190:/gold/target-select.cc diff --git a/gold/target-select.cc b/gold/target-select.cc index fdf7b89636..dcd3017f07 100644 --- a/gold/target-select.cc +++ b/gold/target-select.cc @@ -1,6 +1,6 @@ // target-select.cc -- select a target for an object file -// Copyright 2006, 2007 Free Software Foundation, Inc. +// Copyright 2006, 2007, 2008 Free Software Foundation, Inc. // Written by Ian Lance Taylor . // This file is part of gold. @@ -22,6 +22,8 @@ #include "gold.h" +#include + #include "elfcpp.h" #include "target-select.h" @@ -41,13 +43,35 @@ namespace gold // list. This runs at global constructor time, so we want it to be // fast. -Target_selector::Target_selector(int machine, int size, bool is_big_endian) - : machine_(machine), size_(size), is_big_endian_(is_big_endian) +Target_selector::Target_selector(int machine, int size, bool is_big_endian, + const char* bfd_name) + : machine_(machine), size_(size), is_big_endian_(is_big_endian), + bfd_name_(bfd_name), instantiated_target_(NULL), lock_(NULL), + initialize_lock_(&this->lock_) + { this->next_ = target_selectors; target_selectors = this; } +// Instantiate the target and return it. Use a lock to avoid +// instantiating two instances of the same target. + +Target* +Target_selector::instantiate_target() +{ + // We assume that the pointer will either be written entirely or not + // at all. + if (this->instantiated_target_ == NULL) + { + this->initialize_lock_.initialize(); + Hold_optional_lock hl(this->lock_); + if (this->instantiated_target_ == NULL) + this->instantiated_target_ = this->do_instantiate_target(); + } + return this->instantiated_target_; +} + // Find the target for an ELF file. Target* @@ -77,11 +101,24 @@ select_target_by_name(const char* name) { for (Target_selector* p = target_selectors; p != NULL; p = p->next()) { - Target* ret = p->recognize_by_name(name); - if (ret != NULL) - return ret; + const char* pname = p->bfd_name(); + if (pname == NULL || strcmp(pname, name) == 0) + { + Target* ret = p->recognize_by_name(name); + if (ret != NULL) + return ret; + } } return NULL; } +// Push all the supported BFD names onto a vector. + +void +supported_target_names(std::vector* names) +{ + for (Target_selector* p = target_selectors; p != NULL; p = p->next()) + p->supported_names(names); +} + } // End namespace gold.