| // tls.h -- Thread-Local Storage utility routines for gold   -*- C++ -*- | 
 |  | 
 | // Copyright (C) 2006-2021 Free Software Foundation, Inc. | 
 | // Written by Ian Lance Taylor <iant@google.com>. | 
 |  | 
 | // This file is part of gold. | 
 |  | 
 | // This program is free software; you can redistribute it and/or modify | 
 | // it under the terms of the GNU General Public License as published by | 
 | // the Free Software Foundation; either version 3 of the License, or | 
 | // (at your option) any later version. | 
 |  | 
 | // This program is distributed in the hope that it will be useful, | 
 | // but WITHOUT ANY WARRANTY; without even the implied warranty of | 
 | // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the | 
 | // GNU General Public License for more details. | 
 |  | 
 | // You should have received a copy of the GNU General Public License | 
 | // along with this program; if not, write to the Free Software | 
 | // Foundation, Inc., 51 Franklin Street - Fifth Floor, Boston, | 
 | // MA 02110-1301, USA. | 
 |  | 
 | #ifndef GOLD_TLS_H | 
 | #define GOLD_TLS_H | 
 |  | 
 | #include "elfcpp.h" | 
 | #include "reloc.h" | 
 |  | 
 | namespace gold | 
 | { | 
 |  | 
 | namespace tls | 
 | { | 
 |  | 
 | // This is used for relocations that can be converted to a different, | 
 | // more efficient type of relocation. | 
 |  | 
 | enum Tls_optimization | 
 | { | 
 |   TLSOPT_NONE,    // Can not convert this relocation to a more efficient one. | 
 |   TLSOPT_TO_LD,   // Can convert General Dynamic to Local Dynamic. | 
 |   TLSOPT_TO_LE,   // Can convert GD or LD to Local-Exec. | 
 |   TLSOPT_TO_IE,   // Can convert GD or LD or LE to Initial-Exec. | 
 | }; | 
 |  | 
 | // Check the range for a TLS relocation.  This is inlined for efficiency. | 
 |  | 
 | template<int size, bool big_endian> | 
 | inline void | 
 | check_range(const Relocate_info<size, big_endian>* relinfo, | 
 |             size_t relnum, | 
 |             typename elfcpp::Elf_types<size>::Elf_Addr rel_offset, | 
 |             section_size_type view_size, int off) | 
 | { | 
 |   typename elfcpp::Elf_types<size>::Elf_Addr offset = rel_offset + off; | 
 |   // Elf_Addr is unsigned, so this also tests for signed offset < 0. | 
 |   if (offset > view_size) | 
 |     gold_error_at_location(relinfo, relnum, rel_offset, | 
 | 			   _("TLS relocation out of range")); | 
 | } | 
 |  | 
 | // Check the validity of a TLS relocation.  This is like assert. | 
 |  | 
 | template<int size, bool big_endian> | 
 | inline void | 
 | check_tls(const Relocate_info<size, big_endian>* relinfo, | 
 |           size_t relnum, | 
 |           typename elfcpp::Elf_types<size>::Elf_Addr rel_offset, | 
 |           bool valid) | 
 | { | 
 |   if (!valid) | 
 |     gold_error_at_location(relinfo, relnum, rel_offset, | 
 | 			   _("TLS relocation against invalid instruction")); | 
 | } | 
 |  | 
 |  | 
 | } // End namespace tls. | 
 |  | 
 | } // End namespace gold. | 
 |  | 
 | #endif // !defined(GOLD_TLS_H) |